Three curated symbol vocabularies — boards, lanes, and cards each pick from their own shelf
`CuratedSymbols` was one flat ~65-glyph list serving every style-editor target alike. It is now three level-specific sets — `boards` (project/container/identity), `lanes` (workflow/stage/status), `cards` (work-item/content) — each ~30-40 entries, seeded from the original list and `SymbolPickerCatalog.defaultSet`, reorganized by which level a glyph actually reads as being about. Overlap is kept where a glyph genuinely fits everywhere (`flag`, `star`). Wiring: - `BoardInfoPopover`'s board-glyph `SymbolPicker` now passes `CuratedSymbols.availableBoards` instead of the picker's domain-agnostic default. - The card sidebar's `SymbolPicker` (`CardSidebarSections`) now passes `CuratedSymbols.availableCards` instead of the old flat `available`. - The style editor's own curated grid (`StyleEditorView`, the Style… popover's only remaining anchor) reads `CuratedSymbols.availableForStyleEditor(level:spansLevels:)`: a homogeneous target reads its own level's set, and a target that somehow spans more than one level (today unreachable — 04-interactions.md's cards-XOR-lanes rule keeps a live selection homogeneous) reads the three combined, via a new `BoardStore.styleTargetSpansLevels` seam that asks the question `styleLevel(of:)` deliberately collapses. - `CuratedSymbols.combined` (the three sets' stable-order union) also replaces the old `.all` in `SymbolPickerCatalog`'s full-catalog fallback. - `SymbolPickerCatalog.defaultSet` is kept as the fallback for a caller naming no level (a future saved-search picker, say) rather than retired. DESIGN/03-board-ui.md and DESIGN/05-card-window.md's Styling/sidebar prose amended minimally where they named "the curated set" as a single list. Tests: three new/rewritten suites in KanbanTests/StyleModelTests.swift (set shape, availability, overlap, `combined`, the style-editor level/span decision, the board-anchor width tripwire), one new test in KanbanTests/StyleWriteTests.swift (`styleTargetSpansLevels`), and the old single-list-pinning tests in KanbanTests/SymbolPickerTests.swift and KanbanTests/CardSidebarTests.swift updated to the new set names. 2834 tests, 487 suites green (KanbanTests, arm64); one unrelated flaky failure (RootRecoveryTests.vanishAndReturn under full-suite load) passed clean in isolation. Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
@@ -33,11 +33,12 @@ import SwiftUI
|
||||
/// ### The curated set does not shrink
|
||||
///
|
||||
/// `SymbolPicker`'s own default (`SymbolPickerCatalog.defaultSet`, 36 general "boards and projects"
|
||||
/// glyphs) is deliberately smaller than `CuratedSymbols.all` (~65, grouped by what a board item *is*
|
||||
/// — status/flow, containers, people, …) — `SymbolPicker.swift`'s own doc comment states why the two
|
||||
/// lists are free to diverge. A card is exactly the domain `CuratedSymbols` was grouped for, so this
|
||||
/// section passes it explicitly (`symbols: CuratedSymbols.available`) rather than taking the picker's
|
||||
/// smaller default: the Style… popover and this section now offer the identical curated vocabulary,
|
||||
/// glyphs) is deliberately smaller than `CuratedSymbols.cards` (~40, work-item/content-flavored — one
|
||||
/// of the three level-specific sets `CuratedSymbols` split into, 2026-08-09) — `SymbolPicker.swift`'s
|
||||
/// own doc comment states why the lists are free to diverge. A card is exactly the level
|
||||
/// `CuratedSymbols.cards` is grouped for, so this section passes it explicitly (`symbols:
|
||||
/// CuratedSymbols.availableCards`) rather than taking the picker's domain-agnostic default: the
|
||||
/// Style… popover's card-level grid and this section now offer the identical curated vocabulary,
|
||||
/// through two different controls.
|
||||
///
|
||||
/// ### Writes still ride the one funnel, on this window's own stack
|
||||
@@ -187,7 +188,7 @@ struct CardStyleSection: View {
|
||||
SymbolPicker(
|
||||
current: currentSymbol,
|
||||
fallback: ItemSymbol.card,
|
||||
symbols: CuratedSymbols.available,
|
||||
symbols: CuratedSymbols.availableCards,
|
||||
onSelect: { applySymbol($0) },
|
||||
currentColor: currentIconColor,
|
||||
onSelectColor: { applyIconColor($0) }
|
||||
|
||||
Reference in New Issue
Block a user