aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* fix(ui-navigation): undo-kill-buffer skips open files via equalCraig Jennings7 days2-1/+27
| | | | The visited-file filter used delq, comparing expand-file-name strings by eq, so an already-open file was never removed from the candidates (the skip logic was dead). Use delete (equal). Adds a test with the open file at the head of the list, where the eq/equal difference actually shows.
* feat(dashboard): g refreshes, Telegram moves to G, F1 refreshes on showCraig Jennings7 days2-2/+10
| | | | | - g on the dashboard now runs dashboard-refresh-buffer (the dired/magit convention) instead of opening Telegram. Telegram moves to G in the launcher table. - cj/dashboard-only (F1) refreshes before showing, so re-displaying the dashboard always lands on fresh content.
* feat(ui-navigation): C-x 2/3 show the dashboard in the new windowCraig Jennings7 days2-0/+97
| | | | Splitting with C-x 2 or C-x 3 now shows *dashboard* in the freshly created window and keeps point in the original, instead of mirroring the current buffer. cj/--split-show-buffer does the placement; cj/--dashboard-buffer fetches or opens the dashboard without disturbing windows.
* fix(eshell): flatten visual-commands, wire xterm-color correctlyCraig Jennings7 days1-14/+20
| | | | | - eshell-visual-commands is a flat string list, but add-to-list pushed the whole list as one element, so lf/ranger/htop/top never opened in a visual terminal. dolist the strings instead. (visual-subcommands/options are alists and were already correct.) - The xterm-color before-prompt hook was registered as eshell-before-prompt-hook, which use-package turned into eshell-before-prompt-hook-hook and never ran. Use the real hook name, and actually install xterm-color-filter into eshell-preoutput-filter-functions (dropping eshell-handle-ansi-color) so color output is interpreted.
* fix(prog-go): autoload gofmt so C-; f works under go-ts-modeCraig Jennings7 days1-0/+4
| | | | .go opens the built-in go-ts-mode, so nothing triggered the go-mode package: gofmt was never autoloaded (C-; f signalled void-function) and the :config setting goimports + exec-path never ran. Add :commands (gofmt) so the first format pulls go-mode and its config.
* fix(system-defaults): guard server-start and custom-file against batchCraig Jennings7 days2-4/+21
| | | | A raw module load under --batch started a server and dropped a throwaway custom-file temp on every run; the suite only passed because a testutil stubbed the server. Guard both with (unless noninteractive ...), the established pattern here. Adds a batch-load test for the custom-file guard.
* fix(auth-config): guard gpg-connect-agent, require user-constants at runtimeCraig Jennings7 days1-4/+6
| | | | | - The bare call-process to gpg-connect-agent in :config aborted init with file-missing on a machine without the binary. Guard it with cj/executable-find-or-warn. - user-constants was required only eval-when-compile, but authinfo-file is read at load time, so a standalone .elc load failed. Require it at runtime.
* fix(prog): keep electric-pair and line-number setup buffer-localCraig Jennings7 days6-13/+17
| | | | | | - Go/C/shell setup hooks called the global electric-pair-mode, so one prog buffer turned pairing on in org and text everywhere. Use electric-pair-local-mode. - prog-general set display-line-numbers-type inside the hook, after the mode turned on, so the first prog buffer of a session got absolute numbers. Set the type and width at top level instead. - Updated the go/c tests to stub the local mode.
* fix(eww): quick-add bookmarks to the default store, not a new dirCraig Jennings7 days1-5/+2
| | | | cj/eww-bookmark-quick-add let-bound eww-bookmarks-directory to a path and created a directory there, so B (eww-list-bookmarks) read an unreadable path and quick-added bookmarks vanished after restart. Use the default store both commands share.
* chore(todo): file studio inbox tasks, archive resolvedCraig Jennings7 days1-193/+183
|
* chore(todo): close the gallery color picker taskCraig Jennings7 days1-4/+5
|
* feat(theme-studio): 2D gallery color picker for the assignment dropdownsCraig Jennings7 days6-33/+234
| | | | | | | | | | - The color dropdown opens a grid, not a long list. - The grid mirrors the palette: ground strip, then a row per family. - Members run dark to light, with the current color outlined. - A default chip clears the assignment. - A (gone) cell shows a color no longer in the palette. - The trigger and step buttons stay the same. - All three tiers share the one dropdown.
* feat(theme-studio): show view-area > element usages on palette tile hoverCraig Jennings7 days5-8/+106
| | | | I added paletteUsages, which enumerates every place a color is assigned, grouped by view area (the view dropdown's names: color/code assignments, ui faces, each package app) and the element within it. renderPalette builds the per-area scopes once and appends the list to each used tile's hover title, under the existing name/hex/nearest-deltaE line. Node tests and a #usagetest gate cover it.
* chore(todo): file ground() helper extraction refactorCraig Jennings7 days1-0/+2
|
* style(theme-studio): thin the barber-pole flag borderCraig Jennings7 days2-6/+6
|
* style(theme-studio): make the unused and gone flags a two-color barber-pole ↵Craig Jennings7 days2-6/+20
| | | | | | border The single-color dashed outline blended in. I replaced it with a ring of two alternating contrasting colors, drawn as a masked repeating gradient so it overlays without shifting layout. Unused tiles and columns use gold and black; gone assignments use red and white, keeping the two states distinct at a glance.
* chore(todo): close palette toggle/unused/gone tasks; flag max-spans ambiguityCraig Jennings7 days1-6/+11
|
* feat(theme-studio): flag gone color assignments with a borderCraig Jennings7 days4-2/+38
| | | | An assignment pointing at a color no longer in the palette showed only as "(gone)" on hover. I added a distinct solid border to the swatch whenever its current value resolves to "(gone)", so a broken assignment reads at a glance. The solid red outline is set apart from the dashed unused-tile flag, keeping the two palette-state cues distinguishable. A #gonetest gate covers the flagged and unflagged cases.
* feat(theme-studio): flag unused palette tiles and columnsCraig Jennings7 days6-8/+105
| | | | | | I added usedPaletteHexes, a reverse lookup over the syntax, ui, and package assignments (plus the ground endpoints) that resolves each reference to a hex. renderPalette outlines a tile whose color is referenced nowhere and outlines a whole column when none of its colors are used, so dead colors stand out for pruning before a theme ships. The check is biased safe: an unresolvable reference marks nothing, so a color that is actually used is never flagged. Node tests cover the lookup. A #unusedtest gate covers the tile and column flags.
* feat(theme-studio): add a palette display toggle for base colors vs full spansCraig Jennings7 days4-4/+62
| | | | I added an arrow control to the palette that collapses every column to its base color (right arrow) or expands to the full spans (down arrow), to conserve vertical space. Ground steps collapse too, leaving bg and fg. A #paltoggletest gate covers the collapse and the expand.
* chore(todo): close span-bounds/rename/cluster-size tasks; fix calendar-sync tagCraig Jennings7 days1-11/+15
|
* refactor(theme-studio): rename preview samples and match cluster button sizesCraig Jennings7 days3-14/+14
| | | | | | I renamed the preview personas to Christine (was Alice) and Evan (was Eve), trimming the mu4e header spacing so those rows stay aligned. I shrank the style cluster buttons from 26x24 to the 17x15 box-button size, so the two clusters match and the assignment row returns to roughly its pre-cluster height.
* fix(theme-studio): clamp generated palette spans to the bg/fg boundsCraig Jennings7 days5-20/+67
| | | | | | Spanning a color generated steps toward pure black and white, so a column could produce colors darker than bg or lighter than fg. I changed regenColumn to ramp the dark side toward the darker ground endpoint and the light side toward the lighter one, bounded by bg and fg. Pure black/white duplicates are still skipped, and callers that pass no ground fall back to the old black/white ramp. Node tests cover the bounded span and the no-ground fallback. The #counttest gate asserts the regenerated column stays within the bg/fg bounds.
* chore(todo): file two theme-studio palette tasks from roam inboxCraig Jennings7 days1-0/+4
|
* chore(todo): file roam-inbox theme-studio/emacs tasks; close reset-button ↵Craig Jennings7 days1-1844/+1860
| | | | task; reprioritize elfeed
* refactor(theme-studio): drop dead bindings and CSS left by the cluster workCraig Jennings7 days4-8/+6
|
* feat(theme-studio): reflow the B/I/U/S style buttons into a 2x2 clusterCraig Jennings7 days4-6/+30
| | | | | | The four style buttons sat in a horizontal row, the widest part of the style column. I wrapped them in the same 2x2 grid the box control uses, so they form a square (still multi-toggle, since bold and italic combine). The column narrows to roughly half its width across all three tiers. A #styletest gate confirms the four buttons live in a .stylecluster.
* feat(theme-studio): compact the box control into a 2x2 button clusterCraig Jennings7 days4-22/+92
| | | | | | | | The box control was a wide select plus a color swatch, pinning the box column at 166px. I replaced the select with a 2x2 cluster of radio buttons for the four styles: blank (no box), □ (line), ▼ (pressed), ▲ (raised). The color swatch now shows only while a box style is active, so the no-box case stays narrow. The column drops to 76px across all three tiers. A #boxtest gate covers the cluster: four buttons, radio selection, and the swatch hiding when no box is set. #beveltest now drives the style through the cluster button instead of the removed select. The same cluster shape sets up the B/I/U/S style column next.
* refactor(theme-studio): drop the per-row reset column from package facesCraig Jennings7 days4-10/+10
| | | | | | Package faces was the only tier with a per-row reset button, in its own column. The syntax and ui tiers rely on the bulk reset alone, and the column cost horizontal space the table needs. I removed the per-row cell and its header, so the bulk reset (next to "lock all") is the single reset path now, matching the other tiers. A #viewtest assertion confirms the package rows carry no per-row reset button. The two weren't equivalent: the per-row button reset one face to its default, the bulk reset clears every unlocked face in the app. Losing single-face reset is the accepted tradeoff.
* refactor(theme-studio): collapse assignment views into one dropdown panelCraig Jennings7 days4-14/+104
| | | | | | The assignment area was three stacked sections (color/code, ui faces, package faces), and package faces carried its own application selector. I merged them into one panel driven by a single dropdown: color/code assignments, ui faces, then a non-selectable "package faces" optgroup holding every app in order. Picking an entry swaps the left table and right preview, so only one view shows at a time. curApp now reads the selected app from that dropdown, and the old appsel is gone. A #viewtest browser gate locks in the dropdown order, the optgroup, and the one-view-at-a-time switching.
* chore(theme): update WIP theme buildCraig Jennings7 days1-103/+115
|
* chore(theme-studio): label highlighted preview line (process highlights)Craig Jennings7 days2-2/+2
|
* refactor(org-agenda): drop OVERDUE block, lead with the scheduleCraig Jennings7 days3-113/+33
| | | | | | The daily F8 agenda opened with an OVERDUE block that re-listed every past-due scheduled or deadline task. Those items already show in the SCHEDULE block on today's line, since org-scheduled-past-days and org-deadline-past-days are both 10000. The OVERDUE section was pure duplication. I removed it and moved SCHEDULE to the top so the calendar leads the view. The now-dead cj/org-agenda-skip-subtree-if-not-overdue helper, its header defvar, and the nine tests covering it are gone too.
* docs: spec the theme-studio preview-locate feature; file org-agenda app taskCraig Jennings7 days2-0/+152
| | | | Spec the general preview interaction: hover any element for its section/face/value, click a current-pane element to flash and jump to its assignment row, off-pane elements hover-only via a derived face->owning-app registry that previews also read for cross-pane live rendering. Decisions 5/5 settled. File the locate feature and the dependent org-agenda app (break the agenda faces out of the org-mode pane into their own, with a representative week-agenda preview) as tasks; org-agenda depends on the locate feature.
* feat(face-diagnostic): bind cj/describe-face-at-point to C-h FCraig Jennings7 days2-1/+12
| | | | Bind the diagnostic in the help cluster on C-h F (Face), Craig's pick. It shadows helpful-function, which also sits on C-h F in this config. face-diagnostic is required after help-config, so this binding wins. A test asserts C-h F resolves to the command.
* feat(face-diagnostic): Phase 4 render, command, and init wiringCraig Jennings7 days5-8/+219
| | | | Phase 4 completes the face/font diagnostic. cj/describe-face-at-point renders cj/--face-diagnosis-at into a read-only *Face Diagnosis* buffer (cj/face-diagnostic-mode), with a region-scan mode over distinct face-runs (capped at 20) and an out-of-scope banner. It is required in init.el. The render is split into small section formatters tested on captured plists, and the command is smoke-tested and live-verified in the daemon, where it already surfaces the active auto-dim remaps. The command name is settled as cj/describe-face-at-point. The keybinding stays Craig's pick, and face-name buttons plus the module-header allowlist entry are filed as a follow-up. The spec is marked implemented and renamed to its lifecycle filename. 35 ERT tests, byte-compile clean.
* feat(face-diagnostic): Phase 3 per-face provenance traceCraig Jennings7 days3-6/+129
| | | | Add group 5 to the diagnostic core: per-face provenance. cj/--face-diag-provenance reports, for each named face in the stack, which themes set it (theme-face), whether config saved or customized it (saved-face / customized-face), its :inherit chain, and the attributes still unspecified after inherit-following (the ones that fall through to the default -- the direct read on the all-white-elfeed class of bug). The version-sensitive theme-face / saved-face internals sit behind small accessors that treat missing properties as absent rather than erroring. 30 ERT tests, byte-compile clean.
* feat(face-diagnostic): Phase 2 merged attributes and real fontCraig Jennings7 days4-9/+151
| | | | Extend the diagnostic core with the effective merged attributes and the real-font layer. cj/--face-diag-merged-attributes folds the ordered, remap-expanded spec stack (overlays over text-props over default), taking the first non-unspecified value per attribute, labeled "computed". cj/--face-diag-real-font reports font-at's font, or "unavailable" under batch and on terminals. cj/--face-diagnosis-at now returns groups 0-4. Settles spec decision #7 (the hand-fold approach), pinned by fixtures: overlay-over-text-prop, a default remap, a face-symbol attribute. 23 ERT tests, byte-compile clean.
* feat(face-diagnostic): Phase 1 pure read model for the face/font diagnosticCraig Jennings7 days3-2/+315
| | | | modules/face-diagnostic.el carries the Phase 1 core of the face-at-point diagnostic: cj/--face-diagnosis-at returns a plist with the buffer classification (theme-faced / terminal-ansi / document-shr / image-no-text), the character context (char, codepoint, Unicode name, script), and the face stack separated by source (text-property faces, overlays by priority, active face-remapping-alist entries, default). Built from small pure helpers, no display or prompts. 17 ERT tests cover Normal/Boundary/Error per helper. Not yet wired into init.el; the interactive command, rendering, and keybinding land in Phase 4. Spec: docs/specs/face-font-diagnostic-popup-spec.org.
* chore(todo): close org-capture popup manual-verify as passedCraig Jennings7 days1-7/+2
|
* refactor(org-capture): single-Task desktop popup into the org-roam inboxCraig Jennings7 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 Jennings7 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 Jennings7 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 Jennings7 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 Jennings7 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 Jennings7 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 Jennings7 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 Jennings7 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.