@felloinnovations/brand-kit 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +198 -24
- package/CHANGELOG.md +197 -0
- package/README.md +34 -7
- package/design-system/01-how-claude-decides.md +26 -17
- package/design-system/02-principles.md +11 -6
- package/design-system/03-colour.md +134 -47
- package/design-system/04-type.md +45 -23
- package/design-system/05-space-and-layout.md +175 -52
- package/design-system/06-sizing-profiles.md +4 -4
- package/design-system/07-scrolling.md +66 -20
- package/design-system/08-choosing-components.md +50 -22
- package/design-system/09-charts.md +71 -28
- package/design-system/10-patterns.md +33 -10
- package/design-system/11-page-recipes.md +110 -23
- package/design-system/12-content.md +2 -1
- package/design-system/13-motion.md +330 -47
- package/design-system/14-accessibility.md +47 -24
- package/design-system/15-ai-experiences.md +11 -6
- package/design-system/16-creativity.md +1 -1
- package/design-system/17-decisions.md +357 -1
- package/design-system/18-checklist.md +79 -16
- package/design-system/19-public-pages.md +6 -4
- package/design-system/20-palettes.md +275 -0
- package/design-system/README.md +30 -17
- package/design-system/components/ActionList/README.md +96 -10
- package/design-system/components/ActionList/preview.html +52 -7
- package/design-system/components/ActionList/style.css +64 -0
- package/design-system/components/ActivityGrid/README.md +38 -2
- package/design-system/components/ActivityGrid/preview.html +1 -1
- package/design-system/components/ActivityGrid/style.css +35 -0
- package/design-system/components/AppShell/README.md +205 -75
- package/design-system/components/AppShell/preview.html +339 -58
- package/design-system/components/AppShell/style.css +154 -0
- package/design-system/components/Avatar/README.md +37 -10
- package/design-system/components/Avatar/preview.html +13 -4
- package/design-system/components/Avatar/style.css +14 -0
- package/design-system/components/Badge/README.md +41 -19
- package/design-system/components/Badge/preview.html +13 -10
- package/design-system/components/Badge/style.css +23 -0
- package/design-system/components/Banner/README.md +30 -9
- package/design-system/components/Banner/preview.html +1 -1
- package/design-system/components/Banner/style.css +19 -0
- package/design-system/components/Breadcrumb/README.md +58 -46
- package/design-system/components/Breadcrumb/preview.html +16 -16
- package/design-system/components/Breadcrumb/style.css +17 -0
- package/design-system/components/Button/README.md +113 -55
- package/design-system/components/Button/preview.html +98 -25
- package/design-system/components/Button/style.css +86 -0
- package/design-system/components/Card/README.md +158 -49
- package/design-system/components/Card/preview.html +141 -19
- package/design-system/components/Card/style.css +115 -0
- package/design-system/components/CardBoard/README.md +58 -37
- package/design-system/components/CardBoard/preview.html +26 -29
- package/design-system/components/ChatCard/README.md +115 -29
- package/design-system/components/ChatCard/preview.html +149 -32
- package/design-system/components/ChatCard/style.css +49 -0
- package/design-system/components/ChatShell/README.md +116 -0
- package/design-system/components/ChatShell/preview.html +201 -0
- package/design-system/components/ChatShell/style.css +86 -0
- package/design-system/components/ChatTurn/README.md +78 -35
- package/design-system/components/ChatTurn/preview.html +60 -28
- package/design-system/components/ChatTurn/style.css +50 -0
- package/design-system/components/CheckRow/README.md +141 -0
- package/design-system/components/CheckRow/preview.html +140 -0
- package/design-system/components/CheckRow/style.css +88 -0
- package/design-system/components/Checkbox/README.md +58 -22
- package/design-system/components/Checkbox/preview.html +112 -50
- package/design-system/components/Checkbox/style.css +45 -0
- package/design-system/components/Chip/README.md +78 -47
- package/design-system/components/Chip/preview.html +29 -4
- package/design-system/components/Chip/style.css +17 -0
- package/design-system/components/Combobox/README.md +44 -11
- package/design-system/components/Combobox/preview.html +35 -12
- package/design-system/components/Combobox/style.css +54 -0
- package/design-system/components/Composer/README.md +137 -35
- package/design-system/components/Composer/preview.html +115 -40
- package/design-system/components/Composer/style.css +81 -0
- package/design-system/components/ConfirmDialog/README.md +73 -52
- package/design-system/components/ConfirmDialog/preview.html +70 -26
- package/design-system/components/ConfirmDialog/style.css +5 -0
- package/design-system/components/Cover/preview.html +3 -3
- package/design-system/components/Cover/style.css +19 -0
- package/design-system/components/DateInput/README.md +77 -12
- package/design-system/components/DateInput/preview.html +27 -12
- package/design-system/components/DateInput/style.css +38 -0
- package/design-system/components/Dialog/README.md +112 -44
- package/design-system/components/Dialog/preview.html +141 -18
- package/design-system/components/Dialog/style.css +74 -0
- package/design-system/components/EmptyState/README.md +42 -12
- package/design-system/components/EmptyState/preview.html +11 -11
- package/design-system/components/EmptyState/style.css +9 -0
- package/design-system/components/EntryShell/README.md +73 -48
- package/design-system/components/EntryShell/preview.html +60 -27
- package/design-system/components/EntryShell/style.css +19 -0
- package/design-system/components/FeatureGrid/README.md +61 -39
- package/design-system/components/FeatureGrid/preview.html +2 -2
- package/design-system/components/FeatureGrid/style.css +20 -0
- package/design-system/components/FileUpload/README.md +33 -3
- package/design-system/components/FileUpload/preview.html +18 -4
- package/design-system/components/FileUpload/style.css +23 -0
- package/design-system/components/FilterBar/README.md +114 -0
- package/design-system/components/FilterBar/preview.html +82 -0
- package/design-system/components/FilterBar/style.css +22 -0
- package/design-system/components/Fold/README.md +84 -26
- package/design-system/components/Fold/preview.html +77 -34
- package/design-system/components/Fold/style.css +48 -0
- package/design-system/components/Footer/README.md +62 -39
- package/design-system/components/Footer/preview.html +5 -5
- package/design-system/components/Footer/style.css +30 -0
- package/design-system/components/FunnelBars/README.md +24 -3
- package/design-system/components/FunnelBars/preview.html +5 -5
- package/design-system/components/FunnelBars/style.css +13 -0
- package/design-system/components/GoalBars/README.md +54 -10
- package/design-system/components/GoalBars/preview.html +69 -28
- package/design-system/components/GoalBars/style.css +51 -0
- package/design-system/components/GoalTicks/README.md +74 -58
- package/design-system/components/GoalTicks/preview.html +41 -118
- package/design-system/components/GoalTicks/style.css +37 -0
- package/design-system/components/GoalTubes/README.md +29 -3
- package/design-system/components/GoalTubes/preview.html +6 -6
- package/design-system/components/GoalTubes/style.css +23 -0
- package/design-system/components/Heatmap/README.md +133 -0
- package/design-system/components/Heatmap/preview.html +168 -0
- package/design-system/components/Heatmap/style.css +119 -0
- package/design-system/components/Hero/README.md +58 -40
- package/design-system/components/Hero/preview.html +1 -1
- package/design-system/components/Hero/style.css +19 -0
- package/design-system/components/HoverCard/README.md +114 -0
- package/design-system/components/HoverCard/preview.html +107 -0
- package/design-system/components/HoverCard/style.css +59 -0
- package/design-system/components/IconButton/README.md +69 -38
- package/design-system/components/IconButton/preview.html +77 -43
- package/design-system/components/IconButton/style.css +45 -0
- package/design-system/components/Input/README.md +36 -11
- package/design-system/components/Input/preview.html +1 -1
- package/design-system/components/Input/style.css +23 -0
- package/design-system/components/KanbanBoard/README.md +93 -45
- package/design-system/components/KanbanBoard/preview.html +159 -43
- package/design-system/components/KanbanBoard/style.css +53 -0
- package/design-system/components/Kbd/README.md +25 -9
- package/design-system/components/Kbd/preview.html +6 -2
- package/design-system/components/Kbd/style.css +9 -0
- package/design-system/components/KitButton/README.md +81 -47
- package/design-system/components/KitButton/preview.html +35 -13
- package/design-system/components/KitButton/style.css +46 -0
- package/design-system/components/KitCard/README.md +75 -44
- package/design-system/components/KitCard/preview.html +18 -10
- package/design-system/components/KitCard/style.css +15 -0
- package/design-system/components/KitInput/README.md +54 -39
- package/design-system/components/KitInput/preview.html +7 -7
- package/design-system/components/KitInput/style.css +23 -0
- package/design-system/components/Leaderboard/README.md +76 -49
- package/design-system/components/Leaderboard/preview.html +61 -26
- package/design-system/components/Leaderboard/style.css +44 -0
- package/design-system/components/ListDetail/README.md +222 -0
- package/design-system/components/ListDetail/preview.html +213 -0
- package/design-system/components/ListDetail/style.css +148 -0
- package/design-system/components/LoadBar/README.md +79 -0
- package/design-system/components/LoadBar/preview.html +40 -0
- package/design-system/components/LoadBar/style.css +17 -0
- package/design-system/components/MarketingNav/README.md +76 -42
- package/design-system/components/MarketingNav/preview.html +37 -8
- package/design-system/components/MarketingNav/style.css +45 -0
- package/design-system/components/Matrix/README.md +129 -0
- package/design-system/components/Matrix/preview.html +99 -0
- package/design-system/components/Matrix/style.css +84 -0
- package/design-system/components/Menu/README.md +117 -41
- package/design-system/components/Menu/preview.html +85 -23
- package/design-system/components/Menu/style.css +61 -0
- package/design-system/components/Meter/README.md +39 -4
- package/design-system/components/Meter/preview.html +18 -1
- package/design-system/components/Meter/style.css +23 -0
- package/design-system/components/MetricTile/README.md +237 -0
- package/design-system/components/MetricTile/preview.html +241 -0
- package/design-system/components/MetricTile/style.css +129 -0
- package/design-system/components/Morph/README.md +106 -0
- package/design-system/components/Morph/preview.html +103 -0
- package/design-system/components/Morph/style.css +31 -0
- package/design-system/components/Motion/README.md +164 -0
- package/design-system/components/Motion/preview.html +2537 -0
- package/design-system/components/NumberInput/README.md +27 -8
- package/design-system/components/NumberInput/preview.html +21 -5
- package/design-system/components/NumberInput/style.css +34 -0
- package/design-system/components/PaceBar/README.md +75 -0
- package/design-system/components/PaceBar/preview.html +67 -0
- package/design-system/components/PaceBar/style.css +25 -0
- package/design-system/components/Page/README.md +57 -18
- package/design-system/components/Page/preview.html +15 -17
- package/design-system/components/Page/style.css +7 -0
- package/design-system/components/PageBar/README.md +90 -34
- package/design-system/components/PageBar/preview.html +60 -19
- package/design-system/components/PageBar/style.css +35 -0
- package/design-system/components/PageHero/README.md +87 -51
- package/design-system/components/PageHero/preview.html +35 -6
- package/design-system/components/PageHero/style.css +31 -0
- package/design-system/components/Pagination/README.md +70 -49
- package/design-system/components/Pagination/preview.html +24 -15
- package/design-system/components/Pagination/style.css +12 -0
- package/design-system/components/Panel/README.md +109 -51
- package/design-system/components/Panel/preview.html +118 -20
- package/design-system/components/Panel/style.css +51 -0
- package/design-system/components/PasswordInput/README.md +50 -18
- package/design-system/components/PasswordInput/preview.html +71 -21
- package/design-system/components/PasswordInput/style.css +31 -0
- package/design-system/components/Plate/README.md +75 -17
- package/design-system/components/Plate/preview.html +40 -7
- package/design-system/components/Plate/style.css +37 -0
- package/design-system/components/Popover/README.md +70 -49
- package/design-system/components/Popover/preview.html +44 -22
- package/design-system/components/Popover/style.css +41 -0
- package/design-system/components/PricingTable/README.md +69 -49
- package/design-system/components/PricingTable/preview.html +21 -21
- package/design-system/components/PricingTable/style.css +21 -0
- package/design-system/components/ProgressPetals/README.md +31 -3
- package/design-system/components/ProgressPetals/preview.html +14 -15
- package/design-system/components/ProgressPetals/style.css +27 -0
- package/design-system/components/README.md +151 -0
- package/design-system/components/Radio/README.md +40 -17
- package/design-system/components/Radio/preview.html +16 -1
- package/design-system/components/Radio/style.css +21 -0
- package/design-system/components/RankBar/README.md +29 -2
- package/design-system/components/RankBar/preview.html +14 -12
- package/design-system/components/RankBar/style.css +18 -0
- package/design-system/components/Ring/README.md +61 -11
- package/design-system/components/Ring/preview.html +55 -10
- package/design-system/components/Ring/style.css +49 -0
- package/design-system/components/ScoreHero/README.md +91 -0
- package/design-system/components/ScoreHero/preview.html +104 -0
- package/design-system/components/ScoreHero/style.css +32 -0
- package/design-system/components/Section/README.md +72 -33
- package/design-system/components/Section/preview.html +46 -16
- package/design-system/components/Section/style.css +18 -0
- package/design-system/components/Segmented/README.md +100 -55
- package/design-system/components/Segmented/preview.html +107 -26
- package/design-system/components/Segmented/style.css +94 -0
- package/design-system/components/SegmentedProgress/README.md +64 -0
- package/design-system/components/SegmentedProgress/preview.html +69 -0
- package/design-system/components/SegmentedProgress/style.css +11 -0
- package/design-system/components/Select/README.md +47 -12
- package/design-system/components/Select/preview.html +28 -2
- package/design-system/components/Select/style.css +22 -0
- package/design-system/components/ShareBar/README.md +69 -0
- package/design-system/components/ShareBar/preview.html +72 -0
- package/design-system/components/ShareBar/style.css +25 -0
- package/design-system/components/SideList/README.md +147 -0
- package/design-system/components/SideList/preview.html +139 -0
- package/design-system/components/SideList/style.css +94 -0
- package/design-system/components/Skeleton/README.md +52 -16
- package/design-system/components/Skeleton/preview.html +35 -23
- package/design-system/components/Skeleton/style.css +22 -0
- package/design-system/components/Slider/README.md +95 -0
- package/design-system/components/Slider/preview.html +49 -0
- package/design-system/components/Slider/style.css +13 -0
- package/design-system/components/Split/README.md +112 -0
- package/design-system/components/Split/preview.html +105 -0
- package/design-system/components/Split/style.css +30 -0
- package/design-system/components/Starter/README.md +21 -9
- package/design-system/components/Starter/preview.html +5 -5
- package/design-system/components/Stat/README.md +64 -43
- package/design-system/components/Stat/preview.html +3 -3
- package/design-system/components/Stat/style.css +15 -0
- package/design-system/components/StatTiles/README.md +88 -44
- package/design-system/components/StatTiles/preview.html +142 -71
- package/design-system/components/StatTiles/style.css +64 -0
- package/design-system/components/StatusLine/README.md +85 -0
- package/design-system/components/StatusLine/preview.html +49 -0
- package/design-system/components/StatusLine/style.css +14 -0
- package/design-system/components/StatusScreen/README.md +49 -35
- package/design-system/components/StatusScreen/preview.html +20 -5
- package/design-system/components/StatusScreen/style.css +9 -0
- package/design-system/components/StepLine/README.md +97 -0
- package/design-system/components/StepLine/preview.html +108 -0
- package/design-system/components/StepLine/style.css +62 -0
- package/design-system/components/Stepper/README.md +35 -13
- package/design-system/components/Stepper/style.css +13 -0
- package/design-system/components/StreakCalendar/README.md +22 -1
- package/design-system/components/StreakCalendar/preview.html +10 -10
- package/design-system/components/StreakCalendar/style.css +12 -0
- package/design-system/components/SuggestionChip/README.md +87 -0
- package/design-system/components/SuggestionChip/preview.html +42 -0
- package/design-system/components/SuggestionChip/style.css +20 -0
- package/design-system/components/Switch/README.md +44 -24
- package/design-system/components/Switch/preview.html +23 -8
- package/design-system/components/Switch/style.css +31 -0
- package/design-system/components/Table/README.md +129 -58
- package/design-system/components/Table/preview.html +106 -72
- package/design-system/components/Table/style.css +104 -0
- package/design-system/components/Tabs/README.md +71 -46
- package/design-system/components/Tabs/preview.html +56 -24
- package/design-system/components/Tabs/style.css +44 -0
- package/design-system/components/Testimonial/README.md +48 -32
- package/design-system/components/Testimonial/preview.html +14 -14
- package/design-system/components/Testimonial/style.css +12 -0
- package/design-system/components/TextArea/README.md +27 -11
- package/design-system/components/TextArea/preview.html +8 -2
- package/design-system/components/TextArea/style.css +12 -0
- package/design-system/components/ThemeSwitch/README.md +116 -0
- package/design-system/components/ThemeSwitch/preview.html +57 -0
- package/design-system/components/ThemeSwitch/style.css +6 -0
- package/design-system/components/TickRow/README.md +52 -36
- package/design-system/components/TickRow/preview.html +64 -41
- package/design-system/components/TickRow/style.css +23 -0
- package/design-system/components/TickStrip/README.md +95 -0
- package/design-system/components/TickStrip/preview.html +88 -0
- package/design-system/components/TickStrip/style.css +42 -0
- package/design-system/components/Tile/README.md +79 -18
- package/design-system/components/Tile/preview.html +91 -40
- package/design-system/components/Tile/style.css +36 -0
- package/design-system/components/Timeline/README.md +68 -48
- package/design-system/components/Timeline/preview.html +27 -15
- package/design-system/components/Timeline/style.css +25 -0
- package/design-system/components/Toast/README.md +70 -38
- package/design-system/components/Toast/preview.html +43 -8
- package/design-system/components/Toast/style.css +25 -0
- package/design-system/components/Tooltip/README.md +93 -35
- package/design-system/components/Tooltip/preview.html +69 -15
- package/design-system/components/Tooltip/style.css +78 -0
- package/design-system/components/TopBar/README.md +67 -53
- package/design-system/components/TopBar/preview.html +14 -27
- package/design-system/components/TopBar/style.css +35 -0
- package/design-system/components/TopicRail/README.md +108 -0
- package/design-system/components/TopicRail/preview.html +58 -0
- package/design-system/components/TopicRail/style.css +48 -0
- package/design-system/components/TrendBars/README.md +52 -14
- package/design-system/components/TrendBars/preview.html +65 -32
- package/design-system/components/TrendBars/style.css +25 -0
- package/design-system/components/TrendLine/README.md +164 -0
- package/design-system/components/TrendLine/preview.html +373 -0
- package/design-system/components/TrendLine/style.css +155 -0
- package/design-system/components/Well/README.md +64 -22
- package/design-system/components/Well/preview.html +14 -14
- package/design-system/components/Well/style.css +22 -0
- package/design-system/components/_house.css +324 -0
- package/design-system/components/bundle.css +4091 -744
- package/design-system/tokens.json +1314 -124
- package/dist/fello-core.css +2 -2
- package/dist/fello.css +6 -1369
- package/dist/fello.scoped.css +7 -0
- package/dist/index.d.ts +110 -11
- package/dist/index.js +781 -96
- package/dist/palettes.d.ts +464 -0
- package/dist/palettes.js +497 -0
- package/dist/scoped.d.ts +3 -0
- package/dist/scoped.js +16 -0
- package/dist/toast.d.ts +14 -0
- package/dist/toast.js +33 -29
- package/dist/tokens.d.ts +1686 -62
- package/dist/tokens.js +1668 -61
- package/package.json +20 -4
- package/scripts/check-palette.mjs +295 -0
- package/scripts/token-model.mjs +552 -0
- package/tokens/_dark.css +174 -0
- package/tokens/_palettes.css +46 -0
- package/tokens/_product.css +266 -53
- package/tokens/_source.hubl.css +39 -19
- package/tokens/design-tokens.json +319 -0
- package/tokens/palettes.ts +504 -0
- package/tokens/shadcn-compat.css +19 -19
- package/tokens/shadcn-compat.hsl.css +76 -0
- package/tokens/tokens.css +1292 -62
- package/tokens/tokens.md +588 -61
- package/tokens/tokens.root.css +1298 -62
- package/tokens/tokens.ts +1677 -64
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!-- @dsCard group="Chat" height=346 -->
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>StatusLine</title>
|
|
7
|
+
<link rel="stylesheet" href="../../tokens.css">
|
|
8
|
+
<link rel="stylesheet" href="../bundle.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div class="ws-stage ws-stage--column">
|
|
12
|
+
<div class="ws-stack" style="max-width: 440px;">
|
|
13
|
+
<span class="ws-muted">Working: who, what it is doing (the shimmer runs over these words), the step</span>
|
|
14
|
+
<p class="ws-status-line" role="status" title="Coach: reading your calls, 12 of 40">
|
|
15
|
+
<b class="ws-status-line__who">Coach</b>
|
|
16
|
+
<span class="ws-status-line__doing">Reading your calls</span>
|
|
17
|
+
<span class="ws-status-line__step">12 of 40</span>
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="ws-stack" style="max-width: 440px;">
|
|
21
|
+
<span class="ws-muted">No step yet: who and what it is doing</span>
|
|
22
|
+
<p class="ws-status-line" role="status" title="Grow: checking Google">
|
|
23
|
+
<b class="ws-status-line__who">Grow</b>
|
|
24
|
+
<span class="ws-status-line__doing">Checking Google</span>
|
|
25
|
+
</p>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="ws-stack" style="max-width: 300px;">
|
|
28
|
+
<span class="ws-muted">A long line in a narrow column: the step is cut first, then the doing (the title holds it all)</span>
|
|
29
|
+
<p class="ws-status-line" role="status" title="Tally: matching every charge to a vendor, step 3 of 7: Follow Up Boss">
|
|
30
|
+
<b class="ws-status-line__who">Tally</b>
|
|
31
|
+
<span class="ws-status-line__doing">Matching every charge to a vendor</span>
|
|
32
|
+
<span class="ws-status-line__step">3 of 7: Follow Up Boss</span>
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="ws-stack" style="max-width: 440px;">
|
|
36
|
+
<span class="ws-muted">At the top of an answer at work</span>
|
|
37
|
+
<ol aria-label="Chat">
|
|
38
|
+
<li class="ws-chat-turn ws-chat-turn--agent">
|
|
39
|
+
<p class="ws-status-line" role="status" title="Coach: writing the follow-up">
|
|
40
|
+
<b class="ws-status-line__who">Coach</b>
|
|
41
|
+
<span class="ws-status-line__doing">Writing the follow-up</span>
|
|
42
|
+
</p>
|
|
43
|
+
<p class="ws-chat-turn__words">Here is a short note to Priya, in your voice.</p>
|
|
44
|
+
</li>
|
|
45
|
+
</ol>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* ---- StatusLine: the working line at the top of an answer in progress (North's): who, what it is doing in a moving shimmer, and the step ---- */
|
|
2
|
+
/* One 13 / 18 line, 8 apart on the baseline: the agent's name semibold navy, what it is doing medium, the step muted.
|
|
3
|
+
The doing words shimmer from navy through the AA steps of salmon, purple and teal (1.6 s, steady) so no letter drops
|
|
4
|
+
under AA as the band passes; under reduced motion they stay navy. A long line cuts the step first, then the doing. */
|
|
5
|
+
.ws-status-line { display: flex; align-items: baseline; gap: var(--space-xs); min-width: 0; min-height: var(--space-lg); overflow: hidden; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); white-space: nowrap; }
|
|
6
|
+
.ws-status-line__who { flex-shrink: 0; font-weight: 600; color: var(--color-text-heading); }
|
|
7
|
+
.ws-status-line__doing { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-weight: 500; color: var(--color-text-heading); }
|
|
8
|
+
/* Flex shrinks in proportion to size, so a weight of 4 still cut both at once; a weight this large gives the step up
|
|
9
|
+
whole before the doing loses a letter. */
|
|
10
|
+
.ws-status-line__step { flex-shrink: 1000; min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--color-text-muted); font-variant-numeric: tabular-nums; }
|
|
11
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
12
|
+
.ws-status-line { animation: ws-settle var(--ws-duration-settle) var(--ws-ease-settle) backwards; }
|
|
13
|
+
.ws-status-line__doing { background: linear-gradient(100deg, var(--color-text-heading) 0 35%, var(--ws-word-needs) 45%, var(--ws-word-past-half) 52%, var(--ws-word-positive) 59%, var(--color-text-heading) 70% 100%); background-size: 300% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: ws-shimmer var(--ws-loop-status) var(--ws-ease-steady) infinite; }
|
|
14
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
The whole-page word for something that failed: a page that is not there, a server error, or a connection that is not
|
|
1
|
+
The whole-page word for something that failed: a page that is not there, a server error, or a connection that is not
|
|
2
|
+
back yet.
|
|
2
3
|
|
|
3
4
|
## Use it when
|
|
4
5
|
|
|
@@ -8,70 +9,83 @@ The whole-page word for something that failed: a page that is not there, a serve
|
|
|
8
9
|
|
|
9
10
|
## Not for
|
|
10
11
|
|
|
11
|
-
- "There is an answer, and it is nothing you can act on yet"
|
|
12
|
-
|
|
13
|
-
- A
|
|
14
|
-
- A single field's error: that stays beside the field.
|
|
12
|
+
- "There is an answer, and it is nothing you can act on yet": `EmptyState`, inside its card.
|
|
13
|
+
- A page still loading: ghosts (`.ws-shimmer`), never this screen.
|
|
14
|
+
- A single field's error: it stays beside the field.
|
|
15
15
|
|
|
16
16
|
## Anatomy
|
|
17
17
|
|
|
18
|
-
- A centred column,
|
|
18
|
+
- A centred column on the cream, 24 inside, its parts 12 apart, each at most 320 wide (the entry pages' column).
|
|
19
19
|
- The assistant's orb at rest, 40 px, rising in above the words.
|
|
20
|
-
- A 22
|
|
20
|
+
- A 22 / 28 title (`ws-title`) that says what happened in plain words; when it wraps its lines stay even (never one
|
|
21
|
+
word on a line of its own).
|
|
21
22
|
- One 14 px sentence (`ws-body`) saying what to do.
|
|
22
23
|
- One large (36 px) primary button ("Go back", "Try again").
|
|
23
|
-
- An optional
|
|
24
|
+
- An optional muted reference line, in words a person can read out to support, never a status code.
|
|
25
|
+
- `--page`: the window's full height, the column centred in it (K17), no corners.
|
|
24
26
|
|
|
25
27
|
## Variants and sizes
|
|
26
28
|
|
|
27
29
|
| Situation | Title | Button |
|
|
28
30
|
| --- | --- | --- |
|
|
29
31
|
| Not found | "This page is not here" | "Go back" |
|
|
30
|
-
| Can't reach
|
|
31
|
-
|
|
32
|
-
There is one size: the column is the same width as every other entry page.
|
|
32
|
+
| Can't reach, offline | "We can't connect right now" | "Try again" |
|
|
33
|
+
| Something failed | "Something went wrong on our side" | "Try again" |
|
|
33
34
|
|
|
34
35
|
## States
|
|
35
36
|
|
|
36
|
-
- **Not found
|
|
37
|
-
- **Offline
|
|
38
|
-
|
|
39
|
-
- **
|
|
37
|
+
- **Not found**: the orb, the title, one sentence saying the link may be old, the button.
|
|
38
|
+
- **Offline**: the same, plus a line that updates as it retries (`role="status"`, `aria-live="polite"`).
|
|
39
|
+
- **With a reference**: a muted line a person can read out, never a code or a hash.
|
|
40
|
+
- **On a bare page**: `--page`, centred in the window, never in its top third.
|
|
40
41
|
|
|
41
42
|
## Behaviour
|
|
42
43
|
|
|
43
|
-
- Keyboard: the title is a real heading; the one button is a real
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
mark.
|
|
47
|
-
- Reduced motion: the orb appears in place without rising; an offline screen's retry line still updates in text, read
|
|
48
|
-
by `aria-live="polite"`.
|
|
44
|
+
- Keyboard: the title is a real heading; the one button is a real `<button>` or link.
|
|
45
|
+
- Motion: the orb rises in (`ws-rise`) over `--ws-duration-settle` on `--ws-ease-soft`. Reduced motion: it appears in
|
|
46
|
+
place; the retry line still updates in words.
|
|
49
47
|
|
|
50
48
|
## Content
|
|
51
49
|
|
|
52
|
-
- Plain words, never a status code
|
|
53
|
-
- A reference
|
|
50
|
+
- Plain words, never a status code or a model name.
|
|
51
|
+
- A reference reads like words said over the phone.
|
|
54
52
|
- No em dashes, sentence case.
|
|
55
53
|
|
|
56
54
|
## Props
|
|
57
55
|
|
|
58
56
|
| Name | Type | Meaning |
|
|
59
57
|
| --- | --- | --- |
|
|
60
|
-
| `title` | `string` |
|
|
61
|
-
| `subtitle` | `string` |
|
|
62
|
-
| `action` | `{ label
|
|
63
|
-
| `reference` | `string` |
|
|
64
|
-
| `retrying` | `boolean` |
|
|
58
|
+
| `title` | `string` | What happened, in plain words |
|
|
59
|
+
| `subtitle` | `string` | The one sentence saying what to do |
|
|
60
|
+
| `action` | `{ label, onClick }` | The one large primary button |
|
|
61
|
+
| `reference` | `string` | An optional, speakable reference |
|
|
62
|
+
| `retrying` | `boolean` | Shows the live retry line |
|
|
63
|
+
| `page` | `boolean` | Fills the window and centres in it |
|
|
65
64
|
|
|
66
65
|
## Rules
|
|
67
66
|
|
|
68
|
-
- Never a status code anywhere visible
|
|
69
|
-
- One primary button, large
|
|
70
|
-
- The orb is the one place outside the assistant's own wordmark allowed the AI
|
|
71
|
-
deliberate carve-out from the system's own colour rules.
|
|
67
|
+
- Never a status code anywhere visible.
|
|
68
|
+
- One primary button, large.
|
|
69
|
+
- The orb is the one place outside the assistant's own wordmark allowed the AI colours (`--ws-orb`: the AI cyan, blue and violet drawn from the chart tones, so a palette moves them).
|
|
72
70
|
|
|
73
71
|
## Source
|
|
74
72
|
|
|
75
|
-
**Derived from**: the system's entry-page frame
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
**Derived from**: the system's entry-page frame and its no-status-code rule, and Revenue OS fault K17 (status pages
|
|
74
|
+
sat in the top third of an empty window). **Precedent**: the first product built on the system.
|
|
75
|
+
|
|
76
|
+
## Markup
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<div class="ws-status-screen ws-status-screen--page">
|
|
80
|
+
<span class="ws-status-screen__orb ws-rise" aria-hidden="true"></span>
|
|
81
|
+
<h1 class="ws-title">This page is not here</h1>
|
|
82
|
+
<p class="ws-body">The link may be old, or the page may have moved.</p>
|
|
83
|
+
<button type="button" class="ws-btn ws-btn--primary ws-btn--lg">Go back</button>
|
|
84
|
+
<p class="ws-muted">Reference: cedar-harbor-214</p>
|
|
85
|
+
</div>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Styles
|
|
89
|
+
|
|
90
|
+
`StatusScreen/style.css`, with `Button` for its one act; the words are the house's. Tokens: `--space-2xl`, `--space-9xl`,
|
|
91
|
+
`--space-7xl`, `--space-lg`, `--space-sm`, `--ws-radius-panel`, `--color-bg-page`, `--ws-orb`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- @dsCard group="Feedback" height=
|
|
1
|
+
<!-- @dsCard group="Feedback" height=788 -->
|
|
2
2
|
<!doctype html>
|
|
3
3
|
<html>
|
|
4
4
|
<head>
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
<link rel="stylesheet" href="../bundle.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
|
-
<div class="ws-stage ws-stage--grey">
|
|
12
|
-
<div class="ws-cluster ws-cluster--start ws-cluster--component">
|
|
11
|
+
<div class="ws-stage ws-stage--grey ws-stage--column">
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
<div class="ws-cluster ws-cluster--start ws-cluster--component">
|
|
14
|
+
<div class="ws-stack" style="width: 300px; max-width: 100%;">
|
|
15
|
+
<span class="ws-muted">Not found</span>
|
|
15
16
|
<div class="ws-status-screen">
|
|
16
17
|
<span class="ws-status-screen__orb ws-rise" aria-hidden="true"></span>
|
|
17
18
|
<h1 class="ws-title">This page is not here</h1>
|
|
@@ -21,7 +22,8 @@
|
|
|
21
22
|
</div>
|
|
22
23
|
</div>
|
|
23
24
|
|
|
24
|
-
<div style="width:
|
|
25
|
+
<div class="ws-stack" style="width: 300px; max-width: 100%;">
|
|
26
|
+
<span class="ws-muted">Offline, retrying by itself</span>
|
|
25
27
|
<div class="ws-status-screen">
|
|
26
28
|
<span class="ws-status-screen__orb ws-rise" aria-hidden="true"></span>
|
|
27
29
|
<h1 class="ws-title">We can't connect right now</h1>
|
|
@@ -30,8 +32,21 @@
|
|
|
30
32
|
<p class="ws-muted" role="status" aria-live="polite">Trying again in a few seconds.</p>
|
|
31
33
|
</div>
|
|
32
34
|
</div>
|
|
35
|
+
</div>
|
|
33
36
|
|
|
37
|
+
<div class="ws-stack">
|
|
38
|
+
<span class="ws-muted">--page: the window's full height, the column centred in it (here in a 400 px frame standing in for the window)</span>
|
|
39
|
+
<div style="height: 400px; overflow: hidden; border-radius: var(--ws-radius-panel); box-shadow: var(--ws-shadow-hairline);">
|
|
40
|
+
<div class="ws-status-screen ws-status-screen--page" style="min-height: 100%;">
|
|
41
|
+
<span class="ws-status-screen__orb ws-rise" aria-hidden="true"></span>
|
|
42
|
+
<h1 class="ws-title">Something went wrong on our side</h1>
|
|
43
|
+
<p class="ws-body">Your work is saved. Try the page again; if it keeps happening, tell us the reference below.</p>
|
|
44
|
+
<button type="button" class="ws-btn ws-btn--primary ws-btn--lg">Try again</button>
|
|
45
|
+
<p class="ws-muted">Reference: maple-quarry-87</p>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
34
48
|
</div>
|
|
49
|
+
|
|
35
50
|
</div>
|
|
36
51
|
</body>
|
|
37
52
|
</html>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* ---- StatusScreen: not found, an error, offline: the orb, plain words, one act, in the entry pages' 320 column.
|
|
2
|
+
--page fills the window and centres itself in it (K17). ---- */
|
|
3
|
+
.ws-status-screen { display: flex; flex-direction: column; align-items: center; gap: var(--space-sm); padding: var(--space-lg); border-radius: var(--ws-radius-panel); background: var(--color-bg-page); text-align: center; }
|
|
4
|
+
.ws-status-screen > * { max-width: calc(var(--space-9xl) + var(--space-7xl)); }
|
|
5
|
+
/* A title that wraps keeps its lines even, never one word on its own ("on our / side"). */
|
|
6
|
+
.ws-status-screen > :is(h1, h2, .ws-title) { text-wrap: balance; }
|
|
7
|
+
.ws-status-screen > .ws-body { text-wrap: pretty; }
|
|
8
|
+
.ws-status-screen--page { min-height: 100dvh; justify-content: center; border-radius: 0; }
|
|
9
|
+
.ws-status-screen__orb { flex-shrink: 0; width: var(--space-2xl); height: var(--space-2xl); border-radius: var(--radius-full); background: var(--ws-orb); }
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
A bill or a rate over time as a step line against a dotted reference, the gap between them hatched, its moments named.
|
|
2
|
+
|
|
3
|
+
**Use it when**
|
|
4
|
+
|
|
5
|
+
- A number changes in steps on known dates (a yearly bill as tools turn off, a rate as plans change), and the reader
|
|
6
|
+
needs to see when it drops and by how much against what it would have been.
|
|
7
|
+
- There is one reference ("without Fello") and one series ("with Fello"), and the gap between them is the point.
|
|
8
|
+
|
|
9
|
+
**Not for**
|
|
10
|
+
|
|
11
|
+
- A day-by-day trend: use `TrendBars`. A value over months or weeks on an axis, one series: use `TrendLine`.
|
|
12
|
+
- Parts of one amount: use `ShareBar`.
|
|
13
|
+
- A share of a goal: use `GoalTicks` or `PaceBar`.
|
|
14
|
+
|
|
15
|
+
**Anatomy**
|
|
16
|
+
|
|
17
|
+
- Plot: 280 tall (`calc(--space-9xl + --space-5xl)`): 32 of head room above the top rule (`--space-xl`, Seth's 34 on
|
|
18
|
+
the grid), a 224 grid, 24 under it for the x labels; across, a 40 px y gutter, 12, the plot, 12, a 152 px gutter for
|
|
19
|
+
the end figures.
|
|
20
|
+
- Positions are data as percentages of the plot: `--x` from the left, `--y` from the top.
|
|
21
|
+
- Grid: 0.5 px `--ws-edge-slot` rules (`__rule`, `--y`) and quarter lines (`__tick`, `--x`) the plot's height; a
|
|
22
|
+
quarter's label 11/14 muted, 4 right of its line and 6 under the plot; `--now` makes it 600 navy ("Today").
|
|
23
|
+
- Y figures: 11/14 muted, right-aligned, centred on their rules.
|
|
24
|
+
- Lines: one SVG, `viewBox="0 0 100 100"` stretched (`preserveAspectRatio="none"`), strokes that never scale. The
|
|
25
|
+
reference (`__ref`) 1.5 navy, dashed 3 and 3; the series (`__series`) 2 in `--tone` (salmon by default: `--ws-chart-under-half` (chart tone 3, so a palette that sets it moves it)), round caps
|
|
26
|
+
and joins.
|
|
27
|
+
- Hatch (`__hatch`): a box clipped to the gap (`clip-path: polygon(...)` in the same percentages), 0.75 lines at 45
|
|
28
|
+
degrees every 6, in navy at 45%.
|
|
29
|
+
- Dots: an event 8, an end 6, centred on the point, in the line's tone.
|
|
30
|
+
- Event words (`__event`): 12 right of the dot and 10 down; what changed (12/16 semibold, `--ws-word-needs` for the
|
|
31
|
+
salmon series), then why (11/14 muted). Set `--to` on an event to where its words must stop (the next step's x, or
|
|
32
|
+
short of an end figure on the same line; the plot's end by default): they stop 4 short of it and wrap to fit, so
|
|
33
|
+
they never run across a step or into the hatch.
|
|
34
|
+
- End figures (`__end`) in the right gutter on their lines: the value (13/16 semibold, navy or the tone's AA word),
|
|
35
|
+
6, a small label (11/14 muted).
|
|
36
|
+
- Key: centred, 16 apart, 10 above and 20 below; a 16 px line (dashed for the reference) or a 12 px hatched swatch, 8,
|
|
37
|
+
14/20 medium `--color-text-body`.
|
|
38
|
+
|
|
39
|
+
**Parts and modifiers**
|
|
40
|
+
|
|
41
|
+
- `.ws-step-line__dot--end`: a line's end dot, 6 px instead of an event's 8.
|
|
42
|
+
|
|
43
|
+
**States**
|
|
44
|
+
|
|
45
|
+
- Draw (`--draw`): the lines wipe in left to right over 900 ms on the sweep curve; the hatch, dots and words rise in
|
|
46
|
+
after them.
|
|
47
|
+
- Narrow (the figure under 30rem): re-laid out, not shrunk. The plot takes the full width at 256 tall (the same 32 of head room, a 200 grid); the end figures
|
|
48
|
+
sit at the right, the reference's above its line and the series' under it (`__end--below`, so it never lands on
|
|
49
|
+
the hatch); the y figures and the small words go. An event's words start under its dot, and where a word is still
|
|
50
|
+
wider than its room, the page's colour behind it keeps it off the line and the hatch.
|
|
51
|
+
- Loading: a ghost (`__ghost` with `ws-shimmer`) where the plot goes; `aria-busy="true"`.
|
|
52
|
+
- Reduced motion: everything in place.
|
|
53
|
+
- Hover: none built in; pair a point with `HoverCard` for a read-out.
|
|
54
|
+
|
|
55
|
+
**Behaviour**
|
|
56
|
+
|
|
57
|
+
- The `<figure>` says the whole story in its `aria-label` (both lines, each step and when); the plot and key are
|
|
58
|
+
`aria-hidden`.
|
|
59
|
+
|
|
60
|
+
**Rules**
|
|
61
|
+
|
|
62
|
+
- Two lines at most: the reference and the series. Steps only where something really changes.
|
|
63
|
+
- The series' words take the AA step of its tone; the marks keep the tone.
|
|
64
|
+
- The y range starts at 0.
|
|
65
|
+
- Every mark on the plot has its key: a hatched gap always carries the hatch key, at every width.
|
|
66
|
+
- A signed figure stays whole: join the sign to it with a word joiner (`−⁠$1,620`, U+2060), since a line
|
|
67
|
+
may break between "−" and "$" when an event's room is narrow.
|
|
68
|
+
|
|
69
|
+
**Source**
|
|
70
|
+
|
|
71
|
+
**Seth**: Tally report, "Your tool bill drops to $48,000 a year by Q1 2027" (319:3355 to 319:3403). His hatch is
|
|
72
|
+
#2C4870 at 45%: the kit hatches in `--ws-agent-tally` at 45%. Overturns 09-charts' "no line charts".
|
|
73
|
+
|
|
74
|
+
**Markup**
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<figure class="ws-step-line" aria-label="Your bill: $77,472 a year without Fello, $48,000 with Fello from Q1 2027.">
|
|
78
|
+
<div class="ws-step-line__plot" aria-hidden="true">
|
|
79
|
+
<div class="ws-step-line__y"><span style="--y: 0%;">$80K</span><span style="--y: 100%;">$0</span></div>
|
|
80
|
+
<div class="ws-step-line__area">
|
|
81
|
+
<span class="ws-step-line__rule" style="--y: 0%;"></span><span class="ws-step-line__rule" style="--y: 100%;"></span>
|
|
82
|
+
<span class="ws-step-line__tick ws-step-line__tick--now" style="--x: 0%;"><span>Today</span></span>
|
|
83
|
+
<span class="ws-step-line__hatch" style="clip-path: polygon(40% 3.16%, 100% 3.16%, 100% 40%, 40% 40%);"></span>
|
|
84
|
+
<svg class="ws-step-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none">
|
|
85
|
+
<path class="ws-step-line__ref" d="M0 3.16 H100"/><path class="ws-step-line__series" d="M0 3.16 H40 V40 H100"/>
|
|
86
|
+
</svg>
|
|
87
|
+
<span class="ws-step-line__dot" style="--x: 40%; --y: 40%;"></span>
|
|
88
|
+
<span class="ws-step-line__event" style="--x: 40%; --y: 40%; --to: 70%;"><b>−⁠$29,472 in Q1 2027</b><span>Luxury Presence</span></span>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="ws-step-line__ends"><span class="ws-step-line__end ws-step-line__end--below" style="--y: 40%; --tone-word: var(--ws-word-needs);"><b>$48,000</b><span>with Fello</span></span></div>
|
|
91
|
+
</div>
|
|
92
|
+
<ul class="ws-step-line__legend" aria-hidden="true"><li class="ws-step-line__key--ref">Without Fello</li><li>With Fello</li><li class="ws-step-line__key--hatch">Comes off with Fello</li></ul>
|
|
93
|
+
</figure>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Styles**: `StepLine/style.css`, in `bundle.css` and `fello.css` as `.ws-step-line`. Every value is a token, except
|
|
97
|
+
the reference's 3 and 3 dash, which is Seth's.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
<!-- @dsCard group="Charts" height=1180 -->
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>StepLine</title>
|
|
7
|
+
<link rel="stylesheet" href="../../tokens.css">
|
|
8
|
+
<link rel="stylesheet" href="../bundle.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div class="ws-stage ws-stage--column">
|
|
12
|
+
|
|
13
|
+
<div class="ws-stack" style="max-width: 994px;">
|
|
14
|
+
<span class="ws-muted">Seth's Tally bill: without Fello dotted, with Fello a step down, the gap hatched, drawn in once</span>
|
|
15
|
+
<section class="ws-card ws-card--compound">
|
|
16
|
+
<header class="ws-head">
|
|
17
|
+
<div>
|
|
18
|
+
<h3 class="ws-title">Your tool bill drops to $48,000 a year by Q1 2027</h3>
|
|
19
|
+
<p class="ws-body">Yearly rate of your 5 tools, today through Q3 2027. The hatched gap is what Fello replaces.</p>
|
|
20
|
+
</div>
|
|
21
|
+
</header>
|
|
22
|
+
<div class="ws-card__body">
|
|
23
|
+
<figure class="ws-step-line ws-step-line--draw" aria-label="Your yearly tool bill: $77,472 without Fello; with Fello $75,852 from today, when Mailchimp turns off, and $48,000 from Q1 2027, when Luxury Presence and Follow Up Boss turn off.">
|
|
24
|
+
<div class="ws-step-line__plot" aria-hidden="true">
|
|
25
|
+
<div class="ws-step-line__y"><span style="--y: 0%;">$80K</span><span style="--y: 25%;">$60K</span><span style="--y: 50%;">$40K</span><span style="--y: 75%;">$20K</span><span style="--y: 100%;">$0</span></div>
|
|
26
|
+
<div class="ws-step-line__area">
|
|
27
|
+
<span class="ws-step-line__rule" style="--y: 0%;"></span><span class="ws-step-line__rule" style="--y: 25%;"></span><span class="ws-step-line__rule" style="--y: 50%;"></span><span class="ws-step-line__rule" style="--y: 75%;"></span><span class="ws-step-line__rule" style="--y: 100%;"></span>
|
|
28
|
+
<span class="ws-step-line__tick ws-step-line__tick--now" style="--x: 0%;"><span>Today</span></span>
|
|
29
|
+
<span class="ws-step-line__tick" style="--x: 18.1%;"><span>Q1 27</span></span>
|
|
30
|
+
<span class="ws-step-line__tick" style="--x: 45.2%;"><span>Q2 27</span></span>
|
|
31
|
+
<span class="ws-step-line__tick" style="--x: 72.6%;"><span>Q3 27</span></span>
|
|
32
|
+
<span class="ws-step-line__hatch" style="clip-path: polygon(0% 3.16%, 100% 3.16%, 100% 40%, 18.1% 40%, 18.1% 5.19%, 0% 5.19%);"></span>
|
|
33
|
+
<svg class="ws-step-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none"><path class="ws-step-line__ref" d="M0 3.16 H100"/><path class="ws-step-line__series" d="M0 5.19 H18.1 V40 H100"/></svg>
|
|
34
|
+
<span class="ws-step-line__dot" style="--x: 0%; --y: 5.19%;"></span>
|
|
35
|
+
<span class="ws-step-line__event" style="--x: 0%; --y: 5.19%; --to: 18.1%;"><b>−⁠$1,620 today</b><span>Mailchimp</span></span>
|
|
36
|
+
<span class="ws-step-line__dot" style="--x: 18.1%; --y: 40%;"></span>
|
|
37
|
+
<span class="ws-step-line__event" style="--x: 18.1%; --y: 40%; --to: 70%;"><b>−⁠$27,852 in Q1 2027</b><span>Luxury Presence, Follow Up Boss</span></span>
|
|
38
|
+
<span class="ws-step-line__dot ws-step-line__dot--end" style="--x: 100%; --y: 3.16%; --tone: var(--color-text-heading);"></span>
|
|
39
|
+
<span class="ws-step-line__dot ws-step-line__dot--end" style="--x: 100%; --y: 40%;"></span>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="ws-step-line__ends">
|
|
42
|
+
<span class="ws-step-line__end" style="--y: 3.16%;"><b>$77,472</b><span>without Fello</span></span>
|
|
43
|
+
<span class="ws-step-line__end ws-step-line__end--below" style="--y: 40%; --tone-word: var(--ws-word-needs);"><b>$48,000</b><span>with Fello</span></span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<ul class="ws-step-line__legend" aria-hidden="true">
|
|
47
|
+
<li class="ws-step-line__key--ref">Without Fello</li>
|
|
48
|
+
<li>With Fello</li>
|
|
49
|
+
<li class="ws-step-line__key--hatch">Comes off with Fello</li>
|
|
50
|
+
</ul>
|
|
51
|
+
</figure>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="ws-band">
|
|
54
|
+
<div class="ws-band__words">
|
|
55
|
+
<span class="ws-band__title">Nothing else turns off in Q2 or Q3 2027</span>
|
|
56
|
+
<span class="ws-band__how">Fello's website and IDX pricing isn't set yet, so your quote may differ.</span>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</section>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="ws-stack" style="width: 360px; max-width: 100%;">
|
|
63
|
+
<span class="ws-muted">A 360 px card: a shorter plot, the end figures without their small words</span>
|
|
64
|
+
<section class="ws-card ws-card--inset">
|
|
65
|
+
<figure class="ws-step-line" aria-label="Your yearly tool bill: $77,472 without Fello, $48,000 with Fello from Q1 2027.">
|
|
66
|
+
<div class="ws-step-line__plot" aria-hidden="true">
|
|
67
|
+
<div class="ws-step-line__y"><span style="--y: 0%;">$80K</span><span style="--y: 50%;">$40K</span><span style="--y: 100%;">$0</span></div>
|
|
68
|
+
<div class="ws-step-line__area">
|
|
69
|
+
<span class="ws-step-line__rule" style="--y: 0%;"></span><span class="ws-step-line__rule" style="--y: 50%;"></span><span class="ws-step-line__rule" style="--y: 100%;"></span>
|
|
70
|
+
<span class="ws-step-line__tick ws-step-line__tick--now" style="--x: 0%;"><span>Today</span></span>
|
|
71
|
+
<span class="ws-step-line__tick" style="--x: 40%;"><span>Q1 27</span></span>
|
|
72
|
+
<span class="ws-step-line__hatch" style="clip-path: polygon(40% 3.16%, 100% 3.16%, 100% 40%, 40% 40%);"></span>
|
|
73
|
+
<svg class="ws-step-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none"><path class="ws-step-line__ref" d="M0 3.16 H100"/><path class="ws-step-line__series" d="M0 3.16 H40 V40 H100"/></svg>
|
|
74
|
+
<span class="ws-step-line__dot" style="--x: 40%; --y: 40%;"></span>
|
|
75
|
+
<span class="ws-step-line__event" style="--x: 40%; --y: 40%;"><b>−⁠$29,472</b><span>Luxury Presence</span></span>
|
|
76
|
+
<span class="ws-step-line__dot ws-step-line__dot--end" style="--x: 100%; --y: 3.16%; --tone: var(--color-text-heading);"></span>
|
|
77
|
+
<span class="ws-step-line__dot ws-step-line__dot--end" style="--x: 100%; --y: 40%;"></span>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="ws-step-line__ends">
|
|
80
|
+
<span class="ws-step-line__end" style="--y: 3.16%;"><b>$77K</b><span>without Fello</span></span>
|
|
81
|
+
<span class="ws-step-line__end ws-step-line__end--below" style="--y: 40%; --tone-word: var(--ws-word-needs);"><b>$48K</b><span>with Fello</span></span>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
<ul class="ws-step-line__legend" aria-hidden="true">
|
|
85
|
+
<li class="ws-step-line__key--ref">Without Fello</li>
|
|
86
|
+
<li>With Fello</li>
|
|
87
|
+
<li class="ws-step-line__key--hatch">Comes off with Fello</li>
|
|
88
|
+
</ul>
|
|
89
|
+
</figure>
|
|
90
|
+
</section>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="ws-stack" style="width: 560px; max-width: 100%;">
|
|
94
|
+
<span class="ws-muted">Loading: a ghost where the plot goes</span>
|
|
95
|
+
<section class="ws-card ws-card--inset">
|
|
96
|
+
<figure class="ws-step-line" aria-busy="true" aria-label="Your yearly tool bill, loading">
|
|
97
|
+
<div class="ws-step-line__plot" aria-hidden="true">
|
|
98
|
+
<div class="ws-step-line__y"></div>
|
|
99
|
+
<div class="ws-step-line__area"><span class="ws-shimmer ws-step-line__ghost"></span></div>
|
|
100
|
+
<div class="ws-step-line__ends"></div>
|
|
101
|
+
</div>
|
|
102
|
+
</figure>
|
|
103
|
+
</section>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
</div>
|
|
107
|
+
</body>
|
|
108
|
+
</html>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* ---- StepLine: a bill over time as a step line against a dotted reference, the gap between them hatched ---- */
|
|
2
|
+
/* Seth's Tally bill (319:3355). A plot 280 tall: 32 of head room above the top rule (the end figure's room; Seth 34,
|
|
3
|
+
snapped to the grid), the grid, 24 under it for the quarters; a 40 px y gutter (labels right-aligned, 12 before the
|
|
4
|
+
plot), the plot, and a gutter at the right for the end figures. Positions are data, as percentages of the plot: --x from the left,
|
|
5
|
+
--y from the top. The lines are one SVG (viewBox 0 0 100 100, stretched, strokes that never scale); the hatch is a
|
|
6
|
+
box clipped to the gap; dots and words are placed in px-true HTML, so nothing is distorted at any width. */
|
|
7
|
+
.ws-step-line { --ws-step-line-hatch: color-mix(in srgb, var(--ws-agent-tally) 45%, transparent); container-type: inline-size; }
|
|
8
|
+
.ws-step-line__plot { display: grid; grid-template-columns: var(--space-2xl) minmax(0, 1fr) calc(var(--space-8xl) - var(--space-xs)); column-gap: var(--space-sm); height: calc(var(--space-9xl) + var(--space-5xl)); padding: var(--space-xl) 0 var(--space-lg); }
|
|
9
|
+
.ws-step-line__y, .ws-step-line__area, .ws-step-line__ends { position: relative; min-width: 0; }
|
|
10
|
+
.ws-step-line__y > span { position: absolute; right: 0; top: var(--y); translate: 0 -50%; font-size: var(--ws-text-micro); line-height: var(--space-sm-plus); color: var(--color-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
11
|
+
.ws-step-line__rule { position: absolute; left: 0; right: 0; top: var(--y); border-top: var(--ws-hairline) solid var(--ws-edge-slot); }
|
|
12
|
+
/* A quarter line runs the plot's height; its label sits 4 right of it, under the plot. */
|
|
13
|
+
.ws-step-line__tick { position: absolute; top: 0; bottom: 0; left: var(--x); border-left: var(--ws-hairline) solid var(--ws-edge-slot); }
|
|
14
|
+
.ws-step-line__tick > span { position: absolute; top: calc(100% + var(--space-xxs-plus)); left: var(--space-xxs); font-size: var(--ws-text-micro); line-height: var(--space-sm-plus); color: var(--color-text-muted); white-space: nowrap; }
|
|
15
|
+
.ws-step-line__tick--now > span { font-weight: 600; color: var(--color-text-heading); }
|
|
16
|
+
.ws-step-line__hatch { position: absolute; inset: 0; background: repeating-linear-gradient(135deg, var(--ws-step-line-hatch) 0 calc(var(--ws-hairline) * 1.5), transparent 0 var(--space-xxs-plus)); }
|
|
17
|
+
.ws-step-line__ghost { position: absolute; inset: 0; }
|
|
18
|
+
.ws-step-line__lines { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
|
|
19
|
+
.ws-step-line__lines path { fill: none; vector-effect: non-scaling-stroke; stroke-linecap: round; stroke-linejoin: round; }
|
|
20
|
+
.ws-step-line__ref { stroke: var(--color-text-heading); stroke-width: var(--ws-chart-line); stroke-dasharray: 3 3; stroke-linecap: butt; }
|
|
21
|
+
.ws-step-line__series { stroke: var(--tone, var(--ws-chart-under-half)); stroke-width: var(--ws-ring); }
|
|
22
|
+
/* Dots: an event 8, an end 6, centred on the point. */
|
|
23
|
+
.ws-step-line__dot { position: absolute; left: var(--x); top: var(--y); width: var(--space-xs); height: var(--space-xs); border-radius: var(--radius-full); background: var(--tone, var(--ws-chart-under-half)); translate: -50% -50%; }
|
|
24
|
+
.ws-step-line__dot--end { width: var(--space-xxs-plus); height: var(--space-xxs-plus); }
|
|
25
|
+
/* An event's words: 12 right of the dot and 10 down; what changed (12/16 semibold, the tone's AA word), then why. They
|
|
26
|
+
stop 4 short of --to (the next step's x, or short of an end figure on their line; the plot's end by default) and
|
|
27
|
+
wrap to fit, so they never run across a step or into the hatch. */
|
|
28
|
+
.ws-step-line__event { position: absolute; left: calc(var(--x) + var(--space-sm)); top: calc(var(--y) + var(--space-xs-plus)); display: flex; flex-direction: column; max-width: calc(var(--to, 100%) - var(--x) - var(--space-sm) - var(--space-xxs)); }
|
|
29
|
+
.ws-step-line__event > b { font-size: var(--ws-text-dense); font-weight: 600; line-height: var(--space-md); color: var(--tone-word, var(--ws-word-needs)); text-wrap: balance; }
|
|
30
|
+
.ws-step-line__event > span, .ws-step-line__end > span { overflow: hidden; font-size: var(--ws-text-micro); line-height: var(--space-sm-plus); color: var(--color-text-muted); white-space: nowrap; text-overflow: ellipsis; }
|
|
31
|
+
/* An end figure in the right gutter, on its line: the value (13/16 semibold) and a small label 6 after it. */
|
|
32
|
+
.ws-step-line__end { position: absolute; left: 0; right: 0; top: var(--y); display: flex; align-items: baseline; gap: var(--space-xxs-plus); translate: 0 -50%; }
|
|
33
|
+
.ws-step-line__end > b { flex-shrink: 0; font-size: var(--ws-text-control); font-weight: 600; line-height: var(--space-md); color: var(--tone-word, var(--color-text-heading)); font-variant-numeric: tabular-nums; }
|
|
34
|
+
/* The key, centred under the plot, 16 apart: a 16 px line (or a 12 px hatched swatch), 8, 14/20 medium words. */
|
|
35
|
+
.ws-step-line__legend { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-xxs) var(--space-md); padding: var(--space-xs-plus) 0 var(--ws-card-inset); font-size: var(--ws-text-body); font-weight: 500; line-height: var(--ws-leading-row); color: var(--color-text-body); }
|
|
36
|
+
.ws-step-line__legend > li { display: inline-flex; align-items: center; gap: var(--space-xs); }
|
|
37
|
+
.ws-step-line__legend > li::before { content: ""; flex-shrink: 0; width: var(--space-md); height: var(--ws-ring); border-radius: var(--ws-radius-bar); background: var(--tone, var(--ws-chart-under-half)); }
|
|
38
|
+
.ws-step-line__legend > .ws-step-line__key--ref::before { height: var(--ws-chart-line); background: repeating-linear-gradient(90deg, var(--color-text-heading) 0 3px, transparent 0 6px); }
|
|
39
|
+
.ws-step-line__legend > .ws-step-line__key--hatch::before { width: var(--space-sm); height: var(--space-sm); border-radius: var(--ws-radius-chip); box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-step-line-hatch); background: repeating-linear-gradient(135deg, var(--ws-step-line-hatch) 0 calc(var(--ws-hairline) * 1.5), transparent 0 calc(var(--space-xxs) - var(--ws-hairline))); }
|
|
40
|
+
/* Narrow (under 30rem): re-laid out, not shrunk. The plot takes the whole width and a shorter height; the end figures
|
|
41
|
+
sit at the right, the reference's above its line and the series' (--below) under it; the y figures and the small words
|
|
42
|
+
go (the ends and the events carry the numbers). */
|
|
43
|
+
@container (max-width: 30rem) {
|
|
44
|
+
.ws-step-line__plot { grid-template-columns: minmax(0, 1fr); height: calc(var(--space-9xl) + var(--space-xl) + var(--space-lg)); }
|
|
45
|
+
.ws-step-line__y, .ws-step-line__area, .ws-step-line__ends { grid-area: 1 / 1; }
|
|
46
|
+
.ws-step-line__ends { pointer-events: none; }
|
|
47
|
+
.ws-step-line__y { display: none; }
|
|
48
|
+
.ws-step-line__end { justify-content: flex-end; translate: 0 calc(-100% - var(--space-xxs)); }
|
|
49
|
+
/* The lower line's figure sits under its line, so it never lands on the hatch between the two. */
|
|
50
|
+
.ws-step-line__end--below { translate: 0 var(--space-xxs); }
|
|
51
|
+
.ws-step-line__end > span, .ws-step-line__event > span { display: none; }
|
|
52
|
+
/* An event's words start under its dot (they sit 10 below it), so they keep the room up to --to; where a word is
|
|
53
|
+
still wider than that, the page's colour behind it keeps it off the line and the hatch. */
|
|
54
|
+
.ws-step-line__event { left: var(--x); min-width: min-content; max-width: calc(var(--to, 100%) - var(--x) - var(--space-xxs)); }
|
|
55
|
+
.ws-step-line__event > b { background: var(--color-bg-page); box-shadow: 0 0 0 var(--ws-ring) var(--color-bg-page); }
|
|
56
|
+
}
|
|
57
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
58
|
+
/* The build-in: the lines draw left to right over the draw (900 ms, the sweep curve); the hatch, dots and words
|
|
59
|
+
settle in after them. */
|
|
60
|
+
.ws-step-line--draw .ws-step-line__lines { animation: ws-wipe var(--ws-duration-draw) var(--ws-ease-sweep) backwards; animation-delay: var(--ws-build-at, 0s); }
|
|
61
|
+
.ws-step-line--draw :is(.ws-step-line__hatch, .ws-step-line__dot, .ws-step-line__event, .ws-step-line__end) { animation: ws-rise var(--ws-duration-settle) var(--ws-ease-soft) backwards; animation-delay: calc(var(--ws-build-at, 0s) + var(--ws-duration-draw)); }
|
|
62
|
+
}
|