From 5d35dcfe03cffe640b934a47d501cc7a612d258f Mon Sep 17 00:00:00 2001 From: JasonBrock Date: Tue, 28 Apr 2026 11:14:32 -0400 Subject: [PATCH] =?UTF-8?q?Initial=20commit=20=E2=80=94=20Work=20Journal?= =?UTF-8?q?=20project=20(prototype,=20Android=20app,=20backups,=20project?= =?UTF-8?q?=20log)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- .obsidian/app.json | 1 + .obsidian/appearance.json | 5 + .obsidian/community-plugins.json | 4 + .obsidian/core-plugins.json | 33 + .obsidian/plugins/highlightr-plugin/data.json | 26 + .obsidian/plugins/highlightr-plugin/main.js | 3637 ++ .../plugins/highlightr-plugin/manifest.json | 10 + .../plugins/highlightr-plugin/styles.css | 774 + .obsidian/plugins/pexels-banner/data.json | 154 + .obsidian/plugins/pexels-banner/main.js | 36838 ++++++++++++++++ .obsidian/plugins/pexels-banner/manifest.json | 12 + .obsidian/plugins/pexels-banner/styles.css | 743 + .obsidian/themes/Obsidianite/manifest.json | 7 + .obsidian/themes/Obsidianite/theme.css | 1481 + .obsidian/themes/Obuntu/manifest.json | 6 + .obsidian/themes/Obuntu/theme.css | 1987 + .obsidian/workspace.json | 200 + AndroidApp/.gitignore | 15 + AndroidApp/.idea/.gitignore | 3 + AndroidApp/.idea/.name | 1 + AndroidApp/.idea/AndroidProjectSystem.xml | 6 + AndroidApp/.idea/codeStyles/Project.xml | 123 + .../.idea/codeStyles/codeStyleConfig.xml | 5 + AndroidApp/.idea/compiler.xml | 6 + AndroidApp/.idea/deploymentTargetSelector.xml | 11 + AndroidApp/.idea/gradle.xml | 18 + .../inspectionProfiles/Project_Default.xml | 61 + AndroidApp/.idea/misc.xml | 9 + AndroidApp/.idea/runConfigurations.xml | 17 + AndroidApp/.idea/studiobot.xml | 6 + AndroidApp/app/.gitignore | 1 + AndroidApp/app/build.gradle.kts | 58 + AndroidApp/app/proguard-rules.pro | 21 + .../myjournal/ExampleInstrumentedTest.kt | 24 + AndroidApp/app/src/main/AndroidManifest.xml | 27 + .../com/example/myjournal/MainActivity.kt | 47 + .../com/example/myjournal/ui/theme/Color.kt | 11 + .../com/example/myjournal/ui/theme/Theme.kt | 58 + .../com/example/myjournal/ui/theme/Type.kt | 34 + .../res/drawable/ic_launcher_background.xml | 170 + .../res/drawable/ic_launcher_foreground.xml | 30 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes AndroidApp/app/src/main/res/values/colors.xml | 10 + .../app/src/main/res/values/strings.xml | 3 + AndroidApp/app/src/main/res/values/themes.xml | 5 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../com/example/myjournal/ExampleUnitTest.kt | 17 + AndroidApp/build.gradle.kts | 5 + AndroidApp/gradle.properties | 15 + .../gradle/gradle-daemon-jvm.properties | 12 + AndroidApp/gradle/libs.versions.toml | 31 + AndroidApp/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes .../gradle/wrapper/gradle-wrapper.properties | 9 + AndroidApp/gradlew | 251 + AndroidApp/gradlew.bat | 94 + AndroidApp/settings.gradle.kts | 26 + Backup/3/journal.html | 2002 + Backup/journal-1.html | 1942 + Backup/journal-2.html | 2793 ++ Backup/journal.html | 1477 + .../.claude/settings.local.json | 9 + JournalAppPrototype/journal.html | 2912 ++ Master_Project_log.md | 355 + .../wp4254880-dark-4k-wallpapers.jpg | Bin 0 -> 144297 bytes 76 files changed, 58692 insertions(+) create mode 100644 .obsidian/app.json create mode 100644 .obsidian/appearance.json create mode 100644 .obsidian/community-plugins.json create mode 100644 .obsidian/core-plugins.json create mode 100644 .obsidian/plugins/highlightr-plugin/data.json create mode 100644 .obsidian/plugins/highlightr-plugin/main.js create mode 100644 .obsidian/plugins/highlightr-plugin/manifest.json create mode 100644 .obsidian/plugins/highlightr-plugin/styles.css create mode 100644 .obsidian/plugins/pexels-banner/data.json create mode 100644 .obsidian/plugins/pexels-banner/main.js create mode 100644 .obsidian/plugins/pexels-banner/manifest.json create mode 100644 .obsidian/plugins/pexels-banner/styles.css create mode 100644 .obsidian/themes/Obsidianite/manifest.json create mode 100644 .obsidian/themes/Obsidianite/theme.css create mode 100644 .obsidian/themes/Obuntu/manifest.json create mode 100644 .obsidian/themes/Obuntu/theme.css create mode 100644 .obsidian/workspace.json create mode 100644 AndroidApp/.gitignore create mode 100644 AndroidApp/.idea/.gitignore create mode 100644 AndroidApp/.idea/.name create mode 100644 AndroidApp/.idea/AndroidProjectSystem.xml create mode 100644 AndroidApp/.idea/codeStyles/Project.xml create mode 100644 AndroidApp/.idea/codeStyles/codeStyleConfig.xml create mode 100644 AndroidApp/.idea/compiler.xml create mode 100644 AndroidApp/.idea/deploymentTargetSelector.xml create mode 100644 AndroidApp/.idea/gradle.xml create mode 100644 AndroidApp/.idea/inspectionProfiles/Project_Default.xml create mode 100644 AndroidApp/.idea/misc.xml create mode 100644 AndroidApp/.idea/runConfigurations.xml create mode 100644 AndroidApp/.idea/studiobot.xml create mode 100644 AndroidApp/app/.gitignore create mode 100644 AndroidApp/app/build.gradle.kts create mode 100644 AndroidApp/app/proguard-rules.pro create mode 100644 AndroidApp/app/src/androidTest/java/com/example/myjournal/ExampleInstrumentedTest.kt create mode 100644 AndroidApp/app/src/main/AndroidManifest.xml create mode 100644 AndroidApp/app/src/main/java/com/example/myjournal/MainActivity.kt create mode 100644 AndroidApp/app/src/main/java/com/example/myjournal/ui/theme/Color.kt create mode 100644 AndroidApp/app/src/main/java/com/example/myjournal/ui/theme/Theme.kt create mode 100644 AndroidApp/app/src/main/java/com/example/myjournal/ui/theme/Type.kt create mode 100644 AndroidApp/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 AndroidApp/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 AndroidApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 AndroidApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 AndroidApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 AndroidApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 AndroidApp/app/src/main/res/values/colors.xml create mode 100644 AndroidApp/app/src/main/res/values/strings.xml create mode 100644 AndroidApp/app/src/main/res/values/themes.xml create mode 100644 AndroidApp/app/src/main/res/xml/backup_rules.xml create mode 100644 AndroidApp/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 AndroidApp/app/src/test/java/com/example/myjournal/ExampleUnitTest.kt create mode 100644 AndroidApp/build.gradle.kts create mode 100644 AndroidApp/gradle.properties create mode 100644 AndroidApp/gradle/gradle-daemon-jvm.properties create mode 100644 AndroidApp/gradle/libs.versions.toml create mode 100644 AndroidApp/gradle/wrapper/gradle-wrapper.jar create mode 100644 AndroidApp/gradle/wrapper/gradle-wrapper.properties create mode 100644 AndroidApp/gradlew create mode 100644 AndroidApp/gradlew.bat create mode 100644 AndroidApp/settings.gradle.kts create mode 100644 Backup/3/journal.html create mode 100644 Backup/journal-1.html create mode 100644 Backup/journal-2.html create mode 100644 Backup/journal.html create mode 100644 JournalAppPrototype/.claude/settings.local.json create mode 100644 JournalAppPrototype/journal.html create mode 100644 Master_Project_log.md create mode 100644 pixel-banner-images/wp4254880-dark-4k-wallpapers.jpg diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000..a6c4a03 --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,5 @@ +{ + "cssTheme": "Obuntu", + "accentColor": "#579bb2", + "theme": "obsidian" +} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json new file mode 100644 index 0000000..1b64e52 --- /dev/null +++ b/.obsidian/community-plugins.json @@ -0,0 +1,4 @@ +[ + "highlightr-plugin", + "pexels-banner" +] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000..639b90d --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,33 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "footnotes": false, + "properties": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": true, + "bases": true, + "webviewer": false +} \ No newline at end of file diff --git a/.obsidian/plugins/highlightr-plugin/data.json b/.obsidian/plugins/highlightr-plugin/data.json new file mode 100644 index 0000000..cfb4e04 --- /dev/null +++ b/.obsidian/plugins/highlightr-plugin/data.json @@ -0,0 +1,26 @@ +{ + "highlighterStyle": "realistic", + "highlighterMethods": "inline-styles", + "highlighters": { + "Pink": "#FFB8EBA6", + "Red": "#FF5582A6", + "Orange": "#FFB86CA6", + "Yellow": "#FFF3A3A6", + "Green": "#BBFABBA6", + "Cyan": "#ABF7F7A6", + "Blue": "#ADCCFFA6", + "Purple": "#D2B3FFA6", + "Grey": "#CACFD9A6" + }, + "highlighterOrder": [ + "Pink", + "Red", + "Orange", + "Yellow", + "Green", + "Cyan", + "Blue", + "Purple", + "Grey" + ] +} \ No newline at end of file diff --git a/.obsidian/plugins/highlightr-plugin/main.js b/.obsidian/plugins/highlightr-plugin/main.js new file mode 100644 index 0000000..64464e7 --- /dev/null +++ b/.obsidian/plugins/highlightr-plugin/main.js @@ -0,0 +1,3637 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +if you want to view the source visit the plugins github repository +*/ + +'use strict'; + +var obsidian = require('obsidian'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function wait(delay) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => setTimeout(resolve, delay)); + }); +} + +const icons = { + "highlightr-eraser": ``, + "highlightr-pen": ``, + "highlightr-add": ``, + "highlightr-save": ``, + "highlightr-delete": ``, + "highlightr-copy": `copy`, +}; +function createHighlighterIcons(settings, plugin) { + const highlighterIcons = {}; + for (const key of plugin.settings.highlighterOrder) { + let highlighterpen = `highlightr-pen-${key}`.toLowerCase(); + highlighterIcons[highlighterpen] = ``; + } + Object.keys(highlighterIcons).forEach((key) => { + obsidian.addIcon(key, highlighterIcons[key]); + }); + return highlighterIcons; +} +function addIcons() { + Object.keys(icons).forEach((key) => { + obsidian.addIcon(key, icons[key]); + }); +} + +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +function createCommonjsModule(fn) { + var module = { exports: {} }; + return fn(module, module.exports), module.exports; +} + +/*! Pickr 1.8.2 MIT | https://github.com/Simonwep/pickr */ + +var pickr_min = createCommonjsModule(function (module, exports) { +!function(t,e){module.exports=e();}(self,(function(){return (()=>{var t={d:(e,o)=>{for(var n in o)t.o(o,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:o[n]});},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0});}},e={};t.d(e,{default:()=>L});var o={};function n(t,e,o,n,i={}){e instanceof HTMLCollection||e instanceof NodeList?e=Array.from(e):Array.isArray(e)||(e=[e]),Array.isArray(o)||(o=[o]);for(const s of e)for(const e of o)s[t](e,n,{capture:!1,...i});return Array.prototype.slice.call(arguments,1)}t.r(o),t.d(o,{adjustableInputNumbers:()=>p,createElementFromString:()=>r,createFromTemplate:()=>a,eventPath:()=>l,off:()=>s,on:()=>i,resolveElement:()=>c});const i=n.bind(null,"addEventListener"),s=n.bind(null,"removeEventListener");function r(t){const e=document.createElement("div");return e.innerHTML=t.trim(),e.firstElementChild}function a(t){const e=(t,e)=>{const o=t.getAttribute(e);return t.removeAttribute(e),o},o=(t,n={})=>{const i=e(t,":obj"),s=e(t,":ref"),r=i?n[i]={}:n;s&&(n[s]=t);for(const n of Array.from(t.children)){const t=e(n,":arr"),i=o(n,t?{}:r);t&&(r[t]||(r[t]=[])).push(Object.keys(i).length?i:n);}return n};return o(r(t))}function l(t){let e=t.path||t.composedPath&&t.composedPath();if(e)return e;let o=t.target.parentElement;for(e=[t.target,o];o=o.parentElement;)e.push(o);return e.push(document,window),e}function c(t){return t instanceof Element?t:"string"==typeof t?t.split(/>>/g).reduce(((t,e,o,n)=>(t=t.querySelector(e),ot)){function o(o){const n=[.001,.01,.1][Number(o.shiftKey||2*o.ctrlKey)]*(o.deltaY<0?1:-1);let i=0,s=t.selectionStart;t.value=t.value.replace(/[\d.]+/g,((t,o)=>o<=s&&o+t.length>=s?(s=o,e(Number(t),n,i)):(i++,t))),t.focus(),t.setSelectionRange(s,s),o.preventDefault(),t.dispatchEvent(new Event("input"));}i(t,"focus",(()=>i(window,"wheel",o,{passive:!1}))),i(t,"blur",(()=>s(window,"wheel",o)));}const{min:u,max:h,floor:d,round:m}=Math;function f(t,e,o){e/=100,o/=100;const n=d(t=t/360*6),i=t-n,s=o*(1-e),r=o*(1-i*e),a=o*(1-(1-i)*e),l=n%6;return [255*[o,r,s,s,a,o][l],255*[a,o,o,r,s,s][l],255*[s,s,a,o,o,r][l]]}function v(t,e,o){const n=(2-(e/=100))*(o/=100)/2;return 0!==n&&(e=1===n?0:n<.5?e*o/(2*n):e*o/(2-2*n)),[t,100*e,100*n]}function b(t,e,o){const n=u(t/=255,e/=255,o/=255),i=h(t,e,o),s=i-n;let r,a;if(0===s)r=a=0;else {a=s/i;const n=((i-t)/6+s/2)/s,l=((i-e)/6+s/2)/s,c=((i-o)/6+s/2)/s;t===i?r=c-l:e===i?r=1/3+n-c:o===i&&(r=2/3+l-n),r<0?r+=1:r>1&&(r-=1);}return [360*r,100*a,100*i]}function y(t,e,o,n){e/=100,o/=100;return [...b(255*(1-u(1,(t/=100)*(1-(n/=100))+n)),255*(1-u(1,e*(1-n)+n)),255*(1-u(1,o*(1-n)+n)))]}function g(t,e,o){e/=100;const n=2*(e*=(o/=100)<.5?o:1-o)/(o+e)*100,i=100*(o+e);return [t,isNaN(n)?0:n,i]}function _(t){return b(...t.match(/.{2}/g).map((t=>parseInt(t,16))))}function w(t){t=t.match(/^[a-zA-Z]+$/)?function(t){if("black"===t.toLowerCase())return "#000";const e=document.createElement("canvas").getContext("2d");return e.fillStyle=t,"#000"===e.fillStyle?null:e.fillStyle}(t):t;const e={cmyk:/^cmyk[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)/i,rgba:/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsla:/^((hsla)|hsl)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsva:/^((hsva)|hsv)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hexa:/^#?(([\dA-Fa-f]{3,4})|([\dA-Fa-f]{6})|([\dA-Fa-f]{8}))$/i},o=t=>t.map((t=>/^(|\d+)\.\d+|\d+$/.test(t)?Number(t):void 0));let n;t:for(const i in e){if(!(n=e[i].exec(t)))continue;const s=t=>!!n[2]==("number"==typeof t);switch(i){case"cmyk":{const[,t,e,s,r]=o(n);if(t>100||e>100||s>100||r>100)break t;return {values:y(t,e,s,r),type:i}}case"rgba":{const[,,,t,e,r,a]=o(n);if(t>255||e>255||r>255||a<0||a>1||!s(a))break t;return {values:[...b(t,e,r),a],a,type:i}}case"hexa":{let[,t]=n;4!==t.length&&3!==t.length||(t=t.split("").map((t=>t+t)).join(""));const e=t.substring(0,6);let o=t.substring(6);return o=o?parseInt(o,16)/255:void 0,{values:[..._(e),o],a:o,type:i}}case"hsla":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[...g(t,e,r),a],a,type:i}}case"hsva":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[t,e,r,a],a,type:i}}}}return {values:null,type:null}}function A(t=0,e=0,o=0,n=1){const i=(t,e)=>(o=-1)=>e(~o?t.map((t=>Number(t.toFixed(o)))):t),s={h:t,s:e,v:o,a:n,toHSVA(){const t=[s.h,s.s,s.v,s.a];return t.toString=i(t,(t=>`hsva(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toHSLA(){const t=[...v(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`hsla(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toRGBA(){const t=[...f(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`rgba(${t[0]}, ${t[1]}, ${t[2]}, ${s.a})`)),t},toCMYK(){const t=function(t,e,o){const n=f(t,e,o),i=n[0]/255,s=n[1]/255,r=n[2]/255,a=u(1-i,1-s,1-r);return [100*(1===a?0:(1-i-a)/(1-a)),100*(1===a?0:(1-s-a)/(1-a)),100*(1===a?0:(1-r-a)/(1-a)),100*a]}(s.h,s.s,s.v);return t.toString=i(t,(t=>`cmyk(${t[0]}%, ${t[1]}%, ${t[2]}%, ${t[3]}%)`)),t},toHEXA(){const t=function(t,e,o){return f(t,e,o).map((t=>m(t).toString(16).padStart(2,"0")))}(s.h,s.s,s.v),e=s.a>=1?"":Number((255*s.a).toFixed(0)).toString(16).toUpperCase().padStart(2,"0");return e&&t.push(e),t.toString=()=>`#${t.join("").toUpperCase()}`,t},clone:()=>A(s.h,s.s,s.v,s.a)};return s}const C=t=>Math.max(Math.min(t,1),0);function $(t){const e={options:Object.assign({lock:null,onchange:()=>0,onstop:()=>0},t),_keyboard(t){const{options:o}=e,{type:n,key:i}=t;if(document.activeElement===o.wrapper){const{lock:o}=e.options,s="ArrowUp"===i,r="ArrowRight"===i,a="ArrowDown"===i,l="ArrowLeft"===i;if("keydown"===n&&(s||r||a||l)){let n=0,i=0;"v"===o?n=s||r?1:-1:"h"===o?n=s||r?-1:1:(i=s?-1:a?1:0,n=l?-1:r?1:0),e.update(C(e.cache.x+.01*n),C(e.cache.y+.01*i)),t.preventDefault();}else i.startsWith("Arrow")&&(e.options.onstop(),t.preventDefault());}},_tapstart(t){i(document,["mouseup","touchend","touchcancel"],e._tapstop),i(document,["mousemove","touchmove"],e._tapmove),t.cancelable&&t.preventDefault(),e._tapmove(t);},_tapmove(t){const{options:o,cache:n}=e,{lock:i,element:s,wrapper:r}=o,a=r.getBoundingClientRect();let l=0,c=0;if(t){const e=t&&t.touches&&t.touches[0];l=t?(e||t).clientX:0,c=t?(e||t).clientY:0,la.left+a.width&&(l=a.left+a.width),ca.top+a.height&&(c=a.top+a.height),l-=a.left,c-=a.top;}else n&&(l=n.x*a.width,c=n.y*a.height);"h"!==i&&(s.style.left=`calc(${l/a.width*100}% - ${s.offsetWidth/2}px)`),"v"!==i&&(s.style.top=`calc(${c/a.height*100}% - ${s.offsetHeight/2}px)`),e.cache={x:l/a.width,y:c/a.height};const p=C(l/a.width),u=C(c/a.height);switch(i){case"v":return o.onchange(p);case"h":return o.onchange(u);default:return o.onchange(p,u)}},_tapstop(){e.options.onstop(),s(document,["mouseup","touchend","touchcancel"],e._tapstop),s(document,["mousemove","touchmove"],e._tapmove);},trigger(){e._tapmove();},update(t=0,o=0){const{left:n,top:i,width:s,height:r}=e.options.wrapper.getBoundingClientRect();"h"===e.options.lock&&(o=t),e._tapmove({clientX:n+s*t,clientY:i+r*o});},destroy(){const{options:t,_tapstart:o,_keyboard:n}=e;s(document,["keydown","keyup"],n),s([t.wrapper,t.element],"mousedown",o),s([t.wrapper,t.element],"touchstart",o,{passive:!1});}},{options:o,_tapstart:n,_keyboard:r}=e;return i([o.wrapper,o.element],"mousedown",n),i([o.wrapper,o.element],"touchstart",n,{passive:!1}),i(document,["keydown","keyup"],r),e}function k(t={}){t=Object.assign({onchange:()=>0,className:"",elements:[]},t);const e=i(t.elements,"click",(e=>{t.elements.forEach((o=>o.classList[e.target===o?"add":"remove"](t.className))),t.onchange(e),e.stopPropagation();}));return {destroy:()=>s(...e)}}const S={variantFlipOrder:{start:"sme",middle:"mse",end:"ems"},positionFlipOrder:{top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"},position:"bottom",margin:8},O=(t,e,o)=>{const{container:n,margin:i,position:s,variantFlipOrder:r,positionFlipOrder:a}={container:document.documentElement.getBoundingClientRect(),...S,...o},{left:l,top:c}=e.style;e.style.left="0",e.style.top="0";const p=t.getBoundingClientRect(),u=e.getBoundingClientRect(),h={t:p.top-u.height-i,b:p.bottom+i,r:p.right+i,l:p.left-u.width-i},d={vs:p.left,vm:p.left+p.width/2+-u.width/2,ve:p.left+p.width-u.width,hs:p.top,hm:p.bottom-p.height/2-u.height/2,he:p.bottom-u.height},[m,f="middle"]=s.split("-"),v=a[m],b=r[f],{top:y,left:g,bottom:_,right:w}=n;for(const t of v){const o="t"===t||"b"===t,n=h[t],[i,s]=o?["top","left"]:["left","top"],[r,a]=o?[u.height,u.width]:[u.width,u.height],[l,c]=o?[_,w]:[w,_],[p,m]=o?[y,g]:[g,y];if(!(nl))for(const r of b){const l=d[(o?"v":"h")+r];if(!(lc))return e.style[s]=l-u[s]+"px",e.style[i]=n-u[i]+"px",t+r}}return e.style.left=l,e.style.top=c,null};function E(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}class L{constructor(t){E(this,"_initializingActive",!0),E(this,"_recalc",!0),E(this,"_nanopop",null),E(this,"_root",null),E(this,"_color",A()),E(this,"_lastColor",A()),E(this,"_swatchColors",[]),E(this,"_setupAnimationFrame",null),E(this,"_eventListener",{init:[],save:[],hide:[],show:[],clear:[],change:[],changestop:[],cancel:[],swatchselect:[]}),this.options=t=Object.assign({...L.DEFAULT_OPTIONS},t);const{swatches:e,components:o,theme:n,sliders:i,lockOpacity:s,padding:r}=t;["nano","monolith"].includes(n)&&!i&&(t.sliders="h"),o.interaction||(o.interaction={});const{preview:a,opacity:l,hue:c,palette:p}=o;o.opacity=!s&&l,o.palette=p||a||l||c,this._preBuild(),this._buildComponents(),this._bindEvents(),this._finalBuild(),e&&e.length&&e.forEach((t=>this.addSwatch(t)));const{button:u,app:h}=this._root;this._nanopop=((t,e,o)=>{const n="object"!=typeof t||t instanceof HTMLElement?{reference:t,popper:e,...o}:t;return {update(t=n){const{reference:e,popper:o}=Object.assign(n,t);if(!o||!e)throw new Error("Popper- or reference-element missing.");return O(e,o,n)}}})(u,h,{margin:r}),u.setAttribute("role","button"),u.setAttribute("aria-label",this._t("btn:toggle"));const d=this;this._setupAnimationFrame=requestAnimationFrame((function e(){if(!h.offsetWidth)return requestAnimationFrame(e);d.setColor(t.default),d._rePositioningPicker(),t.defaultRepresentation&&(d._representation=t.defaultRepresentation,d.setColorRepresentation(d._representation)),t.showAlways&&d.show(),d._initializingActive=!1,d._emit("init");}));}_preBuild(){const{options:t}=this;for(const e of ["el","container"])t[e]=c(t[e]);this._root=(t=>{const{components:e,useAsButton:o,inline:n,appClass:i,theme:s,lockOpacity:r}=t.options,l=t=>t?"":'style="display:none" hidden',c=e=>t._t(e),p=a(`\n
\n\n ${o?"":''}\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n\n
\n\n
\n \n\n \n \n \n \n \n\n \n \n \n
\n
\n
\n `),u=p.interaction;return u.options.find((t=>!t.hidden&&!t.classList.add("active"))),u.type=()=>u.options.find((t=>t.classList.contains("active"))),p})(this),t.useAsButton&&(this._root.button=t.el),t.container.appendChild(this._root.root);}_finalBuild(){const t=this.options,e=this._root;if(t.container.removeChild(e.root),t.inline){const o=t.el.parentElement;t.el.nextSibling?o.insertBefore(e.app,t.el.nextSibling):o.appendChild(e.app);}else t.container.appendChild(e.app);t.useAsButton?t.inline&&t.el.remove():t.el.parentNode.replaceChild(e.root,t.el),t.disabled&&this.disable(),t.comparison||(e.button.style.transition="none",t.useAsButton||(e.preview.lastColor.style.transition="none")),this.hide();}_buildComponents(){const t=this,e=this.options.components,o=(t.options.sliders||"v").repeat(2),[n,i]=o.match(/^[vh]+$/g)?o:[],s=()=>this._color||(this._color=this._lastColor.clone()),r={palette:$({element:t._root.palette.picker,wrapper:t._root.palette.palette,onstop:()=>t._emit("changestop","slider",t),onchange(o,n){if(!e.palette)return;const i=s(),{_root:r,options:a}=t,{lastColor:l,currentColor:c}=r.preview;t._recalc&&(i.s=100*o,i.v=100-100*n,i.v<0&&(i.v=0),t._updateOutput("slider"));const p=i.toRGBA().toString(0);this.element.style.background=p,this.wrapper.style.background=`\n linear-gradient(to top, rgba(0, 0, 0, ${i.a}), transparent),\n linear-gradient(to left, hsla(${i.h}, 100%, 50%, ${i.a}), rgba(255, 255, 255, ${i.a}))\n `,a.comparison?a.useAsButton||t._lastColor||l.style.setProperty("--pcr-color",p):(r.button.style.setProperty("--pcr-color",p),r.button.classList.remove("clear"));const u=i.toHEXA().toString();for(const{el:e,color:o}of t._swatchColors)e.classList[u===o.toHEXA().toString()?"add":"remove"]("pcr-active");c.style.setProperty("--pcr-color",p);}}),hue:$({lock:"v"===i?"h":"v",element:t._root.hue.picker,wrapper:t._root.hue.slider,onstop:()=>t._emit("changestop","slider",t),onchange(o){if(!e.hue||!e.palette)return;const n=s();t._recalc&&(n.h=360*o),this.element.style.backgroundColor=`hsl(${n.h}, 100%, 50%)`,r.palette.trigger();}}),opacity:$({lock:"v"===n?"h":"v",element:t._root.opacity.picker,wrapper:t._root.opacity.slider,onstop:()=>t._emit("changestop","slider",t),onchange(o){if(!e.opacity||!e.palette)return;const n=s();t._recalc&&(n.a=Math.round(100*o)/100),this.element.style.background=`rgba(0, 0, 0, ${n.a})`,r.palette.trigger();}}),selectable:k({elements:t._root.interaction.options,className:"active",onchange(e){t._representation=e.target.getAttribute("data-type").toUpperCase(),t._recalc&&t._updateOutput("swatch");}})};this._components=r;}_bindEvents(){const{_root:t,options:e}=this,o=[i(t.interaction.clear,"click",(()=>this._clearColor())),i([t.interaction.cancel,t.preview.lastColor],"click",(()=>{this.setHSVA(...(this._lastColor||this._color).toHSVA(),!0),this._emit("cancel");})),i(t.interaction.save,"click",(()=>{!this.applyColor()&&!e.showAlways&&this.hide();})),i(t.interaction.result,["keyup","input"],(t=>{this.setColor(t.target.value,!0)&&!this._initializingActive&&(this._emit("change",this._color,"input",this),this._emit("changestop","input",this)),t.stopImmediatePropagation();})),i(t.interaction.result,["focus","blur"],(t=>{this._recalc="blur"===t.type,this._recalc&&this._updateOutput(null);})),i([t.palette.palette,t.palette.picker,t.hue.slider,t.hue.picker,t.opacity.slider,t.opacity.picker],["mousedown","touchstart"],(()=>this._recalc=!0),{passive:!0})];if(!e.showAlways){const n=e.closeWithKey;o.push(i(t.button,"click",(()=>this.isOpen()?this.hide():this.show())),i(document,"keyup",(t=>this.isOpen()&&(t.key===n||t.code===n)&&this.hide())),i(document,["touchstart","mousedown"],(e=>{this.isOpen()&&!l(e).some((e=>e===t.app||e===t.button))&&this.hide();}),{capture:!0}));}if(e.adjustableNumbers){const e={rgba:[255,255,255,1],hsva:[360,100,100,1],hsla:[360,100,100,1],cmyk:[100,100,100,100]};p(t.interaction.result,((t,o,n)=>{const i=e[this.getColorRepresentation().toLowerCase()];if(i){const e=i[n],s=t+(e>=100?1e3*o:o);return s<=0?0:Number((s{n.isOpen()&&(e.closeOnScroll&&n.hide(),null===t?(t=setTimeout((()=>t=null),100),requestAnimationFrame((function e(){n._rePositioningPicker(),null!==t&&requestAnimationFrame(e);}))):(clearTimeout(t),t=setTimeout((()=>t=null),100)));}),{capture:!0}));}this._eventBindings=o;}_rePositioningPicker(){const{options:t}=this;if(!t.inline){if(!this._nanopop.update({container:document.body.getBoundingClientRect(),position:t.position})){const t=this._root.app,e=t.getBoundingClientRect();t.style.top=(window.innerHeight-e.height)/2+"px",t.style.left=(window.innerWidth-e.width)/2+"px";}}}_updateOutput(t){const{_root:e,_color:o,options:n}=this;if(e.interaction.type()){const t=`to${e.interaction.type().getAttribute("data-type")}`;e.interaction.result.value="function"==typeof o[t]?o[t]().toString(n.outputPrecision):"";}!this._initializingActive&&this._recalc&&this._emit("change",o,t,this);}_clearColor(t=!1){const{_root:e,options:o}=this;o.useAsButton||e.button.style.setProperty("--pcr-color","rgba(0, 0, 0, 0.15)"),e.button.classList.add("clear"),o.showAlways||this.hide(),this._lastColor=null,this._initializingActive||t||(this._emit("save",null),this._emit("clear"));}_parseLocalColor(t){const{values:e,type:o,a:n}=w(t),{lockOpacity:i}=this.options,s=void 0!==n&&1!==n;return e&&3===e.length&&(e[3]=void 0),{values:!e||i&&s?null:e,type:o}}_t(t){return this.options.i18n[t]||L.I18N_DEFAULTS[t]}_emit(t,...e){this._eventListener[t].forEach((t=>t(...e,this)));}on(t,e){return this._eventListener[t].push(e),this}off(t,e){const o=this._eventListener[t]||[],n=o.indexOf(e);return ~n&&o.splice(n,1),this}addSwatch(t){const{values:e}=this._parseLocalColor(t);if(e){const{_swatchColors:t,_root:o}=this,n=A(...e),s=r(` +

+ + + +
+ + +
+ +
+
Checklist
+
+ + +
+
    +
    + +
    + +
    + + +
    +
    + + today +
    +
    +
    + + day streak +
    +
    +
    + + peak hour +
    +
    +
    + + group +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + Mood: + + + + +
    +
    + + + +
    + + 0 words + +
    +
    +
    + + + + diff --git a/Backup/journal-1.html b/Backup/journal-1.html new file mode 100644 index 0000000..0d3877b --- /dev/null +++ b/Backup/journal-1.html @@ -0,0 +1,1942 @@ + + + + + + Journal + + + +
    +
    +
    + +

    + + +
    +
    +
    + +
    + +
    +
    Checklist
    +
    + + +
    +
      +
      + +
      + +
      +
      + +
      +
      + + today +
      +
      +
      + + day streak +
      +
      +
      + + peak hour +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + Mood: + + + + +
      +
      + + + +
      + + 0 words + +
      +
      +
      + + + + diff --git a/Backup/journal-2.html b/Backup/journal-2.html new file mode 100644 index 0000000..09bf089 --- /dev/null +++ b/Backup/journal-2.html @@ -0,0 +1,2793 @@ + + + + + + Journal + + + +
      +
      +
      + +

      + + +
      +
      +
      + +
      + +
      +
      Checklist
      +
      + + +
      +
        +
        + +
        + +
        +
        + Mood: + + + + +
        +
        +
        +
        + + +
        + +
        + +
        + + + 0 words + +
        +
        +
        + +
        +
        + + today +
        +
        +
        + + day streak +
        +
        +
        + + peak hour +
        +
        +
        + + group +
        +
        +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + diff --git a/Backup/journal.html b/Backup/journal.html new file mode 100644 index 0000000..544e55d --- /dev/null +++ b/Backup/journal.html @@ -0,0 +1,1477 @@ + + + + + + Journal + + + +
        +
        +
        + +

        + + +
        +
        +
        +
        + +
        +
        + +
        +
        + + today +
        +
        +
        + + day streak +
        +
        +
        + + peak hour +
        +
        +
        +
        + +
        +
        +
        +
        + +
        +
        + Mood: + + + + +
        +
        + +
        + + 0 words + +
        +
        +
        + + + + diff --git a/JournalAppPrototype/.claude/settings.local.json b/JournalAppPrototype/.claude/settings.local.json new file mode 100644 index 0000000..58d691f --- /dev/null +++ b/JournalAppPrototype/.claude/settings.local.json @@ -0,0 +1,9 @@ +{ + "permissions": { + "allow": [ + "Bash(dir \"C:\\\\Users\\\\jbrock\\\\Documents\\\\pisyncfolder\\\\JournalApp\" /s /b *.html)", + "Bash(grep -oP '#[0-9a-fA-F]{3,6}' \"C:\\\\Users\\\\jbrock\\\\Documents\\\\pisyncfolder\\\\JournalApp\\\\JournalAppPrototype\\\\journal.html\")", + "Bash(grep -oE '#[0-9a-fA-F]{3,6}' \"C:\\\\Users\\\\jbrock\\\\Documents\\\\pisyncfolder\\\\JournalApp\\\\JournalAppPrototype\\\\journal.html\")" + ] + } +} diff --git a/JournalAppPrototype/journal.html b/JournalAppPrototype/journal.html new file mode 100644 index 0000000..e081616 --- /dev/null +++ b/JournalAppPrototype/journal.html @@ -0,0 +1,2912 @@ + + + + + + Journal + + + +
        +
        +
        + +

        + + +
        +
        +
        + +
        + +
        +
        Checklist
        +
        + + +
        +
          +
          + +
          + +
          +
          + Mood: + + + + +
          +
          +
          +
          + + +
          + +
          + +
          + + + 0 words + +
          +
          +
          + +
          +
          + + today +
          +
          +
          + + day streak +
          +
          +
          + + peak hour +
          +
          +
          + + group +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          + +
          + + + + diff --git a/Master_Project_log.md b/Master_Project_log.md new file mode 100644 index 0000000..55b416a --- /dev/null +++ b/Master_Project_log.md @@ -0,0 +1,355 @@ +--- +banner: pixel-banner-images/wp4254880-dark-4k-wallpapers.jpg +banner-height: 460 +pixel-banner-flag-color: white +--- +# Journal App — Dev Log + +> Single-file offline journal with timeline UI, calendar navigation, and markdown export. +> Stack: Pure HTML/CSS/JS · IndexedDB · No dependencies +> File: `C:\Users\jbrock\Documents\pisyncfolder\Journal App\journal.html` + +--- + +## Status + +| Field | Value | +|-------|-------| +| Version | v1.10 | +| Status | Active Development | +| Started | April 7, 2026 | +| Last Updated | April 27, 2026 (v1.10) | + +--- + +## Changelog + +### v1.10 — April 27, 2026 +- **Project card timeline connector** — CSS-only horizontal connector line extending from each breakout card's left edge back to the main timeline vertical line; implemented via `.breakout-card::before` (205px accent-colored line at 50% card height, opacity 0.5) and `.breakout-card::after` (12px dot centered on the timeline line at `left: -211px`); `position: relative` added to `.breakout-card`; no layout constraints broken +- **Breakout card inline rename** — `edit` button added to breakout card action row (between `open →` and `✕`); clicking it swaps the project name display to a `.breakout-name-input` field and replaces action buttons with `save`/`cancel`; save writes both the `projectName` field on the breakout entry (`updateEntry`) and the canonical name in the projects store (`updateProject`), then refreshes the project cache and re-renders; `Enter` submits, `Escape` cancels; `updateProject(id, fields)` added as a new DB helper on `PROJECTS_STORE` + +### v1.9 — April 21, 2026 +- **CSS custom properties** — all 8 theme colors now defined as CSS variables in `:root` (`--bg-primary`, `--bg-secondary`, `--bg-accent`, `--accent`, `--accent-hover`, `--text-primary`, `--text-secondary`, `--text-muted`, `--disabled`); all hardcoded hex values replaced throughout `