@felloinnovations/brand-kit 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +198 -24
- package/CHANGELOG.md +221 -0
- package/README.md +38 -9
- package/design-system/01-how-claude-decides.md +26 -17
- package/design-system/02-principles.md +11 -6
- package/design-system/03-colour.md +135 -47
- package/design-system/04-type.md +45 -23
- package/design-system/05-space-and-layout.md +175 -52
- package/design-system/06-sizing-profiles.md +4 -4
- package/design-system/07-scrolling.md +66 -20
- package/design-system/08-choosing-components.md +50 -22
- package/design-system/09-charts.md +71 -28
- package/design-system/10-patterns.md +33 -10
- package/design-system/11-page-recipes.md +110 -23
- package/design-system/12-content.md +2 -1
- package/design-system/13-motion.md +330 -47
- package/design-system/14-accessibility.md +47 -24
- package/design-system/15-ai-experiences.md +11 -6
- package/design-system/16-creativity.md +1 -1
- package/design-system/17-decisions.md +367 -1
- package/design-system/18-checklist.md +79 -16
- package/design-system/19-public-pages.md +6 -4
- package/design-system/20-palettes.md +275 -0
- package/design-system/README.md +30 -17
- package/design-system/components/ActionList/README.md +96 -10
- package/design-system/components/ActionList/preview.html +52 -7
- package/design-system/components/ActionList/style.css +64 -0
- package/design-system/components/ActivityGrid/README.md +38 -2
- package/design-system/components/ActivityGrid/preview.html +1 -1
- package/design-system/components/ActivityGrid/style.css +35 -0
- package/design-system/components/AppShell/README.md +205 -75
- package/design-system/components/AppShell/preview.html +339 -58
- package/design-system/components/AppShell/style.css +154 -0
- package/design-system/components/Avatar/README.md +37 -10
- package/design-system/components/Avatar/preview.html +13 -4
- package/design-system/components/Avatar/style.css +14 -0
- package/design-system/components/Badge/README.md +41 -19
- package/design-system/components/Badge/preview.html +13 -10
- package/design-system/components/Badge/style.css +23 -0
- package/design-system/components/Banner/README.md +30 -9
- package/design-system/components/Banner/preview.html +1 -1
- package/design-system/components/Banner/style.css +19 -0
- package/design-system/components/Breadcrumb/README.md +58 -46
- package/design-system/components/Breadcrumb/preview.html +16 -16
- package/design-system/components/Breadcrumb/style.css +17 -0
- package/design-system/components/Button/README.md +113 -55
- package/design-system/components/Button/preview.html +98 -25
- package/design-system/components/Button/style.css +86 -0
- package/design-system/components/Card/README.md +158 -49
- package/design-system/components/Card/preview.html +141 -19
- package/design-system/components/Card/style.css +115 -0
- package/design-system/components/CardBoard/README.md +58 -37
- package/design-system/components/CardBoard/preview.html +26 -29
- package/design-system/components/ChatCard/README.md +115 -29
- package/design-system/components/ChatCard/preview.html +149 -32
- package/design-system/components/ChatCard/style.css +49 -0
- package/design-system/components/ChatShell/README.md +116 -0
- package/design-system/components/ChatShell/preview.html +201 -0
- package/design-system/components/ChatShell/style.css +86 -0
- package/design-system/components/ChatTurn/README.md +78 -35
- package/design-system/components/ChatTurn/preview.html +60 -28
- package/design-system/components/ChatTurn/style.css +50 -0
- package/design-system/components/CheckRow/README.md +141 -0
- package/design-system/components/CheckRow/preview.html +140 -0
- package/design-system/components/CheckRow/style.css +88 -0
- package/design-system/components/Checkbox/README.md +58 -22
- package/design-system/components/Checkbox/preview.html +112 -50
- package/design-system/components/Checkbox/style.css +45 -0
- package/design-system/components/Chip/README.md +78 -47
- package/design-system/components/Chip/preview.html +29 -4
- package/design-system/components/Chip/style.css +17 -0
- package/design-system/components/Combobox/README.md +44 -11
- package/design-system/components/Combobox/preview.html +35 -12
- package/design-system/components/Combobox/style.css +54 -0
- package/design-system/components/Composer/README.md +137 -35
- package/design-system/components/Composer/preview.html +115 -40
- package/design-system/components/Composer/style.css +81 -0
- package/design-system/components/ConfirmDialog/README.md +73 -52
- package/design-system/components/ConfirmDialog/preview.html +70 -26
- package/design-system/components/ConfirmDialog/style.css +5 -0
- package/design-system/components/Cover/preview.html +3 -3
- package/design-system/components/Cover/style.css +19 -0
- package/design-system/components/DateInput/README.md +77 -12
- package/design-system/components/DateInput/preview.html +27 -12
- package/design-system/components/DateInput/style.css +38 -0
- package/design-system/components/Dialog/README.md +112 -44
- package/design-system/components/Dialog/preview.html +141 -18
- package/design-system/components/Dialog/style.css +74 -0
- package/design-system/components/EmptyState/README.md +42 -12
- package/design-system/components/EmptyState/preview.html +11 -11
- package/design-system/components/EmptyState/style.css +9 -0
- package/design-system/components/EntryShell/README.md +73 -48
- package/design-system/components/EntryShell/preview.html +60 -27
- package/design-system/components/EntryShell/style.css +19 -0
- package/design-system/components/FeatureGrid/README.md +61 -39
- package/design-system/components/FeatureGrid/preview.html +2 -2
- package/design-system/components/FeatureGrid/style.css +20 -0
- package/design-system/components/FileUpload/README.md +33 -3
- package/design-system/components/FileUpload/preview.html +18 -4
- package/design-system/components/FileUpload/style.css +23 -0
- package/design-system/components/FilterBar/README.md +114 -0
- package/design-system/components/FilterBar/preview.html +82 -0
- package/design-system/components/FilterBar/style.css +22 -0
- package/design-system/components/Fold/README.md +84 -26
- package/design-system/components/Fold/preview.html +77 -34
- package/design-system/components/Fold/style.css +48 -0
- package/design-system/components/Footer/README.md +62 -39
- package/design-system/components/Footer/preview.html +5 -5
- package/design-system/components/Footer/style.css +30 -0
- package/design-system/components/FunnelBars/README.md +24 -3
- package/design-system/components/FunnelBars/preview.html +5 -5
- package/design-system/components/FunnelBars/style.css +13 -0
- package/design-system/components/GoalBars/README.md +54 -10
- package/design-system/components/GoalBars/preview.html +69 -28
- package/design-system/components/GoalBars/style.css +51 -0
- package/design-system/components/GoalTicks/README.md +74 -58
- package/design-system/components/GoalTicks/preview.html +41 -118
- package/design-system/components/GoalTicks/style.css +37 -0
- package/design-system/components/GoalTubes/README.md +29 -3
- package/design-system/components/GoalTubes/preview.html +6 -6
- package/design-system/components/GoalTubes/style.css +23 -0
- package/design-system/components/Heatmap/README.md +133 -0
- package/design-system/components/Heatmap/preview.html +168 -0
- package/design-system/components/Heatmap/style.css +119 -0
- package/design-system/components/Hero/README.md +58 -40
- package/design-system/components/Hero/preview.html +1 -1
- package/design-system/components/Hero/style.css +19 -0
- package/design-system/components/HoverCard/README.md +114 -0
- package/design-system/components/HoverCard/preview.html +107 -0
- package/design-system/components/HoverCard/style.css +59 -0
- package/design-system/components/IconButton/README.md +69 -38
- package/design-system/components/IconButton/preview.html +77 -43
- package/design-system/components/IconButton/style.css +45 -0
- package/design-system/components/Input/README.md +36 -11
- package/design-system/components/Input/preview.html +1 -1
- package/design-system/components/Input/style.css +23 -0
- package/design-system/components/KanbanBoard/README.md +93 -45
- package/design-system/components/KanbanBoard/preview.html +159 -43
- package/design-system/components/KanbanBoard/style.css +53 -0
- package/design-system/components/Kbd/README.md +25 -9
- package/design-system/components/Kbd/preview.html +6 -2
- package/design-system/components/Kbd/style.css +9 -0
- package/design-system/components/KitButton/README.md +81 -47
- package/design-system/components/KitButton/preview.html +35 -13
- package/design-system/components/KitButton/style.css +46 -0
- package/design-system/components/KitCard/README.md +75 -44
- package/design-system/components/KitCard/preview.html +18 -10
- package/design-system/components/KitCard/style.css +15 -0
- package/design-system/components/KitInput/README.md +54 -39
- package/design-system/components/KitInput/preview.html +7 -7
- package/design-system/components/KitInput/style.css +23 -0
- package/design-system/components/Leaderboard/README.md +76 -49
- package/design-system/components/Leaderboard/preview.html +61 -26
- package/design-system/components/Leaderboard/style.css +44 -0
- package/design-system/components/ListDetail/README.md +222 -0
- package/design-system/components/ListDetail/preview.html +213 -0
- package/design-system/components/ListDetail/style.css +148 -0
- package/design-system/components/LoadBar/README.md +79 -0
- package/design-system/components/LoadBar/preview.html +40 -0
- package/design-system/components/LoadBar/style.css +17 -0
- package/design-system/components/MarketingNav/README.md +76 -42
- package/design-system/components/MarketingNav/preview.html +37 -8
- package/design-system/components/MarketingNav/style.css +45 -0
- package/design-system/components/Matrix/README.md +129 -0
- package/design-system/components/Matrix/preview.html +99 -0
- package/design-system/components/Matrix/style.css +84 -0
- package/design-system/components/Menu/README.md +117 -41
- package/design-system/components/Menu/preview.html +85 -23
- package/design-system/components/Menu/style.css +61 -0
- package/design-system/components/Meter/README.md +39 -4
- package/design-system/components/Meter/preview.html +18 -1
- package/design-system/components/Meter/style.css +23 -0
- package/design-system/components/MetricTile/README.md +237 -0
- package/design-system/components/MetricTile/preview.html +241 -0
- package/design-system/components/MetricTile/style.css +129 -0
- package/design-system/components/Morph/README.md +106 -0
- package/design-system/components/Morph/preview.html +103 -0
- package/design-system/components/Morph/style.css +31 -0
- package/design-system/components/Motion/README.md +164 -0
- package/design-system/components/Motion/preview.html +2537 -0
- package/design-system/components/NumberInput/README.md +27 -8
- package/design-system/components/NumberInput/preview.html +21 -5
- package/design-system/components/NumberInput/style.css +34 -0
- package/design-system/components/PaceBar/README.md +75 -0
- package/design-system/components/PaceBar/preview.html +67 -0
- package/design-system/components/PaceBar/style.css +25 -0
- package/design-system/components/Page/README.md +57 -18
- package/design-system/components/Page/preview.html +15 -17
- package/design-system/components/Page/style.css +7 -0
- package/design-system/components/PageBar/README.md +90 -34
- package/design-system/components/PageBar/preview.html +60 -19
- package/design-system/components/PageBar/style.css +35 -0
- package/design-system/components/PageHero/README.md +87 -51
- package/design-system/components/PageHero/preview.html +35 -6
- package/design-system/components/PageHero/style.css +31 -0
- package/design-system/components/Pagination/README.md +70 -49
- package/design-system/components/Pagination/preview.html +24 -15
- package/design-system/components/Pagination/style.css +12 -0
- package/design-system/components/Panel/README.md +109 -51
- package/design-system/components/Panel/preview.html +118 -20
- package/design-system/components/Panel/style.css +51 -0
- package/design-system/components/PasswordInput/README.md +50 -18
- package/design-system/components/PasswordInput/preview.html +71 -21
- package/design-system/components/PasswordInput/style.css +31 -0
- package/design-system/components/Plate/README.md +75 -17
- package/design-system/components/Plate/preview.html +40 -7
- package/design-system/components/Plate/style.css +37 -0
- package/design-system/components/Popover/README.md +70 -49
- package/design-system/components/Popover/preview.html +44 -22
- package/design-system/components/Popover/style.css +41 -0
- package/design-system/components/PricingTable/README.md +69 -49
- package/design-system/components/PricingTable/preview.html +21 -21
- package/design-system/components/PricingTable/style.css +21 -0
- package/design-system/components/ProgressPetals/README.md +31 -3
- package/design-system/components/ProgressPetals/preview.html +14 -15
- package/design-system/components/ProgressPetals/style.css +27 -0
- package/design-system/components/README.md +151 -0
- package/design-system/components/Radio/README.md +40 -17
- package/design-system/components/Radio/preview.html +16 -1
- package/design-system/components/Radio/style.css +21 -0
- package/design-system/components/RankBar/README.md +29 -2
- package/design-system/components/RankBar/preview.html +14 -12
- package/design-system/components/RankBar/style.css +18 -0
- package/design-system/components/Ring/README.md +61 -11
- package/design-system/components/Ring/preview.html +55 -10
- package/design-system/components/Ring/style.css +49 -0
- package/design-system/components/ScoreHero/README.md +91 -0
- package/design-system/components/ScoreHero/preview.html +104 -0
- package/design-system/components/ScoreHero/style.css +32 -0
- package/design-system/components/Section/README.md +72 -33
- package/design-system/components/Section/preview.html +46 -16
- package/design-system/components/Section/style.css +18 -0
- package/design-system/components/Segmented/README.md +100 -55
- package/design-system/components/Segmented/preview.html +107 -26
- package/design-system/components/Segmented/style.css +94 -0
- package/design-system/components/SegmentedProgress/README.md +64 -0
- package/design-system/components/SegmentedProgress/preview.html +69 -0
- package/design-system/components/SegmentedProgress/style.css +11 -0
- package/design-system/components/Select/README.md +47 -12
- package/design-system/components/Select/preview.html +28 -2
- package/design-system/components/Select/style.css +22 -0
- package/design-system/components/ShareBar/README.md +69 -0
- package/design-system/components/ShareBar/preview.html +72 -0
- package/design-system/components/ShareBar/style.css +25 -0
- package/design-system/components/SideList/README.md +147 -0
- package/design-system/components/SideList/preview.html +139 -0
- package/design-system/components/SideList/style.css +94 -0
- package/design-system/components/Skeleton/README.md +53 -16
- package/design-system/components/Skeleton/preview.html +35 -23
- package/design-system/components/Skeleton/style.css +17 -0
- package/design-system/components/Slider/README.md +95 -0
- package/design-system/components/Slider/preview.html +49 -0
- package/design-system/components/Slider/style.css +13 -0
- package/design-system/components/Split/README.md +112 -0
- package/design-system/components/Split/preview.html +105 -0
- package/design-system/components/Split/style.css +30 -0
- package/design-system/components/Starter/README.md +21 -9
- package/design-system/components/Starter/preview.html +5 -5
- package/design-system/components/Stat/README.md +64 -43
- package/design-system/components/Stat/preview.html +3 -3
- package/design-system/components/Stat/style.css +15 -0
- package/design-system/components/StatTiles/README.md +88 -44
- package/design-system/components/StatTiles/preview.html +142 -71
- package/design-system/components/StatTiles/style.css +64 -0
- package/design-system/components/StatusLine/README.md +85 -0
- package/design-system/components/StatusLine/preview.html +49 -0
- package/design-system/components/StatusLine/style.css +14 -0
- package/design-system/components/StatusScreen/README.md +49 -35
- package/design-system/components/StatusScreen/preview.html +20 -5
- package/design-system/components/StatusScreen/style.css +9 -0
- package/design-system/components/StepLine/README.md +97 -0
- package/design-system/components/StepLine/preview.html +108 -0
- package/design-system/components/StepLine/style.css +62 -0
- package/design-system/components/Stepper/README.md +35 -13
- package/design-system/components/Stepper/style.css +13 -0
- package/design-system/components/StreakCalendar/README.md +22 -1
- package/design-system/components/StreakCalendar/preview.html +10 -10
- package/design-system/components/StreakCalendar/style.css +12 -0
- package/design-system/components/SuggestionChip/README.md +87 -0
- package/design-system/components/SuggestionChip/preview.html +42 -0
- package/design-system/components/SuggestionChip/style.css +20 -0
- package/design-system/components/Switch/README.md +44 -24
- package/design-system/components/Switch/preview.html +23 -8
- package/design-system/components/Switch/style.css +31 -0
- package/design-system/components/Table/README.md +129 -58
- package/design-system/components/Table/preview.html +106 -72
- package/design-system/components/Table/style.css +104 -0
- package/design-system/components/Tabs/README.md +71 -46
- package/design-system/components/Tabs/preview.html +56 -24
- package/design-system/components/Tabs/style.css +44 -0
- package/design-system/components/Testimonial/README.md +48 -32
- package/design-system/components/Testimonial/preview.html +14 -14
- package/design-system/components/Testimonial/style.css +12 -0
- package/design-system/components/TextArea/README.md +27 -11
- package/design-system/components/TextArea/preview.html +8 -2
- package/design-system/components/TextArea/style.css +12 -0
- package/design-system/components/ThemeSwitch/README.md +116 -0
- package/design-system/components/ThemeSwitch/preview.html +57 -0
- package/design-system/components/ThemeSwitch/style.css +6 -0
- package/design-system/components/TickRow/README.md +52 -36
- package/design-system/components/TickRow/preview.html +64 -41
- package/design-system/components/TickRow/style.css +23 -0
- package/design-system/components/TickStrip/README.md +95 -0
- package/design-system/components/TickStrip/preview.html +88 -0
- package/design-system/components/TickStrip/style.css +42 -0
- package/design-system/components/Tile/README.md +79 -18
- package/design-system/components/Tile/preview.html +91 -40
- package/design-system/components/Tile/style.css +36 -0
- package/design-system/components/Timeline/README.md +68 -48
- package/design-system/components/Timeline/preview.html +27 -15
- package/design-system/components/Timeline/style.css +25 -0
- package/design-system/components/Toast/README.md +70 -38
- package/design-system/components/Toast/preview.html +43 -8
- package/design-system/components/Toast/style.css +25 -0
- package/design-system/components/Tooltip/README.md +93 -35
- package/design-system/components/Tooltip/preview.html +69 -15
- package/design-system/components/Tooltip/style.css +78 -0
- package/design-system/components/TopBar/README.md +67 -53
- package/design-system/components/TopBar/preview.html +14 -27
- package/design-system/components/TopBar/style.css +35 -0
- package/design-system/components/TopicRail/README.md +108 -0
- package/design-system/components/TopicRail/preview.html +58 -0
- package/design-system/components/TopicRail/style.css +48 -0
- package/design-system/components/TrendBars/README.md +52 -14
- package/design-system/components/TrendBars/preview.html +65 -32
- package/design-system/components/TrendBars/style.css +25 -0
- package/design-system/components/TrendLine/README.md +164 -0
- package/design-system/components/TrendLine/preview.html +373 -0
- package/design-system/components/TrendLine/style.css +155 -0
- package/design-system/components/Well/README.md +64 -22
- package/design-system/components/Well/preview.html +14 -14
- package/design-system/components/Well/style.css +22 -0
- package/design-system/components/_house.css +324 -0
- package/design-system/components/bundle.css +4086 -744
- package/design-system/tokens.json +1310 -124
- package/dist/fello-core.css +2 -2
- package/dist/fello.css +6 -1369
- package/dist/fello.scoped.css +7 -0
- package/dist/index.d.ts +109 -10
- package/dist/index.js +781 -96
- package/dist/palettes.d.ts +464 -0
- package/dist/palettes.js +497 -0
- package/dist/scoped.d.ts +3 -0
- package/dist/scoped.js +16 -0
- package/dist/toast.d.ts +14 -0
- package/dist/toast.js +33 -29
- package/dist/tokens.d.ts +1686 -62
- package/dist/tokens.js +1668 -61
- package/package.json +20 -4
- package/scripts/check-palette.mjs +295 -0
- package/scripts/token-model.mjs +552 -0
- package/tokens/_dark.css +173 -0
- package/tokens/_palettes.css +46 -0
- package/tokens/_product.css +266 -53
- package/tokens/_source.hubl.css +39 -19
- package/tokens/design-tokens.json +319 -0
- package/tokens/palettes.ts +504 -0
- package/tokens/shadcn-compat.css +19 -19
- package/tokens/shadcn-compat.hsl.css +76 -0
- package/tokens/tokens.css +1287 -62
- package/tokens/tokens.md +587 -61
- package/tokens/tokens.root.css +1293 -62
- package/tokens/tokens.ts +1677 -64
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* ---- Meter: a count on a thin 4 px track (a running job, a seat's share), the words beside or above it ---- */
|
|
2
|
+
.ws-meter { display: flex; align-items: center; gap: var(--space-xs); }
|
|
3
|
+
.ws-meter__track { flex: 1; min-width: var(--space-4xl); height: var(--space-xxs); overflow: hidden; border-radius: var(--ws-radius-chip); background: var(--ws-track); }
|
|
4
|
+
.ws-meter__fill { display: block; height: 100%; border-radius: var(--ws-radius-chip); background: var(--ws-agent-tally); }
|
|
5
|
+
@media (prefers-reduced-motion: no-preference) { .ws-meter__fill { transition: width var(--ws-duration-fill) var(--ws-ease-settle); } }
|
|
6
|
+
.ws-meter__fill--done { background: var(--color-stat-positive); }
|
|
7
|
+
.ws-meter__words { flex-shrink: 0; font-size: var(--ws-text-dense); line-height: var(--space-md); color: var(--color-text-muted); font-variant-numeric: tabular-nums; }
|
|
8
|
+
.ws-meter--pill .ws-meter__track, .ws-meter--pill .ws-meter__fill { height: var(--space-sm); border-radius: var(--radius-full); }
|
|
9
|
+
/* The running card: the step and its clock, then the meter. */
|
|
10
|
+
.ws-meter__card { display: flex; flex-direction: column; gap: var(--space-xxs); padding: var(--ws-card-padding); }
|
|
11
|
+
.ws-meter__step { font-size: var(--ws-text-body); line-height: var(--ws-leading-row); color: var(--color-text-interactive); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
12
|
+
.ws-meter__step--done { color: var(--color-text-muted); }
|
|
13
|
+
/* Rows (Seth's "Seats Felix absorbs"): the name and its value on a line, the track under it, a small caption under that.
|
|
14
|
+
Rows are joined by 0.5 px dividers, full width, none above the first; 8 above and below, 14 at the sides. */
|
|
15
|
+
.ws-meter__rows { display: flex; flex-direction: column; }
|
|
16
|
+
.ws-meter__row { display: flex; flex-direction: column; gap: var(--space-xxs); padding: var(--space-xs) var(--space-sm-plus); }
|
|
17
|
+
.ws-meter__row + .ws-meter__row { border-top: var(--ws-divider); }
|
|
18
|
+
.ws-meter__line { display: flex; align-items: baseline; gap: var(--space-xs); }
|
|
19
|
+
.ws-meter__name { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--ws-text-control); font-weight: 500; line-height: var(--ws-leading-control); color: var(--color-text-heading); }
|
|
20
|
+
.ws-meter__value { flex-shrink: 0; font-size: var(--ws-text-dense); font-weight: 600; line-height: var(--space-md); color: var(--color-text-heading); font-variant-numeric: tabular-nums; }
|
|
21
|
+
.ws-meter__value--quiet { font-weight: 500; color: var(--color-text-muted); }
|
|
22
|
+
.ws-meter__row .ws-meter__track { flex: none; min-width: 0; }
|
|
23
|
+
.ws-meter__caption { font-size: var(--ws-text-micro); line-height: var(--ws-leading-micro); color: var(--color-text-muted); }
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
North's key metric: a rimmed tile with a label, a figure, a pace bar or a mini chart (columns, or a line with dots)
|
|
2
|
+
and a foot, that opens across its row into its chart.
|
|
3
|
+
|
|
4
|
+
**Use it when**
|
|
5
|
+
|
|
6
|
+
- A dashboard leads with a few key metrics, each with a goal and a story behind it (revenue, calls, deals, reply time).
|
|
7
|
+
- The reader should see all of them closed, then open one to see what moved it, without leaving the page.
|
|
8
|
+
|
|
9
|
+
**Not for**
|
|
10
|
+
|
|
11
|
+
- A page's few plain numbers with no chart behind them: use `StatTiles`.
|
|
12
|
+
- A report's one score: use `ScoreHero`.
|
|
13
|
+
- A card that holds its chart from the start: use a chart card (`Card` with a chart).
|
|
14
|
+
|
|
15
|
+
**Anatomy (closed)**
|
|
16
|
+
|
|
17
|
+
- The set (`.ws-metric-tiles`) measures itself: one across under 30rem, two from 30rem, four from 60rem with
|
|
18
|
+
`__grid--4`. Tiles 16 apart.
|
|
19
|
+
- Tile: one `<button>`. The tray rim (1 px of `--ws-tray` through padding, 8 outside, 7 inside), the cream surface 16
|
|
20
|
+
inside, 12 between its parts.
|
|
21
|
+
- Head: label 13/18 medium in `--color-text-body` (one line, a `title` when it can truncate) and a 16 px go arrow that
|
|
22
|
+
rests 4 px back with a hovering pointer (on touch it sits on the content edge).
|
|
23
|
+
- Figure: 40/48 regular, -3%, navy, tabular, never wraps.
|
|
24
|
+
- Bar: a `PaceBar` (24 slot), or a preview chart in `__preview` (24 tall) shown greyed until it wakes, or a mini
|
|
25
|
+
chart (`__cols` or `__line`, below).
|
|
26
|
+
- Foot on the tray: 32 tall, 16 at the sides, 12/16 words in `--color-text-body`, the figure `<b>` semibold navy;
|
|
27
|
+
the words give way, the figure never does.
|
|
28
|
+
- `--dense` (North's KPI rail): 12 / 14 inside, 4 apart, a 12 px label and a 28/32 figure.
|
|
29
|
+
|
|
30
|
+
**Mini charts (closed)**
|
|
31
|
+
|
|
32
|
+
North's Home tiles carry a small chart of the periods behind the figure, in the bar's place. Two kinds, either one:
|
|
33
|
+
|
|
34
|
+
- **Column strip** (`__cols`, one `__col` a period, oldest first): columns 8 apart, stopping 12 short of the right edge,
|
|
35
|
+
2 px top corners, each `--v` tall (its share of the chart's range, `lo` to `hi`), on a 1 px baseline that runs the
|
|
36
|
+
full width. The period in progress is the last column, `__col--now`, lighter. `--step` on the strip (a share of the
|
|
37
|
+
height, say `33.33%` for a scale line every third) cuts every column with a fine line in the ground's colour at each
|
|
38
|
+
step, North's scale lines through the bars. A zero is a 1 px stub on the baseline, never left out.
|
|
39
|
+
- **Line with dots** (`__line`, an inline `<svg>`): one `<line pathLength="1">` a step and one `<circle>` a point, the
|
|
40
|
+
coordinates in percent of the plot (x from 0% to 100%, y from the top), the points 4 in from the left and 12 short of
|
|
41
|
+
the right, over a 0.5 px mid rule the full width. Dots 5 px with a 1.5 px ring in the ground's colour; the last
|
|
42
|
+
(`__now`, it marks now) 9 px. The line is 1.25 px.
|
|
43
|
+
- Both are 36 tall and reach up into the 12 above them, so the baseline sits where a PaceBar's 24 slot ends and a tile
|
|
44
|
+
with a chart is as tall as one with a bar.
|
|
45
|
+
- **Grey at rest, woken on hover or focus.** The marks are the heading navy at 20% over the ground whatever their
|
|
46
|
+
tone, so every tile rests the same grey, as North's do (the period in progress 11%; the baseline and mid rule
|
|
47
|
+
`--ws-chart-foot`); under the pointer or the focus they turn to the tone (the period
|
|
48
|
+
in progress 55%; the baseline `--ws-edge-card`, the mid rule `--ws-edge-slot`) over 400 ms (`--ws-duration-shrink`).
|
|
49
|
+
`--tone` on the chart picks the woken tone, navy (`--color-text-heading`) by default; North's retention line is teal
|
|
50
|
+
(`--ws-chart-finished`) and a figure behind its pace is alert red (`--ws-chart-alert`). Marks keep the exact tone; the words around them are navy (D2).
|
|
51
|
+
- The chart is `aria-hidden`: the tile's `aria-label` says what it shows in words ("up every month from $5.1M in May").
|
|
52
|
+
- No history yet (a first month): no chart, never a greyed one or an invented one.
|
|
53
|
+
|
|
54
|
+
**Anatomy (open)**
|
|
55
|
+
|
|
56
|
+
- `--open` on the tile (a `<section role="dialog">` once open): it takes the whole row, 12 outside and 11 inside
|
|
57
|
+
(`--ws-radius-drawer`); its siblings are gone (`display: none`); at least 376 tall (two closed rows and their gap).
|
|
58
|
+
- Main (20 24 8 28): the label at 20/24 with a dotted underline (a description opens from it), the figure at 52/56 in
|
|
59
|
+
its status word colour (`style="--tone-word: ..."`), the chart (`__chart`, or `__chart--segs`: rows of a name, a
|
|
60
|
+
figure and a share over a PaceBar, 24 apart), the key centred under it (8 px swatches, 12/16 medium).
|
|
61
|
+
- Side column, 420 wide behind a 0.5 px rule: tools (the period and the close, an icon button), then sections 12 / 14
|
|
62
|
+
/ 12 / 24 split by full-width 0.5 px rules: what moved it (8 px dot, name, figure in a right column), a line, the
|
|
63
|
+
acts (a pair that shares the row in equal halves, the primary last, as Seth's pane pair; each takes the row when
|
|
64
|
+
the two do not fit side by side).
|
|
65
|
+
- Foot on the tray, 40 tall, 28 at the sides.
|
|
66
|
+
- Parts: `.ws-metric-tile__main` (the chart column: head, value, chart, key), `.ws-metric-tile__chart--segs` of
|
|
67
|
+
`.ws-metric-tile__seg` (each a `.ws-metric-tile__seg-line`, name, figure and `<em>` share, over a PaceBar),
|
|
68
|
+
`.ws-metric-tile__key` (`<i>` swatches with `--tone`), `.ws-metric-tile__side` (the side column),
|
|
69
|
+
`.ws-metric-tile__tools` (the period and the close), `.ws-metric-tile__section` (split by 0.5 px rules; `--grow`
|
|
70
|
+
takes the spare height), `.ws-metric-tile__section-title` (13/18 medium navy), `.ws-metric-tile__mover` (an `<i>`
|
|
71
|
+
dot, a `<b>` name, an `<em>` figure) and `.ws-metric-tile__acts` (the pair of buttons).
|
|
72
|
+
- Under 60rem the side column moves under the chart; under 30rem everything inside is 16 from the edge.
|
|
73
|
+
|
|
74
|
+
**States**
|
|
75
|
+
|
|
76
|
+
- Rest, hover (the rim darkens to `--ws-well-hover` over 200 ms, the arrow steps forward, a preview wakes to its
|
|
77
|
+
colours over 400 ms), focus (the same, plus the 2 px navy ring), selected (`--selected`: the darker rim and a 2 px
|
|
78
|
+
navy tab 8 under the tile, 16 in from each side), open.
|
|
79
|
+
- Loading: put `ws-shimmer` ghosts where the figure and the bar go.
|
|
80
|
+
- Long label: one line, an ellipsis and its `title`. Long foot words: an ellipsis; the figure stays whole.
|
|
81
|
+
- Zero: every column a 1 px stub, or the line on the floor of the plot, and a 0 in the figure.
|
|
82
|
+
- Building in (`--draw` on the tile, North's Home intro, "Metric + goal bars fill"): the chart draws over the card's
|
|
83
|
+
share of the page fill, `--ws-duration-fill-page` (1700 ms) x 0.79, so 1343 ms. Column `i` of `--n` starts at
|
|
84
|
+
`i / (n - 1)` of the first half and rises from the baseline over the other half on `--ws-ease-settle` (North's
|
|
85
|
+
stagger, share 0.5). The line draws left to right at an even pace over the first three quarters, step `i` after step
|
|
86
|
+
`i - 1`, and each dot pops (`ws-bloom` on `--ws-ease-pop`) as the line reaches it, the end dot last. Then the foot's
|
|
87
|
+
figure rises in (`ws-rise`, 320 ms). Set `--n` on the chart and `--i` on each column, step and dot. Inside a
|
|
88
|
+
`.ws-build` card all of it starts at the card's `--ws-build-at`, when the card scrolls into view, once (Motion,
|
|
89
|
+
Build-in).
|
|
90
|
+
- Hover while building: the tint and the arrow as at rest; the marks wake to their tone where they have drawn.
|
|
91
|
+
- Reduced motion: everything changes at once; the chart shows its final drawing.
|
|
92
|
+
|
|
93
|
+
**Behaviour**
|
|
94
|
+
|
|
95
|
+
- Opening is the app's job, in this order (North): measure the tile's slot, set `--open`, and animate from the slot's
|
|
96
|
+
box to the row's over 550 ms on `--ws-ease-grow` (`--ws-duration-grow`), corners 8 to 12. Fade the other tiles out
|
|
97
|
+
over 200 ms first (`--ws-duration-hover`), then hide them. After 80 ms the details settle in (`ws-settle` with
|
|
98
|
+
`--ws-i`, 22 ms apart) and the chart draws (900 ms, `--ws-duration-draw`).
|
|
99
|
+
- Closing: 400 ms on the same curve (`--ws-duration-shrink`); the details leave in 120 ms (`--ws-duration-exit`).
|
|
100
|
+
- Escape closes; focus moves to the close act on open and back to the tile on close. The open tile is
|
|
101
|
+
`role="dialog"` with `aria-label` (the metric's name).
|
|
102
|
+
- A closed tile's `aria-label` reads the whole tile ("Revenue this month, $412K, behind pace by $38K. Open").
|
|
103
|
+
- In React, use `springs` and `eases` from `@felloinnovations/brand-kit/tokens` inside `<MotionConfig reducedMotion="user">`.
|
|
104
|
+
|
|
105
|
+
**Rules**
|
|
106
|
+
|
|
107
|
+
- Four key metrics at most in a set; each has a goal, or it is a `StatTiles` tile.
|
|
108
|
+
- One tile open at a time.
|
|
109
|
+
- Words in a tone take the AA step (`--ws-word-past-half`, `--ws-word-needs-work`, `--ws-word-positive`).
|
|
110
|
+
|
|
111
|
+
**Source**
|
|
112
|
+
|
|
113
|
+
**Derived from**: North's Home key metrics and scoreboard tiles (`.mcard`, `.scard`, `.mtile`, the opened `.mopen`),
|
|
114
|
+
built from Seth's base values (16 / 12 / 40, foot 32) rather than the 1.09 scaled ones (17.5 / 13.12 / 43.74); the open
|
|
115
|
+
and close timing from North's motion config. The slot height (189 in North) is not fixed here: a tile is as tall as
|
|
116
|
+
its content. The mini charts are North's Home previews (`HD` and its drawing in app.js: columns 8 apart, 12 short of
|
|
117
|
+
the right, 2 px corners, 0.75 px scale cuts, the month to date lighter; the line 1.25 px, dots 2.5 and 4.5 radius with
|
|
118
|
+
a 1.5 px paper ring; the rest palette a navy wash, woken over 0.4 s), 40 tall at North's 1.09 scale and so 36 here
|
|
119
|
+
(D3); their draw is North's intro ("Metric + goal bars fill", 1.7 s, cards 0.21 apart, marks 0.5).
|
|
120
|
+
|
|
121
|
+
**Tokens**: `--ws-duration-fill-page` (the draw), `--ws-ease-settle` (each column), `--ws-ease-steady` (the line),
|
|
122
|
+
`--ws-ease-pop` (each dot), `--ws-duration-settle` (a dot, the foot's figure), `--ws-duration-shrink` (waking),
|
|
123
|
+
`--ws-chart-foot`, `--ws-edge-card`, `--ws-edge-slot`, `--ws-radius-chip`, `--ws-hairline`, `--ws-line`.
|
|
124
|
+
|
|
125
|
+
**Markup**
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<div class="ws-metric-tiles">
|
|
129
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
130
|
+
<button type="button" class="ws-metric-tile" aria-label="Calls this week, 312, ahead of pace by 24. Open">
|
|
131
|
+
<span class="ws-metric-tile__surface">
|
|
132
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Calls this week</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" aria-hidden="true">...</svg></span>
|
|
133
|
+
<span class="ws-metric-tile__value">312</span>
|
|
134
|
+
<span class="ws-pace-bar" style="--value: 78%; --pace: 72%; --tone: var(--ws-chart-finished);" aria-hidden="true">
|
|
135
|
+
<span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__dot"></span>
|
|
136
|
+
</span>
|
|
137
|
+
</span>
|
|
138
|
+
<span class="ws-metric-tile__foot"><span>Ahead of pace by</span><b>24</b></span>
|
|
139
|
+
</button>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
With a mini chart, building in on a dashboard (`.ws-build` on the page or section, the tile its card): a column strip
|
|
145
|
+
(six periods, a scale line every third, the last in progress), then a line with dots in teal:
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<div class="ws-metric-tiles ws-build">
|
|
149
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
150
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 0;" aria-label="Recurring revenue, $12.99M, up every month from $5.1M in May; 100% of pace, $12.99M of $13.06M. Open">
|
|
151
|
+
<span class="ws-metric-tile__surface">
|
|
152
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Recurring revenue</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" aria-hidden="true">...</svg></span>
|
|
153
|
+
<span class="ws-metric-tile__value">$12.99M</span>
|
|
154
|
+
<span class="ws-metric-tile__cols" style="--n: 6; --step: 33.33%;" aria-hidden="true">
|
|
155
|
+
<span class="ws-metric-tile__col" style="--v: 34%; --i: 0;"></span>
|
|
156
|
+
<span class="ws-metric-tile__col" style="--v: 42.67%; --i: 1;"></span>
|
|
157
|
+
<span class="ws-metric-tile__col" style="--v: 52.67%; --i: 2;"></span>
|
|
158
|
+
<span class="ws-metric-tile__col" style="--v: 62.8%; --i: 3;"></span>
|
|
159
|
+
<span class="ws-metric-tile__col" style="--v: 77%; --i: 4;"></span>
|
|
160
|
+
<span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 86.6%; --i: 5;"></span>
|
|
161
|
+
</span>
|
|
162
|
+
</span>
|
|
163
|
+
<span class="ws-metric-tile__foot"><span>Pace $12.99M of $13.06M</span><b>100%</b></span>
|
|
164
|
+
</button>
|
|
165
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 1;" aria-label="Net revenue retention, 99.9%, between 99.1% and 100.7% since May; 100% of the 100.0% target. Open">
|
|
166
|
+
<span class="ws-metric-tile__surface">
|
|
167
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Net revenue retention</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" aria-hidden="true">...</svg></span>
|
|
168
|
+
<span class="ws-metric-tile__value">99.9%</span>
|
|
169
|
+
<span class="ws-metric-tile__line" style="--n: 6; --tone: var(--ws-chart-finished);" aria-hidden="true"><svg>
|
|
170
|
+
<line pathLength="1" x1="0%" y1="76.67%" x2="20%" y2="53.33%" style="--i: 0;"/>
|
|
171
|
+
<line pathLength="1" x1="20%" y1="53.33%" x2="40%" y2="40%" style="--i: 1;"/>
|
|
172
|
+
<line pathLength="1" x1="40%" y1="40%" x2="60%" y2="66.67%" style="--i: 2;"/>
|
|
173
|
+
<line pathLength="1" x1="60%" y1="66.67%" x2="80%" y2="23.33%" style="--i: 3;"/>
|
|
174
|
+
<line pathLength="1" x1="80%" y1="23.33%" x2="100%" y2="50%" style="--i: 4;"/>
|
|
175
|
+
<circle cx="0%" cy="76.67%" style="--i: 0;"/><circle cx="20%" cy="53.33%" style="--i: 1;"/>
|
|
176
|
+
<circle cx="40%" cy="40%" style="--i: 2;"/><circle cx="60%" cy="66.67%" style="--i: 3;"/>
|
|
177
|
+
<circle cx="80%" cy="23.33%" style="--i: 4;"/><circle class="ws-metric-tile__now" cx="100%" cy="50%" style="--i: 5;"/>
|
|
178
|
+
</svg></span>
|
|
179
|
+
</span>
|
|
180
|
+
<span class="ws-metric-tile__foot"><span>Target 100.0%</span><b>100%</b></span>
|
|
181
|
+
</button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
A column's `--v` is `(value - lo) / (hi - lo)`; a point's `cy` is `(hi - value) / (hi - lo)`. Pick `lo` and `hi` a little
|
|
187
|
+
outside the run (North: 0 to 15 for 5.1 to 12.99) so no mark touches the plot's edge, and `--step` so a strip shows at
|
|
188
|
+
most two scale lines.
|
|
189
|
+
|
|
190
|
+
Open (the app swaps the tile's `<button>` for this `<section>` in the same slot; the other tiles in the grid hide):
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<section class="ws-metric-tile ws-metric-tile--open" role="dialog" aria-label="Revenue this month" style="--tone-word: var(--ws-word-past-half);">
|
|
194
|
+
<div class="ws-metric-tile__surface">
|
|
195
|
+
<div class="ws-metric-tile__main">
|
|
196
|
+
<div class="ws-metric-tile__head ws-settle" style="--ws-i: 0;"><span class="ws-metric-tile__label">Revenue this month</span></div>
|
|
197
|
+
<span class="ws-metric-tile__value ws-settle" style="--ws-i: 1;">$412K</span>
|
|
198
|
+
<div class="ws-metric-tile__chart ws-metric-tile__chart--segs">
|
|
199
|
+
<div class="ws-metric-tile__seg ws-settle" style="--ws-i: 2;">
|
|
200
|
+
<div class="ws-metric-tile__seg-line"><span title="Priya Nair">Priya Nair</span><b>$148K</b><em>92%</em></div>
|
|
201
|
+
<div class="ws-pace-bar ws-pace-bar--draw" style="--value: 74%; --pace: 66%; --tone: var(--ws-chart-finished);" role="img" aria-label="Priya Nair, 92% of pace">
|
|
202
|
+
<span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__dot"></span>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<!-- one __seg a part -->
|
|
206
|
+
</div>
|
|
207
|
+
<div class="ws-metric-tile__key ws-settle" style="--ws-i: 5;" aria-hidden="true">
|
|
208
|
+
<span><i style="--tone: var(--ws-chart-finished);"></i>On pace</span>
|
|
209
|
+
<span><i style="--tone: var(--ws-chart-needs-work);"></i>Off pace</span>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
<aside class="ws-metric-tile__side">
|
|
213
|
+
<div class="ws-metric-tile__tools">
|
|
214
|
+
<span>This month, to Nov 4</span>
|
|
215
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--sm" aria-label="Close"><svg viewBox="0 0 16 16" aria-hidden="true">...</svg></button>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="ws-metric-tile__section ws-settle" style="--ws-i: 2;">
|
|
218
|
+
<h4 class="ws-metric-tile__section-title">What moved it</h4>
|
|
219
|
+
<div class="ws-metric-tile__mover"><i style="--tone: var(--ws-chart-finished);"></i><b title="Two listings closed early">Two listings closed early</b><em>+$52K</em></div>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="ws-metric-tile__section ws-metric-tile__section--grow ws-settle" style="--ws-i: 3;">
|
|
222
|
+
<p class="ws-body">Behind pace by $38K with 26 days to go.</p>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="ws-metric-tile__section ws-settle" style="--ws-i: 4;">
|
|
225
|
+
<div class="ws-metric-tile__acts">
|
|
226
|
+
<button type="button" class="ws-btn ws-btn--secondary">Open the report</button>
|
|
227
|
+
<button type="button" class="ws-btn ws-btn--primary">Ask about this</button>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
</aside>
|
|
231
|
+
</div>
|
|
232
|
+
<div class="ws-metric-tile__foot"><span>Behind pace by</span><b>$38K</b></div>
|
|
233
|
+
</section>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Styles**: `MetricTile/style.css` (with `PaceBar/style.css`), in `bundle.css` and `fello.css` as `.ws-metric-tile`.
|
|
237
|
+
Every value is a token.
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
<!-- @dsCard group="Charts" height=1720 -->
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>MetricTile</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: 1194px;">
|
|
14
|
+
<div class="ws-cluster"><span class="ws-muted">Mini charts building in (a .ws-build): each tile rises in 70 ms after the one before; its columns grow from the baseline one after another, the line draws left to right and its dots pop, then the foot's figure. Grey until the pointer or the focus wakes it to its tone</span><button type="button" class="ws-btn ws-btn--secondary ws-btn--sm" data-replay="mt-build" aria-label="Replay the build-in">Replay</button></div>
|
|
15
|
+
<div class="ws-metric-tiles ws-build" id="mt-build">
|
|
16
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
17
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 0;" aria-label="Recurring revenue, $12.99M, up every month from $5.1M in May; 100% of pace, $12.99M of $13.06M. Open">
|
|
18
|
+
<span class="ws-metric-tile__surface">
|
|
19
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Recurring revenue</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
20
|
+
<span class="ws-metric-tile__value">$12.99M</span>
|
|
21
|
+
<span class="ws-metric-tile__cols" style="--n: 6; --step: 33.33%;" aria-hidden="true"><span class="ws-metric-tile__col" style="--v: 34%; --i: 0;"></span><span class="ws-metric-tile__col" style="--v: 42.67%; --i: 1;"></span><span class="ws-metric-tile__col" style="--v: 52.67%; --i: 2;"></span><span class="ws-metric-tile__col" style="--v: 62.8%; --i: 3;"></span><span class="ws-metric-tile__col" style="--v: 77%; --i: 4;"></span><span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 86.6%; --i: 5;"></span></span>
|
|
22
|
+
</span>
|
|
23
|
+
<span class="ws-metric-tile__foot"><span>Pace $12.99M of $13.06M</span><b>100%</b></span>
|
|
24
|
+
</button>
|
|
25
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 1;" aria-label="Total revenue, $35.75M, up every month from $29.5M in May; 89% of the $40.03M plan. Open">
|
|
26
|
+
<span class="ws-metric-tile__surface">
|
|
27
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Total revenue</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
28
|
+
<span class="ws-metric-tile__value">$35.75M</span>
|
|
29
|
+
<span class="ws-metric-tile__cols" style="--n: 6; --step: 41.67%;" aria-hidden="true"><span class="ws-metric-tile__col" style="--v: 37.5%; --i: 0;"></span><span class="ws-metric-tile__col" style="--v: 46.67%; --i: 1;"></span><span class="ws-metric-tile__col" style="--v: 52.5%; --i: 2;"></span><span class="ws-metric-tile__col" style="--v: 58.83%; --i: 3;"></span><span class="ws-metric-tile__col" style="--v: 76.25%; --i: 4;"></span><span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 89.58%; --i: 5;"></span></span>
|
|
30
|
+
</span>
|
|
31
|
+
<span class="ws-metric-tile__foot"><span>Of the $40.03M plan</span><b>89%</b></span>
|
|
32
|
+
</button>
|
|
33
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 2;" aria-label="Net revenue retention, 99.9%, between 99.1% and 100.7% since May; 100% of the 100.0% target. Open">
|
|
34
|
+
<span class="ws-metric-tile__surface">
|
|
35
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Net revenue retention</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
36
|
+
<span class="ws-metric-tile__value">99.9%</span>
|
|
37
|
+
<span class="ws-metric-tile__line" style="--n: 6; --tone: var(--ws-chart-finished);" aria-hidden="true"><svg><line pathLength="1" x1="0%" y1="76.67%" x2="20%" y2="53.33%" style="--i: 0;"/><line pathLength="1" x1="20%" y1="53.33%" x2="40%" y2="40%" style="--i: 1;"/><line pathLength="1" x1="40%" y1="40%" x2="60%" y2="66.67%" style="--i: 2;"/><line pathLength="1" x1="60%" y1="66.67%" x2="80%" y2="23.33%" style="--i: 3;"/><line pathLength="1" x1="80%" y1="23.33%" x2="100%" y2="50%" style="--i: 4;"/><circle cx="0%" cy="76.67%" style="--i: 0;"/><circle cx="20%" cy="53.33%" style="--i: 1;"/><circle cx="40%" cy="40%" style="--i: 2;"/><circle cx="60%" cy="66.67%" style="--i: 3;"/><circle cx="80%" cy="23.33%" style="--i: 4;"/><circle class="ws-metric-tile__now" cx="100%" cy="50%" style="--i: 5;"/></svg></span>
|
|
38
|
+
</span>
|
|
39
|
+
<span class="ws-metric-tile__foot"><span>Target 100.0%</span><b>100%</b></span>
|
|
40
|
+
</button>
|
|
41
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--draw ws-build__card" style="--ws-i: 3;" aria-label="Net new revenue, $1.55M this month, after $2.03M in July and $1.32M in August; 87% of pace, $1.78M of $1.87M. Open">
|
|
42
|
+
<span class="ws-metric-tile__surface">
|
|
43
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Net new revenue</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
44
|
+
<span class="ws-metric-tile__value">$1.55M</span>
|
|
45
|
+
<span class="ws-metric-tile__cols" style="--n: 6; --step: 43.48%; --tone: var(--ws-chart-alert);" aria-hidden="true"><span class="ws-metric-tile__col" style="--v: 70.43%; --i: 0;"></span><span class="ws-metric-tile__col" style="--v: 81.74%; --i: 1;"></span><span class="ws-metric-tile__col" style="--v: 88.26%; --i: 2;"></span><span class="ws-metric-tile__col" style="--v: 57.39%; --i: 3;"></span><span class="ws-metric-tile__col" style="--v: 76.52%; --i: 4;"></span><span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 67.39%; --i: 5;"></span></span>
|
|
46
|
+
</span>
|
|
47
|
+
<span class="ws-metric-tile__foot"><span>Pace $1.78M of $1.87M</span><b>87%</b></span>
|
|
48
|
+
</button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="ws-stack" style="max-width: 1194px;">
|
|
54
|
+
<span class="ws-muted">At rest: a long label and long foot words give way to an ellipsis; nothing counted is a 1 px stub a period (columns) or a line on the floor (the line); no history yet is no chart, never a greyed one</span>
|
|
55
|
+
<div class="ws-metric-tiles">
|
|
56
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
57
|
+
<button type="button" class="ws-metric-tile" aria-label="Average revenue per active account this quarter, $4,120, up from $3,200 in the first month; 96% of pace. Open">
|
|
58
|
+
<span class="ws-metric-tile__surface">
|
|
59
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label" title="Average revenue per active account this quarter">Average revenue per active account this quarter</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
60
|
+
<span class="ws-metric-tile__value">$4,120</span>
|
|
61
|
+
<span class="ws-metric-tile__cols" style="--n: 4; --step: 40%;" aria-hidden="true"><span class="ws-metric-tile__col" style="--v: 64%; --i: 0;"></span><span class="ws-metric-tile__col" style="--v: 70%; --i: 1;"></span><span class="ws-metric-tile__col" style="--v: 78%; --i: 2;"></span><span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 82.4%; --i: 3;"></span></span>
|
|
62
|
+
</span>
|
|
63
|
+
<span class="ws-metric-tile__foot"><span title="Behind the quarter’s pace by a little under two hundred dollars">Behind the quarter’s pace by a little under two hundred dollars</span><b>96%</b></span>
|
|
64
|
+
</button>
|
|
65
|
+
<button type="button" class="ws-metric-tile" aria-label="New accounts this week, 0, none on any day yet; 0% of the 12 planned. Open">
|
|
66
|
+
<span class="ws-metric-tile__surface">
|
|
67
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">New accounts this week</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
68
|
+
<span class="ws-metric-tile__value">0</span>
|
|
69
|
+
<span class="ws-metric-tile__cols" style="--n: 7;" aria-hidden="true"><span class="ws-metric-tile__col" style="--v: 0%; --i: 0;"></span><span class="ws-metric-tile__col" style="--v: 0%; --i: 1;"></span><span class="ws-metric-tile__col" style="--v: 0%; --i: 2;"></span><span class="ws-metric-tile__col" style="--v: 0%; --i: 3;"></span><span class="ws-metric-tile__col" style="--v: 0%; --i: 4;"></span><span class="ws-metric-tile__col" style="--v: 0%; --i: 5;"></span><span class="ws-metric-tile__col ws-metric-tile__col--now" style="--v: 0%; --i: 6;"></span></span>
|
|
70
|
+
</span>
|
|
71
|
+
<span class="ws-metric-tile__foot"><span>Of the 12 planned this week</span><b>0%</b></span>
|
|
72
|
+
</button>
|
|
73
|
+
<button type="button" class="ws-metric-tile" aria-label="Reply rate, 0%, no replies in five weeks; 0% of the 25% target. Open">
|
|
74
|
+
<span class="ws-metric-tile__surface">
|
|
75
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Reply rate</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
76
|
+
<span class="ws-metric-tile__value">0%</span>
|
|
77
|
+
<span class="ws-metric-tile__line" style="--n: 5;" aria-hidden="true"><svg><line pathLength="1" x1="0%" y1="100%" x2="25%" y2="100%" style="--i: 0;"/><line pathLength="1" x1="25%" y1="100%" x2="50%" y2="100%" style="--i: 1;"/><line pathLength="1" x1="50%" y1="100%" x2="75%" y2="100%" style="--i: 2;"/><line pathLength="1" x1="75%" y1="100%" x2="100%" y2="100%" style="--i: 3;"/><circle cx="0%" cy="100%" style="--i: 0;"/><circle cx="25%" cy="100%" style="--i: 1;"/><circle cx="50%" cy="100%" style="--i: 2;"/><circle cx="75%" cy="100%" style="--i: 3;"/><circle class="ws-metric-tile__now" cx="100%" cy="100%" style="--i: 4;"/></svg></span>
|
|
78
|
+
</span>
|
|
79
|
+
<span class="ws-metric-tile__foot"><span>Target 25%</span><b>0%</b></span>
|
|
80
|
+
</button>
|
|
81
|
+
<button type="button" class="ws-metric-tile" aria-label="Referrals, 3, the first month so no trend yet. Open">
|
|
82
|
+
<span class="ws-metric-tile__surface">
|
|
83
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Referrals</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
84
|
+
<span class="ws-metric-tile__value">3</span>
|
|
85
|
+
|
|
86
|
+
</span>
|
|
87
|
+
<span class="ws-metric-tile__foot"><span>First month, no trend yet</span><b>3</b></span>
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="ws-stack" style="max-width: 1194px;">
|
|
94
|
+
<span class="ws-muted">Closed, four across: label and go arrow, the figure, a PaceBar or a greyed preview, the foot on the tray</span>
|
|
95
|
+
<div class="ws-metric-tiles">
|
|
96
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
97
|
+
<button type="button" class="ws-metric-tile ws-settle" style="--ws-i: 0;" aria-label="Revenue this month, $412K, behind pace by $38K. Open">
|
|
98
|
+
<span class="ws-metric-tile__surface">
|
|
99
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Revenue this month</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
100
|
+
<span class="ws-metric-tile__value">$412K</span>
|
|
101
|
+
<span class="ws-pace-bar" style="--value: 58%; --pace: 66%; --tone: var(--ws-chart-past-half);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__cut" style="--at: 25%;"></span><span class="ws-pace-bar__cut" style="--at: 50%;"></span><span class="ws-pace-bar__cut" style="--at: 75%;"></span><span class="ws-pace-bar__dot"></span></span>
|
|
102
|
+
</span>
|
|
103
|
+
<span class="ws-metric-tile__foot"><span>Behind pace by</span><b>$38K</b></span>
|
|
104
|
+
</button>
|
|
105
|
+
<button type="button" class="ws-metric-tile ws-settle" style="--ws-i: 1;" aria-label="Calls this week, 312, ahead of pace by 24. Open">
|
|
106
|
+
<span class="ws-metric-tile__surface">
|
|
107
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Calls this week</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
108
|
+
<span class="ws-metric-tile__value">312</span>
|
|
109
|
+
<span class="ws-pace-bar" style="--value: 78%; --pace: 72%; --tone: var(--ws-chart-finished);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__cut" style="--at: 25%;"></span><span class="ws-pace-bar__cut" style="--at: 50%;"></span><span class="ws-pace-bar__cut" style="--at: 75%;"></span><span class="ws-pace-bar__dot"></span></span>
|
|
110
|
+
</span>
|
|
111
|
+
<span class="ws-metric-tile__foot"><span>Ahead of pace by</span><b>24</b></span>
|
|
112
|
+
</button>
|
|
113
|
+
<button type="button" class="ws-metric-tile ws-settle" style="--ws-i: 2;" aria-label="Deals closed, 9, 2 more than last month. Open">
|
|
114
|
+
<span class="ws-metric-tile__surface">
|
|
115
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Deals closed</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
116
|
+
<span class="ws-metric-tile__value">9</span>
|
|
117
|
+
<span class="ws-metric-tile__preview" aria-hidden="true"><span class="ws-tick-strip ws-tick-strip--bar" style="--n: 12; --tone: var(--ws-chart-finished);"><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></span></span>
|
|
118
|
+
</span>
|
|
119
|
+
<span class="ws-metric-tile__foot"><span>More than last month</span><b>2</b></span>
|
|
120
|
+
</button>
|
|
121
|
+
<button type="button" class="ws-metric-tile ws-settle" style="--ws-i: 3;" aria-label="Average time to first reply, 4 minutes 12 seconds, slower by 38 seconds. Open">
|
|
122
|
+
<span class="ws-metric-tile__surface">
|
|
123
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label" title="Average time to first reply on new leads">Average time to first reply on new leads</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
124
|
+
<span class="ws-metric-tile__value">4m 12s</span>
|
|
125
|
+
<span class="ws-pace-bar" style="--value: 30%; --pace: 70%; --tone: var(--ws-chart-needs-work);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__dot"></span></span>
|
|
126
|
+
</span>
|
|
127
|
+
<span class="ws-metric-tile__foot"><span>Slower than the 3 minute goal by</span><b>1m 12s</b></span>
|
|
128
|
+
</button>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="ws-stack" style="max-width: 1194px;">
|
|
134
|
+
<span class="ws-muted">Open: the tile takes the row; the chart beside a side column (under it below 60rem); details settle in</span>
|
|
135
|
+
<div class="ws-metric-tiles">
|
|
136
|
+
<div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
|
|
137
|
+
<button type="button" class="ws-metric-tile">hidden while one is open</button>
|
|
138
|
+
<section class="ws-metric-tile ws-metric-tile--open" role="dialog" aria-label="Revenue this month" style="--tone-word: var(--ws-word-past-half);">
|
|
139
|
+
<div class="ws-metric-tile__surface">
|
|
140
|
+
<div class="ws-metric-tile__main">
|
|
141
|
+
<div class="ws-metric-tile__head ws-settle" style="--ws-i: 0;">
|
|
142
|
+
<span class="ws-metric-tile__label">Revenue this month</span>
|
|
143
|
+
</div>
|
|
144
|
+
<span class="ws-metric-tile__value ws-settle" style="--ws-i: 1;">$412K</span>
|
|
145
|
+
<div class="ws-metric-tile__chart ws-metric-tile__chart--segs">
|
|
146
|
+
<div class="ws-metric-tile__seg ws-settle" style="--ws-i: 2;">
|
|
147
|
+
<div class="ws-metric-tile__seg-line"><span title="Priya Nair">Priya Nair</span><b>$148K</b><em>92%</em></div>
|
|
148
|
+
<div class="ws-pace-bar ws-pace-bar--draw" style="--value: 74%; --pace: 66%; --tone: var(--ws-chart-finished);" role="img" aria-label="Priya Nair, 92% of pace"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__cut" style="--at: 25%;"></span><span class="ws-pace-bar__cut" style="--at: 50%;"></span><span class="ws-pace-bar__cut" style="--at: 75%;"></span><span class="ws-pace-bar__dot"></span></div>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="ws-metric-tile__seg ws-settle" style="--ws-i: 3;">
|
|
151
|
+
<div class="ws-metric-tile__seg-line"><span title="Marcus Bell">Marcus Bell</span><b>$121K</b><em>81%</em></div>
|
|
152
|
+
<div class="ws-pace-bar ws-pace-bar--draw" style="--value: 54%; --pace: 66%; --tone: var(--ws-chart-past-half);" role="img" aria-label="Marcus Bell, 81% of pace"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__cut" style="--at: 25%;"></span><span class="ws-pace-bar__cut" style="--at: 50%;"></span><span class="ws-pace-bar__cut" style="--at: 75%;"></span><span class="ws-pace-bar__dot"></span></div>
|
|
153
|
+
</div>
|
|
154
|
+
<div class="ws-metric-tile__seg ws-settle" style="--ws-i: 4;">
|
|
155
|
+
<div class="ws-metric-tile__seg-line"><span title="Dana Whitfield, the newest on the team this quarter">Dana Whitfield, the newest on the team this quarter</span><b>$84K</b><em>61%</em></div>
|
|
156
|
+
<div class="ws-pace-bar ws-pace-bar--draw" style="--value: 40%; --pace: 66%; --tone: var(--ws-chart-needs-work);" role="img" aria-label="Dana Whitfield, 61% of pace"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__cut" style="--at: 25%;"></span><span class="ws-pace-bar__cut" style="--at: 50%;"></span><span class="ws-pace-bar__cut" style="--at: 75%;"></span><span class="ws-pace-bar__dot"></span></div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<div class="ws-metric-tile__key ws-settle" style="--ws-i: 5;" aria-hidden="true">
|
|
160
|
+
<span><i style="--tone: var(--ws-chart-finished);"></i>On pace</span>
|
|
161
|
+
<span><i style="--tone: var(--ws-chart-past-half);"></i>Behind</span>
|
|
162
|
+
<span><i style="--tone: var(--ws-chart-needs-work);"></i>Off pace</span>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
<aside class="ws-metric-tile__side">
|
|
166
|
+
<div class="ws-metric-tile__tools">
|
|
167
|
+
<span>This month, to Nov 4</span>
|
|
168
|
+
<button type="button" class="ws-icon-btn ws-icon-btn--sm" aria-label="Close"><svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M4.5 4.5l7 7M11.5 4.5l-7 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></button>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="ws-metric-tile__section ws-settle" style="--ws-i: 2;">
|
|
171
|
+
<h4 class="ws-metric-tile__section-title">What moved it</h4>
|
|
172
|
+
<div class="ws-metric-tile__mover"><i style="--tone: var(--ws-chart-finished);"></i><b title="Two listings closed early">Two listings closed early</b><em>+$52K</em></div>
|
|
173
|
+
<div class="ws-metric-tile__mover"><i style="--tone: var(--ws-chart-needs-work);"></i><b title="A buyer walked away at inspection on Elm Street">A buyer walked away at inspection on Elm Street</b><em>−$31K</em></div>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="ws-metric-tile__section ws-metric-tile__section--grow ws-settle" style="--ws-i: 3;">
|
|
176
|
+
<p class="ws-body">Behind pace by $38K with 26 days to go. Dana's three open deals would close the gap.</p>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="ws-metric-tile__section ws-settle" style="--ws-i: 4;">
|
|
179
|
+
<div class="ws-metric-tile__acts">
|
|
180
|
+
<button type="button" class="ws-btn ws-btn--secondary">Open the report</button>
|
|
181
|
+
<button type="button" class="ws-btn ws-btn--primary">Ask about this</button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</aside>
|
|
185
|
+
</div>
|
|
186
|
+
<div class="ws-metric-tile__foot"><span>Behind pace by</span><b>$38K</b></div>
|
|
187
|
+
</section>
|
|
188
|
+
<button type="button" class="ws-metric-tile">hidden while one is open</button>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<div class="ws-stack" style="max-width: 760px;">
|
|
194
|
+
<span class="ws-muted">Two across, one selected (the darker rim and the navy tab under it)</span>
|
|
195
|
+
<div class="ws-metric-tiles">
|
|
196
|
+
<div class="ws-metric-tiles__grid">
|
|
197
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--selected" aria-pressed="true" aria-label="Sales, 64% of pace">
|
|
198
|
+
<span class="ws-metric-tile__surface">
|
|
199
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Sales</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
200
|
+
<span class="ws-metric-tile__value">64%</span>
|
|
201
|
+
<span class="ws-pace-bar" style="--value: 64%; --pace: 70%; --tone: var(--ws-chart-past-half);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__dot"></span></span>
|
|
202
|
+
</span>
|
|
203
|
+
<span class="ws-metric-tile__foot"><span>Of pace</span><b>64%</b></span>
|
|
204
|
+
</button>
|
|
205
|
+
<button type="button" class="ws-metric-tile" aria-pressed="false" aria-label="Recruiting, 88% of pace">
|
|
206
|
+
<span class="ws-metric-tile__surface">
|
|
207
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Recruiting</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
208
|
+
<span class="ws-metric-tile__value">88%</span>
|
|
209
|
+
<span class="ws-pace-bar" style="--value: 88%; --pace: 70%; --tone: var(--ws-chart-finished);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__dot"></span></span>
|
|
210
|
+
</span>
|
|
211
|
+
<span class="ws-metric-tile__foot"><span>Of pace</span><b>88%</b></span>
|
|
212
|
+
</button>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<div class="ws-stack" style="width: 300px; max-width: 100%;">
|
|
218
|
+
<span class="ws-muted">Dense (North's KPI rail): 12 / 14 inside, a 28 px figure</span>
|
|
219
|
+
<div class="ws-metric-tiles">
|
|
220
|
+
<div class="ws-metric-tiles__grid">
|
|
221
|
+
<button type="button" class="ws-metric-tile ws-metric-tile--dense" aria-label="New leads, 48, 92% of pace">
|
|
222
|
+
<span class="ws-metric-tile__surface">
|
|
223
|
+
<span class="ws-metric-tile__head"><span class="ws-metric-tile__label">New leads</span></span>
|
|
224
|
+
<span class="ws-metric-tile__value">48</span>
|
|
225
|
+
<span class="ws-pace-bar" style="--value: 64%; --pace: 70%; --tone: var(--ws-chart-finished);" aria-hidden="true"><span class="ws-pace-bar__fill"></span><span class="ws-pace-bar__gap"></span><span class="ws-pace-bar__dot"></span></span>
|
|
226
|
+
</span>
|
|
227
|
+
</button>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
</div>
|
|
231
|
+
|
|
232
|
+
</div>
|
|
233
|
+
<script>
|
|
234
|
+
/* Replay: a fresh copy of the build runs its build-in again (the app never needs this; a page builds in once). */
|
|
235
|
+
for (const b of document.querySelectorAll('[data-replay]')) b.addEventListener('click', () => {
|
|
236
|
+
const el = document.getElementById(b.dataset.replay);
|
|
237
|
+
el.replaceWith(el.cloneNode(true));
|
|
238
|
+
});
|
|
239
|
+
</script>
|
|
240
|
+
</body>
|
|
241
|
+
</html>
|