aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* chore(todo): close org-capture popup manual-verify as passedCraig Jennings8 days1-7/+2
|
* refactor(org-capture): single-Task desktop popup into the org-roam inboxCraig Jennings8 days3-184/+61
| | | | The Hyprland Super+Shift+N popup now goes straight to a single Task capture into the org-roam inbox (file+headline inbox-file "Inbox"), with no template menu. It drops Bug and Event from the popup, removes the now-pointless org-mks Customize-strip advice, and replaces the Task/Bug/Event subset filter with a one-template builder, cj/--quick-capture-template. The full org-capture menu in the daemon is unchanged. todo.org: cancelled the deferred Note/Recipe popup feature and replaced the old manual-verify checklist with one matching the simpler behavior.
* chore(todo): file emacs tasks from the roam inbox, drain it to zeroCraig Jennings8 days1-2/+8
| | | | Process the seven emacs/theme-studio captures from the org-roam inbox into Emacs Open Work: settle the cursor task on remove (Craig's directive), add page-down-in-completing-read, scratch-background-lighter, and one consolidated auto-dim task for org headings/links/tags. The bug capture template was checked against task and kept (it adds [#C], so it differs). The inbox is now empty of emacs items.
* refactor(themes): retire dupre, fall back to modus-vivendiCraig Jennings8 days14-1480/+23
| | | | WIP, the theme-studio export, is the active theme. dupre was only the fallback and a structural reference. Move the fallback to the built-in modus-vivendi, guaranteed present everywhere this config loads. Delete the three dupre files plus its test and palette assets, and fix the stale comments that pointed at dupre-faces.el for the auto-dim and org-keyword faces (those moved to org-faces-config.el). Repoint the dupre-clear-theme spec's palette reference to git history.
* docs: move the two docs-root specs into docs/specs/Craig Jennings8 days3-10/+18
| | | | Finish the reorg: theme-studio-palette-generator (doing — core planner, UI, and generatortest gate shipped, one refinement open) and theme-studio-semantic-theme-architecture (not-started) lived in docs/ root. Moved both into docs/specs/ with status filenames, ID and STATUS drawers, and id-linked references. Fixed their Related links from ../todo.org to ../../todo.org for the deeper path.
* docs: move specs to docs/specs/ with lifecycle-status filenamesCraig Jennings8 days48-84/+345
| | | | | | Separate the 27 formal specs from working notes. Specs move to docs/specs/, notes stay in docs/design/. Each spec carries its lifecycle in the filename (-spec, -spec-doing, -spec-implemented, -spec-superseded) plus an authoritative ID and STATUS property drawer. The status came from checking each spec against the code, not the doc's own field: 6 implemented, 8 in progress, 12 not started, 1 superseded. Inbound links become org-id links so future status renames don't break them; code-comment paths repoint to docs/specs/. Working notes, inventories, reviews, and brainstorms stay in docs/design/.
* docs: file roam-inbox tasks, face/font diagnostic spec, close org-facesCraig Jennings8 days2-1/+234
| | | | File the roam-inbox backlog (face/font diagnostic popup, gold-text-in-dimmed-buffers, and the theme-studio bugs: elfeed all-white, dashboard preview icons, converter :inherit gap, cursor row controls, sample renames). Add the face/font diagnostic spec the lead task references. Close the org-faces feature as DONE and file its residual visual round-trip as a VERIFY under Manual testing and validation.
* chore(theme-studio): refresh WIP theme export and deployed themeCraig Jennings8 days2-387/+462
| | | | Latest theme-studio tuning pass: updated theme.json export and the regenerated themes/WIP-theme.el it deploys.
* build: add deploy-wip target for live WIP theme reloadCraig Jennings8 days1-1/+14
| | | | Build scripts/theme-studio/WIP.json into themes/WIP-theme.el, load it into the running daemon via the existing theme-reload target, and fire a silent desktop notification on success. The notify runs after the reload, so a build or load failure aborts before claiming the theme deployed.
* feat(theme-studio): add org-faces app for agenda keyword and priority colorsCraig Jennings8 days5-3/+75
| | | | Surface the org-faces-config.el header-row faces as their own theme-studio app, placed beside elfeed and mu4e so it reads as a custom layer rather than built-in org. The seed mirrors the module defaults exactly across all 28 faces (10 keywords, 4 priorities, and their dim variants), so the editor opens on the live colors. The preview shows a focused agenda block and an auto-dim block covering every face.
* feat(auto-dim): dim the org-faces header-row faces in unfocused windowsCraig Jennings8 days1-13/+15
| | | | auto-dim remapped the now-orphaned dupre-org-* keyword and priority faces to their -dim variants; this repoints it at the live org-faces-* layer (org-faces-config) so an unfocused window dims keywords and priorities to a darker shade of their own hue instead of leaving them at full color. Picks up DELEGATED and CANCELLED, which the dupre set never had. The dupre-org-* faces stay defined in dupre-faces.el but are no longer referenced here.
* feat(org): themeable agenda header-row faces via org-faces-configCraig Jennings8 days6-0/+515
| | | | | | Each TODO keyword and priority cookie gets its own named face instead of sharing org's built-in org-todo / org-done / org-priority. org-faces-config.el defines org-faces-<keyword> and org-faces-priority-a..d (plus -dim variants for auto-dim), each with a real default color, and wires them through org-todo-keyword-faces and org-priority-faces once org loads. The file is org-faces-config, not org-faces, because org ships its own org-faces feature that the bare name would shadow. This re-introduces the per-keyword/priority coloring that was stripped earlier, now as a named, theme-agnostic layer a theme can override. The design and the four resolved decisions are in docs/design/org-faces-spec.org; a theme-studio "org-faces" app and the auto-dim repoint follow in later phases.
* refactor(dashboard): drop the theme-test layout and tidy the configCraig Jennings8 days1-107/+30
| | | | | | I removed the theme-test layout: the configured/theme-test startupify variants and the cj/dashboard-show-theme-test-layout and restore commands I'd added to inspect faces live. Live theme testing now uses the loaded theme plus theme-studio's dashboard preview, so the extra layout isn't needed. While here I dropped the obsolete dashboard-set-footer and dashboard-set-navigator toggles (dashboard-startupify-list controls footer and navigator as of dashboard 1.9.0), normalized cj/dashboard-only's tabs to two spaces, and declared el (the variable dashboard binds for the bookmark-insertion override) so it stops byte-compiling as a free variable.
* refactor(theme-studio): derive the gate list and sentinel the samples splitCraig Jennings8 days3-2/+7
| | | | | | run-tests.sh built its browser-gate list by hand, so a new gate could go unrun or a removed one stay listed (that drift hid the #familytest alias). It now derives the list from the gate blocks in browser-gates.js. generate.py split samples.py on the first "cols=" substring to import only the data section, which would truncate at the wrong place if "cols=" ever appeared earlier. Both sides now use an explicit THEME_STUDIO_DATA_END marker.
* refactor(theme-studio): extract the shared package-preview wrapperCraig Jennings8 days2-40/+46
| | | | The 20 line-based renderXxxPreview functions each ended with a byte-identical monospace-pre wrapper. They now build their L array and return previewLines(L), so the wrapper lives in one place and can't drift across the family.
* refactor(theme-studio): spec-table the bespoke apps, guard the palette dedupCraig Jennings8 days1-23/+28
| | | | The bespoke APPS dict was 21 hand-repeated lines of the same shape. It's now a (key, label, preview, FACES, prefix, SEED) spec list turned into the dict by one comprehension, so adding an app is one row. add_palette_color's dedup set tolerates a palette row with no name slot instead of indexing past its end.
* chore(theme-studio): remove dead code and clear a type warningCraig Jennings8 days8-199/+7
| | | | | | | | | - ramp (app-core.js) and its test-ramp.mjs: superseded by regenColumn, no production caller. - optList (app-core.js) and its tests: superseded by paletteOptionList. - ITALIC in generate.py: computed, never read (ITALIC_MAP is the live one). - a stray empty string in MU4E_FACES that .split() silently dropped. - the dead #familytest alias in the columntest gate, which HASHES never listed. - widen face_rows to Sequence[str], clearing the list-invariance warnings on the APPS calls.
* fix(theme-studio): make broken browser gates fail instead of silently passingCraig Jennings8 days3-9/+17
| | | | | | run-tests.sh scored each browser gate by grepping the dumped DOM for the gate name and taking the first match. A gate that throws before setting its verdict left its own inlined source as the first match, and that source, "GATENAME '+(ok?'PASS':'FAIL')", contains the literal PASS, so the run reported green for a gate that never produced a verdict. The matcher now requires a resolved "GATENAME PASS" or "GATENAME FAIL". That exposed two gates that had been throwing unnoticed. baseedittest still referenced fam after the variable was renamed to column, so it ReferenceError'd. columntest read getComputedStyle on a palette chip captured before a re-render detached it, so the match returned null and threw. baseedittest now uses column, and columntest re-queries the live chip by its selection index.
* chore(themes): track generated theme outputsCraig Jennings8 days2-2/+540
| | | | Drop the theme-theme.el ignore and check in WIP-theme.el, so the deployable themes the studio generates live in the repo. The studio JSON sources stay ignored as scratch.
* fix(theme-studio): hold the package preview heightCraig Jennings8 days2-2/+2
| | | | Selecting a compact package (auto-dim, with a 2-row face table and a short preview) collapsed the package section and shortened the page. A 60vh floor on the preview keeps the section sized to the largest of the columns, the preview, or that floor, so switching packages no longer shrinks the page.
* fix(theme-studio): name exported themes from the source filenameCraig Jennings8 days3-5/+26
| | | | The converter took the theme name from the JSON's internal name field, so every draft whose field read "theme" overwrote theme-theme.el. It now uses the JSON file's basename, so WIP.json becomes WIP-theme.el and each draft lands under its own name. The reload target derives the load name from the basename too, and a regression test pins it: the filename wins over the internal field.
* feat(theme-studio): auto-dim split previewCraig Jennings8 days8-5/+142
| | | | | | | | auto-dim-other-buffers is a package face, not a theme face, so build-inventory.el (it scans only elpa/straight packages) never listed it and the studio couldn't theme it. This adds it as a bespoke app. The preview is a vertical split: the focused window on the left in real syntax colors, the same code on the right collapsed to the single auto-dim-other-buffers face, the way Emacs renders a non-selected window. Both panes follow the language selector. A trailing row shows auto-dim-other-buffers-hide, whose foreground matches the background so it vanishes when dimmed. A #autodimtest gate covers the split, the uniform recolor, and language sync.
* fix(theme-studio): keep dropdown color names legibleCraig Jennings8 days3-3/+32
| | | | | | The color-picker popup colored each row's name and hex for contrast against the swatch, but the rows sit on the popup's fixed dark background. A mid or dark swatch (the blues past blue-1) got near-black text that vanished on the dark popup. The text now inherits the popup foreground for every real palette color. Only the solid "default" row, whose background is the color itself, still contrasts against its own fill. I moved the decision into dropdownRowTextColor with unit coverage, including a dark-swatch regression case.
* chore(theme-studio): drop scratch theme JSONs, ignore working artifactsCraig Jennings8 days6-43430/+4
| | | | Remove the distinguished-revised, distinguished-test, dupre-rebuild, dupre-revised, and sterling2 experiment snapshots, and ignore WIP.json and themes/theme-theme.el so working scratch stays out of the tree.
* feat(dashboard): theme-test layout for live face inspectionCraig Jennings8 days1-17/+100
| | | | | | The dashboard's startupify-list, items, and item-generators move from inline :custom values into named defconsts, so the layout-toggle commands can reuse them. cj/dashboard-show-theme-test-layout swaps in a layout that enables init-info, the footer, and a deliberately empty section, so the live dashboard exposes faces the normal layout hides, dashboard-no-items-face among them. cj/dashboard-restore-configured-layout returns to the normal layout. Both refresh the buffer in place.
* feat(theme-studio): make targets for the build-theme converterCraig Jennings8 days2-2/+63
| | | | theme-studio-theme converts a Theme Studio JSON export to themes/<name>-theme.el. theme-studio-theme-load disables the custom themes and loads one in the running Emacs. theme-studio-theme-reload chains the two. Each delegates to the scripts/theme-studio/Makefile and errors clearly when its required JSON or THEME argument is missing.
* feat(theme-studio): palette generator and preview fidelityCraig Jennings8 days17-649/+3414
| | | | | | | | | | Two strands land together because the generated theme-studio.html bundles every source file into one page and can't be split cleanly. The palette generator is a preview-first panel: palette-generator-core.js plans the palette and palette-generator-ui.js draws it. Generated colors stay inspectable and tunable through the existing selector, and committing one creates a normal base column. It adds source-mode and scheme controls, a configurable accent count, and color names from color-names.json. For preview fidelity, syntax and UI colors now resolve through the real Emacs inherit chains, so the preview matches how Emacs renders the theme. resolveSyntaxFg pins dec to ty (Emacs has no decorator face) and otherwise follows comment-delimiter to comment, doc to string, property to variable, function-call to function-name. resolveUiAttr walks mode-line-inactive to mode-line and line-number-current-line to line-number. The decorator label now reads "decorator to type" to match the type face Emacs uses for it. Design recorded in the two theme-studio specs under docs/.
* test: reconcile build-theme tests with nested syntax formatCraig Jennings8 days1-17/+24
| | | | | | The converter reads theme.json's nested "syntax" shape: each category is an object with fg/bg/bold/italic, and bg/p are category objects carrying fg. The tests still drove the old flat "assignments"/"bold"/"italic" format with 3-arg syntax calls, so they passed only against a stale build-theme.elc. Rebuilt against the source, six tests failed on the wrong API. I updated the fixture JSON and every call site to the nested 1-arg signature. No production code changed. The converter and theme.json were already the source of truth.
* refactor(ui): color the cursor and modeline from theme faces, in syncCraig Jennings8 days6-382/+278
| | | | The cursor color and the modeline buffer-name indicator both hard-coded hex colors through cj/buffer-status-colors. Replaced that constant with cj/buffer-status-faces, mapping each buffer state to a theme face: read-only to error, overwrite and modified to warning, unmodified to success. A shared classifier (cj/buffer-status-state) and resolver (cj/buffer-status-color) in user-constants now drive both consumers, so the cursor and the modeline resolve their color from the active theme at use time and stay in sync, including the ghostel-terminal case the cursor already special-cased. Tests cover the map, the classifier, the resolver, and both integration paths.
* refactor(org): let the theme color todo keywords and prioritiesCraig Jennings9 days1-20/+3
| | | | org-todo-keyword-faces and org-priority-faces pinned the keywords and priority cookies to dupre-org-* faces, which only exist when the dupre theme is loaded. Under any other theme those faces are undefined, so org keywords and priorities fell back to the default face instead of the theme's org-todo / org-done / org-priority. Dropped both maps so org follows whatever theme is active. The TODO state sequence and the priority range stay.
* fix(slack): autoload w/@/# commands, guard close-all, register the prefixCraig Jennings9 days3-4/+48
| | | | Three lifecycle gaps that bit before slack loads. The w / @ / # keys bound slack-message-write-another-buffer, slack-message-embed-mention, and slack-message-embed-channel, none autoloaded or in :commands, so they void-function'd before slack started; added them to :commands. cj/slack-close-all-buffers read slack-current-buffer via buffer-local-value on every buffer, which signals void-variable on buffers without the local binding; it now guards with buffer-local-boundp like its sibling. And C-; S was bound with a raw global-set-key, invisible to the keybindings registry; it now registers through cj/register-prefix-map like the signal and erc prefixes.
* fix(erc): one mention notification, real server list, runtime requireCraig Jennings9 days3-5/+70
| | | | Three audit defects. erc-modules carried the built-in notifications module while :config also added cj/erc-notify-on-mention to the same erc-text-matched-hook, so every mention popped two desktop notifications. Dropped notifications from erc-modules and kept the custom one. cj/erc-connected-servers compared a buffer's erc-server-process to itself inside with-current-buffer (always true), so it returned every ERC buffer; it now filters on erc-server-buffer-p and erc-server-process-alive. And user-constants moved from an eval-when-compile-only require to a runtime require, since user-whole-name is read at load time for erc-user-full-name.
* refactor(faces): let the theme own face appearanceCraig Jennings9 days5-90/+6
| | | | Strip per-module face configuration so the active theme is the single source of face styling. Removed the dired text-greying set-face-attribute calls (kept the buffer-local face-remap), the org appearance set-face-attribute calls, the highlight-indent-guides colors, the rainbow-delimiters depth colors (which were overriding the theme's blue with red), and the cj/music-* defface forms plus the emms-playlist custom-set-faces. Left nerd-icons' set-face-foreground alone, since it's runtime tint logic rather than static config. Each touched file is backed up beside it as <name>.el.faces.bak (untracked). The cj/music-* faces now come from the theme instead of the module, so until the theme provides them music rendering falls back to the default face.
* fix(modeline): drop per-render truename, guard vc fetch against signalsCraig Jennings9 days4-59/+70
| | | | The VC modeline cache rebuilt its key every render, and the key included file-truename, so a stat ran on every redisplay rather than once per refresh as the comment claimed. Now it keys on (file show-remote). A moved symlink target is caught at the next TTL refresh, when vc-backend resolves the link fresh. And cj/modeline-vc-fetch is wrapped in condition-case returning nil, so a git signal on a slow or unmounted filesystem degrades to no-VC-info instead of breaking all redisplay.
* Update theme studio palette workflowCraig Jennings9 days28-1792/+51998
|
* Add theme studio box color controlsCraig Jennings9 days5-32/+75
|
* Shorten theme studio reset erase labelsCraig Jennings9 days5-33/+32
|
* Clarify theme studio reset and erase actionsCraig Jennings9 days5-38/+83
|
* Add theme studio face color step arrowsCraig Jennings9 days7-30/+158
|
* Preview selected theme studio chip while pickingCraig Jennings9 days4-12/+40
|
* Change theme studio spans to endpoint divisionsCraig Jennings9 days6-35/+72
|
* Remove theme studio save buttonCraig Jennings9 days4-29/+10
|
* Fix theme studio span endpoint tilesCraig Jennings9 days7-31/+57
|
* Sort theme studio dropdown colors by lightnessCraig Jennings9 days4-8/+38
|
* Fix theme studio ground endpoint editCraig Jennings9 days3-6/+28
|
* Fix theme studio fg endpoint selectionCraig Jennings9 days3-6/+30
|
* Refine theme studio tile name editingCraig Jennings9 days6-9/+46
|
* Migrate roam inbox tasks to todoCraig Jennings9 days1-0/+36
|
* Make theme studio column delete saferCraig Jennings9 days5-10/+31
|
* Add theme studio Rust and Zig samplesCraig Jennings9 days6-5/+98
|