@felloinnovations/brand-kit 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +198 -24
- package/CHANGELOG.md +197 -0
- package/README.md +34 -7
- package/design-system/01-how-claude-decides.md +26 -17
- package/design-system/02-principles.md +11 -6
- package/design-system/03-colour.md +134 -47
- package/design-system/04-type.md +45 -23
- package/design-system/05-space-and-layout.md +175 -52
- package/design-system/06-sizing-profiles.md +4 -4
- package/design-system/07-scrolling.md +66 -20
- package/design-system/08-choosing-components.md +50 -22
- package/design-system/09-charts.md +71 -28
- package/design-system/10-patterns.md +33 -10
- package/design-system/11-page-recipes.md +110 -23
- package/design-system/12-content.md +2 -1
- package/design-system/13-motion.md +330 -47
- package/design-system/14-accessibility.md +47 -24
- package/design-system/15-ai-experiences.md +11 -6
- package/design-system/16-creativity.md +1 -1
- package/design-system/17-decisions.md +357 -1
- package/design-system/18-checklist.md +79 -16
- package/design-system/19-public-pages.md +6 -4
- package/design-system/20-palettes.md +275 -0
- package/design-system/README.md +30 -17
- package/design-system/components/ActionList/README.md +96 -10
- package/design-system/components/ActionList/preview.html +52 -7
- package/design-system/components/ActionList/style.css +64 -0
- package/design-system/components/ActivityGrid/README.md +38 -2
- package/design-system/components/ActivityGrid/preview.html +1 -1
- package/design-system/components/ActivityGrid/style.css +35 -0
- package/design-system/components/AppShell/README.md +205 -75
- package/design-system/components/AppShell/preview.html +339 -58
- package/design-system/components/AppShell/style.css +154 -0
- package/design-system/components/Avatar/README.md +37 -10
- package/design-system/components/Avatar/preview.html +13 -4
- package/design-system/components/Avatar/style.css +14 -0
- package/design-system/components/Badge/README.md +41 -19
- package/design-system/components/Badge/preview.html +13 -10
- package/design-system/components/Badge/style.css +23 -0
- package/design-system/components/Banner/README.md +30 -9
- package/design-system/components/Banner/preview.html +1 -1
- package/design-system/components/Banner/style.css +19 -0
- package/design-system/components/Breadcrumb/README.md +58 -46
- package/design-system/components/Breadcrumb/preview.html +16 -16
- package/design-system/components/Breadcrumb/style.css +17 -0
- package/design-system/components/Button/README.md +113 -55
- package/design-system/components/Button/preview.html +98 -25
- package/design-system/components/Button/style.css +86 -0
- package/design-system/components/Card/README.md +158 -49
- package/design-system/components/Card/preview.html +141 -19
- package/design-system/components/Card/style.css +115 -0
- package/design-system/components/CardBoard/README.md +58 -37
- package/design-system/components/CardBoard/preview.html +26 -29
- package/design-system/components/ChatCard/README.md +115 -29
- package/design-system/components/ChatCard/preview.html +149 -32
- package/design-system/components/ChatCard/style.css +49 -0
- package/design-system/components/ChatShell/README.md +116 -0
- package/design-system/components/ChatShell/preview.html +201 -0
- package/design-system/components/ChatShell/style.css +86 -0
- package/design-system/components/ChatTurn/README.md +78 -35
- package/design-system/components/ChatTurn/preview.html +60 -28
- package/design-system/components/ChatTurn/style.css +50 -0
- package/design-system/components/CheckRow/README.md +141 -0
- package/design-system/components/CheckRow/preview.html +140 -0
- package/design-system/components/CheckRow/style.css +88 -0
- package/design-system/components/Checkbox/README.md +58 -22
- package/design-system/components/Checkbox/preview.html +112 -50
- package/design-system/components/Checkbox/style.css +45 -0
- package/design-system/components/Chip/README.md +78 -47
- package/design-system/components/Chip/preview.html +29 -4
- package/design-system/components/Chip/style.css +17 -0
- package/design-system/components/Combobox/README.md +44 -11
- package/design-system/components/Combobox/preview.html +35 -12
- package/design-system/components/Combobox/style.css +54 -0
- package/design-system/components/Composer/README.md +137 -35
- package/design-system/components/Composer/preview.html +115 -40
- package/design-system/components/Composer/style.css +81 -0
- package/design-system/components/ConfirmDialog/README.md +73 -52
- package/design-system/components/ConfirmDialog/preview.html +70 -26
- package/design-system/components/ConfirmDialog/style.css +5 -0
- package/design-system/components/Cover/preview.html +3 -3
- package/design-system/components/Cover/style.css +19 -0
- package/design-system/components/DateInput/README.md +77 -12
- package/design-system/components/DateInput/preview.html +27 -12
- package/design-system/components/DateInput/style.css +38 -0
- package/design-system/components/Dialog/README.md +112 -44
- package/design-system/components/Dialog/preview.html +141 -18
- package/design-system/components/Dialog/style.css +74 -0
- package/design-system/components/EmptyState/README.md +42 -12
- package/design-system/components/EmptyState/preview.html +11 -11
- package/design-system/components/EmptyState/style.css +9 -0
- package/design-system/components/EntryShell/README.md +73 -48
- package/design-system/components/EntryShell/preview.html +60 -27
- package/design-system/components/EntryShell/style.css +19 -0
- package/design-system/components/FeatureGrid/README.md +61 -39
- package/design-system/components/FeatureGrid/preview.html +2 -2
- package/design-system/components/FeatureGrid/style.css +20 -0
- package/design-system/components/FileUpload/README.md +33 -3
- package/design-system/components/FileUpload/preview.html +18 -4
- package/design-system/components/FileUpload/style.css +23 -0
- package/design-system/components/FilterBar/README.md +114 -0
- package/design-system/components/FilterBar/preview.html +82 -0
- package/design-system/components/FilterBar/style.css +22 -0
- package/design-system/components/Fold/README.md +84 -26
- package/design-system/components/Fold/preview.html +77 -34
- package/design-system/components/Fold/style.css +48 -0
- package/design-system/components/Footer/README.md +62 -39
- package/design-system/components/Footer/preview.html +5 -5
- package/design-system/components/Footer/style.css +30 -0
- package/design-system/components/FunnelBars/README.md +24 -3
- package/design-system/components/FunnelBars/preview.html +5 -5
- package/design-system/components/FunnelBars/style.css +13 -0
- package/design-system/components/GoalBars/README.md +54 -10
- package/design-system/components/GoalBars/preview.html +69 -28
- package/design-system/components/GoalBars/style.css +51 -0
- package/design-system/components/GoalTicks/README.md +74 -58
- package/design-system/components/GoalTicks/preview.html +41 -118
- package/design-system/components/GoalTicks/style.css +37 -0
- package/design-system/components/GoalTubes/README.md +29 -3
- package/design-system/components/GoalTubes/preview.html +6 -6
- package/design-system/components/GoalTubes/style.css +23 -0
- package/design-system/components/Heatmap/README.md +133 -0
- package/design-system/components/Heatmap/preview.html +168 -0
- package/design-system/components/Heatmap/style.css +119 -0
- package/design-system/components/Hero/README.md +58 -40
- package/design-system/components/Hero/preview.html +1 -1
- package/design-system/components/Hero/style.css +19 -0
- package/design-system/components/HoverCard/README.md +114 -0
- package/design-system/components/HoverCard/preview.html +107 -0
- package/design-system/components/HoverCard/style.css +59 -0
- package/design-system/components/IconButton/README.md +69 -38
- package/design-system/components/IconButton/preview.html +77 -43
- package/design-system/components/IconButton/style.css +45 -0
- package/design-system/components/Input/README.md +36 -11
- package/design-system/components/Input/preview.html +1 -1
- package/design-system/components/Input/style.css +23 -0
- package/design-system/components/KanbanBoard/README.md +93 -45
- package/design-system/components/KanbanBoard/preview.html +159 -43
- package/design-system/components/KanbanBoard/style.css +53 -0
- package/design-system/components/Kbd/README.md +25 -9
- package/design-system/components/Kbd/preview.html +6 -2
- package/design-system/components/Kbd/style.css +9 -0
- package/design-system/components/KitButton/README.md +81 -47
- package/design-system/components/KitButton/preview.html +35 -13
- package/design-system/components/KitButton/style.css +46 -0
- package/design-system/components/KitCard/README.md +75 -44
- package/design-system/components/KitCard/preview.html +18 -10
- package/design-system/components/KitCard/style.css +15 -0
- package/design-system/components/KitInput/README.md +54 -39
- package/design-system/components/KitInput/preview.html +7 -7
- package/design-system/components/KitInput/style.css +23 -0
- package/design-system/components/Leaderboard/README.md +76 -49
- package/design-system/components/Leaderboard/preview.html +61 -26
- package/design-system/components/Leaderboard/style.css +44 -0
- package/design-system/components/ListDetail/README.md +222 -0
- package/design-system/components/ListDetail/preview.html +213 -0
- package/design-system/components/ListDetail/style.css +148 -0
- package/design-system/components/LoadBar/README.md +79 -0
- package/design-system/components/LoadBar/preview.html +40 -0
- package/design-system/components/LoadBar/style.css +17 -0
- package/design-system/components/MarketingNav/README.md +76 -42
- package/design-system/components/MarketingNav/preview.html +37 -8
- package/design-system/components/MarketingNav/style.css +45 -0
- package/design-system/components/Matrix/README.md +129 -0
- package/design-system/components/Matrix/preview.html +99 -0
- package/design-system/components/Matrix/style.css +84 -0
- package/design-system/components/Menu/README.md +117 -41
- package/design-system/components/Menu/preview.html +85 -23
- package/design-system/components/Menu/style.css +61 -0
- package/design-system/components/Meter/README.md +39 -4
- package/design-system/components/Meter/preview.html +18 -1
- package/design-system/components/Meter/style.css +23 -0
- package/design-system/components/MetricTile/README.md +237 -0
- package/design-system/components/MetricTile/preview.html +241 -0
- package/design-system/components/MetricTile/style.css +129 -0
- package/design-system/components/Morph/README.md +106 -0
- package/design-system/components/Morph/preview.html +103 -0
- package/design-system/components/Morph/style.css +31 -0
- package/design-system/components/Motion/README.md +164 -0
- package/design-system/components/Motion/preview.html +2537 -0
- package/design-system/components/NumberInput/README.md +27 -8
- package/design-system/components/NumberInput/preview.html +21 -5
- package/design-system/components/NumberInput/style.css +34 -0
- package/design-system/components/PaceBar/README.md +75 -0
- package/design-system/components/PaceBar/preview.html +67 -0
- package/design-system/components/PaceBar/style.css +25 -0
- package/design-system/components/Page/README.md +57 -18
- package/design-system/components/Page/preview.html +15 -17
- package/design-system/components/Page/style.css +7 -0
- package/design-system/components/PageBar/README.md +90 -34
- package/design-system/components/PageBar/preview.html +60 -19
- package/design-system/components/PageBar/style.css +35 -0
- package/design-system/components/PageHero/README.md +87 -51
- package/design-system/components/PageHero/preview.html +35 -6
- package/design-system/components/PageHero/style.css +31 -0
- package/design-system/components/Pagination/README.md +70 -49
- package/design-system/components/Pagination/preview.html +24 -15
- package/design-system/components/Pagination/style.css +12 -0
- package/design-system/components/Panel/README.md +109 -51
- package/design-system/components/Panel/preview.html +118 -20
- package/design-system/components/Panel/style.css +51 -0
- package/design-system/components/PasswordInput/README.md +50 -18
- package/design-system/components/PasswordInput/preview.html +71 -21
- package/design-system/components/PasswordInput/style.css +31 -0
- package/design-system/components/Plate/README.md +75 -17
- package/design-system/components/Plate/preview.html +40 -7
- package/design-system/components/Plate/style.css +37 -0
- package/design-system/components/Popover/README.md +70 -49
- package/design-system/components/Popover/preview.html +44 -22
- package/design-system/components/Popover/style.css +41 -0
- package/design-system/components/PricingTable/README.md +69 -49
- package/design-system/components/PricingTable/preview.html +21 -21
- package/design-system/components/PricingTable/style.css +21 -0
- package/design-system/components/ProgressPetals/README.md +31 -3
- package/design-system/components/ProgressPetals/preview.html +14 -15
- package/design-system/components/ProgressPetals/style.css +27 -0
- package/design-system/components/README.md +151 -0
- package/design-system/components/Radio/README.md +40 -17
- package/design-system/components/Radio/preview.html +16 -1
- package/design-system/components/Radio/style.css +21 -0
- package/design-system/components/RankBar/README.md +29 -2
- package/design-system/components/RankBar/preview.html +14 -12
- package/design-system/components/RankBar/style.css +18 -0
- package/design-system/components/Ring/README.md +61 -11
- package/design-system/components/Ring/preview.html +55 -10
- package/design-system/components/Ring/style.css +49 -0
- package/design-system/components/ScoreHero/README.md +91 -0
- package/design-system/components/ScoreHero/preview.html +104 -0
- package/design-system/components/ScoreHero/style.css +32 -0
- package/design-system/components/Section/README.md +72 -33
- package/design-system/components/Section/preview.html +46 -16
- package/design-system/components/Section/style.css +18 -0
- package/design-system/components/Segmented/README.md +100 -55
- package/design-system/components/Segmented/preview.html +107 -26
- package/design-system/components/Segmented/style.css +94 -0
- package/design-system/components/SegmentedProgress/README.md +64 -0
- package/design-system/components/SegmentedProgress/preview.html +69 -0
- package/design-system/components/SegmentedProgress/style.css +11 -0
- package/design-system/components/Select/README.md +47 -12
- package/design-system/components/Select/preview.html +28 -2
- package/design-system/components/Select/style.css +22 -0
- package/design-system/components/ShareBar/README.md +69 -0
- package/design-system/components/ShareBar/preview.html +72 -0
- package/design-system/components/ShareBar/style.css +25 -0
- package/design-system/components/SideList/README.md +147 -0
- package/design-system/components/SideList/preview.html +139 -0
- package/design-system/components/SideList/style.css +94 -0
- package/design-system/components/Skeleton/README.md +52 -16
- package/design-system/components/Skeleton/preview.html +35 -23
- package/design-system/components/Skeleton/style.css +22 -0
- package/design-system/components/Slider/README.md +95 -0
- package/design-system/components/Slider/preview.html +49 -0
- package/design-system/components/Slider/style.css +13 -0
- package/design-system/components/Split/README.md +112 -0
- package/design-system/components/Split/preview.html +105 -0
- package/design-system/components/Split/style.css +30 -0
- package/design-system/components/Starter/README.md +21 -9
- package/design-system/components/Starter/preview.html +5 -5
- package/design-system/components/Stat/README.md +64 -43
- package/design-system/components/Stat/preview.html +3 -3
- package/design-system/components/Stat/style.css +15 -0
- package/design-system/components/StatTiles/README.md +88 -44
- package/design-system/components/StatTiles/preview.html +142 -71
- package/design-system/components/StatTiles/style.css +64 -0
- package/design-system/components/StatusLine/README.md +85 -0
- package/design-system/components/StatusLine/preview.html +49 -0
- package/design-system/components/StatusLine/style.css +14 -0
- package/design-system/components/StatusScreen/README.md +49 -35
- package/design-system/components/StatusScreen/preview.html +20 -5
- package/design-system/components/StatusScreen/style.css +9 -0
- package/design-system/components/StepLine/README.md +97 -0
- package/design-system/components/StepLine/preview.html +108 -0
- package/design-system/components/StepLine/style.css +62 -0
- package/design-system/components/Stepper/README.md +35 -13
- package/design-system/components/Stepper/style.css +13 -0
- package/design-system/components/StreakCalendar/README.md +22 -1
- package/design-system/components/StreakCalendar/preview.html +10 -10
- package/design-system/components/StreakCalendar/style.css +12 -0
- package/design-system/components/SuggestionChip/README.md +87 -0
- package/design-system/components/SuggestionChip/preview.html +42 -0
- package/design-system/components/SuggestionChip/style.css +20 -0
- package/design-system/components/Switch/README.md +44 -24
- package/design-system/components/Switch/preview.html +23 -8
- package/design-system/components/Switch/style.css +31 -0
- package/design-system/components/Table/README.md +129 -58
- package/design-system/components/Table/preview.html +106 -72
- package/design-system/components/Table/style.css +104 -0
- package/design-system/components/Tabs/README.md +71 -46
- package/design-system/components/Tabs/preview.html +56 -24
- package/design-system/components/Tabs/style.css +44 -0
- package/design-system/components/Testimonial/README.md +48 -32
- package/design-system/components/Testimonial/preview.html +14 -14
- package/design-system/components/Testimonial/style.css +12 -0
- package/design-system/components/TextArea/README.md +27 -11
- package/design-system/components/TextArea/preview.html +8 -2
- package/design-system/components/TextArea/style.css +12 -0
- package/design-system/components/ThemeSwitch/README.md +116 -0
- package/design-system/components/ThemeSwitch/preview.html +57 -0
- package/design-system/components/ThemeSwitch/style.css +6 -0
- package/design-system/components/TickRow/README.md +52 -36
- package/design-system/components/TickRow/preview.html +64 -41
- package/design-system/components/TickRow/style.css +23 -0
- package/design-system/components/TickStrip/README.md +95 -0
- package/design-system/components/TickStrip/preview.html +88 -0
- package/design-system/components/TickStrip/style.css +42 -0
- package/design-system/components/Tile/README.md +79 -18
- package/design-system/components/Tile/preview.html +91 -40
- package/design-system/components/Tile/style.css +36 -0
- package/design-system/components/Timeline/README.md +68 -48
- package/design-system/components/Timeline/preview.html +27 -15
- package/design-system/components/Timeline/style.css +25 -0
- package/design-system/components/Toast/README.md +70 -38
- package/design-system/components/Toast/preview.html +43 -8
- package/design-system/components/Toast/style.css +25 -0
- package/design-system/components/Tooltip/README.md +93 -35
- package/design-system/components/Tooltip/preview.html +69 -15
- package/design-system/components/Tooltip/style.css +78 -0
- package/design-system/components/TopBar/README.md +67 -53
- package/design-system/components/TopBar/preview.html +14 -27
- package/design-system/components/TopBar/style.css +35 -0
- package/design-system/components/TopicRail/README.md +108 -0
- package/design-system/components/TopicRail/preview.html +58 -0
- package/design-system/components/TopicRail/style.css +48 -0
- package/design-system/components/TrendBars/README.md +52 -14
- package/design-system/components/TrendBars/preview.html +65 -32
- package/design-system/components/TrendBars/style.css +25 -0
- package/design-system/components/TrendLine/README.md +164 -0
- package/design-system/components/TrendLine/preview.html +373 -0
- package/design-system/components/TrendLine/style.css +155 -0
- package/design-system/components/Well/README.md +64 -22
- package/design-system/components/Well/preview.html +14 -14
- package/design-system/components/Well/style.css +22 -0
- package/design-system/components/_house.css +324 -0
- package/design-system/components/bundle.css +4091 -744
- package/design-system/tokens.json +1314 -124
- package/dist/fello-core.css +2 -2
- package/dist/fello.css +6 -1369
- package/dist/fello.scoped.css +7 -0
- package/dist/index.d.ts +110 -11
- package/dist/index.js +781 -96
- package/dist/palettes.d.ts +464 -0
- package/dist/palettes.js +497 -0
- package/dist/scoped.d.ts +3 -0
- package/dist/scoped.js +16 -0
- package/dist/toast.d.ts +14 -0
- package/dist/toast.js +33 -29
- package/dist/tokens.d.ts +1686 -62
- package/dist/tokens.js +1668 -61
- package/package.json +20 -4
- package/scripts/check-palette.mjs +295 -0
- package/scripts/token-model.mjs +552 -0
- package/tokens/_dark.css +174 -0
- package/tokens/_palettes.css +46 -0
- package/tokens/_product.css +266 -53
- package/tokens/_source.hubl.css +39 -19
- package/tokens/design-tokens.json +319 -0
- package/tokens/palettes.ts +504 -0
- package/tokens/shadcn-compat.css +19 -19
- package/tokens/shadcn-compat.hsl.css +76 -0
- package/tokens/tokens.css +1292 -62
- package/tokens/tokens.md +588 -61
- package/tokens/tokens.root.css +1298 -62
- package/tokens/tokens.ts +1677 -64
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
A rimmed list of checks, each row a name, a strip of ticks for its score, the score, a status and a chevron that opens
|
|
2
|
+
it; or a list of fixes, each row a box to tick, the fix and its effort, its act, and a chevron that opens it in place.
|
|
3
|
+
Seth's checks list (301:1728) and Fixes checklist (308:2466).
|
|
4
|
+
|
|
5
|
+
## Use it when
|
|
6
|
+
|
|
7
|
+
- A report breaks one score into a few checks and each check opens its detail (an audit's "Your AI visibility checks").
|
|
8
|
+
- A short list of fixes is worked through and ticked off, each with one act and a few steps behind it.
|
|
9
|
+
|
|
10
|
+
## Not for
|
|
11
|
+
|
|
12
|
+
- Records with many columns: use `Table`.
|
|
13
|
+
- A ranking of people: use `Leaderboard`.
|
|
14
|
+
- Next acts with a reason each, in a card: use `ActionList`.
|
|
15
|
+
- A grid of yes-or-no answers: use `Matrix`.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
- A rim (`ul.ws-check-row`): the tray grey (`--ws-tray`), 1 px of it round the rows (`--ws-rim`), 8 px corners outside,
|
|
20
|
+
7 inside (`--ws-radius-card-inner`) on the first and last row. Rows cream, joined by 0.5 px lines (`--ws-edge`),
|
|
21
|
+
full width, drawn inside the top of the row (an inset line, not a border), so a row's height includes its line as in
|
|
22
|
+
Seth's frames. No outline, no shadow.
|
|
23
|
+
- Every row is at least 56 (`--ws-check-row-h`), with an act or without, so lists line up (Seth's rows ran 46 to 70).
|
|
24
|
+
- A check row (`__row`, a button with `aria-expanded`, or a link): 12 above and below, 20 in, 16 out, parts 24 apart, on
|
|
25
|
+
one grid every row shares:
|
|
26
|
+
|
|
27
|
+
| Part | Width | Type |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| Name (`__name`) | 150 | 15 / 20 medium navy, wraps |
|
|
30
|
+
| Ticks (`__ticks`) | the rest | 40 ticks, 32 tall, 3 apart, 1 px corners |
|
|
31
|
+
| Score (`__score`) | 56, right | 28 / 32 regular navy, tabular |
|
|
32
|
+
| Status (`__status`) | 112, right | 13 / 18 medium body grey (`--quiet` muted) |
|
|
33
|
+
| Chevron (`__chev`) | 16 | navy, 1.5 stroke |
|
|
34
|
+
|
|
35
|
+
- The ticks: lit ticks (`b`) in the row's rating tone (D10): strong teal (`--ws-rating-strong`, the default),
|
|
36
|
+
getting there mid blue (`--middle`), needs work pink (`--needs-work`); the rest (`i`) the empty track. Lit is
|
|
37
|
+
`round(score / 100 x 40)`.
|
|
38
|
+
- Not checked: every tick empty, a short muted rule in place of the score (`__none`, 20 wide, its words for a screen
|
|
39
|
+
reader), the status "Could not check" muted; the chevron stays (it still opens).
|
|
40
|
+
- A fix row (`li.ws-check-row__fix` holding `__line`): the box (an 18 wide column, the skinned `Checkbox`, a 24 target,
|
|
41
|
+
40 on touch), the fix (`__open`, a button whose hit area covers the line): the title 15 / 22 medium navy and the
|
|
42
|
+
effort 13 / 18 muted 8 after it on the baseline, or a done line under it (`__meta`, 13 / 18 medium in the positive
|
|
43
|
+
word, 6 below); its act (Seth's grey act: a medium `Button --well`, 32 tall, 12 at the sides, no edge; `--primary`
|
|
44
|
+
on the open row) and a 16 px chevron; parts 16 apart, 12 above and below, 20 in, 16 out.
|
|
45
|
+
- Every part of a fix row sits on the title's first line: the box and the chevron centre on it and the act is centred
|
|
46
|
+
on it, so a done row's box stays beside its title, not mid-way down the two lines (Seth's 308:2466 centred it on the
|
|
47
|
+
block). A one-line row's line sits mid-row.
|
|
48
|
+
- The open fix's panel (`__detail`): cream, 6 px corners, 24 inside, its left edge on the title's (20 + 18 + 16 = 54; Seth's
|
|
49
|
+
frame drew it 4 px off at 58), 16 from the right and below.
|
|
50
|
+
|
|
51
|
+
## Variants and sizes
|
|
52
|
+
|
|
53
|
+
| Part | Value |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| Row | 56 at least, 12 / 16 / 12 / 20 inside |
|
|
56
|
+
| Check columns | 150, the rest, 56, 112, 16; 24 apart |
|
|
57
|
+
| Ticks | 40, 32 tall, 3 apart |
|
|
58
|
+
| Fix columns | 18, the rest, the act (32, `--well`), 16; 16 apart; all on the title's first line |
|
|
59
|
+
| Panel | 54 in, 24 inside, 6 px corners |
|
|
60
|
+
| Narrow (under 40rem) | check: name and status over the ticks, the score beside them; fix: the act under the words, the box and the chevron on the title's first line |
|
|
61
|
+
|
|
62
|
+
## States
|
|
63
|
+
|
|
64
|
+
- **Default**: cream.
|
|
65
|
+
- **Hover**: North's faint navy wash (`--ws-hover-faint`) laid over the cream (a background image, so the grey rim never
|
|
66
|
+
shows through), nothing moves (not drawn by Seth); never on an open or a current row, which keep their sunk ground.
|
|
67
|
+
- **Open** (`aria-expanded="true"`): the sunk cream (`--ws-surface-sunk`); a check's status turns navy; a fix's title
|
|
68
|
+
turns semibold at the same size, its act turns primary, its chevron points up and its panel shows.
|
|
69
|
+
- **Focus**: the 2 px navy ring drawn inside the row.
|
|
70
|
+
- **Not checked**: as above.
|
|
71
|
+
- **Done** (a fix, `--done`): the box ticked, the title muted, the done line under it in the positive word.
|
|
72
|
+
- **Loading**: the name and the ticks as ghosts in the chart colours' sweep (`__ghost ws-shimmer`, `__ticks ws-shimmer`);
|
|
73
|
+
still under reduced motion.
|
|
74
|
+
- **Long name**: wraps within its 150; the row grows, every column still lines up.
|
|
75
|
+
|
|
76
|
+
## Behaviour
|
|
77
|
+
|
|
78
|
+
- Keyboard: a check row is one button (it opens the check's drawer, `aria-expanded` saying so); a fix row's box, its
|
|
79
|
+
open button and its act are three stops, in that order.
|
|
80
|
+
- Pointer: clicking anywhere on a fix row's line opens it, except on the box and the act, which do their own thing.
|
|
81
|
+
- Motion: the lit ticks grow up from their base on arrival, 700 ms on `--ws-ease-settle`, left to right 4 ms a tick
|
|
82
|
+
(`--ws-ripple`, where the browser can count siblings; elsewhere together). A fix opens in place on North's fold
|
|
83
|
+
("Sidebar sections open / close", the fold spring .32 / 0): its panel (`__detail`, wearing the house's `ws-unfold`,
|
|
84
|
+
shown and hidden by `hidden`) grows from nothing to its height with its padding and margin and fades in, and the
|
|
85
|
+
chevron turns 180 on the same spring (`--ws-spring-fold` over `--ws-spring-fold-duration`); closing runs it back.
|
|
86
|
+
Without `@starting-style` or `interpolate-size` the panel opens at once. Under reduced motion nothing moves.
|
|
87
|
+
|
|
88
|
+
## Content
|
|
89
|
+
|
|
90
|
+
- A check's name is one or two words ("Local search"); its status a count of fixes ("2 fixes") or a plain state
|
|
91
|
+
("Nothing to fix", "Could not check").
|
|
92
|
+
- A fix starts with a verb ("Speed up the homepage on phones"); its effort says how long ("A few days").
|
|
93
|
+
- No em dashes; the not-checked mark is a drawn rule, not a dash.
|
|
94
|
+
|
|
95
|
+
## Rules
|
|
96
|
+
|
|
97
|
+
- **One grid for every check row**, so the scores stack in one right-aligned column (Seth: name 150, score 56 right,
|
|
98
|
+
status 112 right).
|
|
99
|
+
- **One minimum height for every row** in a list, act or no act.
|
|
100
|
+
- **A selected or open state never changes size**: weight and ground change, line heights do not.
|
|
101
|
+
- **Words pass AA on their ground** (D2): Seth's #7F7F7F and #8A8A8A words take `--color-text-muted`; the teal done line
|
|
102
|
+
takes `--ws-word-positive`. The tick tones are marks and keep Seth's hue.
|
|
103
|
+
|
|
104
|
+
## Source
|
|
105
|
+
|
|
106
|
+
**Derived from**: Seth's Grow audit report (301:1630: the checks list 301:1725 to 2010) and Fixes checklist (308:2466:
|
|
107
|
+
the fix rows and the open fix), on the kit's rim (D5), rating tones (D10) and North's tick ripple (D7). The tick strip
|
|
108
|
+
is the same shape as `TickStrip` (40 ticks, 32 tall, 3 apart) and can be swapped for it. **Precedent**: new in 0.5.0
|
|
109
|
+
(4 Nov 2026).
|
|
110
|
+
|
|
111
|
+
## Markup
|
|
112
|
+
|
|
113
|
+
```html
|
|
114
|
+
<ul class="ws-check-row" aria-label="Your AI visibility checks">
|
|
115
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false">
|
|
116
|
+
<span class="ws-check-row__name">Website</span>
|
|
117
|
+
<span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><i></i><!-- 40 in all: round(score / 100 x 40) b, the rest i --></span>
|
|
118
|
+
<span class="ws-check-row__score">75</span>
|
|
119
|
+
<span class="ws-check-row__status">2 fixes</span>
|
|
120
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
121
|
+
</button></li>
|
|
122
|
+
</ul>
|
|
123
|
+
|
|
124
|
+
<ul class="ws-check-row" aria-label="Website fixes">
|
|
125
|
+
<li class="ws-check-row__fix">
|
|
126
|
+
<div class="ws-check-row__line">
|
|
127
|
+
<label class="ws-check"><input type="checkbox" aria-label="Done: Speed up the homepage on phones"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
|
|
128
|
+
<button type="button" class="ws-check-row__open" aria-expanded="false" aria-controls="fix-1"><span class="ws-check-row__title">Speed up the homepage on phones</span><span class="ws-check-row__effort">A few days</span></button>
|
|
129
|
+
<button type="button" class="ws-btn ws-btn--well ws-check-row__act">Send to my web person</button>
|
|
130
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
|
|
131
|
+
</div>
|
|
132
|
+
<div class="ws-check-row__detail ws-unfold" id="fix-1" hidden><p class="ws-body">Your homepage takes 6.2 seconds to show on a phone.</p></div>
|
|
133
|
+
</li>
|
|
134
|
+
</ul>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Styles
|
|
138
|
+
|
|
139
|
+
`design-system/components/CheckRow/style.css`, in `bundle.css` and `fello.css`. Dark and the navy ground come from the
|
|
140
|
+
tokens (`--ws-tray`, `--ws-edge`, `--ws-track`, `--ws-rating-*`, `--ws-surface-sunk`). The rim is a size container
|
|
141
|
+
named `ws-check-row`.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<!-- @dsCard group="Data" height=980 -->
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>CheckRow</title>
|
|
7
|
+
<link rel="stylesheet" href="../../tokens.css">
|
|
8
|
+
<link rel="stylesheet" href="../bundle.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div class="ws-stage ws-stage--column">
|
|
12
|
+
|
|
13
|
+
<div class="ws-stack">
|
|
14
|
+
<span class="ws-muted">Check rows (Seth 301:1728): one grid for every row, so names, ticks, scores and statuses line up; the open row is sunk with its status in navy; a check that could not run keeps its row and its chevron; ticks in the rating's tone (strong teal, getting there mid blue, needs work pink)</span>
|
|
15
|
+
<h3 class="ws-section">Your AI visibility checks</h3>
|
|
16
|
+
<ul class="ws-check-row" aria-label="Your AI visibility checks">
|
|
17
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="true" aria-label="Local search, score 39 of 100, needs work, 2 fixes">
|
|
18
|
+
<span class="ws-check-row__name">Local search</span>
|
|
19
|
+
<span class="ws-check-row__ticks ws-check-row__ticks--needs-work" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
|
|
20
|
+
<span class="ws-check-row__score">39</span>
|
|
21
|
+
<span class="ws-check-row__status">2 fixes</span>
|
|
22
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
23
|
+
</button></li>
|
|
24
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Website, score 75 of 100, strong, 2 fixes">
|
|
25
|
+
<span class="ws-check-row__name">Website</span>
|
|
26
|
+
<span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
|
|
27
|
+
<span class="ws-check-row__score">75</span>
|
|
28
|
+
<span class="ws-check-row__status">2 fixes</span>
|
|
29
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
30
|
+
</button></li>
|
|
31
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Social, score 55 of 100, getting there, 1 fix">
|
|
32
|
+
<span class="ws-check-row__name">Social</span>
|
|
33
|
+
<span class="ws-check-row__ticks ws-check-row__ticks--middle" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
|
|
34
|
+
<span class="ws-check-row__score">55</span>
|
|
35
|
+
<span class="ws-check-row__status">1 fix</span>
|
|
36
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
37
|
+
</button></li>
|
|
38
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Zillow, score 100 of 100, strong, Nothing to fix">
|
|
39
|
+
<span class="ws-check-row__name">Zillow</span>
|
|
40
|
+
<span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b></span>
|
|
41
|
+
<span class="ws-check-row__score">100</span>
|
|
42
|
+
<span class="ws-check-row__status ws-check-row__status--quiet">Nothing to fix</span>
|
|
43
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
44
|
+
</button></li>
|
|
45
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Google Business Profile, not checked, Could not check">
|
|
46
|
+
<span class="ws-check-row__name">Google Business Profile</span>
|
|
47
|
+
<span class="ws-check-row__ticks" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
|
|
48
|
+
<span class="ws-check-row__score"><span class="ws-check-row__none" aria-hidden="true"></span><span class="ws-sr">Not checked</span></span>
|
|
49
|
+
<span class="ws-check-row__status ws-check-row__status--quiet">Could not check</span>
|
|
50
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
51
|
+
</button></li>
|
|
52
|
+
<li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="AI answers, not checked, Could not check">
|
|
53
|
+
<span class="ws-check-row__name">AI answers</span>
|
|
54
|
+
<span class="ws-check-row__ticks" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
|
|
55
|
+
<span class="ws-check-row__score"><span class="ws-check-row__none" aria-hidden="true"></span><span class="ws-sr">Not checked</span></span>
|
|
56
|
+
<span class="ws-check-row__status ws-check-row__status--quiet">Could not check</span>
|
|
57
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
|
|
58
|
+
</button></li>
|
|
59
|
+
</ul>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="ws-stack">
|
|
63
|
+
<span class="ws-muted">Fix rows (Seth 308:2466): every row 56 at least, with an act or without; the open fix is sunk, its act primary, its panel on the title's edge; a done fix keeps its row, its title muted and a line under it</span>
|
|
64
|
+
<div class="ws-stack ws-stack--group">
|
|
65
|
+
<div class="ws-stack">
|
|
66
|
+
<h3 class="ws-section">Website <span class="ws-muted">0 of 2 done</span></h3>
|
|
67
|
+
<ul class="ws-check-row" aria-label="Website fixes">
|
|
68
|
+
<li class="ws-check-row__fix">
|
|
69
|
+
<div class="ws-check-row__line">
|
|
70
|
+
<label class="ws-check"><input type="checkbox" aria-label="Done: Speed up the homepage on phones"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
|
|
71
|
+
<button type="button" class="ws-check-row__open" aria-expanded="false" aria-controls="fx-1"><span class="ws-check-row__title">Speed up the homepage on phones</span><span class="ws-check-row__effort">A few days</span></button>
|
|
72
|
+
<button type="button" class="ws-btn ws-btn--well ws-check-row__act">Send to my web person</button>
|
|
73
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="ws-check-row__detail ws-unfold" id="fx-1" hidden><p class="ws-body">Your homepage takes 6.2 seconds to show on a phone.</p></div>
|
|
76
|
+
</li>
|
|
77
|
+
<li class="ws-check-row__fix">
|
|
78
|
+
<div class="ws-check-row__line">
|
|
79
|
+
<label class="ws-check"><input type="checkbox" aria-label="Done: Run an accessibility check and fix the flagged issues"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
|
|
80
|
+
<button type="button" class="ws-check-row__open" aria-expanded="true" aria-controls="fx-2"><span class="ws-check-row__title">Run an accessibility check and fix the flagged issues</span><span class="ws-check-row__effort">An hour or two</span></button>
|
|
81
|
+
<button type="button" class="ws-btn ws-btn--primary ws-check-row__act">Send to my web person</button>
|
|
82
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
|
|
83
|
+
</div>
|
|
84
|
+
<div class="ws-check-row__detail ws-unfold" id="fx-2"><p class="ws-body">Buyers and sellers using assistive technology need to read your content and use your tools too. Grow checks for 90 or more.</p></div>
|
|
85
|
+
</li>
|
|
86
|
+
</ul>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="ws-stack">
|
|
89
|
+
<h3 class="ws-section">Social <span class="ws-muted">1 of 2 done</span></h3>
|
|
90
|
+
<ul class="ws-check-row" aria-label="Social fixes">
|
|
91
|
+
<li class="ws-check-row__fix ws-check-row__fix--done">
|
|
92
|
+
<div class="ws-check-row__line">
|
|
93
|
+
<label class="ws-check"><input type="checkbox" checked aria-label="Done: Reply to comments on your posts within a day"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
|
|
94
|
+
<button type="button" class="ws-check-row__open" aria-expanded="false"><span class="ws-check-row__title">Reply to comments on your posts within a day</span><span class="ws-check-row__meta">Done today, Grow checks it again Nov 9</span></button>
|
|
95
|
+
|
|
96
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
|
|
97
|
+
</div>
|
|
98
|
+
</li>
|
|
99
|
+
<li class="ws-check-row__fix">
|
|
100
|
+
<div class="ws-check-row__line">
|
|
101
|
+
<label class="ws-check"><input type="checkbox" aria-label="Done: Cross-promote your Instagram on your other channels"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
|
|
102
|
+
<button type="button" class="ws-check-row__open" aria-expanded="false"><span class="ws-check-row__title">Cross-promote your Instagram on your other channels</span><span class="ws-check-row__effort">An hour or two</span></button>
|
|
103
|
+
|
|
104
|
+
<svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
|
|
105
|
+
</div>
|
|
106
|
+
</li>
|
|
107
|
+
</ul>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<div class="ws-stack" style="width: 560px;">
|
|
113
|
+
<span class="ws-muted">Loading: the rows' places as ghosts in the chart colours' sweep</span>
|
|
114
|
+
<ul class="ws-check-row" aria-busy="true" aria-label="Checks, loading">
|
|
115
|
+
<li><div class="ws-check-row__row" aria-hidden="true">
|
|
116
|
+
<span class="ws-check-row__name"><span class="ws-check-row__ghost ws-shimmer" style="width: 70%;"></span></span>
|
|
117
|
+
<span class="ws-check-row__ticks ws-shimmer"></span>
|
|
118
|
+
</div></li>
|
|
119
|
+
<li><div class="ws-check-row__row" aria-hidden="true">
|
|
120
|
+
<span class="ws-check-row__name"><span class="ws-check-row__ghost ws-shimmer" style="width: 70%;"></span></span>
|
|
121
|
+
<span class="ws-check-row__ticks ws-shimmer"></span>
|
|
122
|
+
</div></li>
|
|
123
|
+
</ul>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
</div>
|
|
127
|
+
<script>
|
|
128
|
+
// Open and close a fix the way an app does (aria-expanded on its open button, hidden on its panel, its act primary
|
|
129
|
+
// while open), so the fold shows here: the panel grows open and the chevron turns on the fold spring.
|
|
130
|
+
for (const b of document.querySelectorAll('.ws-check-row__open[aria-controls]')) b.addEventListener('click', () => {
|
|
131
|
+
const open = b.getAttribute('aria-expanded') !== 'true';
|
|
132
|
+
b.setAttribute('aria-expanded', String(open));
|
|
133
|
+
document.getElementById(b.getAttribute('aria-controls')).hidden = !open;
|
|
134
|
+
const act = b.parentElement.querySelector('.ws-check-row__act');
|
|
135
|
+
act?.classList.toggle('ws-btn--primary', open);
|
|
136
|
+
act?.classList.toggle('ws-btn--well', !open);
|
|
137
|
+
});
|
|
138
|
+
</script>
|
|
139
|
+
</body>
|
|
140
|
+
</html>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* ---- CheckRow: Seth's rimmed list of check rows (301:1728) and fix rows (308:2466). A check row is one grid every row
|
|
2
|
+
shares (name 150, ticks the rest, score 56 right, status 112 right, chevron 16, 24 apart, 56 tall), so the scores
|
|
3
|
+
stack in one column. A fix row is a box, the fix and its effort, its act and a chevron; it opens in place onto a
|
|
4
|
+
cream panel on the title's edge. Every row takes the same 56 px minimum, so lists with and without acts line up. ---- */
|
|
5
|
+
.ws-check-row { --ws-check-row-name: calc(var(--space-9xl) * 0.75); --ws-check-row-score: calc(var(--space-3xl) + var(--space-xs)); --ws-check-row-status: calc(var(--space-6xl) + var(--space-md)); --ws-check-row-box: calc(var(--space-md) + var(--space-3xs)); --ws-check-row-h: calc(var(--space-3xl) + var(--space-xs)); --ws-check-row-tone: var(--ws-rating-strong); container: ws-check-row / inline-size; display: flex; flex-direction: column; padding: var(--ws-rim); border-radius: var(--ws-radius-card); background: var(--ws-tray); }
|
|
6
|
+
/* Cream rows joined by 0.5 px lines, full width, drawn inside the row's top (Seth's 56 includes its line, so a border
|
|
7
|
+
would add 0.5 a row); an open check row's sunk ground covers its li, so it draws the line too. The rim's inner corners
|
|
8
|
+
on the first and last. */
|
|
9
|
+
.ws-check-row > li { background: var(--color-bg-page); }
|
|
10
|
+
.ws-check-row > li + li, .ws-check-row > li + li > .ws-check-row__row:is([aria-expanded="true"], [aria-current="true"]) { box-shadow: inset 0 var(--ws-hairline) 0 var(--ws-edge); }
|
|
11
|
+
.ws-check-row > li:first-child { border-top-left-radius: var(--ws-radius-card-inner); border-top-right-radius: var(--ws-radius-card-inner); }
|
|
12
|
+
.ws-check-row > li:last-child { border-bottom-left-radius: var(--ws-radius-card-inner); border-bottom-right-radius: var(--ws-radius-card-inner); }
|
|
13
|
+
|
|
14
|
+
/* A check row: the whole row opens its check (a button with aria-expanded, or a link). */
|
|
15
|
+
.ws-check-row__row { display: grid; grid-template-columns: var(--ws-check-row-name) minmax(0, 1fr) var(--ws-check-row-score) var(--ws-check-row-status) var(--ws-icon); grid-template-areas: "name ticks score status chev"; align-items: center; gap: var(--space-lg); width: 100%; min-height: var(--ws-check-row-h); padding: var(--space-sm) var(--space-md) var(--space-sm) var(--ws-card-inset); border: 0; border-radius: inherit; background: transparent; text-align: left; text-decoration: none; color: inherit; cursor: pointer; transition: background-color var(--ws-duration-hover) var(--ws-ease-soft); }
|
|
16
|
+
.ws-check-row__row:focus-visible { outline-offset: calc(var(--ws-focus-width) * -1); }
|
|
17
|
+
@media (hover: hover) { .ws-check-row__row:not([aria-expanded="true"], [aria-current="true"]):hover { background-color: var(--ws-hover-faint); } }
|
|
18
|
+
/* Open (its drawer showing): the sunk cream, the status in navy. Nothing else moves. */
|
|
19
|
+
.ws-check-row__row[aria-expanded="true"], .ws-check-row__row[aria-current="true"] { background-color: var(--ws-surface-sunk); }
|
|
20
|
+
.ws-check-row__name { grid-area: name; min-width: 0; font-size: var(--ws-text-section); line-height: var(--ws-leading-row); font-weight: 500; color: var(--color-text-heading); }
|
|
21
|
+
/* The ticks: 40 equal ticks across the column, 32 tall, 3 apart, 1 px corners; lit ones (b) in the row's rating tone,
|
|
22
|
+
the rest (i) the empty track. Strong teal, middle mid blue, needs work pink (D10). */
|
|
23
|
+
.ws-check-row__ticks { grid-area: ticks; display: flex; gap: var(--ws-halo); height: var(--space-xl); min-width: 0; }
|
|
24
|
+
.ws-check-row__ticks > * { flex: 1 0 0; min-width: var(--ws-line); border-radius: var(--ws-radius-bar); background: var(--ws-track); }
|
|
25
|
+
.ws-check-row__ticks > b { background: var(--ws-check-row-tone); }
|
|
26
|
+
.ws-check-row__ticks--middle { --ws-check-row-tone: var(--ws-rating-middle); }
|
|
27
|
+
.ws-check-row__ticks--needs-work { --ws-check-row-tone: var(--ws-rating-needs-work); }
|
|
28
|
+
.ws-check-row__score { grid-area: score; text-align: right; font-size: var(--ws-text-figure-row); line-height: var(--ws-leading-figure-row); font-weight: 400; color: var(--color-text-heading); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
29
|
+
/* Not checked: a short rule in place of the figure (its words for a screen reader), on the figures' right edge. */
|
|
30
|
+
.ws-check-row__none { display: block; width: calc(var(--space-md) + var(--space-xxs)); height: var(--ws-chart-line); margin-left: auto; border-radius: var(--ws-radius-bar); background: var(--ws-mark-muted); }
|
|
31
|
+
.ws-check-row__status { grid-area: status; text-align: right; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--color-text-body); }
|
|
32
|
+
.ws-check-row__status--quiet { color: var(--color-text-muted); }
|
|
33
|
+
.ws-check-row__row[aria-expanded="true"] .ws-check-row__status, .ws-check-row__row[aria-current="true"] .ws-check-row__status { color: var(--color-text-heading); }
|
|
34
|
+
.ws-check-row__chev { grid-area: chev; width: var(--ws-icon); height: var(--ws-icon); color: var(--color-text-heading); }
|
|
35
|
+
/* Arrival: the lit ticks grow up from their base, left to right, North's 4 ms ripple a tick (where the browser can count
|
|
36
|
+
siblings; elsewhere they grow together). */
|
|
37
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
38
|
+
.ws-check-row__line > .ws-check-row__chev { transition: transform var(--ws-spring-fold-duration) var(--ws-spring-fold); }
|
|
39
|
+
.ws-check-row__ticks > b { transform-origin: bottom; animation: ws-grow-up var(--ws-duration-fill) var(--ws-ease-settle) backwards; animation-delay: calc(sibling-index() * var(--ws-ripple)); }
|
|
40
|
+
}
|
|
41
|
+
/* Loading: the name and the ticks as ghosts in the chart colours' sweep (add ws-shimmer). */
|
|
42
|
+
.ws-check-row__ghost { display: block; height: calc(var(--space-xs) + var(--space-3xs)); border-radius: var(--ws-radius-bar); background: var(--ws-track); }
|
|
43
|
+
.ws-check-row__ghost.ws-shimmer, .ws-check-row__ticks.ws-shimmer { background: var(--ws-shimmer); background-size: 300% 100%; }
|
|
44
|
+
|
|
45
|
+
/* A fix row: the box (outside the open target), the fix and its effort, its act, the chevron. The open button's hit area
|
|
46
|
+
covers the whole line; the box and the act sit above it. Every part sits on the title's first line (22), however many
|
|
47
|
+
lines the words run to (a done line under the title, a long fix): the box and the chevron are that line's height, the
|
|
48
|
+
act is centred on it (its margins trim it to the line), and a one-line row's line sits mid-row. */
|
|
49
|
+
.ws-check-row__fix { transition: background-color var(--ws-duration-hover) var(--ws-ease-soft); }
|
|
50
|
+
.ws-check-row__line { position: relative; display: grid; border-radius: inherit; grid-template-columns: var(--ws-check-row-box) minmax(0, 1fr) auto var(--ws-icon); grid-template-areas: "box words act chev"; align-items: start; align-content: center; column-gap: var(--space-md); min-height: var(--ws-check-row-h); padding: var(--space-sm) var(--space-md) var(--space-sm) var(--ws-card-inset); }
|
|
51
|
+
.ws-check-row__line > .ws-check { grid-area: box; position: relative; z-index: 1; align-items: center; justify-content: center; width: var(--ws-check-row-box); height: var(--ws-leading-section); padding: 0; }
|
|
52
|
+
.ws-check-row__line > .ws-check-row__chev { height: var(--ws-leading-section); }
|
|
53
|
+
/* Its target: 24 square (the box column is 18, the line 22), 40 on touch, drawn as a hit area so nothing moves. */
|
|
54
|
+
.ws-check-row__line > .ws-check::after { content: ""; position: absolute; inset: calc((100% - var(--space-lg)) / 2); }
|
|
55
|
+
@media (pointer: coarse) { .ws-check-row__line > .ws-check::after { inset: calc((100% - var(--ws-touch)) / 2); } }
|
|
56
|
+
.ws-check-row__line .ws-check__box { margin-top: 0; }
|
|
57
|
+
.ws-check-row__open { grid-area: words; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-xxs-plus) var(--space-xs); min-width: 0; padding: 0; border: 0; border-radius: inherit; background: none; text-align: left; color: inherit; cursor: pointer; }
|
|
58
|
+
.ws-check-row__open::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }
|
|
59
|
+
.ws-check-row__open:focus-visible { outline: 0; }
|
|
60
|
+
.ws-check-row__open:focus-visible::after { box-shadow: var(--ws-focus-inset); }
|
|
61
|
+
.ws-check-row__title { font-size: var(--ws-text-section); line-height: var(--ws-leading-section); font-weight: 500; color: var(--color-text-heading); }
|
|
62
|
+
.ws-check-row__effort { font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 400; color: var(--color-text-muted); }
|
|
63
|
+
.ws-check-row__meta { flex-basis: 100%; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--ws-word-positive); }
|
|
64
|
+
/* The act (Seth's 32 well, primary when open; 40 on touch) is trimmed to the title's line, so it centres on it. */
|
|
65
|
+
.ws-check-row__act { --ws-check-row-act: var(--ws-control-h); grid-area: act; position: relative; z-index: 1; margin-block: calc((var(--ws-leading-section) - var(--ws-check-row-act)) / 2); }
|
|
66
|
+
.ws-check-row__act.ws-btn--sm { --ws-check-row-act: var(--ws-control-h-sm); }
|
|
67
|
+
@media (pointer: coarse) { .ws-check-row .ws-check-row__act { --ws-check-row-act: var(--ws-touch); } }
|
|
68
|
+
/* Hover: the faint wash laid over the cream (a background-color would replace the cream and let the grey rim through). */
|
|
69
|
+
@media (hover: hover) { .ws-check-row__fix:not(:has(> .ws-check-row__line [aria-expanded="true"])):hover { background-image: linear-gradient(var(--ws-hover-faint), var(--ws-hover-faint)); } }
|
|
70
|
+
/* Open: the row sunk, its title semibold (the size never changes), the chevron up, the panel under it. */
|
|
71
|
+
.ws-check-row__fix:has(> .ws-check-row__line [aria-expanded="true"]) { background-color: var(--ws-surface-sunk); }
|
|
72
|
+
.ws-check-row__open[aria-expanded="true"] .ws-check-row__title { font-weight: 600; }
|
|
73
|
+
.ws-check-row__line:has([aria-expanded="true"]) > .ws-check-row__chev { transform: rotate(180deg); }
|
|
74
|
+
/* Done: the title muted, the line under it in the positive word. */
|
|
75
|
+
.ws-check-row__fix--done .ws-check-row__title { color: var(--color-text-muted); }
|
|
76
|
+
/* The panel: cream, 6 px corners, 24 inside, its left edge on the title's (20 + the box + 16), 16 from the right and below. */
|
|
77
|
+
.ws-check-row__detail { margin: 0 var(--space-md) var(--space-md) calc(var(--ws-card-inset) + var(--ws-check-row-box) + var(--space-md)); padding: var(--space-lg); border-radius: var(--ws-radius-row); background: var(--color-bg-page); }
|
|
78
|
+
.ws-check-row__detail[hidden] { display: none; }
|
|
79
|
+
|
|
80
|
+
/* Narrow: a check row stacks the name and status over the ticks, the score beside them; a fix row's act drops under its words. */
|
|
81
|
+
@container ws-check-row (max-width: 40rem) {
|
|
82
|
+
.ws-check-row__row { grid-template-columns: minmax(0, 1fr) auto var(--ws-icon); grid-template-areas: "name score chev" "status score chev" "ticks ticks ticks"; gap: var(--space-xxs) var(--space-sm); }
|
|
83
|
+
.ws-check-row__status { text-align: left; }
|
|
84
|
+
.ws-check-row__ticks { margin-top: var(--space-xs); }
|
|
85
|
+
.ws-check-row__line { grid-template-columns: var(--ws-check-row-box) minmax(0, 1fr) var(--ws-icon); grid-template-areas: "box words chev" ". act ."; }
|
|
86
|
+
.ws-check-row__act { justify-self: start; margin-block: var(--space-xs) 0; }
|
|
87
|
+
.ws-check-row__detail { margin-left: var(--space-md); }
|
|
88
|
+
}
|
|
@@ -15,12 +15,21 @@ A real native checkbox under a skin, drawn with a navy tick when chosen, its lab
|
|
|
15
15
|
|
|
16
16
|
## Anatomy
|
|
17
17
|
|
|
18
|
-
- Box:
|
|
19
|
-
|
|
20
|
-
- Chosen: the box fills
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
- Box: Seth's action box, 18 px square, 4 px corners (`--ws-radius-control`), a 1.5 px navy edge at rest (12:1 on the
|
|
19
|
+
cream, past the 3:1 a control asks), drawn inside so the box is exactly 18.
|
|
20
|
+
- Chosen: the box fills navy and a 12 px cream tick (stroke 1.75, round caps) sits in its middle. Some chosen (a select
|
|
21
|
+
all): a cream dash instead of the tick.
|
|
22
|
+
- Label: 14 / 20 medium navy, 10 px from the box (`--space-xs-plus`); a description below it in `.ws-muted`, 2 apart.
|
|
23
|
+
The box sits on the label's first line (1 px down).
|
|
24
|
+
- `--quiet`: Seth's status box (select all, replied), its edge the muted grey: his #D3D3D3 is 1.45:1, under the 3:1 a
|
|
25
|
+
control asks, so the AA step is used.
|
|
26
|
+
- `--sm`: Tally's 16 px box with a 12 / 16 label, 8 from it, for a dense row.
|
|
27
|
+
- `--step`: a checklist step (Seth's Steps, 308): the label 14 / 20 regular, and muted (`--color-text-muted`) once its
|
|
28
|
+
box is ticked. Steps sit 12 apart: put them in a `ws-stack--loose`.
|
|
29
|
+
- `--control`: Seth's control words (313, "Mark as replied"): the label 13 / 18 medium on an 18 px line.
|
|
30
|
+
- The row is its label's line (20 tall, no padding), as wide as its words and no wider, so a click far right of the
|
|
31
|
+
words does nothing in a column. The whole row, box and label and description together, is the target, at least
|
|
32
|
+
24 tall through a hit area that moves nothing.
|
|
24
33
|
|
|
25
34
|
## Variants and sizes
|
|
26
35
|
|
|
@@ -28,36 +37,42 @@ A real native checkbox under a skin, drawn with a navy tick when chosen, its lab
|
|
|
28
37
|
| --- | --- | --- |
|
|
29
38
|
| Plain | label only | a short setting ("Send a copy to the team channel") |
|
|
30
39
|
| With description | label plus a muted line under it | a setting that needs one more sentence to be clear |
|
|
40
|
+
| `--quiet` | the box's edge in the muted grey | a status or a select all beside rows of action boxes (Seth's Review inbox) |
|
|
41
|
+
| `--sm` | a 16 px box, a 12 / 16 label | a dense row of chart controls (Tally's "Cancelled") |
|
|
42
|
+
| `--step` | a 14 / 20 regular label, muted once done | a checklist's steps, 12 apart (`ws-stack--loose`) |
|
|
43
|
+
| `--control` | a 13 / 18 medium label | a status act in a row ("Mark as replied") |
|
|
31
44
|
|
|
32
|
-
|
|
45
|
+
Sizes: 18 (the default) and 16 (`--sm`).
|
|
33
46
|
|
|
34
47
|
## States
|
|
35
48
|
|
|
36
|
-
- **Default (not chosen):** the cream box with
|
|
37
|
-
- **Hover
|
|
38
|
-
- **Focus:** the kit's
|
|
39
|
-
hand-rolled one.
|
|
49
|
+
- **Default (not chosen):** the cream box with its navy edge.
|
|
50
|
+
- **Hover (a mouse only):** the box takes the navy wash while it is not chosen.
|
|
51
|
+
- **Focus:** the kit's ring, 2 px navy, 2 px out, round the box, from the native input's own focus.
|
|
40
52
|
- **Pressed:** the native input's own press; nothing is drawn for it beyond what the browser gives.
|
|
41
|
-
- **
|
|
42
|
-
|
|
53
|
+
- **Pictured states (a preview or a mockup):** `is-hover` on the label draws the wash, `is-focus` the ring round the box.
|
|
54
|
+
- **Done (a step):** with `--step`, a ticked step's label turns muted, so what is left reads first.
|
|
55
|
+
- **Selected (chosen):** navy fill, the cream tick popping in (the small-mark overshoot, `--ws-ease-pop`). Navy, never
|
|
56
|
+
the kit's salmon tick.
|
|
57
|
+
- **Some chosen:** `input.indeterminate = true` draws the cream dash.
|
|
43
58
|
- **Pending / loading:** not applicable; a checkbox has no network state of its own.
|
|
44
59
|
- **Disabled:** 50% opacity on the whole row, pointer events off; a disabled, chosen box still shows its tick so the
|
|
45
60
|
state stays legible.
|
|
46
|
-
- **Error:**
|
|
61
|
+
- **Error:** a box that must be ticked (a consent) takes the salmon's AA step as its edge (`aria-invalid="true"`) and a
|
|
62
|
+
message below its label that says what to do.
|
|
47
63
|
- **Empty:** not applicable; a checkbox is always one of two states.
|
|
48
|
-
- **Long label:** the label wraps
|
|
49
|
-
(`margin-top`), not centred against the wrapped block.
|
|
64
|
+
- **Long label:** the label wraps; the box stays on the first line, not centred against the wrapped block.
|
|
50
65
|
- **Narrow:** the row shrinks with its column; only the label wraps, never the box.
|
|
51
|
-
- **Touch:**
|
|
52
|
-
|
|
66
|
+
- **Touch:** one line is a 40 px row (the house's floor), the box still on the label's first line.
|
|
67
|
+
- **Dark:** the navy edge and fill become the light ink, the tick the dark act words.
|
|
53
68
|
|
|
54
69
|
## Behaviour
|
|
55
70
|
|
|
56
71
|
- Keyboard: a native `<input type="checkbox">`; Tab reaches it, Space toggles it.
|
|
57
72
|
- Pointer / touch: clicking or tapping anywhere in the label toggles it, since the label is part of the control.
|
|
58
|
-
- Touch: the row (not just the box) is the target, so phones never need an
|
|
59
|
-
- Motion: the fill
|
|
60
|
-
|
|
73
|
+
- Touch: the row (not just the box) is the target, so phones never need an 18 px precision tap.
|
|
74
|
+
- Motion: the fill over the hover beat; the tick pops in over the settle beat on `--ws-ease-pop`; still under reduced
|
|
75
|
+
motion.
|
|
61
76
|
|
|
62
77
|
## Content
|
|
63
78
|
|
|
@@ -88,4 +103,25 @@ There is one size.
|
|
|
88
103
|
|
|
89
104
|
**Derived from**: the kit's own `Checkbox` contract and its native-input-under-a-skin reasoning, with the tick
|
|
90
105
|
overridden to navy instead of the kit's salmon (a reported gap, 21 Oct 2026; the same gap applies to `Radio`).
|
|
91
|
-
**Precedent**: the first product built on the system.
|
|
106
|
+
**Precedent**: the first product built on the system. 0.5.0: Seth's action box (Fixes 308:2509, 308:2594; Review inbox
|
|
107
|
+
313:2746, 313:2960; Tally 319:3468): 18 px, 4 px corners, a 1.5 px navy edge, a 12 px cream tick with a 1.75 stroke;
|
|
108
|
+
his status box, taken to 3:1.
|
|
109
|
+
|
|
110
|
+
## Markup
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<label class="ws-check">
|
|
114
|
+
<input type="checkbox">
|
|
115
|
+
<span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span>
|
|
116
|
+
<span class="ws-check__words">
|
|
117
|
+
<span class="ws-check__label">Include last month's calls</span>
|
|
118
|
+
<span class="ws-muted">Adds September's cold calls to this report</span>
|
|
119
|
+
</span>
|
|
120
|
+
</label>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Styles
|
|
124
|
+
|
|
125
|
+
`design-system/components/Checkbox/style.css`: `ws-check` with `--quiet`, `--sm`, `--step`, `--control`, the pictured
|
|
126
|
+
states `is-hover` and `is-focus`, and `ws-check--disabled` (0.4.0's disabled class, still honoured; a disabled input
|
|
127
|
+
does the same on its own); `__box`, `__words`, `__label`.
|