@felloinnovations/brand-kit 0.4.0 → 0.5.1
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 +221 -0
- package/README.md +38 -9
- package/design-system/01-how-claude-decides.md +26 -17
- package/design-system/02-principles.md +11 -6
- package/design-system/03-colour.md +135 -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 +367 -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 +53 -16
- package/design-system/components/Skeleton/preview.html +35 -23
- package/design-system/components/Skeleton/style.css +17 -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 +4086 -744
- package/design-system/tokens.json +1310 -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 +109 -10
- 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 +173 -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 +1287 -62
- package/tokens/tokens.md +587 -61
- package/tokens/tokens.root.css +1293 -62
- package/tokens/tokens.ts +1677 -64
package/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# brand-kit for coding agents (0.
|
|
1
|
+
# brand-kit for coding agents (0.5.1)
|
|
2
2
|
|
|
3
3
|
Read this before writing UI in any Fello project that uses `@felloinnovations/brand-kit`. It ships inside the
|
|
4
4
|
package at `node_modules/@felloinnovations/brand-kit/AGENTS.md`. The HubSpot website (felix-theme) is out of scope:
|
|
@@ -14,35 +14,134 @@ All paths are under `node_modules/@felloinnovations/brand-kit/`.
|
|
|
14
14
|
| --- | --- |
|
|
15
15
|
| `design-system/README.md` | The guide's front page. Read it first. |
|
|
16
16
|
| `design-system/01-how-claude-decides.md` | The decision workflow: situation, recipe, components, foundations, states, verify. Follow it in order. |
|
|
17
|
-
| `design-system/<NN>-*.md` | The other numbered chapters, one per topic: colour, type, space, sizing, scrolling, choosing components, charts, patterns, page recipes, content, motion, accessibility, AI experiences, creativity, public pages, decisions, and `18-checklist.md`. |
|
|
18
|
-
| `design-system/components
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
17
|
+
| `design-system/<NN>-*.md` | The other numbered chapters, one per topic: colour, type, space, sizing, scrolling, choosing components, charts, patterns, page recipes, content, motion, accessibility, AI experiences, creativity, public pages, palettes (`20-palettes.md`), decisions, and `18-checklist.md`. |
|
|
18
|
+
| `design-system/components/README.md` | The catalog's index: every component by group, one line each. |
|
|
19
|
+
| `design-system/components/<Name>/` | The catalog: `README.md` (use, anatomy, states, rules) and `preview.html` (markup to copy). |
|
|
20
|
+
| `tokens/tokens.md` | Every token and its value, light and dark, and every word's contrast on every ground. Grep it before writing any value. |
|
|
21
|
+
| `dist/fello.css` | The whole kit in one file, in cascade layers. |
|
|
22
|
+
| `dist/fello.scoped.css` | The whole kit under a `.fello` root, for an app inside a host it does not own. |
|
|
21
23
|
| `tokens/tokens.css` | Tokens only, as a Tailwind v4 `@theme`. |
|
|
24
|
+
| `scripts/check-palette.mjs` | Checks an app's own palette file against the contract (Palettes, below). |
|
|
22
25
|
|
|
23
26
|
The same guide is hosted, always current, at `https://brand-kit-site-production.up.railway.app/latest/llms.txt`
|
|
24
|
-
(pinned copies under `/v/0.
|
|
27
|
+
(pinned copies under `/v/0.5.1/`).
|
|
25
28
|
|
|
26
29
|
---
|
|
27
30
|
|
|
28
|
-
##
|
|
31
|
+
## Which stylesheet
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
| Your app | Import |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Owns its page, Tailwind v4 | `tokens.css` and `fello.css` (below) |
|
|
36
|
+
| Owns its page, no Tailwind | `fello.css`, or `tokens.root.css` for the tokens alone |
|
|
37
|
+
| Owns its page, Tailwind v3 | the scoped build (below): v3's preflight is unlayered and beats every layered `fello.css` rule |
|
|
38
|
+
| Lives inside a host it does not own: a platform's guest app, a shared bundle, a Tailwind v3 host, a host with its own shadcn tokens | the scoped build (below) |
|
|
39
|
+
|
|
40
|
+
- **`fello.css`** (`@felloinnovations/brand-kit/fello.css`): Instrument Sans, every token (kit and product layer, light
|
|
41
|
+
and dark), and the `ws-*` component classes the catalog markup uses. Every rule sits in a `fello` layer nested in
|
|
42
|
+
Tailwind v4's own (`theme.fello`, `base.fello`, `components.fello`), so the app's utilities still win and its theme
|
|
43
|
+
stays its own. Its resets touch only elements that wear a `ws-*` class or sit inside one; only `html` and `body` are
|
|
44
|
+
styled bare. Unlayered CSS beats every layered rule, so an app's own bare `button`, `body` or `*:focus` rules now win
|
|
45
|
+
over the kit: keep them in a layer or off `ws-*` elements, or take the scoped build.
|
|
33
46
|
- **`tokens.css`** (`@felloinnovations/brand-kit/tokens.css`): the tokens only, as a Tailwind v4 `@theme`, so utilities
|
|
34
|
-
such as `bg-brand-salmon` exist.
|
|
47
|
+
such as `bg-brand-salmon` exist. It leaves Tailwind's `--radius-*` names to the host; the kit's corners are the
|
|
48
|
+
`--ws-radius-*` lengths.
|
|
35
49
|
|
|
36
|
-
A Tailwind v4 app usually takes both:
|
|
50
|
+
A Tailwind v4 app usually takes both, with the font first:
|
|
37
51
|
|
|
38
52
|
```css
|
|
53
|
+
@import url("https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400..700&display=swap");
|
|
39
54
|
@import "tailwindcss";
|
|
40
55
|
@import "@felloinnovations/brand-kit/tokens.css";
|
|
41
56
|
@import "@felloinnovations/brand-kit/fello.css";
|
|
42
57
|
@source "../node_modules/@felloinnovations/brand-kit/dist";
|
|
43
58
|
```
|
|
44
59
|
|
|
45
|
-
The
|
|
60
|
+
The font line comes first: compiled into one stylesheet, `fello.css`'s own font `@import` lands after Tailwind's rules,
|
|
61
|
+
where a browser drops it and the face never loads. A `<link>` to the same URL in the document head (or `next/font`)
|
|
62
|
+
does the same job. The `@source` line is what makes Tailwind generate the classes the kit's React components use.
|
|
63
|
+
|
|
64
|
+
**The scoped build** puts every rule under `.fello`, renames the keyframes `fello-ws-*`, and changes nothing outside a
|
|
65
|
+
`.fello` element:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import { felloScopedCss } from '@felloinnovations/brand-kit/scoped';
|
|
69
|
+
|
|
70
|
+
<div className="fello">
|
|
71
|
+
<style>{felloScopedCss}</style>
|
|
72
|
+
{/* the app */}
|
|
73
|
+
</div>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Or link `dist/fello.scoped.css`. Put `class="fello"` on the app's root and on the root of every portal (a menu, a tooltip,
|
|
77
|
+
a dialog rendered outside it), or those lose the kit. It has no font `@import`: link Instrument Sans yourself. The string
|
|
78
|
+
is plain TypeScript, so a Node test run that cannot load CSS still loads it. The `brand-adopt` skill has the whole path
|
|
79
|
+
for a guest app, without touching the host's lockfile or Dockerfile.
|
|
80
|
+
|
|
81
|
+
**shadcn**: `shadcn-compat.css` points shadcn's variables at the kit as `var()` refs (follows dark);
|
|
82
|
+
`shadcn-compat.hsl.css` writes bare HSL channels for a `hsl(var(--x))` config, with light, dark and `.dark` values.
|
|
83
|
+
`--primary` is the navy act and `--ring` the navy focus.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Dark theme
|
|
88
|
+
|
|
89
|
+
Opt-in. A page that sets nothing stays light.
|
|
90
|
+
|
|
91
|
+
```html
|
|
92
|
+
<html data-theme="dark"> <!-- night, always -->
|
|
93
|
+
<html data-theme="system"> <!-- follow the person's system -->
|
|
94
|
+
<html data-theme="dark" data-ground="navy"> <!-- the navy ground, for brand and event pages -->
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Any element takes the same attributes (a container, an app's `.fello` root), and the nearest one wins: dark inside a
|
|
98
|
+
light page, light inside a dark one.
|
|
99
|
+
|
|
100
|
+
Brand colours stay literal in every theme; semantic tokens carry the swap. So in your own CSS use the semantic names:
|
|
101
|
+
`--color-surface` (never `--color-white`) for a white surface, `--ws-raised` for anything that floats, `--ws-track` for an
|
|
102
|
+
empty track, `--ws-field` and `--ws-field-ink` for a field, `--ws-on-act` for words on the navy act, and
|
|
103
|
+
`--color-text-heading` for a navy mark. A wash or a shadow of your own is
|
|
104
|
+
`color-mix(in srgb, var(--ws-ink) 5%, transparent)` or the same with `--ws-shade`; the 0.4 channels `--ws-ink-rgb` and
|
|
105
|
+
`--ws-shade-rgb` still work but do not follow a palette. Prefer a token over a theme selector; if you must write one, use
|
|
106
|
+
`[data-theme="dark"] .x` (any element, not only `:root`) and repeat it for `system` inside
|
|
107
|
+
`@media (prefers-color-scheme: dark)`. A person's choice is the `ThemeSwitch` component.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Palettes
|
|
112
|
+
|
|
113
|
+
An app whose colours differ a little from the kit's sets a palette. It never writes its own values for kit tokens on
|
|
114
|
+
`:root` or in `@theme`: such an override goes unchecked, can set a token that should derive, and, being unlayered,
|
|
115
|
+
beats the kit's dark values too. A palette sets only the 33 contract tokens, everything derived recomputes from them,
|
|
116
|
+
and the check proves it AA in light, night and navy.
|
|
117
|
+
|
|
118
|
+
```html
|
|
119
|
+
<html data-palette="cool"> <!-- a built-in: default (none), cool, warm -->
|
|
120
|
+
<div class="fello" data-palette="warm" data-theme="dark"> <!-- on a container, with its own theme -->
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
- Pick by how it should look, and name your own the same way: never after the app.
|
|
124
|
+
- Your own: write the checked form, one file of `[data-palette="name"] { ... }` and the same with
|
|
125
|
+
`[data-theme="dark"]`, setting only contract tokens (in dark, only what the kit's dark does not give you). Check it,
|
|
126
|
+
fix every error, then ship what `--emit` writes, never the file you wrote:
|
|
127
|
+
|
|
128
|
+
```sh
|
|
129
|
+
node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs src/app.css
|
|
130
|
+
node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs --emit src/app.css > src/app.shipped.css
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The shipped file nests anywhere (on `<html>` or any container, either way round with the theme, light or dark, both
|
|
134
|
+
builds) and load order no longer matters. A dark value left out is the kit's derived dark, never the light value.
|
|
135
|
+
The check reports a hand-written file as "not in the shipped form": as written, its light values also paint in dark
|
|
136
|
+
wherever the theme sits on another element.
|
|
137
|
+
- A contract token the kit derives (the focus ring from the heading, the raised ground, the alert and positive words,
|
|
138
|
+
the rating and agent tones) recomputes on a container unless the palette sets it.
|
|
139
|
+
- A `:root` override does not reach the chart fades, tints and empty cell: they are literal on `:root` and derive only
|
|
140
|
+
on a palette or theme element. Use `data-palette`.
|
|
141
|
+
- Many apps in one bundle: each on its own `.fello` root with its own `data-palette`; its portals carry the same.
|
|
142
|
+
- In JS: `import { palettes, contract } from '@felloinnovations/brand-kit/palettes'` (every built-in resolved per theme).
|
|
143
|
+
|
|
144
|
+
The contract, nesting and the check are in `design-system/20-palettes.md`.
|
|
46
145
|
|
|
47
146
|
---
|
|
48
147
|
|
|
@@ -51,8 +150,8 @@ The `@source` line is what makes Tailwind generate the classes the kit's React c
|
|
|
51
150
|
Name the face before choosing anything (guide chapter 01, step 0: product workspace, dashboard or report, entry,
|
|
52
151
|
public web page, email, deck, mockup). The face sets one of two layers, never mixed on one surface:
|
|
53
152
|
|
|
54
|
-
- **Product layer**: a cream page and cream cards
|
|
55
|
-
card and per page; 14 px body; compact controls. Built from the catalog markup and `ws-*` classes, wrapped in the
|
|
153
|
+
- **Product layer**: a cream page and rimmed cream cards (the 1 px tray rim, 8 px corners), flat; one solid navy button
|
|
154
|
+
per card and per page; 14 px body; compact controls. Built from the catalog markup and `ws-*` classes, wrapped in the
|
|
56
155
|
app's own thin components.
|
|
57
156
|
- **Marketing layer** (public pages, chapter 19): white cards at 4 px, the salmon gradient button, the kit's big type
|
|
58
157
|
steps, 16 px body. The package's React `Button`, `Card`, `Input`, `Badge`, `Checkbox`, `Radio` and `Stat` are this
|
|
@@ -64,20 +163,27 @@ public web page, email, deck, mockup). The face sets one of two layers, never mi
|
|
|
64
163
|
|
|
65
164
|
## The rules
|
|
66
165
|
|
|
67
|
-
- **Never invent a value.** No raw hex, px font-size, one-off shadow
|
|
68
|
-
`tokens/tokens.md`. If none fits, say so and leave it; do not make one up.
|
|
166
|
+
- **Never invent a value.** No raw hex, px font-size, one-off shadow, ad-hoc radius or duration. Every value is a token in
|
|
167
|
+
`tokens/tokens.md`. If none fits, say so and leave it; do not make one up. A one-off spacing snaps to the nearest step.
|
|
69
168
|
- **Tailwind v4:** write `text-[color:var(--x)]` and `text-[length:var(--x)]`, never bare `text-[var(--x)]`. Tailwind
|
|
70
169
|
cannot tell a colour from a size behind a bare `var()`, guesses font-size, and drops the colour silently. This has
|
|
71
|
-
already shipped a bug.
|
|
170
|
+
already shipped a bug. Never `--radius-xl` or `--radius-2xl` for a product corner: those are Tailwind's.
|
|
72
171
|
- **Semantic tokens over primitives**: `var(--color-text-heading)`, not `var(--color-brand-navy)`, for the same job.
|
|
73
|
-
The semantic layer is what lets a colour be retuned in
|
|
172
|
+
The semantic layer is what lets a colour be retuned, and what turns in dark.
|
|
74
173
|
- **Check the catalog before building a component.** Never redraw one. If the kit has nothing for it, build it in
|
|
75
|
-
the consuming app from tokens and say what was missing
|
|
174
|
+
the consuming app from tokens and say what was missing, as an issue
|
|
175
|
+
(`https://github.com/FelloInnovations/brand-kit/issues/new?template=feedback.yml`). Do not add it to brand-kit and do not open a PR against it
|
|
76
176
|
from a consuming app; the kit's owners take it from there.
|
|
77
177
|
- **Close but not exact**: pass `className` to a React export (merged through `tailwind-merge`, so your utility wins).
|
|
78
178
|
Do not fork it.
|
|
79
|
-
- **
|
|
80
|
-
|
|
179
|
+
- **Layout**: one content edge per surface; numbers in fixed right-aligned columns; rows in a list share one
|
|
180
|
+
min-height; a selected row never changes size. A scroll region's children never shrink: a child that scrolls says so
|
|
181
|
+
(`flex: 1; min-height: 0; overflow: auto`). Never `overflow: hidden` on a card or a table. Inline icons are `ws-icon`.
|
|
182
|
+
- **Accessibility**: native elements first; the 2 px navy focus ring on every control (never `outline: none` without a
|
|
183
|
+
replacement); an error is a message wired with `aria-describedby`; targets 40 px boxed on touch and 24 px for words
|
|
184
|
+
that act; every word passes AA on its ground (use the word tokens).
|
|
185
|
+
- **Motion comes from the kit** (Motion, below): build with the catalog's classes and the motion comes with them.
|
|
186
|
+
Never hand-roll a transition, a duration, a curve or a `@keyframes`.
|
|
81
187
|
- **Every page scrolls**: no content trapped by a nested `overflow: hidden` or a fixed-height parent. A field on the
|
|
82
188
|
cream page has a white ground (`ws-field`).
|
|
83
189
|
- **Words**: sentence case, no em dashes, nothing developer-facing on a screen, never a faked card or number.
|
|
@@ -86,12 +192,77 @@ Before calling UI done, run `design-system/18-checklist.md`.
|
|
|
86
192
|
|
|
87
193
|
---
|
|
88
194
|
|
|
195
|
+
## Motion
|
|
196
|
+
|
|
197
|
+
Seth's motion is in `fello.css`, on his springs: build with the catalog's markup and classes and every press, slide,
|
|
198
|
+
fold, enter and exit is already there. The situations, with markup, are in `design-system/13-motion.md`.
|
|
199
|
+
|
|
200
|
+
- **Never hand-roll it.** No raw duration, `cubic-bezier()`, `ease-in-out`, `transition-all` or `@keyframes` of your
|
|
201
|
+
own, and no restyling a kit element's transition.
|
|
202
|
+
- **Hover is a tint, never a lift**: `ws-hover-tint` (`--faint`, `--strong`), inside `@media (hover: hover)`. No rise,
|
|
203
|
+
grow or shadow on hover.
|
|
204
|
+
- **Press**: `ws-btn`, `ws-icon-btn`, `ws-suggestion-chip` and chips that act spring to `--ws-press-scale` on their
|
|
205
|
+
own; a pressable of your own adds `ws-press`. Rows never scale; they take `--ws-surface-press`.
|
|
206
|
+
- **A choice slides**: `Segmented`, `Tabs`, `AppShell`'s current row, `SideList` and `ListDetail` move their
|
|
207
|
+
indicator when you move `aria-pressed`, `aria-selected` or `aria-current`. No extra markup or script.
|
|
208
|
+
- **Opening in place**: a kit `<details>`, or `ws-unfold` on a body shown and hidden with `hidden`.
|
|
209
|
+
- **Over the page**: `Menu` and `Popover` as a native `popover`, `Dialog` as a native `<dialog>`; a `Toast`,
|
|
210
|
+
`HoverCard`, `Panel` or mounted menu gets `data-leaving` and stays until its exit has played
|
|
211
|
+
(`Promise.allSettled(el.getAnimations().map((a) => a.finished)).then(() => el.remove())`). Opens grow from their
|
|
212
|
+
source; every exit is quicker than its entrance.
|
|
213
|
+
- **The two moves CSS cannot start**, both from the package root (under reduced motion, or without view transitions,
|
|
214
|
+
each just runs the update):
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
import { morph, reorder } from '@felloinnovations/brand-kit';
|
|
218
|
+
|
|
219
|
+
// as: 'full' a card to full screen and back, 'grow' / 'shrink' a tile opening and closing, 'shift' the chat's modes
|
|
220
|
+
morph(() => flushSync(() => setFull(true)), { as: 'full', el: cardRef.current, close: () => flushSync(() => setFull(false)) });
|
|
221
|
+
// rows re-sorting or filtering, a card moving column
|
|
222
|
+
reorder(() => flushSync(() => setRows(sorted)), listRef.current);
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- **A dashboard** wears `ws-build`, each card `ws-build__card` with `--ws-i`; **loading** is `Skeleton` (the shimmer),
|
|
226
|
+
never a spinner; **charts** take their `--draw` variant.
|
|
227
|
+
- **Your own part** (nothing in the catalog has it): a spring for what the person drives,
|
|
228
|
+
`transition: <prop> var(--ws-spring-<name>-duration) var(--ws-spring-<name>)` (the table in `13-motion.md`, "Which
|
|
229
|
+
spring, when"); `--ws-duration-*` with `--ws-ease-*` for what the system plays. In React the same springs:
|
|
230
|
+
`import { springs, eases } from '@felloinnovations/brand-kit/tokens'`, every motion tree in
|
|
231
|
+
`<MotionConfig reducedMotion="user">`.
|
|
232
|
+
- **Reduced motion is still**: write your own motion inside `@media (prefers-reduced-motion: no-preference)`; the
|
|
233
|
+
kit's net does the rest. Every change lands in its final state at once.
|
|
234
|
+
- **Check it** against the Motion card (`design-system/components/Motion/preview.html`: the playground and the
|
|
235
|
+
206-row reference), side by side.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Checking it
|
|
240
|
+
|
|
241
|
+
The kit's own checks run in the kit's repo, for anyone changing a catalog component (only `check-palette.mjs` ships in
|
|
242
|
+
the package; the rest show what "done" means for your own screens too):
|
|
243
|
+
|
|
244
|
+
```sh
|
|
245
|
+
node scripts/check-geometry.mjs --only Name1,Name2 --widths 320,390,1440 # alignment, spacing, centring, clipping, targets
|
|
246
|
+
node scripts/check-geometry.mjs --only Name1,Name2 --theme dark
|
|
247
|
+
node scripts/check-geometry.mjs --only Name1,Name2 --palette cool # any built-in palette, with or without --theme
|
|
248
|
+
node scripts/check-geometry.mjs --only Name1,Name2 --hover # rest, hover and focus; no lift, still under reduced motion
|
|
249
|
+
node scripts/check-geometry.mjs --only Name1,Name2 --hover --motion # the same with motion on: a lift that only plays then
|
|
250
|
+
node scripts/check-scope.mjs # the scoped build leaks nothing; fello.css resets miss the host
|
|
251
|
+
node scripts/check-palette.mjs [file.css] # the built-ins, or a palette file, against the contract
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Open every screenshot the geometry check writes. In an app, run the same eye over the screen at 320, 390 and 1440,
|
|
255
|
+
light and dark, with the keyboard, with motion on and with reduced motion (Checklist, "Senior QA, by eye").
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
89
259
|
## Provisional values
|
|
90
260
|
|
|
91
261
|
Not signed off and **will change**. Do not build anything load-bearing on them, and flag it when you use one:
|
|
92
262
|
|
|
93
263
|
- `--color-feedback-*`, `--color-alert`, `--color-stat-positive`: inherited from the HubSpot boilerplate.
|
|
94
264
|
- The kit `Button`'s `tertiary` and `clean` themes, and all kit `Badge` tones.
|
|
265
|
+
- The dark values of the glass stage and the frame gradient: derived, not drawn.
|
|
95
266
|
|
|
96
267
|
---
|
|
97
268
|
|
|
@@ -107,6 +278,9 @@ This project uses `@felloinnovations/brand-kit` (the Fello brand kit). Before wr
|
|
|
107
278
|
`node_modules/@felloinnovations/brand-kit/design-system/README.md` and its workflow `01-how-claude-decides.md`.
|
|
108
279
|
|
|
109
280
|
Every value is a token in `node_modules/@felloinnovations/brand-kit/tokens/tokens.md`: never invent a colour,
|
|
110
|
-
size, radius or
|
|
111
|
-
|
|
281
|
+
size, radius, shadow or duration. Motion comes with the catalog's classes (`design-system/13-motion.md`): never
|
|
282
|
+
hand-roll a transition. Check the catalog (`design-system/components/`) before building a component. Write
|
|
283
|
+
`text-[color:var(--x)]`, never `text-[var(--x)]`. Dark is opt-in (`data-theme`). This app's own colours are a palette
|
|
284
|
+
(`data-palette`, `design-system/20-palettes.md`), checked with `scripts/check-palette.mjs` and shipped as its
|
|
285
|
+
`--emit` writes it, never tokens retuned on `:root`. Run `design-system/18-checklist.md` before calling UI done.
|
|
112
286
|
```
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,226 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.1 (10 Nov 2026)
|
|
4
|
+
|
|
5
|
+
Loaders are calm: the shimmer is one quiet grey. Amit looked at the skeletons in an app built on the kit and did not
|
|
6
|
+
like the salmon, purple and green tints sweeping every grey ghost block (Decisions, 10 Nov 2026).
|
|
7
|
+
|
|
8
|
+
- **The shimmer is one neutral tone.** `--ws-shimmer` is the ghost grey with a lighter pass of the same grey, no chart
|
|
9
|
+
hues, in light, night, the navy ground and every palette. North's timing stays: 1.8 s on `--ws-loop-shimmer` and
|
|
10
|
+
`--ws-ease-shimmer`, the 300 % band at 100 deg; still under reduced motion. Every ghost that wears the shimmer
|
|
11
|
+
(Skeleton, a pending Stat, StatTiles, Table, Well, TickStrip, ShareBar, ScoreHero and the rest) changes with no
|
|
12
|
+
markup change.
|
|
13
|
+
- **One ghost grey at rest and in motion.** `--ws-shimmer-ground` is now `--ws-ghost` (#E3DFDB, the night's #273544),
|
|
14
|
+
so a ghost shows on the cream (1.29:1) and on the tray (1.13:1) alike, and the still ghost under reduced motion is the
|
|
15
|
+
same grey. Skeleton's own ground for a card's foot or band is gone.
|
|
16
|
+
- **The chart ghost's colour band is gone.** `ws-skeleton__chart`'s bars are ghosts under the same shimmer; the band
|
|
17
|
+
that crossed the drawing in blend mode colour is removed (a neutral band there would paint nothing).
|
|
18
|
+
- **The docs say so**: the Skeleton card and preview, the Motion card (the shimmer row is now Close, the chart band row
|
|
19
|
+
Not yet), Colour, Motion, Patterns, Charts, Choosing components and every loading line in the catalog.
|
|
20
|
+
- **Pinned links keep working**: `/v/0.5.0/` is kept as a snapshot (`hosted/v/0.5.0`), so a page pinned to it still
|
|
21
|
+
loads after the bump. Pinned links in the docs now point at `/v/0.5.1/`.
|
|
22
|
+
|
|
23
|
+
**Upgrading from 0.5.0**: nothing to change. A copy of the old gradient, or of #ECE8E4 as the shimmer's grey, should
|
|
24
|
+
become `var(--ws-shimmer)` or `var(--ws-shimmer-ground)`. `StatusLine`'s working words keep their colours for now (open
|
|
25
|
+
in Decisions).
|
|
26
|
+
|
|
27
|
+
## 0.5.0 (4 Nov 2026)
|
|
28
|
+
|
|
29
|
+
The kit the whole team can trust: teams kept hitting alignment, spacing and placement bugs, and Seth (the designer) has
|
|
30
|
+
new, detailed work to learn from. 0.5.0 rebuilds the product layer on his six Fia frames and his North app, fixes every
|
|
31
|
+
fault the field found, stops `fello.css` restyling other apps, adds an opt-in dark theme and lets every app keep its own
|
|
32
|
+
palette. Fifteen decisions set the defaults (D1 to D15 in Decisions, 4 Nov 2026), D1 to D14 open to Amit's veto; every
|
|
33
|
+
kit rule they overturn is logged with Seth's source.
|
|
34
|
+
|
|
35
|
+
- **Seth's layout, measured.** One content edge per surface; numbers in fixed right-aligned columns; rows in a list share
|
|
36
|
+
one min-height and a selected row never changes size; dividers 0.5 px and full width; four half steps on the 4 px
|
|
37
|
+
grid (2, 6, 10, 14), every other value snapped; a 32 px app gutter, the stage 13 from the top and 12 from the right
|
|
38
|
+
and bottom; layouts re-lay out by the room they have, never just shrink.
|
|
39
|
+
- **The rimmed card.** Every product card is Seth's tray: a 1 px #EDEDED rim, concentric corners (8 and 7; a drawer 12
|
|
40
|
+
and 11), the cream surface, an optional foot on the rim, no outline and no shadow at rest. Same class names, so markup
|
|
41
|
+
upgrades in place except the items in "Upgrading from 0.4" below.
|
|
42
|
+
- **Type gains Seth's steps**: a 96 px report score, 44, 32 and 28 px figures, 13/18 control words, 15/22 sections, 15/20
|
|
43
|
+
row names.
|
|
44
|
+
- **Words AA on every ground.** Every word token is computed on eight grounds in light, night and navy, and the build
|
|
45
|
+
stops on a fail. Muted words are #666666. New word and mark tokens for needs work (pink), alert and past halfway; a
|
|
46
|
+
rating is teal, mid blue or pink.
|
|
47
|
+
- **Motion from North**: role-named durations, curves and staggers, and Seth's springs in `tokens.ts` (`springs`,
|
|
48
|
+
`eases`); hover is a colour, never a lift; opens grow from their slot and their details settle after; loading is a
|
|
49
|
+
shimmer in the chart colours. Everything is still under reduced motion, by a net on every kit element.
|
|
50
|
+
- **Motion comes with the components, and the guide says how.** Seth's springs are CSS too (`--ws-spring-<name>` over
|
|
51
|
+
`--ws-spring-<name>-duration`, a `linear()` curve with its overshoot kept), so buttons and chips press on a spring,
|
|
52
|
+
`Segmented`, `Tabs`, `AppShell`, `SideList` and `ListDetail` slide their indicator (CSS anchor positioning), every
|
|
53
|
+
kit `<details>` and `.ws-unfold` folds, and menus, popovers, dialogs, toasts, tooltips, hover cards and panels grow
|
|
54
|
+
in from their source and leave quicker; `morph()` and `reorder()` do the two moves CSS cannot start. Motion is
|
|
55
|
+
rewritten by situation (hover, press, a choice, a fold, an overlay, full screen, a reorder, a dashboard, loading,
|
|
56
|
+
charts), with which spring to use when, the reduced-motion and older-browser fallbacks, and the Motion card as the
|
|
57
|
+
reference; the skill, AGENTS.md, the Checklist, `brand-new` and `brand-audit` carry the same rules, and
|
|
58
|
+
`check-geometry --hover --motion` catches a hover lift that only plays with motion on.
|
|
59
|
+
- **Dashboards build in, in every app** (Amit, 5 Nov). `.ws-build` on a page or section: its cards rise in 70 ms apart
|
|
60
|
+
and each card's charts draw as it lands, once, as it scrolls into view (a scroll trigger where the browser has one,
|
|
61
|
+
first paint elsewhere). `MetricTile` gains North's mini charts (a column strip, a line with dots) that grow and draw
|
|
62
|
+
in and wake to their tone on hover; `SideList` goal rows fill in order, navy, teal past the goal, red behind.
|
|
63
|
+
- **`TrendLine`, a value over periods as a line or as columns.** Bars / Line morphs between them: the columns melt into
|
|
64
|
+
the line on `--ws-spring-morph-chart` while it draws, and grow back down from the dots. A band slides to the hovered
|
|
65
|
+
period and a dot grows; a real table reads it out. It builds in on arrival, or as it scrolls into view. Motion's
|
|
66
|
+
playground now opens on a dashboard that builds in (four tiles, the goals, the chart card) with Replay the arrival.
|
|
67
|
+
- **Full screen covers the window from anywhere.** `morph(update, { as: 'full', el })` lifts a chat card into the top
|
|
68
|
+
layer while it is full (a manual popover), with Escape (`close`) and focus in and back, so the chat's glass, AppShell's
|
|
69
|
+
stage or any ancestor with a transform, filter, `contain` or `will-change` no longer squashes it into a strip. The
|
|
70
|
+
stage draws its blur on a layer, so a toaster or a phone's full-screen panel inside it reaches the window, and a
|
|
71
|
+
tooltip anchors to the window, so the bar and the body's scroll no longer cut it. The Motion card opens on a
|
|
72
|
+
playground: a product screen with every North move live and a numbered hint at each.
|
|
73
|
+
- **Focus you can see**: a 2 px navy ring 2 px outside everything that takes focus, drawn inside dense rows. The old
|
|
74
|
+
salmon halo was 1.21:1.
|
|
75
|
+
- **Dark, opt-in**: `data-theme="dark"` or `"system"` on `<html>` or any container, `data-ground="navy"` for the navy
|
|
76
|
+
ground; the nearest wins, so light inside dark works and the reverse. A page that sets nothing stays light. Brand
|
|
77
|
+
colours stay literal; semantic tokens carry the swap.
|
|
78
|
+
- **Palettes: one kit, many apps** (D15). A palette sets only the contract, 33 existing semantic tokens listed with
|
|
79
|
+
their meaning in `design-tokens.json` and the new Palettes chapter; everything derived recomputes inside the element
|
|
80
|
+
that sets it, and so does a contract token the kit derives (the focus ring from the heading, the raised ground, the
|
|
81
|
+
alert and positive words, the rating and agent tones) unless the palette sets it. Built-ins named for how they look:
|
|
82
|
+
`default` (no attribute), `cool`, `warm`. The first product's tally navy gets no palette: Seth's #2C4870 wins (D1)
|
|
83
|
+
and the product adopts it. On `<html>` or any container, light or dark, nested either way, in `fello.css` and the
|
|
84
|
+
scoped build, so many apps in one bundle each keep their own. `scripts/check-palette.mjs` ships in the package and
|
|
85
|
+
checks any app's palette file (contract only, every word AA on every ground, the focus ring and the act 3:1, chart
|
|
86
|
+
tones apart) in light, night and navy; `--emit` then writes the file to ship, in the built-ins' own form, so an app's
|
|
87
|
+
palette nests anywhere too and load order no longer matters. A dark value a palette leaves out is the kit's derived
|
|
88
|
+
dark, never its light value. `palettes` and `contract` come from the package and
|
|
89
|
+
`@felloinnovations/brand-kit/palettes`. The gallery's Components page gains a theme and palette switch.
|
|
90
|
+
- **Every colour follows the palette** (D15), in light, night and the navy ground. Component styles carry no colour
|
|
91
|
+
literal (`build-bundle --check` fails on one), and every colour a component paints derives from the contract. The
|
|
92
|
+
dark tints and fades are now their tone over the dark page (within CIEDE2000 3.5 of the old literals), so an app's
|
|
93
|
+
dark page moves them; the dark alert tone #FF5A5A became #FF5470, which a chart can tell from salmon. New tokens
|
|
94
|
+
(none renamed): `--ws-frame-top`, `--ws-stage-foot`, `--ws-agent-coach`, `--ws-agent-growth`, `--ws-agent-recruit`;
|
|
95
|
+
`--ws-ink` and `--ws-shade` (the ink of washes and rings, the tint of a drop); `--ws-inverse` and `--ws-on-inverse`
|
|
96
|
+
(the toast, note and footer pair); `--ws-control-off` (a switch's off track); `--ws-shimmer-ground`; `--ws-glow-rose`,
|
|
97
|
+
`--ws-glow-pink`, `--ws-glow-blue` and `--ws-orb`; `--ws-mask` for mask stops. `--ws-ink-rgb` and `--ws-shade-rgb`
|
|
98
|
+
stay as legacy and do not follow a palette. Kit aliases now: `--color-border-default` is `--ws-edge`, the hairline
|
|
99
|
+
`--ws-edge-card`, `--color-stat-positive` `--ws-chart-finished`, `--color-text-brand-strong` `--ws-word-needs`.
|
|
100
|
+
Still the brand's under any palette, by ruling: the toast, the note tip and the footer keep the brand navy with white
|
|
101
|
+
words in dark; `KitButton`'s salmon and navy acts and the `Cover` logo; the navy ground's fields. Proof:
|
|
102
|
+
`check-palette` finds a leftover statically (a colour a component reads that no contract token moves), and the
|
|
103
|
+
poison test (`scripts/palette-poison.mjs`, run in CI from `check-scope`) sets each contract token to a wild colour
|
|
104
|
+
on `<html>` and on a container around every preview, light and dark, and finds nothing stale, leaked or constant.
|
|
105
|
+
- **`fello.css` stops leaking** into the apps around it: every rule sits in a `fello` layer nested in Tailwind's own, so
|
|
106
|
+
utilities win; resets touch only kit elements; Tailwind's radius names stay the host's. New `fello.scoped.css` and
|
|
107
|
+
`@felloinnovations/brand-kit/scoped` (the CSS as a string) put everything under a `.fello` root for a guest app in a
|
|
108
|
+
shared host. `shadcn-compat.hsl.css` for `hsl(var(--x))` configs; `--primary` is now the navy act.
|
|
109
|
+
- **The shell owns its scroll** (the Revenue OS audit, K1 to K17): nothing squashed by its scroller, screen-reader words
|
|
110
|
+
no longer stretch the window, dialogs scroll and fit the window, drawers are the whole screen on a phone, menus open
|
|
111
|
+
in the top layer, one touch block (40 px boxes, 24 px words), inline icons sized (`ws-icon`).
|
|
112
|
+
- **New components**: Split, HoverCard, ListDetail, SideList, Matrix, CheckRow, Slider, FilterBar, ThemeSwitch,
|
|
113
|
+
TickStrip, ScoreHero, SegmentedProgress, ShareBar, StepLine, Heatmap, MetricTile, PaceBar, StatusLine, LoadBar,
|
|
114
|
+
SuggestionChip, TopicRail and ChatShell. Issues #5 to #12 are done (GoalBars, the v7 ring, TickRow sizes, the Example
|
|
115
|
+
tag, the tile row, the snug card, the first-open recipe).
|
|
116
|
+
- **The guide**: Space and layout, Motion, Scrolling, Colour and Type rewritten; interaction states (hover, press, focus,
|
|
117
|
+
selected, pending, loading) in Patterns; every new component in Choosing components and Charts; three new recipes
|
|
118
|
+
(the first open of an AI app's thread, a report with its drawer, an inbox list and detail) and a dashboard home;
|
|
119
|
+
Accessibility on focus and reduced motion; Checklist gains the geometry check and a senior QA list.
|
|
120
|
+
- **Checks**: `yarn check:geometry` measures every preview at 320, 390 and 1440 (`--theme dark`, `--palette cool`,
|
|
121
|
+
`--hover` for focus);
|
|
122
|
+
`yarn check:scope` proves the scoped build changes nothing outside `.fello` and `fello.css`'s resets never touch
|
|
123
|
+
the host's markup. The skills and AGENTS.md cover the scoped build,
|
|
124
|
+
dark and the checks; `brand-adopt` gains the guest-app path (no root lockfile or Dockerfile change).
|
|
125
|
+
|
|
126
|
+
### Upgrading from 0.4
|
|
127
|
+
|
|
128
|
+
Most markup keeps working: the class names stay, and a card, a button or a row takes the new look by itself. These are
|
|
129
|
+
the exceptions. After the bump, run `yarn check:geometry` on your own previews (or look at each screen at 320, 390 and
|
|
130
|
+
1440) before you ship.
|
|
131
|
+
|
|
132
|
+
**Classes removed** (7, the only ones 0.4 had that 0.5 does not)
|
|
133
|
+
|
|
134
|
+
| 0.4 | 0.5 |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| `ws-stat-tiles__stripe` with `--navy`, `--purple`, `--salmon` or `--teal` | Gone: Seth's tile has no stripe, so delete the element. Where the tone meant a category, put it on the tile's mark: a `ws-tick-row ws-tick-row--tall` with `style="--tone: var(--ws-chart-...)"` in `__value-row` |
|
|
137
|
+
| `ws-stat-tiles__ticks` | A `ws-tick-row` (`--tall` for Seth's size) inside `ws-stat-tiles__value-row`, beside the figure |
|
|
138
|
+
| `ws-funnel-bars__fill--first` | Delete it: every bar takes the same 4 px corners now |
|
|
139
|
+
|
|
140
|
+
**Markup to change**
|
|
141
|
+
|
|
142
|
+
| Piece | 0.4 | 0.5 |
|
|
143
|
+
| --- | --- | --- |
|
|
144
|
+
| StatTiles | `<ul class="ws-stat-tiles">` of `<li class="ws-card ws-stat-tiles__tile">` | `<div class="ws-stat-tiles"><ul class="ws-stat-tiles__grid">` of `<li class="ws-stat-tiles__tile"><div class="ws-stat-tiles__surface">...</div><div class="ws-stat-tiles__foot">...</div></li>`. The 0.4 form still lays out (as many tiles of at least 14 rem as its own width holds) but gets no count rule and no foot |
|
|
145
|
+
| A card with a foot | the 80 px band (`ws-band`) for every act | On a page: `<div class="ws-card"><div class="ws-card__surface">...</div><a class="ws-card__foot">...</a></div>`, the foot on the tray. The band stays for a chart card's one act |
|
|
146
|
+
| AppShell, to pin the person | `__wordmark`, `__rows` and `__foot` straight inside `__nav` | `__head` (holding `__wordmark`), then `__groups` (holding each `__group` and its `__rows`), then `__foot`. Without the wrappers the person scrolls away with the rows |
|
|
147
|
+
| A page in AppShell | a `.ws-page` inside `__body` | No `.ws-page` there: the body is the page (its gutter, gap and size container) |
|
|
148
|
+
| PageBar | `__words` held the `h1` and a `<p class="ws-body">` sentence under it | `__words` is one line: `__face`, the `h1` `__title`, a short `__context` word. An old sentence now sits inline beside the title; move it into the page under the bar |
|
|
149
|
+
| Ring, the split | `.ws-ring__split` with `.ws-ring__hole` inside `.ws-ring__ticks` | Inside `.ws-ring__split`, a `.ws-ring__plate` holding `.ws-ring__ticks` and then `.ws-ring__hole` (with `__total` and `__caption`). An old hole inside the ticks shows the dots through it |
|
|
150
|
+
| GoalBars | `__fillbox` held `__not-yet` and `__fill` | Add `<span class="ws-goal-bars__leader"></span>` between them, so each bar's leader runs to its dot |
|
|
151
|
+
| EntryShell, StatusScreen | filled only their parent | A bare page (the shell or the screen straight in `body`) adds `--page` (`ws-entry-shell--page`, `ws-status-screen--page`) to fill and centre in the window. Without it StatusScreen stays in the top third of its parent by design, since it can also sit inside a page as a block |
|
|
152
|
+
| Tooltip | the tip was always drawn; the app mounted it only while it showed | The tip is hidden until its `.ws-tooltip` is hovered or holds keyboard focus; to show it from code, add `ws-tooltip--open` |
|
|
153
|
+
|
|
154
|
+
**Looks and behaviour that change on their own**
|
|
155
|
+
|
|
156
|
+
- **Focus**: a 2 px navy outline 2 px outside, on `:focus-visible`, replaces the salmon halo (it was 1.21:1). A host rule
|
|
157
|
+
such as `*:focus { outline: none }` now hides the kit's focus: remove it.
|
|
158
|
+
- **Corners**: buttons and square icon buttons 6 (were 4); `IconButton` is a square, `ws-icon-btn--round` for voice and
|
|
159
|
+
send; chips 4 (were 2); checkboxes and radios 18 px with 4 px corners and a navy edge (were 16 and grey); cards 8
|
|
160
|
+
outside, 7 inside; dialogs and drawers 12; menus 10; the toast an 18 px pill.
|
|
161
|
+
- **Cards**: the rim is a 1 px `border` in the tray colour, so a card's inside is 2 px narrower and a `border` of your own
|
|
162
|
+
replaces the rim. A child that rounds with the card takes `--ws-radius-card-inner`. Hover on a pressable card darkens
|
|
163
|
+
the rim; nothing lifts.
|
|
164
|
+
- **Buttons**: words 13/18 (were 14/16), `--lg` 40 tall (was 36), `--secondary` has no fill (the cream is gone; the new
|
|
165
|
+
`--well` sits on the tray), primary hover brightens instead of dimming. A button still stays on one line and never
|
|
166
|
+
shrinks beside its row's words, as in 0.4; a label that can be wider than its column opts in with `ws-btn--wrap`
|
|
167
|
+
(balanced lines). The halves of a `ws-btn-split` stack, full width, instead of breaking a label.
|
|
168
|
+
- **Card heads wrap**: in a `.ws-head` the aside drops under the title, as one piece, when it would squeeze the title
|
|
169
|
+
below 200 px, where 0.4 kept one line. Put controls that may drop together in one element (a `ws-cluster`). Icon acts
|
|
170
|
+
(a close, an expand) never drop: they stay top right on the title's first line and the title wraps.
|
|
171
|
+
- **Stacks**: `ws-stack` and `ws-cluster` are 8 apart and no longer read a `--ws-gap` set on a parent; take a modifier
|
|
172
|
+
for another gap (`--tight`, `--loose`, `--component`, `--group`, and on a stack `--block` 32 or `--section` 56).
|
|
173
|
+
- **Titles** (`ws-title`, `ws-section`) lose their -0.5% tracking and balance their lines.
|
|
174
|
+
- **Hover only where a pointer hovers**: every kit hover sits in `@media (hover: hover)`, so a tap on a phone never
|
|
175
|
+
leaves it stuck. A hover of your own on a kit piece needs the same query.
|
|
176
|
+
- **Sizes**: the page gutter is 32 (was 24, still 16 on a phone); the folded rail 64 (was 72); a PageBar title 16/22
|
|
177
|
+
(was 26/32) and one line, with an ellipsis; muted words #666666 (were #6E6E6E). Breadcrumb links are body grey with a
|
|
178
|
+
"/" (were mid blue with chevrons). Section rows lost their 8 px sides and 6 px corners. Toasts are navy pills.
|
|
179
|
+
- **Tailwind's radius names are the host's again**: `tokens.css` no longer sets `--radius-xs` to `--radius-2xl`, so
|
|
180
|
+
`rounded-xl` and `rounded-2xl` go back to Tailwind's own sizes. Use the `--ws-radius-*` lengths for kit corners; every
|
|
181
|
+
kit piece, the marketing ones and the React exports included, rounds with them, so a shadcn `--radius` no longer
|
|
182
|
+
moves a kit corner.
|
|
183
|
+
- **The font in a Tailwind v4 app**: put the Instrument Sans `@import` before `@import "tailwindcss"` (AGENTS.md), or a
|
|
184
|
+
`<link>` in the head. Compiled into one stylesheet, `fello.css`'s own font `@import` lands after Tailwind's rules,
|
|
185
|
+
where a browser drops it, so the face never loaded.
|
|
186
|
+
- **shadcn**: `--primary` in `shadcn-compat.css` is now the navy act with `ws-on-act` words (was salmon with white).
|
|
187
|
+
- **A `:root` override of a chart tone**: the chart fades, tints and empty cell are literal on `:root` and derive on
|
|
188
|
+
every palette or theme element, so a bare `:root { --ws-chart-under-half: X }` without `data-palette` no longer moves
|
|
189
|
+
them. Put the change in a palette.
|
|
190
|
+
- **Washes of your own**: `rgba(var(--ws-ink-rgb), a)` still paints, in the default's colours only (it follows the
|
|
191
|
+
theme, not a palette). Write `color-mix(in srgb, var(--ws-ink) 5%, transparent)` (and `--ws-shade` for a drop) so it
|
|
192
|
+
follows a palette.
|
|
193
|
+
- **Layers**: `fello.css` sits in cascade layers (`theme.fello`, `base.fello`, `components.fello`, inside Tailwind's own),
|
|
194
|
+
so your utilities win, and so does any unlayered CSS of yours. In 0.4 a bare `button { ... }` or `body { ... }` rule of
|
|
195
|
+
the host lost to the kit; now it wins. Put such rules in a layer, scope them away from `ws-*` elements, or take the
|
|
196
|
+
scoped build. Tailwind v3 (its preflight is unlayered) always takes the scoped build.
|
|
197
|
+
- **An artifact** inlines `fello-core.css` (unlayered) and the blocks of the components it uses, as `Starter` and the
|
|
198
|
+
skill do, not the whole `fello.css`, which is now over 400 kB and layered.
|
|
199
|
+
|
|
200
|
+
**Opting in**
|
|
201
|
+
|
|
202
|
+
- **Dark**: `<html data-theme="dark">` for the night ground, `data-theme="system"` to follow the person's setting, and
|
|
203
|
+
`data-ground="navy"` beside it for the navy ground (brand and event pages). A page that sets nothing stays light.
|
|
204
|
+
In the scoped build the same attributes work on the `.fello` element or any ancestor; a host's `.dark` class does not
|
|
205
|
+
turn the kit.
|
|
206
|
+
- **A palette**: an app whose colours differ a little from the kit's sets `data-palette` instead of retuning kit
|
|
207
|
+
tokens on `:root`: a built-in, or its own file of contract tokens, checked with
|
|
208
|
+
`node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs <file>` and shipped as
|
|
209
|
+
`check-palette.mjs --emit <file> > <file>.shipped.css` writes it. The `brand-adopt` skill has the step. A theme
|
|
210
|
+
selector of your own can now be `[data-theme="dark"] .x` on any element.
|
|
211
|
+
- **The scoped build**, for an app inside a host it does not own (a platform's guest app, a shared bundle) or any
|
|
212
|
+
Tailwind v3 app: `import { felloScopedCss } from '@felloinnovations/brand-kit/scoped'` and render
|
|
213
|
+
`<div className="fello"><style>{felloScopedCss}</style>...</div>`, or link `fello.scoped.css`. Put `class="fello"` on
|
|
214
|
+
every portal's root too (menus, tooltips, dialogs rendered outside the app). It has no font `@import`: link Instrument
|
|
215
|
+
Sans yourself. `yarn check:scope` proves it changes nothing outside `.fello`.
|
|
216
|
+
|
|
217
|
+
## Feedback loop (30 Oct 2026)
|
|
218
|
+
|
|
219
|
+
What the kit misses now reaches its owners. A new `brand-feedback` skill turns a job's gaps (a component built from
|
|
220
|
+
tokens, a missing token, an unclear rule, something broken) into one GitHub issue per gap on this repo, after checking
|
|
221
|
+
for an open one to add to. The other skills and the guide offer it when they finish. Without `gh` (claude.ai, Cowork)
|
|
222
|
+
it gives a link that opens the issue already filled in, through the new feedback issue form. No package change.
|
|
223
|
+
|
|
3
224
|
## 0.4.0 on npm (30 Oct 2026)
|
|
4
225
|
|
|
5
226
|
The kit moves from GitHub Packages to the public npm registry, so anyone, any app and any deploy installs it with
|