aboutsummaryrefslogtreecommitdiff
path: root/assets
Commit message (Collapse)AuthorAgeFilesLines
* feat(music): cover-art fetch and cache for the player (fancy UI phase 2)Craig Jennings6 days1-0/+20
| | | | | | | | | | Phase 2 gives each track a local cover-image path so phase 3's GUI has art to draw. A radio station uses its logo, a local file a sibling cover image, and anything without either falls back to a shipped vinyl placeholder. I consolidated the .m3u parse into one richer cj/music--m3u-entries that reads :name, :uuid, and :favicon per station. Phase 1's cj/music--m3u-labels is now a thin projection of it, so names and art share a single cached disk read. New stations capture their favicon into a #RADIOBROWSERFAVICON line at creation, so most need no lookup later. A legacy station with only a UUID resolves its favicon through a byuuid call. The render path never touches the network. cj/music-art--for-track reads only the cache and returns the placeholder until art exists. cj/music-art--ensure does the blocking fetch off that path. A fetched response is validated as an actual image before it's cached, so an HTML error page or an empty body becomes the placeholder, not a poisoned cache entry. Only http and https URLs are fetched, so an external favicon field can't reach a file:// resource. Art lands under data/music-art/, keyed by UUID or a file hash. cj/music-clear-art-cache empties it, with no automatic expiry. The pure helpers carry the tests: the parser, the cache key, the favicon URL, and the image validation, each with Normal, Boundary, and Error cases. The fetch, the byuuid lookup, and the placeholder fallback are verified live against a real station. Local files use a sibling cover image for now. Embedded-tag extraction is deferred. The full suite is green.
* fix(markdown): vendor strapdown.js instead of a plain-HTTP CDNCraig Jennings12 days1-0/+5
| | | | | | The live markdown preview pulled strapdown.js from http://ndossougbe.github.io over plain HTTP. That broke the preview with no network, loaded third-party JS over an unencrypted connection (mixed content, MITM), and trusted an unmaintained github.io page against the localhost preview. I vendored the self-contained bundle (jQuery, marked, bootstrap themes) into assets/strapdown.js and embed it inline. The whole preview now serves from localhost and works offline. cj/markdown-html reads the file once and caches it.
* chore(emacs): sync abbrev_defsCraig Jennings2026-06-081-2/+3
|
* chore(todo): file dupre diff-face legibility bug from pearl handoffCraig Jennings2026-06-071-0/+0
| | | | dupre's diff-refine-changed is bright gold under near-white text (WCAG ~1.35), unreadable as a plain background. Filed with the side-by-side comparison render from the pearl session that surfaced it.
* chore: drop the stray butterfly PNG backup and ignore .bak filesCraig Jennings2026-05-261-0/+0
| | | | assets/M-x_butterfly.png.bak was a tracked duplicate of the banner PNG, an accidental backup that got committed. I removed it and added *.bak to .gitignore so editor and image backups stay out of the tree.
* feat(dashboard): render the butterfly banner with a transparency maskCraig Jennings2026-05-252-0/+0
| | | | | | The dashboard banner showed the butterfly PNG without its transparency, because the image descriptor was built before the mask props were set. I moved the banner setup (dashboard-startup-banner, dashboard-banner-logo-title) ahead of dashboard-setup-startup-hook and added dashboard-image-extra-props with :mask heuristic, so the mask is in place when the startup hook builds the buffer. If a *dashboard* buffer already exists I refresh it, so the change shows without a restart. I also re-encoded the PNG smaller and kept the previous encoding as M-x_butterfly.png.bak.
* feat(agenda): add project-filtered agenda view on C-f8Craig Jennings2026-04-091-4/+5
| | | | | | New cj/todo-list-single-project prompts for a project, then shows the daily agenda scoped to that project's todo.org plus calendars and inbox. Moved cj/todo-list-all-agenda-files from C-f8 to s-f8.
* feat(vterm): pass F8, F9, F10 through to EmacsCraig Jennings2026-04-071-2/+3
| | | | | | Add nil bindings for F8 (agenda), F9 (gptel), and F10 (music) in vterm-mode-map so these global keybindings aren't swallowed by vterm. Also disable wttrin-debug and update abbreviations.
* fix(slack): add error visibility to notification handlerCraig Jennings2026-03-141-2/+3
| | | | | | Websocket library silently swallows callback errors via condition-case. Wrap cj/slack-notify in condition-case to surface errors in *Messages*. Add cj/slack-test-notify command for pipeline verification.
* fix(calendar-sync): handle variable-length date lists in RRULE UNTILCraig Jennings2026-03-091-0/+1
| | | | | | | date-to-time used (reverse date) which broke when RRULE UNTIL values were parsed as 5-element lists (year month day hour minute) from UTC timestamps. This caused recurring events with UTC UNTIL dates to expand to 0 occurrences, producing stale calendar entries.
* feat(json,yaml): add tree-sitter modes, formatting, and jq integrationCraig Jennings2026-03-021-5/+8
| | | | | | | New prog-json module: json-ts-mode with jq formatting (C-; f) and jq-interactively (C-c C-q). Upgraded prog-yaml to yaml-ts-mode with prettier formatting. Both use treesit-auto for grammar management. Includes 18 new tests (10 JSON, 8 YAML), 185/185 passing.
* chore: minor housekeeping updatesCraig Jennings2026-02-041-0/+1
| | | | | | | - Add typo correction: should't -> shouldn't - Add dirvish shortcut pcr for career project - Rename pc -> pcl for clipper project - Minor whitespace cleanup in init.el
* chore: add new typo corrections to abbrev_defsCraig Jennings2026-02-041-2/+4
|
* fix(abbrev): correct broken abbreviation substitutionsCraig Jennings2026-01-241-15/+14
| | | | | | | | | | | | - commmitting → committing (was "not") - contstruction → construction (was "carrollton") - dialate → dilate (was "to") - feelingn → feeling (was "up") - inclluding → including (was empty) - remeditation → remediation (was "schedule") - stoory → story (was "short") - valiedate → validate (was "visible") - Remove walkthrough, differentname, sunroom (valid words)
* feat(email): add password decryption to setup scriptCraig Jennings2026-01-242-0/+1
| | | | | | | | - Add password decryption loop to scripts/setup-email.sh - Decrypt .gpg files from assets/mail-passwords/ to ~/.config/ - Add encrypted password files (.gmailpass.gpg, .cmailpass.gpg) - Fix missing paren in text-config.el that broke config parsing - Clean up mail-config.el
* fix(calendar-sync): disable auto-start to prevent freezeCraig Jennings2026-01-141-2/+4
| | | | | | Proton calendar download causes Emacs to freeze. Disabled auto-sync by default until root cause is investigated. Manual sync still available via C-; g s keybinding.
* feat: Fix modeline lag and add org multi-level sort with comprehensive testsCraig Jennings2025-11-081-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Performance improvement and new feature with full test coverage. ## Changes ### 1. Fix modeline line/column position lag (#A priority) - Replace expensive line-number-at-pos with cached %l/%c format specifiers - Enable line-number-mode explicitly for caching - Result: Instant modeline updates, zero performance overhead - Files: modules/modeline-config.el:81-83, modules/ui-config.el:53 ### 2. Implement multi-level org sorting - New function: cj/org-sort-by-todo-and-priority - Sorts by TODO status (TODO before DONE) AND priority (A→B→C→D) - Uses stable sorting: priority first, then TODO state - Gracefully handles empty sections (no error) - Bound to C-; o o (ordering → org sort) - Files: modules/org-config.el:278-299, modules/custom-ordering.el:253,267 ### 3. Comprehensive ERT test suite (12/12 passing) - Normal cases: Mixed TODO/DONE, multiple of same type, same priority - Boundary cases: Empty sections, single entries, no priorities - Error cases: Non-org-mode buffer - Test file: tests/test-org-sort-by-todo-and-priority.el ### 4. Testing improvements discovered - Disable org-mode hooks to avoid package dependencies in batch mode - org-sort-entries must be called from parent heading - Preserve priority cookie in org-get-heading (t t nil t) - Add condition-case to handle "Nothing to sort" gracefully ### 5. Minor cleanup - Comment out chime-debug setting (org-agenda-config.el:267) - Mark modeline lag task as DONE in todo.org ## Technical Details Modeline optimization: - line-number-at-pos is O(n) where n = current line - %l and %c are O(1) lookups from cached values Org sorting algorithm uses stable sort: 1. Sort by priority (A, B, C, D, unprioritized) 2. Sort by TODO status (preserves priority order within groups) Result: TODO [#A], TODO [#B], DONE [#A], DONE [#B], etc.
* chore: Update abbrev corrections and add flyspell TODOCraig Jennings2025-11-061-5/+6
| | | | | - Automatic abbrev_defs updates from spell corrections - Added TODO: investigate flyspell-then-abbrev keybinding loss in scratch
* chore: Move gemini.key.gpg to assets folderCraig Jennings2025-11-061-0/+2
| | | | | Relocated gemini.key.gpg to assets/ folder for better organization. No code references found in modules directory, so no updates needed.
* removing test asset duplicateCraig Jennings2025-10-211-411/+0
|
* abbrevsCraig Jennings2025-10-171-3/+3
|
* abbrevsCraig Jennings2025-10-151-1/+4
|
* changing repositoriesCraig Jennings2025-10-12202-0/+1087786