Commit graph

1164 commits

Author SHA1 Message Date
Adam Brown
e495edb421
Add scene tags, scene notes, and four new analytical notes to example project 2026-05-12 22:17:49 -07:00
Adam Brown
2384f5886e
View tags now invoke global search 2026-05-12 21:20:39 -07:00
Adam Brown
95f9aa6337
Refresh index service with stats 2026-05-12 20:40:29 -07:00
Adam Brown
74accd02b1
Add short-form aliases to characters and add Pigeon entry 2026-05-12 20:24:26 -07:00
Adam Brown
08a4e82208
Add 17 encyclopedia entries (characters + places) to example project 2026-05-12 15:32:35 -07:00
Adam Brown
ae4b018e5e
Set Lewis Carroll as example project author with custom theme colors 2026-05-12 15:29:16 -07:00
Adam Brown
4bdbf6bf6c
Tag example project encyclopedia, notes, and timeline events 2026-05-12 15:27:02 -07:00
Adam Brown
b2ea155c47
Seed example project with pre-confirmed references and scene outlines 2026-05-12 15:21:15 -07:00
Adam Brown
bb9094b0b6
Fix auto-confirmed references being clobbered by stale panel state 2026-05-12 15:09:15 -07:00
Adam Brown
51b8d81b7c
Fix scene buffer not being marked dirty 2026-05-12 14:38:13 -07:00
Adam Brown
b1eff6a632
Expandable nav rail with sliding indicator 2026-05-12 14:00:55 -07:00
Adam Brown
e4cf5a9028
Redesign Global Search 2026-05-12 13:16:51 -07:00
Adam Brown
5ad1bccbc7
Redesign Import & Export dialogs 2026-05-12 13:02:19 -07:00
Adam Brown
ca2e86dd65
Localize strings 2026-05-12 12:50:47 -07:00
Adam Brown
76883d7c25
Add Story Info home-screen widget
Resizable single-project stats widget (4x1 / 2x2 / 3x2 / 3x3+) showing
total word count, cadence-goal progress, today/streak, a 7-day sparkline,
and Open/Note actions. Adds a config activity for project selection.

Bumps Glance to 1.2.0-rc01 and wires up providePreview + setWidgetPreviews
so all three widgets render previews on Android 15+ pickers. Adds the
project name to the Add Note widget header. Extracts parseDailyWordTotals
and formatWidgetWords as shared helpers.
2026-05-12 12:03:44 -07:00
Adam Brown
cb171c5cb4
Fabricate writing activity when installing the example project 2026-05-12 00:53:22 -07:00
Adam Brown
456c38fb59
Restyle Add Note widget with editorial design 2026-05-12 00:11:00 -07:00
Adam Brown
038894adf6
Fix scene metadata panel not showing when narrow 2026-05-11 23:14:15 -07:00
Adam Brown
6476f6b5e2
Merge branch 'claude/wonderful-villani-a4f3fc' into develop 2026-05-11 22:55:47 -07:00
Adam Brown
a7a1f0e400
Memoize tag suggestions and dedupe rankedTags updates
- Wrap suggestion derivation in remember(...) so HdHairlineTagField
  and the encyclopedia tag-add dialog only recompute when the draft
  or existing-tag set changes.
- Replace HdHairlineTagField's nullable suggestTags param with an
  empty-default lambda, removing the inline null check.
- Extract the FlowRow-of-chips suggestion strip into a shared
  HdTagSuggestionStrip composable; the design-system field and the
  encyclopedia dialog now use it.
- Guard rankedTags updates in BrowseNotes and TimeLineOverview
  components so identical lists don't propagate downstream.
2026-05-11 22:52:43 -07:00
Adam Brown
a704a78446
Add tag suggestion dropdown to tag input fields
HdHairlineTagField now accepts an optional suggestTags callback and
renders a row of suggestion chips below the input as the user types.
Project components inherit a suggestTags implementation from
ProjectComponentBase that delegates to TagIndexService.suggest, scoped
to the top 5 results across all entity types.
2026-05-11 22:24:00 -07:00
Adam Brown
b761e5fcf1
Source filter-bar tag suggestions from TagIndexService
BrowseNotes and TimeLineOverview now expose a rankedTags Value sourced
from TagIndexService. UIs subscribe to it instead of recomputing
buildTagIndex from the in-memory list on every frame.
2026-05-11 22:11:58 -07:00
Adam Brown
9825dc8cfb
Extract shared cleanTags into TagNormalizer
Removes identical private cleanTags from EncyclopediaRepository,
NotesRepository, and TimeLineRepository in favor of one top-level
function in the tagindex package.
2026-05-11 21:53:01 -07:00
Adam Brown
f51e53b030
Merge branch 'claude/goofy-chandrasekhar-95334b' into develop 2026-05-11 21:51:47 -07:00
Adam Brown
8a37342e16
Add sort menu to the projects list 2026-05-11 21:50:10 -07:00
Adam Brown
84beb98356
Add TagIndexService
Aggregates tags from encyclopedia, notes, and timeline events into a
project-scoped reactive index for ranking and lookup. Each repository
gains a contentChangedFlow signal that drives a debounced rebuild.
2026-05-11 21:48:10 -07:00
Adam Brown
b84f283afd
Show project word count on the projects list 2026-05-11 21:36:01 -07:00
Adam Brown
0c0a9f37df
Redesign sync conflict screens 2026-05-11 21:21:14 -07:00
Adam Brown
d77564c6ad
Redesign Account Settings
Brings Account Settings in line with the Hammer design system: breadcrumb,
§ 0 Hero with version greeble, six numbered sections at 64dp spacing, and
a folio caption footer. Drops every M3 Surface/card/button on the screen.

§ III Sync gets a new HdCatalogueCard affordance — a doubled-hairline
library-index-card with four corner greeble slots — to highlight
connection state above the rest of the page.

Lifts three helpers from Project Settings into the design system so both
screens share them: HdHairlineCheckbox, HdHairlineToggleRow, and a
generic HdHairlineSegmentedPicker (replaces the per-screen CadencePicker).
Adds a danger tone to HdHairlineButton and an inline error to
HdHairlineField. Per-platform PlatformSettingsUi (Android + Desktop)
also moves to Hd* primitives.
2026-05-09 23:59:03 -07:00
Adam Brown
18221fcd42
Redesign project selection 2026-05-09 12:57:34 -07:00
Adam Brown
63669c11f8
Redesigned Confirmation Dialogs
Redesign project settings
2026-05-08 23:03:19 -07:00
Adam Brown
a8dcb412be
Redesigned Outline Overview 2026-05-08 17:20:28 -07:00
Adam Brown
5cbc83e7bb
Add tags to global search 2026-05-08 16:58:26 -07:00
Adam Brown
b40939f249
Tweaking edit views 2026-05-08 01:38:20 -07:00
Adam Brown
4ba803b8eb
Redesign Create & View Timeline Event 2026-05-08 00:33:09 -07:00
Adam Brown
ae78382e7a
notes: redesign View Note as catalogue-card modal; add HdEntityId
- View Note now reads as a hairline-framed modal with a CrumbRow
  (back to Notes + delete-via-menu) over a StampRow (section label,
  meta, Edit/Save), matching the encyclopedia entry vocabulary. Folio
  footer flips to a status row in edit mode.
- Add HdEntityId design-system primitive: zero-padded type-prefixed
  identifier (NOTE-007, ENT-034, SCN-12). Used in the notes folio
  footer and the scene metadata panel masthead.
2026-05-07 23:12:16 -07:00
Adam Brown
1bb68a5b6f
Added tags to timeline events 2026-05-07 23:10:15 -07:00
Adam Brown
2b594654ca
Redesign Notes! 2026-05-07 22:02:00 -07:00
Adam Brown
4311969246
Shorten nav string 2026-05-07 00:44:31 -07:00
Adam Brown
9e0049465d
Added tags to the NoteContent entity 2026-05-07 00:43:25 -07:00
Adam Brown
2734b596b3
Redesign scene list to match the editor's manuscript aesthetic
Replace the emoji header and Surface/elevation scene cards with the
hairline + mono-label vocabulary used by the rest of the redesigned
editor. Top-level group rows now lead with a chevron and display title;
nested groups keep the folder icon. The two floating FABs become a
footer row with the Outline Overview button and a + dropdown for new
scene/group; the footer hides on scroll-down and reveals on scroll-up
to reclaim vertical space on narrow layouts. The list uses
surfaceContainerLow only when in a split pane (sidebar context); on
mobile single-pane it sits on plain surface so it doesn't read as
phantom panel chrome. The list/editor split divider drops from 1dp
outline to Dp.Hairline outlineVariant.
2026-05-02 23:09:38 -07:00
Adam Brown
4fab077237
Simplify scene metadata panel: efficiency and reuse fixes
- Add change-detection guard to the SceneEditor settings observer so
  unrelated GlobalSettings emissions (font size, dnd, locale, ...) don't
  rebuild the SceneEditor.State on every emit.
- Memoize isWide and the onToggleMetadata callback in SceneEditorUi so
  EditorTopBar's parameter identity is stable across recompositions and
  Compose can skip when nothing changed.
- Wrap the EntryDef groupBy in remember(refs) for both ReferencesBody
  and DismissedBody so partition only runs when the lists actually
  change.
- Drop the redundant derivedStateOf around the dialog suggestions list
  (no observable Snapshot reads inside; plain remember is enough).
- Migrate AddReferenceDialog from raw Dialog to the new AnimatedDialog
  wrapper so it gets fade+scale animation and predictive-back support
  for free, matching the panel modal.
- Colocate per-bucket search placeholder strings on RefBucket via a new
  searchPlaceholder() extension instead of an inline when expression at
  the call site.
- Strip narration comments throughout SceneMetadataPanelUi.kt (// Header,
  // Outline, // Notes, // Type tabs, // Search, // Footer, etc.).
- Drop two now-unused string resources (add_placeholder, add_no_matches)
  superseded by the add_dialog_* family.
2026-05-02 22:18:49 -07:00
Adam Brown
1913dfb25d
Remove 'Create new in encyclopedia' hint from add-reference dialog
The hint read button-like even though it was just a label. Drops it
entirely; the dialog's empty state is now just the 'No matching
entries.' line. Removes the now-unused string resource.
2026-05-02 22:00:05 -07:00
Adam Brown
dd3073a287
Persist metadata-panel visibility on wide layouts
Splits the panel-visibility concern into two paths:

- Wide layouts (in-line aside) read GlobalSettings.metadataPanelVisible.
  Tapping the info icon flips the persisted setting via
  toggleMetadataPanelVisible(), so the panel state survives across
  sessions. Default true.
- Narrow layouts (Dialog) keep the existing transient behavior via
  toggleMetadataModal() and the State.showMetadataModal flag.

The breakpoint decision still lives in SceneEditorUi (the component
intentionally doesn't know about screen width); SceneEditorUi derives
isWide once and dispatches the right toggle into EditorTopBar via a new
onToggleMetadata callback parameter on the expect/actual function.

Renames State.showMetadata -> showMetadataModal so future readers don't
conflate the persistent and transient flags. The new
GlobalSettings.metadataPanelVisible field carries a KDoc noting it's UI
state living in settings until we have a dedicated window-state store.
2026-05-02 21:51:54 -07:00
Adam Brown
930005a0ce
Restyle scene metadata panel and editor top bar to design system
Adds HdUnsavedBadge and HdReferenceChip primitives, extends
HdMetadataItem with selectable and CollapsableSection with a trailing
action slot. Rewrites SceneMetadataPanelUi: hairline-underline fields
for outline / notes / draft name, references partitioned into
Characters / Locations / Other, dismissed promoted to a peer
collapsable, advanced rendered with HdMetadataItem, and a new modal
AddReferenceDialog with type tabs and live autocomplete. EditorTopBar
swaps M3 Badge for the square-corner HdUnsavedBadge, and the desktop
metadata sidebar drops its outer padding wrapper to sit flush.
2026-05-02 18:29:16 -07:00
Adam Brown
b3e3e983c7
Tweak headers 2026-05-01 00:36:59 -07:00
Adam Brown
622640a6a0
Rebuild Encyclopedia entry detail as a catalogue card
Recasts the View Entry screen in the same hairline-and-mono editorial
voice as the rest of the redesigned encyclopedia: type stamp + folio
meta, massive 200-weight name, an inset figure (240x320 wide, full-width
on compact), a Particulars ledger of type/tags/aliases/scenes, paired
Tags and Aliases sections, an Appears-in-scenes list, and a colophon
footer. The folio meta swaps out for Save/Cancel during edit mode so
the row never overflows on narrow screens.

Adds a matching shared-element on the entry image so it animates from
the browse-card hero bounds straight to the inset bounds, instead of
being dragged along with the much larger card-bounds animation.

All user-facing copy lives in strings_encyclopedia.xml.
2026-04-30 21:54:29 -07:00
Adam Brown
a4d1996d0a
Redesign project home stats with activity heatmap and writing goals
Adds a 12-week activity heatmap, writing streaks, this-week summary, and
goal-progress card to the project home screen. Surfaces per-device word
totals, reading-time and page estimates derived from total words, and
chapter spread (min/max/std-dev) alongside scene length stats. Replaces
the chapter words bar chart with a line chart.
2026-04-28 23:18:59 -07:00
Adam Brown
585c9919c5
Apply project theme to project window UI
Renames ProjectTheme.color1/color2 to primary/secondary and pipes them
into a Material 3 ColorScheme via material-kolor's dynamicColorScheme.
The user's secondary seeds both the Material 3 secondary and tertiary
palettes, the Rainbow palette style keeps them in distinct hue lanes
instead of collapsing toward the primary, and surfaceTint is redirected
to secondary so elevated surfaces (cards, dialogs, top bars) pick up
the accent.

The override is hoisted to the platform entry points
(ProjectEditorWindow.AppContent on desktop, ProjectRootActivity.Content
on Android) so a single ProjectThemeOverride wraps the NavigationRail,
ProjectRootUi, FAB stack, and confirm-close dialogs. ProjectRootUi and
ProjectRootFab no longer self-wrap.

All five project FABs (notes, encyclopedia, timeline, scene group,
scene) explicitly draw containerColor/contentColor from
secondaryContainer so the second color is the obvious accent on the
heaviest visible chrome.
2026-04-28 20:59:15 -07:00
Adam Brown
b1189d50dd
Add per-project synced settings (author, theme, word goal)
New project-data sync phase runs before entity transfer. The blob is a
single per-project row on the server, hash-checked for conflicts; the
client surfaces a per-field pick-a-side resolver UI when both sides
edited concurrently. Author name is a text field, custom theme uses a
clickable color swatch backed by skydoves/colorpicker-compose, and the
word-count goal is cadence + count. Each opt-in section nulls out its
data when unchecked so the wire signal is unambiguous.
2026-04-28 19:31:45 -07:00