@@ -49,10 +49,13 @@ Button shape follows the job:
4949Use icons inside buttons when an icon exists. Do not replace familiar icon
5050actions with verbose text-only controls.
5151
52+ Read-status controls on memory cards and reader pages are icon-only action
53+ buttons. They keep accessible labels on the button. Open eye means unread
54+ (` read: false ` ), and closed eye means read (` read: true ` ).
55+
5256Paper themes add one deliberate material exception for archive actions:
5357
54- - Add-memory commands and List/Grid view toggles use the
55- ` trauma-paper-wax-seal ` treatment.
58+ - Add-memory commands use the ` trauma-paper-wax-seal ` treatment.
5659- Do not replace theme colours inside this treatment. The button's existing
5760 semantic background, text, border, hover, and ` aria-pressed ` classes stay in
5861 charge of colour.
@@ -74,22 +77,31 @@ Paper themes add one deliberate material exception for archive actions:
7477
7578## Browse Header
7679
77- The Memories browse header owns the list/grid view toggle. Keep the title block
78- and view toggle in one two-column grid row at every route width:
79-
80- - Title/eyebrow column: ` minmax(0, 1fr) ` so it can shrink.
81- - View mode column: ` auto ` , aligned to the inline end.
82- - Do not let phone layout push List/Grid below the ` Memories ` title.
83- - The shared narrow-route header container query can stack other route headers,
84- but ` MemoryBrowse ` uses its own header marker to remain a single row.
80+ The Memories browse header owns the read-state tabs, not a large route title
81+ or list/grid toggle.
82+
83+ - Render exactly three equal-width tabs: ` All ` , ` Unread ` , and ` Read ` .
84+ - ` All ` is the default state and removes read-state tokens from the search
85+ query.
86+ - ` Unread ` appends the standalone ` unread ` search token.
87+ - ` Read ` appends the standalone ` read ` search token.
88+ - The search bar and URL remain the source of truth for the filter state.
89+ - The active tab uses bold primary text plus a short rounded accent underline
90+ anchored to the tab bottom. Inactive tabs use muted text.
91+ - The tab strip stays in one sticky row at every route width.
92+ - These tabs are not wax controls. Paper/Hermès wax treatment remains reserved
93+ for archive commands such as Add memory.
8594
8695## Shell Popovers
8796
8897Left-rail transient controls open as anchored popovers rather than global
8998drawers:
9099
91- - Theme settings and Add memory composer use the same ` role="dialog" ` popup
92- pattern, ` aria-haspopup="dialog" ` , ` aria-expanded ` , and ` aria-controls ` .
100+ - Theme settings and Add memory composer use the shared ` Popup ` shell with
101+ ` role="dialog" ` , ` aria-haspopup ` , ` aria-expanded ` , and ` aria-controls ` .
102+ - General action menus use the same ` Popup ` shell with ` role="menu" ` . Memory,
103+ Moment, and Flashback delete actions use one danger menu-item treatment and
104+ the shared trash icon.
93105- Popovers close on Escape, outside pointer interaction, or successful
94106 completion of the contained workflow.
95107- Add memory keeps the shell-level command globally reachable, but the composer
@@ -110,8 +122,25 @@ Inputs use semantic surfaces:
110122Search inputs:
111123
112124- The browse route owns the memory search field.
125+ - The focus indicator belongs to the rounded search surface itself, using an
126+ inset ring so focus corners follow the search bar shape.
113127- The right rail does not contain a search field.
114128
129+ ## Taxonomy Rendering
130+
131+ Use ` TaxonomyList ` for category/tag chips and right-rail taxonomy filters.
132+
133+ - ` mode="chips" ` renders attached categories/tags on memory rows and reader
134+ intros, and the same chip styling is also used for right-rail category/tag
135+ filters.
136+ - Use ` density="compact" ` for right-rail chip lists when the section needs
137+ tighter item spacing than memory-row metadata.
138+ - Selectable chips use ` aria-pressed ` for active right-rail filters.
139+ - ` mode="filters" ` remains available for full-width taxonomy controls, but the
140+ current shell does not use it for the right rail.
141+ - Parents own route/query state; taxonomy rendering components do not know
142+ browse query keys.
143+
115144## Memory Browse Rows
116145
117146Memory rows are the primary archive scanning surface.
@@ -136,19 +165,24 @@ Grid mode reuses the same content and adds:
136165
137166## Flashback Excerpts
138167
139- ` FlashbackExcerpt ` is the shared excerpt component for browse cards and the
140- canonical ` /flashbacks ` view.
168+ ` FlashbackInlineText ` is the shared text primitive for right-rail Flashback
169+ shortcuts and the canonical ` /flashbacks ` view. ` FlashbackExcerpt ` is only a
170+ thin browse-card wrapper around the same primitive.
141171
142172Contract:
143173
144- - Rounded quote block.
145- - Left border uses ` border-trauma-quote-bar ` .
146- - Background uses ` bg-trauma-quote-bg ` .
147- - Text uses ` text-trauma-quote-ink ` .
148- - Flashback text uses ` mark ` with ` bg-trauma-flashback-bg ` .
174+ - Prefix and suffix context render around the selected Flashback text.
175+ - Context uses theme secondary/tertiary foreground tokens plus the shared
176+ Flashback context blur/mask treatment, so it stays visibly lower contrast
177+ than the selected text. The blur belongs to the prefix/suffix text spans, not
178+ to the whole Flashback card, list, or right-rail island.
179+ - The selected Flashback string uses normal primary readable contrast and a
180+ semantic ` mark ` element without becoming a separate highlighter badge.
149181- Optional link wraps the whole excerpt.
150182
151- Do not hand-roll separate flashback quote treatments for each route.
183+ Do not hand-roll separate Flashback text treatments for each route. ` /flashbacks `
184+ uses dense route rows: shared inline Flashback text first, then the source
185+ memory title as small supplemental metadata at the bottom.
152186
153187## Right Rail Sections
154188
@@ -167,17 +201,21 @@ route content containers. Contextual route content must stay small enough to
167201act as a right rail aid rather than a second main pane.
168202
169203When an island contains an unbounded list, the list body must be a bounded
170- scroll region. This is required for Flashback shortcut lists and reader TOC. Do not
171- let those islands grow vertically for every item.
172-
173- Reader TOC should make overflow discoverable. When its bounded list can still
174- scroll in a direction, show a low-contrast blur fade on that edge only. The
175- fade should make the edge entries look slightly hazy, not like a heavy shadow
176- or spotlight. Use neutral black in the fade recipe, not the primary/accent
177- colour. The top fade must start at the scroll body edge so text cannot appear
178- unblurred between the TOC heading and the fade. Use CSS gradients and masks to
179- soften the fade boundary; do not use JavaScript to paint the effect. Do not
180- render a fade for a direction that is not currently scrollable.
204+ scroll region. This is required for Flashback shortcut lists and reader TOC. Do
205+ not let those islands grow vertically for every item.
206+
207+ Reader TOC should make overflow discoverable. When the bounded TOC can still
208+ scroll in a direction, show a low-contrast blur fade on that edge only. The fade
209+ should make the edge entries look slightly hazy, not like a heavy shadow or
210+ spotlight. Use neutral black in the fade recipe, not the primary/accent colour.
211+ The top fade must start at the scroll body edge so text cannot appear unblurred
212+ between the heading and the fade. Use CSS gradients and masks to soften the fade
213+ boundary. Do not render a fade for a direction that is not currently scrollable.
214+
215+ Flashback shortcut lists do not use TOC scroll-edge overlays. Their focal
216+ treatment is per Flashback item: selected text remains normal and readable,
217+ while the stored prefix/suffix context uses the shared Flashback context
218+ blur/mask classes.
181219
182220## Add Memory Composer
183221
0 commit comments