@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- @dsCard group="Actions" height=
|
|
1
|
+
<!-- @dsCard group="Actions" height=500 -->
|
|
2
2
|
<!doctype html>
|
|
3
3
|
<html>
|
|
4
4
|
<head>
|
|
@@ -11,70 +11,104 @@
|
|
|
11
11
|
<div class="ws-stage ws-stage--column">
|
|
12
12
|
|
|
13
13
|
<div class="ws-stack">
|
|
14
|
-
<span class="ws-muted">Ghost, outline, solid, primary (
|
|
14
|
+
<span class="ws-muted">Ghost, outline, solid, primary (32 px squares, 6 px corners, navy 16 px icons)</span>
|
|
15
15
|
<div class="ws-cluster ws-cluster--loose">
|
|
16
|
-
<button class="ws-icon-btn" aria-label="Edit criteria" title="Edit criteria">
|
|
17
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
16
|
+
<button type="button" class="ws-icon-btn" aria-label="Edit criteria" title="Edit criteria">
|
|
17
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
18
18
|
</button>
|
|
19
|
-
<button class="ws-icon-btn ws-icon-btn--outline" aria-label="Edit criteria" title="Edit criteria">
|
|
20
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
19
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--outline" aria-label="Edit criteria" title="Edit criteria">
|
|
20
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
21
21
|
</button>
|
|
22
|
-
<button class="ws-icon-btn ws-icon-btn--solid" aria-label="
|
|
23
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
|
|
22
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid" aria-label="Close" title="Close">
|
|
23
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
24
24
|
</button>
|
|
25
|
-
<button class="ws-icon-btn ws-icon-btn--primary" aria-label="Send" title="Send">
|
|
26
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 13V3M4 7l4-4 4 4"/></svg>
|
|
25
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--primary" aria-label="Send" title="Send">
|
|
26
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V3M4 7l4-4 4 4"/></svg>
|
|
27
27
|
</button>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
<div class="ws-stack">
|
|
32
|
-
<span class="ws-muted">
|
|
32
|
+
<span class="ws-muted">Seth's Previous and Next (solid), beside their count</span>
|
|
33
|
+
<div class="ws-cluster">
|
|
34
|
+
<span class="ws-control-words ws-muted">4 of 10</span>
|
|
35
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid" aria-label="Previous review" title="Previous review">
|
|
36
|
+
<svg 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.5 10l3.5-3.5 3.5 3.5"/></svg>
|
|
37
|
+
</button>
|
|
38
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid" aria-label="Next review" title="Next review">
|
|
39
|
+
<svg 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.5 6l3.5 3.5 3.5-3.5"/></svg>
|
|
40
|
+
</button>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="ws-stack">
|
|
45
|
+
<span class="ws-muted">Sizes: xs (24), small (28), medium (32), large (36, a 20 px icon); every one a 40 px target on touch</span>
|
|
46
|
+
<div class="ws-cluster ws-cluster--loose">
|
|
47
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--xs ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
48
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
49
|
+
</button>
|
|
50
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--sm ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
51
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
52
|
+
</button>
|
|
53
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
54
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
55
|
+
</button>
|
|
56
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--lg ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
57
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="ws-stack">
|
|
63
|
+
<span class="ws-muted">Round: the voice and send discs (they give 0.94 under a press)</span>
|
|
33
64
|
<div class="ws-cluster ws-cluster--loose">
|
|
34
|
-
<
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<
|
|
39
|
-
</
|
|
40
|
-
<div class="ws-stack ws-stack--tight" style="align-items: center;">
|
|
41
|
-
<button class="ws-icon-btn ws-icon-btn--sm ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
42
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
43
|
-
</button>
|
|
44
|
-
<span class="ws-muted" style="font-size: var(--ws-text-micro);">small</span>
|
|
45
|
-
</div>
|
|
46
|
-
<div class="ws-stack ws-stack--tight" style="align-items: center;">
|
|
47
|
-
<button class="ws-icon-btn ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
48
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
49
|
-
</button>
|
|
50
|
-
<span class="ws-muted" style="font-size: var(--ws-text-micro);">medium</span>
|
|
51
|
-
</div>
|
|
52
|
-
<div class="ws-stack ws-stack--tight" style="align-items: center;">
|
|
53
|
-
<button class="ws-icon-btn ws-icon-btn--lg ws-icon-btn--outline" aria-label="Remove" title="Remove">
|
|
54
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
55
|
-
</button>
|
|
56
|
-
<span class="ws-muted" style="font-size: var(--ws-text-micro);">large</span>
|
|
57
|
-
</div>
|
|
65
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--lg ws-icon-btn--round ws-icon-btn--primary" aria-label="Talk" title="Talk">
|
|
66
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="6" y="2" width="4" height="7" rx="2"/><path d="M4 7.5a4 4 0 0 0 8 0M8 13.5V15"/></svg>
|
|
67
|
+
</button>
|
|
68
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--round ws-icon-btn--solid" aria-label="Send" title="Send">
|
|
69
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V3M4 7l4-4 4 4"/></svg>
|
|
70
|
+
</button>
|
|
58
71
|
</div>
|
|
59
72
|
</div>
|
|
60
73
|
|
|
61
74
|
<div class="ws-stack">
|
|
62
|
-
<span class="ws-muted">
|
|
75
|
+
<span class="ws-muted">Hover, pictured (is-hover): ghost (the navy wash), outline (a darker edge), solid (a darker grey), primary (a brighter navy); then pressed (0.97) and focus (2 px navy ring)</span>
|
|
63
76
|
<div class="ws-cluster ws-cluster--loose">
|
|
64
|
-
<button class="ws-icon-btn" aria-label="
|
|
65
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"
|
|
77
|
+
<button type="button" class="ws-icon-btn is-hover" aria-label="Edit criteria" title="Edit criteria">
|
|
78
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
79
|
+
</button>
|
|
80
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--outline is-hover" aria-label="Edit criteria" title="Edit criteria">
|
|
81
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
66
82
|
</button>
|
|
67
|
-
<button class="ws-icon-btn ws-icon-btn--solid
|
|
68
|
-
<svg
|
|
83
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid is-hover" aria-label="Close" title="Close">
|
|
84
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
85
|
+
</button>
|
|
86
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--primary is-hover" aria-label="Send" title="Send">
|
|
87
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V3M4 7l4-4 4 4"/></svg>
|
|
88
|
+
</button>
|
|
89
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid is-hover is-pressed" aria-label="Close" title="Close">
|
|
90
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
91
|
+
</button>
|
|
92
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--outline is-focus" aria-label="Edit criteria" title="Edit criteria">
|
|
93
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
69
94
|
</button>
|
|
70
95
|
</div>
|
|
71
96
|
</div>
|
|
72
97
|
|
|
73
98
|
<div class="ws-stack">
|
|
74
|
-
<span class="ws-muted">
|
|
99
|
+
<span class="ws-muted">Selected (a mic that is listening), pending (its icon breathes), disabled, the navy one disabled</span>
|
|
75
100
|
<div class="ws-cluster ws-cluster--loose">
|
|
76
|
-
<button class="ws-icon-btn
|
|
77
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><
|
|
101
|
+
<button type="button" class="ws-icon-btn" aria-label="Microphone" aria-pressed="true" title="Microphone on">
|
|
102
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="6" y="2" width="4" height="7" rx="2"/><path d="M4 7.5a4 4 0 0 0 8 0M8 13.5V15M6 15h4"/></svg>
|
|
103
|
+
</button>
|
|
104
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--solid" aria-label="Draft the opener" aria-busy="true" aria-disabled="true" title="Draft the opener">
|
|
105
|
+
<svg class="ws-working" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.5 2.5l3 3L5 14H2v-3L10.5 2.5Z"/></svg>
|
|
106
|
+
</button>
|
|
107
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--outline" aria-label="Archive" disabled title="Archive">
|
|
108
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h10M6 5V3.5h4V5M5 5l.6 8.5A1 1 0 0 0 6.6 14.5h2.8a1 1 0 0 0 1-1L11 5"/></svg>
|
|
109
|
+
</button>
|
|
110
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--primary" aria-label="Send" disabled title="Send">
|
|
111
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V3M4 7l4-4 4 4"/></svg>
|
|
78
112
|
</button>
|
|
79
113
|
</div>
|
|
80
114
|
</div>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* ---- IconButton: Seth's square (0.5.0, D1): 6 px corners, one 16 px navy icon, 32 by default; ghost, outline, solid
|
|
2
|
+
(the tray grey), primary; --round for a voice or send disc. North's states: a navy wash, an edge or a brighter navy on
|
|
3
|
+
hover, never a lift. Restates the house's icon button in full, so that copy can go. On touch every size gets a 40 px
|
|
4
|
+
target (the house's touch block: the box grows, xs and small keep their look and gain a hit area). ---- */
|
|
5
|
+
.ws-icon-btn { position: relative; display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; width: var(--ws-control-h); height: var(--ws-control-h); padding: 0; border: 0; border-radius: var(--ws-radius-row); background-color: transparent; color: var(--color-text-heading); cursor: pointer; transition: background-color var(--ws-duration-hover) var(--ws-ease-soft), color var(--ws-duration-hover) var(--ws-ease-soft), box-shadow var(--ws-duration-hover) var(--ws-ease-soft), transform var(--ws-duration-hover) var(--ws-ease-soft); }
|
|
6
|
+
.ws-icon-btn svg { width: var(--ws-icon); height: var(--ws-icon); }
|
|
7
|
+
.ws-icon-btn--xs { width: var(--space-lg); height: var(--space-lg); border-radius: var(--ws-radius-control); }
|
|
8
|
+
.ws-icon-btn--sm { width: var(--ws-control-h-sm); height: var(--ws-control-h-sm); }
|
|
9
|
+
.ws-icon-btn--lg { width: var(--ws-control-h-md); height: var(--ws-control-h-md); }
|
|
10
|
+
.ws-icon-btn--lg svg { width: var(--ws-icon-lg); height: var(--ws-icon-lg); }
|
|
11
|
+
.ws-icon-btn--round { border-radius: var(--radius-full); }
|
|
12
|
+
/* A busy one keeps its resting look under the pointer (each look's [aria-busy]:hover selector), since it refuses the
|
|
13
|
+
press a hover would invite. */
|
|
14
|
+
.ws-icon-btn[aria-busy="true"]:hover { background-color: transparent; opacity: 1; }
|
|
15
|
+
|
|
16
|
+
.ws-icon-btn--outline, .ws-icon-btn--outline[aria-busy="true"]:hover { background-color: transparent; box-shadow: var(--ws-shadow-hairline-in); }
|
|
17
|
+
.ws-icon-btn--solid, .ws-icon-btn--solid[aria-busy="true"]:hover { background-color: var(--ws-tray); }
|
|
18
|
+
.ws-icon-btn--primary, .ws-icon-btn[aria-pressed="true"], .ws-icon-btn--primary[aria-busy="true"]:hover { isolation: isolate; background-color: var(--color-text-heading); color: var(--ws-on-act); box-shadow: none; }
|
|
19
|
+
.ws-icon-btn--primary::before, .ws-icon-btn[aria-pressed="true"]::before { content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; pointer-events: none; background: radial-gradient(var(--space-6xl) circle at var(--mx, 50%) var(--my, 50%), var(--ws-act-light), transparent 70%); opacity: 0; transition: opacity var(--ws-duration-hover) var(--ws-ease-soft); }
|
|
20
|
+
|
|
21
|
+
/* Hover, on a mouse only, never on a busy one (:where keeps each selector's weight as it was). */
|
|
22
|
+
@media (hover: hover) {
|
|
23
|
+
.ws-icon-btn:not(:where([aria-busy="true"])):hover { background-color: var(--ws-hover-strong); color: var(--color-text-heading); }
|
|
24
|
+
.ws-icon-btn--outline:not(:where([aria-busy="true"])):hover { background-color: transparent; box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-edge-hover); }
|
|
25
|
+
.ws-icon-btn--solid:not(:where([aria-busy="true"])):hover { background-color: var(--ws-well-hover); }
|
|
26
|
+
.ws-icon-btn--primary:not(:where([aria-busy="true"])):hover, .ws-icon-btn[aria-pressed="true"]:not(:where([aria-busy="true"])):hover { background-color: var(--ws-act-hover); color: var(--ws-on-act); opacity: 1; }
|
|
27
|
+
.ws-icon-btn--primary:not(:where([aria-busy="true"])):hover::before, .ws-icon-btn[aria-pressed="true"]:not(:where([aria-busy="true"])):hover::before { opacity: 1; }
|
|
28
|
+
}
|
|
29
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
30
|
+
.ws-icon-btn:active, .ws-icon-btn.is-pressed { transform: scale(var(--ws-press-scale)); transition-duration: var(--ws-duration-instant); }
|
|
31
|
+
.ws-icon-btn--round:active, .ws-icon-btn--round.is-pressed { transform: scale(var(--ws-press-scale-round)); }
|
|
32
|
+
}
|
|
33
|
+
/* States drawn still, for a preview or a mockup (D14): is-hover, is-pressed (above) and is-focus. */
|
|
34
|
+
.ws-icon-btn.is-hover { background-color: var(--ws-hover-strong); }
|
|
35
|
+
.ws-icon-btn--outline.is-hover { background-color: transparent; box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-edge-hover); }
|
|
36
|
+
.ws-icon-btn--solid.is-hover { background-color: var(--ws-well-hover); }
|
|
37
|
+
.ws-icon-btn--primary.is-hover, .ws-icon-btn[aria-pressed="true"].is-hover { background-color: var(--ws-act-hover); }
|
|
38
|
+
.ws-icon-btn--primary.is-hover::before, .ws-icon-btn[aria-pressed="true"].is-hover::before { opacity: 1; }
|
|
39
|
+
.ws-icon-btn.is-focus { outline: var(--ws-focus-width) solid var(--ws-focus-color); outline-offset: var(--ws-focus-offset); }
|
|
40
|
+
|
|
41
|
+
/* Disabled: 40%, no pointer. The navy one sinks instead (its fill at 40% reads as a broken act). Pending keeps full colour
|
|
42
|
+
and pulses its icon (ws-working on the svg). */
|
|
43
|
+
.ws-icon-btn:disabled { opacity: 0.4; pointer-events: none; }
|
|
44
|
+
.ws-icon-btn--primary:disabled { opacity: 1; background-color: var(--ws-surface-sunk); color: var(--color-text-muted); }
|
|
45
|
+
.ws-icon-btn[aria-busy="true"] { cursor: progress; }
|
|
@@ -16,10 +16,11 @@ edge while typing.
|
|
|
16
16
|
## Anatomy
|
|
17
17
|
|
|
18
18
|
- Box: 32px tall (`--ws-control-h`, 40px on touch), `--ws-radius-control` (4px) corners, white ground (`--ws-field`),
|
|
19
|
-
the
|
|
19
|
+
the 0.5 px card edge (`--ws-edge-card`) drawn inside, so a scroller never clips it.
|
|
20
20
|
- Sides: 12px (`--space-sm`).
|
|
21
21
|
- Label: 12px medium, `--color-text-body`, above the field.
|
|
22
|
-
- Words typed:
|
|
22
|
+
- Words typed: 14 / 20, `--ws-field-ink`; placeholder `--color-text-placeholder` (#6E6E6E).
|
|
23
|
+
- Search (`ws-search`): 36 tall (40 on touch), the 16 px glass 8 px in at the left, the words 32 in.
|
|
23
24
|
- Message below: 12px, `--color-text-muted` for a hint, `--ws-word-needs` for an error, with a warning icon before it.
|
|
24
25
|
|
|
25
26
|
## Variants and sizes
|
|
@@ -32,25 +33,28 @@ edge while typing.
|
|
|
32
33
|
## States
|
|
33
34
|
|
|
34
35
|
- **Default (rest):** the cream-adjacent white ground, the fine grey edge, no ring.
|
|
35
|
-
- **
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- **Error:**
|
|
39
|
-
|
|
36
|
+
- **Hover (a mouse only):** the edge darkens (#AAA49D, North's outlined controls).
|
|
37
|
+
- **Typing (focus):** the kit's focus ring, 2 px navy, 2 px out, over the field's own ground; it never reads as an error
|
|
38
|
+
(the error is the salmon's step, the ring is navy).
|
|
39
|
+
- **Error:** a 1 px edge in the salmon's AA step (`--ws-word-needs`; salmon itself is 2.7:1 on white, under the 3:1 an
|
|
40
|
+
edge asks) and a message rises in below (`ws-arrive`) with a warning icon, in `--ws-word-needs`. `aria-invalid` and `aria-describedby` are
|
|
40
41
|
set together; an error with no message is never drawn.
|
|
41
|
-
- **Disabled:** the
|
|
42
|
+
- **Disabled:** the sunk cream ground with muted words, `cursor: not-allowed`.
|
|
42
43
|
- **With placeholder:** the placeholder is `--color-text-placeholder` (#6E6E6E, 5.1:1 on white: AA) and still never the field's only label.
|
|
43
44
|
- **Empty:** the rest state with no value and, if given, the placeholder.
|
|
44
45
|
- **Long label:** the label wraps to a second line rather than truncate; the field itself keeps its height.
|
|
45
46
|
- **Narrow:** the field is always `width: 100%` of its column.
|
|
46
|
-
- **Touch:** the field grows to 40px tall (`--ws-touch`)
|
|
47
|
+
- **Touch:** the field grows to 40px tall (`--ws-touch`), the search box too, and its words to 16 px
|
|
48
|
+
(`--ws-text-value`): a phone zooms the page into any field under 16 px when it takes focus.
|
|
49
|
+
- **Dark:** the field's ground (`--ws-field`), ink and edge take their dark values; on the navy ground a field stays
|
|
50
|
+
white with navy words.
|
|
47
51
|
|
|
48
52
|
## Behaviour
|
|
49
53
|
|
|
50
54
|
- Keyboard: a native `<input>`; Tab moves to and from it like any field; typing and browser autofill work unmodified.
|
|
51
55
|
- Pointer / touch: clicking or tapping anywhere in the box focuses it; the touch floor is 40px.
|
|
52
|
-
- Motion:
|
|
53
|
-
|
|
56
|
+
- Motion: the edge over the hover beat (200 ms) on `--ws-ease-soft`; an error message rises in (`ws-arrive`); still
|
|
57
|
+
under reduced motion.
|
|
54
58
|
|
|
55
59
|
## Content
|
|
56
60
|
|
|
@@ -84,3 +88,24 @@ edge while typing.
|
|
|
84
88
|
- **Derived from**: the kit's `InputProps` contract (`label`, `error`, `hint`) and the system's rules for a field's
|
|
85
89
|
ground, focus ring and search size.
|
|
86
90
|
- **Precedent**: the first product built on the system.
|
|
91
|
+
- 0.5.0: the edge drawn inside (the field's fix: "the buttons' top looks cut off" in a scroller, 4 Nov), North's hover
|
|
92
|
+
edge, the kit's navy focus ring (D8) in place of the mid-blue edge and salmon halo, the error edge at its AA step.
|
|
93
|
+
|
|
94
|
+
## Markup
|
|
95
|
+
|
|
96
|
+
```html
|
|
97
|
+
<div class="ws-field">
|
|
98
|
+
<label class="ws-label" for="email">Seller's email</label>
|
|
99
|
+
<input class="ws-input" id="email" type="email" aria-invalid="true" aria-describedby="email-msg">
|
|
100
|
+
<p class="ws-field-msg ws-field-msg--error ws-arrive" id="email-msg">Needs a full address, like priya.nair@email.com</p>
|
|
101
|
+
</div>
|
|
102
|
+
<span class="ws-search-wrap">
|
|
103
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="M13 13l-2.8-2.8"/></svg>
|
|
104
|
+
<input class="ws-input ws-search" type="search" placeholder="Search" aria-label="Search leads">
|
|
105
|
+
</span>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Styles
|
|
109
|
+
|
|
110
|
+
`design-system/components/Input/style.css`: `ws-input` (and `--typing`, the focus drawn still), `ws-search-wrap`,
|
|
111
|
+
`ws-search`. `ws-field`, `ws-label` and `ws-field-msg` are the house's (`_house.css`, Fields).
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div class="ws-stage">
|
|
12
|
-
<div style="display: grid; grid-template-columns: repeat(
|
|
12
|
+
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 200px), 1fr)); gap: var(--ws-gap-component); width: 100%;">
|
|
13
13
|
|
|
14
14
|
<div class="ws-field">
|
|
15
15
|
<span class="ws-muted">Rest</span>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* ---- Input: the house field, restated (0.5.0) so the house's Fields copy can go: the white field ground, 32 tall (40 on
|
|
2
|
+
touch), 4 px corners, 14 / 20 words, its 0.5 px edge drawn inside (a scroller never clips it). Under the pointer the
|
|
3
|
+
edge darkens (North); typing shows the kit's focus ring (2 px navy, 2 px out); an error edge is the AA step of the
|
|
4
|
+
salmon, 1 px, beside words that say what to do. ---- */
|
|
5
|
+
.ws-input { width: 100%; min-width: 0; height: var(--ws-control-h); padding: 0 var(--space-sm); border: 0; border-radius: var(--ws-radius-control); background: var(--ws-field); box-shadow: var(--ws-shadow-hairline-in); color: var(--ws-field-ink); font-size: var(--ws-text-body); line-height: calc(var(--space-md) + var(--space-xxs)); transition: box-shadow var(--ws-duration-hover) var(--ws-ease-soft); }
|
|
6
|
+
@media (hover: hover) { .ws-input:not(:disabled, [aria-invalid="true"]):hover { box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-edge-hover); } }
|
|
7
|
+
.ws-input::placeholder { color: var(--color-text-placeholder); }
|
|
8
|
+
.ws-input:focus-visible { background: var(--ws-field); }
|
|
9
|
+
.ws-input[aria-invalid="true"] { box-shadow: inset 0 0 0 var(--ws-line) var(--ws-word-needs); }
|
|
10
|
+
.ws-input:disabled { background: var(--ws-surface-sunk); color: var(--color-text-muted); cursor: not-allowed; }
|
|
11
|
+
/* A field's marks (Select's and Combobox's chevrons, the calendar, the eye, the steppers) are navy, as Seth draws them,
|
|
12
|
+
and the light ink in night: the heading colour. On the navy ground the field stays white while the heading turns
|
|
13
|
+
white, so there the marks take the field's own ink. Each mark reads var(--ws-field-mark, var(--color-text-heading));
|
|
14
|
+
the navy ground re-points --ws-field-mark itself (tokens/_dark.css), on any element that carries it. */
|
|
15
|
+
/* The typing state drawn still, for a preview or a mockup: the focus ring a real focus draws. */
|
|
16
|
+
.ws-input--typing { outline: var(--ws-focus-width) solid var(--ws-focus-color); outline-offset: var(--ws-focus-offset); }
|
|
17
|
+
/* The search box: 36 tall (40 on touch), the icon inside at the left. */
|
|
18
|
+
.ws-search-wrap { position: relative; display: flex; min-width: 0; }
|
|
19
|
+
.ws-search-wrap svg { position: absolute; left: var(--space-xs); top: 50%; width: var(--ws-icon); height: var(--ws-icon); transform: translateY(-50%); color: var(--color-text-muted); pointer-events: none; }
|
|
20
|
+
.ws-search { height: var(--ws-control-h-md); padding: 0 var(--space-sm) 0 var(--space-xl); }
|
|
21
|
+
/* Touch: 40 tall (the house's touch height, restated after the field's own so it still wins), the words 16 so a phone
|
|
22
|
+
does not zoom the page into the field when it takes focus (iOS zooms any field under 16 px). */
|
|
23
|
+
@media (pointer: coarse) { .ws-input, .ws-search { height: var(--ws-touch); font-size: var(--ws-text-value); } }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Columns of cards for a pipeline: a stage per column, a card per thing moving through it, a count beside each stage's name.
|
|
2
|
+
`--fill` makes it a board page: the rest of the page's height, every stage scrolling on its own, the sideways bar on screen.
|
|
2
3
|
|
|
3
4
|
## Use it when
|
|
4
5
|
|
|
@@ -14,45 +15,65 @@ Columns of cards for a pipeline: a stage per column, a card per thing moving thr
|
|
|
14
15
|
|
|
15
16
|
## Anatomy
|
|
16
17
|
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- A
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- A
|
|
24
|
-
(
|
|
25
|
-
-
|
|
18
|
+
- The board: a row of columns 12 apart (`--space-sm`), scrolling sideways inside itself, with 4 px of room on every
|
|
19
|
+
side (pulled back by a margin) so a focused card's 2 px ring, 2 px out, is never clipped. It snaps a stage at a time
|
|
20
|
+
(proximity), and while stages are hidden past the far edge its last 24 px fade out; the fade lifts at the end.
|
|
21
|
+
- A column: 280 wide (`min(280, the board less 40)`, so on a phone the next stage peeks in), on the sunk plate
|
|
22
|
+
(`--ws-surface-sunk`; in dark the well, `--ws-well`, so the cards stay lighter than their column), 8 px corners, 8
|
|
23
|
+
inside, cards 8 apart.
|
|
24
|
+
- A column head: at least 32 tall, the stage in 13 / 18 medium navy (`__title`), its count beside it in muted figures
|
|
25
|
+
(`__count`), sentence case, flush with the cards' edge.
|
|
26
|
+
- A card: `ws-card` (a link or a button when it opens the thing), 12 inside, a 28 px `Avatar` and the name (14 / 20
|
|
27
|
+
medium navy) 8 apart, a 13 / 18 muted meta line 4 under.
|
|
28
|
+
- A held card (`__card--dragging`, with `aria-grabbed="true"`; the app sets both while a card is held): North's
|
|
29
|
+
floating shadow (`--ws-shadow-pop`, with the dark rim) and a 1 degree tilt; the only thing on the board that floats.
|
|
30
|
+
- The column under a held card (`__column--over`, set by the app while the card is over it): one step darker
|
|
31
|
+
(`--ws-surface-press`), nothing moves. In dark that step would be
|
|
32
|
+
lighter than the cards, so the column keeps the well and takes a 1 px card edge (`--ws-edge-card`) round it.
|
|
33
|
+
- An empty column: its head and a count of 0, a centred muted sentence in place of cards ("Nobody here yet").
|
|
26
34
|
|
|
27
35
|
## Variants and sizes
|
|
28
36
|
|
|
29
|
-
| Variant |
|
|
30
|
-
| --- | --- |
|
|
31
|
-
| Default
|
|
32
|
-
|
|
|
37
|
+
| Variant | What changes |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| Default | Columns as tall as their cards; the board as tall as its tallest column |
|
|
40
|
+
| `--fill` | The board takes the rest of a height-bound column (`flex: 1; min-height: 0`); every column runs the full height and scrolls on its own, its head stuck at the very top (over the column's 8 px padding, so no card shows above it; the title sits where the plain board's does), so the sideways bar sits at the window's foot (K16). A column that holds more than it shows fades its last 24 px into its ground, lifting at the end; a card reached by Tab scrolls clear of the stuck head |
|
|
41
|
+
| Phone | The same row of 280 columns, the next one peeking in, snapping a stage at a time |
|
|
33
42
|
|
|
34
43
|
## States
|
|
35
44
|
|
|
36
45
|
- **Default**: as above.
|
|
37
|
-
- **
|
|
38
|
-
card
|
|
39
|
-
- **Dragging**: `--ws-shadow-
|
|
40
|
-
|
|
41
|
-
- **Dropped**: the card glides to its new
|
|
42
|
-
|
|
43
|
-
- **Empty**: the column
|
|
44
|
-
|
|
45
|
-
- **Loading**:
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
- **Hover** (a card that opens): North's wash (`--ws-hover`) over the card's cream, stronger on press (`--ws-hover-strong`);
|
|
47
|
+
never the card's own sunk hover, which is the column's ground. It is flat until picked up.
|
|
48
|
+
- **Dragging**: `__card--dragging` (`--ws-shadow-pop` and the tilt); the column it is over takes `__column--over` and
|
|
49
|
+
darkens a step. The app adds and removes both classes; the kit only draws them.
|
|
50
|
+
- **Dropped**: the card glides to its new place and the cards it leaves close up, never teleports (North's "List rows
|
|
51
|
+
reorder", `springs.reorder` .4 / 0): wrap the move in `reorder()` (below).
|
|
52
|
+
- **Empty**: the column keeps its full width, its head and its count; a muted sentence in place of cards. It never
|
|
53
|
+
hides, which would reflow every column beside it mid-task.
|
|
54
|
+
- **Loading**: ghost cards the height of a card in the chart colours' sweep (`__ghost ws-shimmer`), the heads shown at
|
|
55
|
+
once; still under reduced motion.
|
|
56
|
+
- **Scrolled**: the far-edge fade while stages are hidden, gone at the end; in `--fill`, a column's foot fades while cards
|
|
57
|
+
are hidden below it, gone at its end.
|
|
58
|
+
- **Touch**: a card is one target (its whole box); dragging on touch needs a press-and-hold, not drawn here.
|
|
48
59
|
|
|
49
60
|
## Behaviour
|
|
50
61
|
|
|
51
|
-
- Keyboard:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
|
|
62
|
+
- Keyboard: the board is a focusable region (its ring drawn inside; while it has focus the far-edge fade drops, so the
|
|
63
|
+
ring shows whole); a card is a real link or button in document order, column after column; moving a card by keyboard
|
|
64
|
+
is a menu act ("Move to Offer") on the card, never keyboard-only drag and drop.
|
|
65
|
+
- Pointer: drag and drop between columns; a plain click opens the card.
|
|
66
|
+
- Motion: a card glides to its new column; columns never resize during a drag, only the held card changes, so
|
|
67
|
+
neighbours never jump. The glide is `reorder(update, board)` from `@felloinnovations/brand-kit`, a small
|
|
68
|
+
framework-free helper (CSS alone cannot see a row's old place): it names each card in view for a View Transition,
|
|
69
|
+
runs `update` (the move), and eases every card's flight on the kit's reorder spring, `--ws-spring-reorder` over
|
|
70
|
+
`--ws-spring-reorder-duration` (motion's own `spring(.4, 0)`, 750 ms, read from the page's tokens), the card that changed column flying above the cards it passes; the column counts cross-fade. It runs on
|
|
71
|
+
the compositor, with no script per frame. Give each card a stable `id` or `data-key` so React re-rendering it into
|
|
72
|
+
another column keeps its flight; a card cut by a scrolling `--fill` column cross-fades instead (a flying card is
|
|
73
|
+
drawn above every clip). In React, make the update land inside the callback:
|
|
74
|
+
`reorder(() => flushSync(() => setColumns(next)), boardRef.current)`. The same helper glides `ListDetail` rows and
|
|
75
|
+
`SideList` picks, or any rows its third argument selects. Without View Transitions, or under reduced motion, the card
|
|
76
|
+
lands at once. Try it in the preview: click a card in the last board.
|
|
56
77
|
|
|
57
78
|
## Content
|
|
58
79
|
|
|
@@ -66,27 +87,54 @@ Columns of cards for a pipeline: a stage per column, a card per thing moving thr
|
|
|
66
87
|
| Name | Type | Meaning |
|
|
67
88
|
| --- | --- | --- |
|
|
68
89
|
| `columns` | `{ stage, label, count, cards: CardItem[] }[]` | The board's stages, in order |
|
|
69
|
-
| `CardItem` | `{ id, name, initials, meta }` | One card's content |
|
|
90
|
+
| `CardItem` | `{ id, name, initials, meta, href? }` | One card's content |
|
|
70
91
|
| `onMove` | `(cardId, toStage) => void` | Called when a card changes column |
|
|
71
92
|
| `draggingId` | `string \| null` | Which card, if any, is currently lifted |
|
|
93
|
+
| `fill` | `boolean` | The board page form (`--fill`) |
|
|
72
94
|
|
|
73
95
|
## Rules
|
|
74
96
|
|
|
75
|
-
- **Every stage the same width**, whatever it holds
|
|
76
|
-
|
|
77
|
-
- **
|
|
78
|
-
|
|
79
|
-
- **
|
|
80
|
-
|
|
81
|
-
- **
|
|
82
|
-
flat otherwise, per the product's flat-with-fine-edges rule.
|
|
83
|
-
- **One shape, many pipelines**: pipelines appear in any product with a process (sales, hiring, support tickets), not
|
|
84
|
-
only one app's funnel. Derived from a hiring app's own pipeline board: its card shape, its column plate, and its
|
|
85
|
-
"every stage the same width" rule, generalised to a reusable board.
|
|
97
|
+
- **Every stage the same width**, whatever it holds: a column never grows to fit more cards than its neighbours.
|
|
98
|
+
- **A card is `ws-card`, never redrawn**, set on the sunk plate rather than invented as its own surface.
|
|
99
|
+
- **An empty column says so in words**, never collapses or disappears.
|
|
100
|
+
- **Only what is lifted floats**: the held card alone takes a shadow.
|
|
101
|
+
- **A board page shows its sideways bar** (K16): when the board is the page, use `--fill` so the bar is never below the
|
|
102
|
+
fold, and each stage scrolls on its own.
|
|
103
|
+
- **The head is sentence case** (D6): 13 / 18 medium, no uppercase eyebrow.
|
|
86
104
|
|
|
87
105
|
## Source
|
|
88
106
|
|
|
89
|
-
- **Derived from**: the system's card shape (`ws-card`), the sunk-plate column
|
|
90
|
-
flat-except-dragged rules
|
|
91
|
-
|
|
92
|
-
|
|
107
|
+
- **Derived from**: the system's card shape (`ws-card`), the sunk-plate column, the equal-width-column and
|
|
108
|
+
flat-except-dragged rules; North's floating shadow family and its edge fade; the K16 audit (Revenue OS: a 6-stage
|
|
109
|
+
board 638 px tall with its sideways bar at y 1,107 in a 900 px window).
|
|
110
|
+
- **Precedent**: an intentional addition decided from the system, 26 Oct 2026, generalised from the first product's
|
|
111
|
+
pipeline board; `--fill` added in 0.5.0 (4 Nov 2026).
|
|
112
|
+
|
|
113
|
+
## Markup
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<div class="ws-kanban-board" role="region" aria-label="Pipeline stages" tabindex="0">
|
|
117
|
+
<section class="ws-kanban-board__column" aria-labelledby="kb-new">
|
|
118
|
+
<div class="ws-kanban-board__head">
|
|
119
|
+
<h3 class="ws-kanban-board__title" id="kb-new">New leads <span class="ws-kanban-board__count">1</span></h3>
|
|
120
|
+
</div>
|
|
121
|
+
<a class="ws-card ws-kanban-board__card" href="#priya">
|
|
122
|
+
<span class="ws-kanban-board__who"><span class="ws-avatar ws-avatar--sm" aria-hidden="true">PN</span><span class="ws-row__title">Priya Nair</span></span>
|
|
123
|
+
<span class="ws-kanban-board__meta">6 days here, cold call</span>
|
|
124
|
+
</a>
|
|
125
|
+
</section>
|
|
126
|
+
<section class="ws-kanban-board__column" aria-labelledby="kb-offer">
|
|
127
|
+
<div class="ws-kanban-board__head">
|
|
128
|
+
<h3 class="ws-kanban-board__title" id="kb-offer">Offer made <span class="ws-kanban-board__count">0</span></h3>
|
|
129
|
+
</div>
|
|
130
|
+
<p class="ws-kanban-board__empty">Nobody here yet</p>
|
|
131
|
+
</section>
|
|
132
|
+
</div>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Styles
|
|
136
|
+
|
|
137
|
+
`design-system/components/KanbanBoard/style.css`, in `bundle.css` and `fello.css`. Dark and the navy ground come from
|
|
138
|
+
the tokens (`--ws-surface-sunk`, `--ws-well` for the column in dark, `--ws-surface-press`, `--ws-shadow-pop`). For
|
|
139
|
+
`--fill`, the board's parent must be a height-bound flex column (the shell's body, a fill page). The far-edge and
|
|
140
|
+
column fades use scroll-driven animations where the browser has them.
|