@felloinnovations/brand-kit 0.5.0 → 0.5.3
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 +29 -9
- package/CHANGELOG.md +110 -0
- package/README.md +14 -6
- package/design-system/01-how-claude-decides.md +5 -3
- package/design-system/03-colour.md +22 -3
- package/design-system/05-space-and-layout.md +2 -1
- package/design-system/08-choosing-components.md +20 -4
- package/design-system/09-charts.md +7 -4
- package/design-system/10-patterns.md +1 -1
- package/design-system/11-page-recipes.md +40 -1
- package/design-system/13-motion.md +4 -4
- package/design-system/15-ai-experiences.md +11 -0
- package/design-system/17-decisions.md +51 -0
- package/design-system/components/AppShell/README.md +89 -21
- package/design-system/components/AppShell/preview.html +148 -3
- package/design-system/components/AppShell/style.css +47 -0
- package/design-system/components/Avatar/README.md +6 -3
- package/design-system/components/Avatar/preview.html +2 -1
- package/design-system/components/Avatar/style.css +3 -0
- package/design-system/components/Banner/README.md +9 -5
- package/design-system/components/Banner/preview.html +9 -0
- package/design-system/components/Banner/style.css +3 -0
- package/design-system/components/Button/README.md +29 -2
- package/design-system/components/Button/preview.html +33 -1
- package/design-system/components/Button/style.css +21 -0
- package/design-system/components/Calendar/README.md +148 -0
- package/design-system/components/Calendar/preview.html +449 -0
- package/design-system/components/Calendar/style.css +61 -0
- package/design-system/components/Card/README.md +13 -0
- package/design-system/components/Card/preview.html +23 -0
- package/design-system/components/Card/style.css +19 -0
- package/design-system/components/ChatCard/README.md +74 -3
- package/design-system/components/ChatCard/preview.html +126 -25
- package/design-system/components/ChatCard/style.css +6 -0
- package/design-system/components/CheckRow/README.md +1 -1
- package/design-system/components/CheckRow/preview.html +1 -1
- package/design-system/components/CheckRow/style.css +1 -1
- package/design-system/components/Chip/README.md +16 -7
- package/design-system/components/Chip/preview.html +25 -1
- package/design-system/components/Chip/style.css +5 -0
- package/design-system/components/Combobox/README.md +10 -4
- package/design-system/components/Combobox/preview.html +19 -4
- package/design-system/components/Combobox/style.css +7 -1
- package/design-system/components/CommentThread/README.md +138 -0
- package/design-system/components/CommentThread/preview.html +134 -0
- package/design-system/components/CommentThread/style.css +41 -0
- package/design-system/components/DateInput/README.md +38 -4
- package/design-system/components/DateInput/preview.html +50 -2
- package/design-system/components/DateInput/style.css +6 -0
- package/design-system/components/Dialog/README.md +26 -3
- package/design-system/components/Dialog/preview.html +80 -0
- package/design-system/components/Dialog/style.css +28 -3
- package/design-system/components/EmptyState/README.md +1 -1
- package/design-system/components/Fold/README.md +21 -0
- package/design-system/components/Fold/preview.html +44 -1
- package/design-system/components/Fold/style.css +30 -0
- package/design-system/components/InlineEdit/README.md +116 -0
- package/design-system/components/InlineEdit/preview.html +135 -0
- package/design-system/components/InlineEdit/style.css +34 -0
- package/design-system/components/Input/README.md +20 -1
- package/design-system/components/Input/preview.html +24 -0
- package/design-system/components/Input/style.css +13 -1
- package/design-system/components/KanbanBoard/README.md +69 -5
- package/design-system/components/KanbanBoard/preview.html +129 -0
- package/design-system/components/KanbanBoard/style.css +32 -1
- package/design-system/components/ListDetail/preview.html +1 -1
- package/design-system/components/Matrix/README.md +1 -1
- package/design-system/components/Matrix/preview.html +1 -1
- package/design-system/components/Motion/README.md +2 -2
- package/design-system/components/Motion/preview.html +8 -8
- package/design-system/components/PlanTimeline/README.md +144 -0
- package/design-system/components/PlanTimeline/preview.html +109 -0
- package/design-system/components/PlanTimeline/style.css +64 -0
- package/design-system/components/README.md +12 -7
- package/design-system/components/ScoreHero/README.md +2 -2
- package/design-system/components/ScoreHero/style.css +1 -1
- package/design-system/components/ShareBar/README.md +1 -1
- package/design-system/components/ShareBar/style.css +1 -1
- package/design-system/components/Skeleton/README.md +82 -17
- package/design-system/components/Skeleton/preview.html +84 -2
- package/design-system/components/Skeleton/style.css +9 -14
- package/design-system/components/Starter/README.md +1 -1
- package/design-system/components/Starter/preview.html +1 -1
- package/design-system/components/Stepper/README.md +81 -5
- package/design-system/components/Stepper/preview.html +64 -1
- package/design-system/components/Stepper/style.css +29 -0
- package/design-system/components/StreakCalendar/README.md +1 -0
- package/design-system/components/Table/README.md +8 -4
- package/design-system/components/Table/preview.html +16 -1
- package/design-system/components/Table/style.css +3 -1
- package/design-system/components/TextDiff/README.md +96 -0
- package/design-system/components/TextDiff/preview.html +42 -0
- package/design-system/components/TextDiff/style.css +21 -0
- package/design-system/components/TickStrip/README.md +1 -1
- package/design-system/components/TickStrip/preview.html +1 -1
- package/design-system/components/TickStrip/style.css +1 -1
- package/design-system/components/Timeline/README.md +4 -2
- package/design-system/components/TrendLine/README.md +38 -7
- package/design-system/components/TrendLine/preview.html +140 -3
- package/design-system/components/TrendLine/style.css +12 -2
- package/design-system/components/Well/README.md +1 -1
- package/design-system/components/Well/style.css +2 -2
- package/design-system/components/_house.css +1 -1
- package/design-system/components/bundle.css +501 -30
- package/design-system/tokens.json +17 -7
- package/dist/fello-core.css +2 -2
- package/dist/fello.css +2 -2
- package/dist/fello.scoped.css +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/scoped.js +2 -2
- package/dist/tokens.d.ts +16 -8
- package/dist/tokens.js +16 -8
- package/package.json +7 -2
- package/scripts/check-drift.mjs +325 -0
- package/scripts/token-model.mjs +2 -1
- package/tokens/_dark.css +3 -2
- package/tokens/_product.css +13 -11
- package/tokens/palettes.ts +1 -1
- package/tokens/shadcn-compat.css +1 -1
- package/tokens/shadcn-compat.hsl.css +1 -1
- package/tokens/tokens.css +23 -15
- package/tokens/tokens.md +56 -50
- package/tokens/tokens.root.css +23 -15
- package/tokens/tokens.ts +17 -9
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
A plan's phases and tasks as bars across its dates: a row a phase (its tasks one step in), each bar from its start to
|
|
2
|
+
its end on one scale, the phase in hand navy, milestones as diamonds and today one line through every row.
|
|
3
|
+
|
|
4
|
+
## Use it when
|
|
5
|
+
|
|
6
|
+
- Work is planned over a window and the question is "what runs when, and where are we now": a campaign's phases, a
|
|
7
|
+
launch, a rollout with its gates.
|
|
8
|
+
- Phases overlap or run back to back and their lengths matter, not only their order.
|
|
9
|
+
|
|
10
|
+
## Not for
|
|
11
|
+
|
|
12
|
+
- Steps in order with no dates: use `Stepper` (`--across` for a thing's stages).
|
|
13
|
+
- One thing's dated milestones with the time between them: use `Stepper --milestones`.
|
|
14
|
+
- Things that fall on a day (posts, sends, touches): use `Calendar`.
|
|
15
|
+
- What happened, in order: use `Timeline`.
|
|
16
|
+
|
|
17
|
+
## Anatomy
|
|
18
|
+
|
|
19
|
+
- The region (`ws-plan-timeline`, `role="region"`, `tabindex="0"`, named for the plan and today): it sets `--days`, the
|
|
20
|
+
window's length in days, and scrolls sideways inside itself when the plan is wider than its box. 4 px of room above,
|
|
21
|
+
below and at the far end (pulled back by a margin) for a focus ring; none at the start, where the names stick.
|
|
22
|
+
- The plot (`__plot`): the names' column (160, 120 under 40rem of the region) and the window, never narrower than 8 px
|
|
23
|
+
a day, so a long plan scrolls rather than squeezing its bars.
|
|
24
|
+
- The scale (`__scale`, `aria-hidden`): 24 tall, a tick (`__tick`, `--at` its day) at each month's (or week's) first
|
|
25
|
+
day: a 0.5 px line and the name, 11 / 13 medium muted.
|
|
26
|
+
- A row (`__row`, in an `ol`): a 0.5 px line above it. Its name (`__name`), stuck at the left on the card's cream: the
|
|
27
|
+
phase (`__title`, 13 / 18 medium navy; semibold for the row in hand) and its dates under it (`__when`, 12 / 16
|
|
28
|
+
muted; `--late` in needs-you words, "Was due Nov 6"). Names and dates wrap rather than cut.
|
|
29
|
+
- A task row (`--task`): one step in (16), its name in the body words, its bar 16 tall.
|
|
30
|
+
- The track (`__track`): at least 40 tall. A bar (`__bar`, a link when it opens the phase): `--start` (days from the
|
|
31
|
+
window's first day) and `--span` (days), 24 tall, 4 px corners, at least 24 wide. Its state, in a `ws-sr` span too:
|
|
32
|
+
done (`--done`, teal), in hand (`aria-current="step"`, navy), late (`--late`, salmon), to come (`--wait`, the track
|
|
33
|
+
with a 0.5 px edge).
|
|
34
|
+
- A milestone (`__milestone`, `--at` its day, `role="img"` with its name and date in `aria-label` and `title`): a 10 px
|
|
35
|
+
diamond, cream inside a navy edge; reached (`--done`) teal. It opens nothing: its phase's bar does.
|
|
36
|
+
- Today (`__now`, `--at` its day, `aria-hidden`): "Today" over the window, 11 px semibold, and one 1 px line through every
|
|
37
|
+
row, in the salmon's AA step (`--ws-word-needs`). Left out when today is outside the window; the region's name
|
|
38
|
+
carries the date.
|
|
39
|
+
|
|
40
|
+
## Variants and sizes
|
|
41
|
+
|
|
42
|
+
| State | Class | Bar |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| Done | `__bar--done` | teal (`--ws-chart-finished`) |
|
|
45
|
+
| In hand | `aria-current="step"` | navy (`--color-text-heading`); its row's name semibold |
|
|
46
|
+
| Late | `__bar--late` | salmon (`--ws-chart-under-half`); say it under the name in `__when--late` |
|
|
47
|
+
| To come | `__bar--wait` | the track (`--ws-track`) on a 0.5 px edge |
|
|
48
|
+
|
|
49
|
+
A tone token passed as `--tone` on a bar wins (a category of work rather than a state); it follows the palette, never a
|
|
50
|
+
hex. A short plan (two to six weeks) takes a tick per week; a quarter, a tick per month.
|
|
51
|
+
|
|
52
|
+
## States
|
|
53
|
+
|
|
54
|
+
- **Hover** (a bar that opens): a wash over its fill; never a lift.
|
|
55
|
+
- **Focus**: the house ring round the bar; a bar reached by Tab scrolls clear of the stuck names
|
|
56
|
+
(`scroll-padding-inline-start`). The region's own ring is drawn inside, and the far-edge fade drops while it has focus.
|
|
57
|
+
- **Scrolling** (a phone): the plan opens on today (`scroll-initial-target` on `__now`), the names stay put, the far
|
|
58
|
+
edge fades while days are hidden past it.
|
|
59
|
+
- **Loading**: the scale drawn; `ws-skeleton ws-skeleton--line` in each name and `ws-shimmer` on the bars where they
|
|
60
|
+
will land.
|
|
61
|
+
- **Empty**: a plan with no phases is an `EmptyState` in the card, never an empty scale.
|
|
62
|
+
- **Touch**: a bar's target is 40 tall (its `::after`), a task's 16 px bar too.
|
|
63
|
+
- **Dark and the navy ground**: from the tokens.
|
|
64
|
+
|
|
65
|
+
## Behaviour
|
|
66
|
+
|
|
67
|
+
- No script in the kit: the app works out each bar's `--start` and `--span` and each tick's and milestone's `--at`
|
|
68
|
+
(days from the window's first day) and renders them.
|
|
69
|
+
- Keyboard: the region takes focus so the keyboard can scroll it; bars are links in document order, row after row.
|
|
70
|
+
- Screen reader: the region's name says the plan and today; a row reads its name and dates, then its bar's state
|
|
71
|
+
("Pre-launch, in hand"); a milestone reads its name, date and whether it was passed. The scale and today's line are
|
|
72
|
+
`aria-hidden`.
|
|
73
|
+
- The names' column narrows under 40rem of the region (a container query, `ws-plan-timeline`).
|
|
74
|
+
|
|
75
|
+
## Content
|
|
76
|
+
|
|
77
|
+
- A phase's name is the plan's own word ("Pre-launch", "Retro"), sentence case; dates short ("Oct 20 to Nov 16",
|
|
78
|
+
"Nov 2 to 12").
|
|
79
|
+
- A late phase says how in words under its name ("Was due Nov 6", "4 days late"), never with colour alone.
|
|
80
|
+
- A milestone's label names it and its date ("Gate 2, Oct 20, passed", "Launch day, Nov 17").
|
|
81
|
+
- No em dashes.
|
|
82
|
+
|
|
83
|
+
## Props
|
|
84
|
+
|
|
85
|
+
| Name | Type | Meaning |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
| `start`, `end` | `string` | The window, `YYYY-MM-DD`; `--days` is the days between them |
|
|
88
|
+
| `rows` | `{ id, name, when, start, end, state: "done" \| "current" \| "late" \| "wait", task?, href?, lateNote?, tone? }[]` | Phases and their tasks, in order (a task straight after its phase) |
|
|
89
|
+
| `milestones` | `{ row, date, label, done? }[]` | Diamonds, each on its row |
|
|
90
|
+
| `ticks` | `{ date, label }[]` | Months, or weeks for a short plan |
|
|
91
|
+
| `today` | `string` | `YYYY-MM-DD`; the line is drawn only inside the window |
|
|
92
|
+
|
|
93
|
+
## Rules
|
|
94
|
+
|
|
95
|
+
- **One scale for every row**: a bar's place and length are its dates, never squeezed to fit a label.
|
|
96
|
+
- **The phase in hand is the one navy bar** (its tasks in hand may share it); done is teal, late salmon, to come the
|
|
97
|
+
track. A state is never colour alone: its words are in the bar's `ws-sr` and, when late, under the name.
|
|
98
|
+
- **Today is one fine line**, never a band or a wash over the window.
|
|
99
|
+
- **Names stay on screen**: the plan scrolls, its names do not.
|
|
100
|
+
- **Hover is a tint**; nothing lifts.
|
|
101
|
+
|
|
102
|
+
## Source
|
|
103
|
+
|
|
104
|
+
- **Derived from**: `Stepper`'s states (done teal, in hand navy, a stall in needs-you words), `KanbanBoard`'s sideways
|
|
105
|
+
scroll with its far-edge fade and stuck head, today's mark in the needs step (`DateInput`, `StreakCalendar`), Seth's
|
|
106
|
+
0.5 px lines.
|
|
107
|
+
- **Precedent**: 0.5.3 (Nov 2026), from the field: three Marketing OS screens (a campaign's phases, the overview's
|
|
108
|
+
launch timeline and the plays by date) drew a plan across its window by hand for want of one (issue #24).
|
|
109
|
+
|
|
110
|
+
## Markup
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<div class="ws-plan-timeline" style="--days: 91;" role="region" aria-label="Portal launch plan by date, today Nov 10" tabindex="0">
|
|
114
|
+
<div class="ws-plan-timeline__plot">
|
|
115
|
+
<div class="ws-plan-timeline__scale" aria-hidden="true">
|
|
116
|
+
<span class="ws-plan-timeline__tick" style="--at: 0;">Sep</span>
|
|
117
|
+
<span class="ws-plan-timeline__tick" style="--at: 30;">Oct</span>
|
|
118
|
+
<span class="ws-plan-timeline__tick" style="--at: 61;">Nov</span>
|
|
119
|
+
</div>
|
|
120
|
+
<ol class="ws-plan-timeline__rows">
|
|
121
|
+
<li class="ws-plan-timeline__row">
|
|
122
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Pre-launch</span><span class="ws-plan-timeline__when">Oct 20 to Nov 16</span></span>
|
|
123
|
+
<span class="ws-plan-timeline__track">
|
|
124
|
+
<a class="ws-plan-timeline__bar" href="#" aria-current="step" style="--start: 49; --span: 28;"><span class="ws-sr">Pre-launch, in hand</span></a>
|
|
125
|
+
<span class="ws-plan-timeline__milestone" style="--at: 77;" role="img" aria-label="Launch day, Nov 17" title="Launch day, Nov 17"></span>
|
|
126
|
+
</span>
|
|
127
|
+
</li>
|
|
128
|
+
<li class="ws-plan-timeline__row ws-plan-timeline__row--task">
|
|
129
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Landing page</span><span class="ws-plan-timeline__when ws-plan-timeline__when--late">Was due Nov 6</span></span>
|
|
130
|
+
<span class="ws-plan-timeline__track">
|
|
131
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--late" href="#" style="--start: 56; --span: 11;"><span class="ws-sr">Landing page, 4 days late</span></a>
|
|
132
|
+
</span>
|
|
133
|
+
</li>
|
|
134
|
+
</ol>
|
|
135
|
+
<span class="ws-plan-timeline__now" style="--at: 70;" aria-hidden="true"><span>Today</span></span>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Styles
|
|
141
|
+
|
|
142
|
+
`design-system/components/PlanTimeline/style.css`, in `bundle.css` and `fello.css` as `.ws-plan-timeline`. Every value
|
|
143
|
+
is a token; the bar tones follow the palette. The far-edge fade uses a scroll-driven animation (`ws-scroll-edges`)
|
|
144
|
+
where the browser has one.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<!-- @dsCard group="Data" height=900 -->
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>PlanTimeline</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--grey ws-stage--column">
|
|
12
|
+
|
|
13
|
+
<div class="ws-stack">
|
|
14
|
+
<span class="ws-muted">A campaign's plan across its window: a phase a row, its tasks one step in, done teal, the phase in hand navy, a late task salmon, the rest to come; gates and launch day as diamonds; today one line through every row</span>
|
|
15
|
+
<section class="ws-card ws-card--inset ws-stack" aria-labelledby="plan-title">
|
|
16
|
+
<div class="ws-cluster ws-cluster--between">
|
|
17
|
+
<h3 class="ws-section" id="plan-title">Portal launch plan</h3>
|
|
18
|
+
<span class="ws-meta">Sep 1 to Nov 30</span>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="ws-plan-timeline" style="--days: 91;" role="region" aria-label="Portal launch plan by date, today Nov 10" tabindex="0">
|
|
21
|
+
<div class="ws-plan-timeline__plot">
|
|
22
|
+
<div class="ws-plan-timeline__scale" aria-hidden="true">
|
|
23
|
+
<span class="ws-plan-timeline__tick" style="--at: 0;">Sep</span>
|
|
24
|
+
<span class="ws-plan-timeline__tick" style="--at: 30;">Oct</span>
|
|
25
|
+
<span class="ws-plan-timeline__tick" style="--at: 61;">Nov</span>
|
|
26
|
+
</div>
|
|
27
|
+
<ol class="ws-plan-timeline__rows">
|
|
28
|
+
<li class="ws-plan-timeline__row">
|
|
29
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Plan</span><span class="ws-plan-timeline__when">Sep 1 to 14</span></span>
|
|
30
|
+
<span class="ws-plan-timeline__track">
|
|
31
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--done" href="#plan" style="--start: 0; --span: 14;"><span class="ws-sr">Plan, done</span></a>
|
|
32
|
+
<span class="ws-plan-timeline__milestone ws-plan-timeline__milestone--done" style="--at: 14;" role="img" aria-label="Gate 1, Sep 15, passed" title="Gate 1, Sep 15, passed"></span>
|
|
33
|
+
</span>
|
|
34
|
+
</li>
|
|
35
|
+
<li class="ws-plan-timeline__row">
|
|
36
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Build</span><span class="ws-plan-timeline__when">Sep 15 to Oct 19</span></span>
|
|
37
|
+
<span class="ws-plan-timeline__track">
|
|
38
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--done" href="#build" style="--start: 14; --span: 35;"><span class="ws-sr">Build, done</span></a>
|
|
39
|
+
<span class="ws-plan-timeline__milestone ws-plan-timeline__milestone--done" style="--at: 49;" role="img" aria-label="Gate 2, Oct 20, passed" title="Gate 2, Oct 20, passed"></span>
|
|
40
|
+
</span>
|
|
41
|
+
</li>
|
|
42
|
+
<li class="ws-plan-timeline__row">
|
|
43
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Pre-launch</span><span class="ws-plan-timeline__when">Oct 20 to Nov 16</span></span>
|
|
44
|
+
<span class="ws-plan-timeline__track">
|
|
45
|
+
<a class="ws-plan-timeline__bar" href="#pre-launch" aria-current="step" style="--start: 49; --span: 28;"><span class="ws-sr">Pre-launch, in hand</span></a>
|
|
46
|
+
<span class="ws-plan-timeline__milestone" style="--at: 77;" role="img" aria-label="Launch day, Nov 17" title="Launch day, Nov 17"></span>
|
|
47
|
+
</span>
|
|
48
|
+
</li>
|
|
49
|
+
<li class="ws-plan-timeline__row ws-plan-timeline__row--task">
|
|
50
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Email sequence</span><span class="ws-plan-timeline__when">Oct 20 to Nov 6</span></span>
|
|
51
|
+
<span class="ws-plan-timeline__track">
|
|
52
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--done" href="#emails" style="--start: 49; --span: 18;"><span class="ws-sr">Email sequence, done</span></a>
|
|
53
|
+
</span>
|
|
54
|
+
</li>
|
|
55
|
+
<li class="ws-plan-timeline__row ws-plan-timeline__row--task">
|
|
56
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Landing page</span><span class="ws-plan-timeline__when ws-plan-timeline__when--late">Was due Nov 6</span></span>
|
|
57
|
+
<span class="ws-plan-timeline__track">
|
|
58
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--late" href="#landing" style="--start: 56; --span: 11;"><span class="ws-sr">Landing page, 4 days late</span></a>
|
|
59
|
+
</span>
|
|
60
|
+
</li>
|
|
61
|
+
<li class="ws-plan-timeline__row ws-plan-timeline__row--task">
|
|
62
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Webinar invites</span><span class="ws-plan-timeline__when">Nov 2 to 12</span></span>
|
|
63
|
+
<span class="ws-plan-timeline__track">
|
|
64
|
+
<a class="ws-plan-timeline__bar" href="#invites" aria-current="step" style="--start: 62; --span: 11;"><span class="ws-sr">Webinar invites, in hand</span></a>
|
|
65
|
+
</span>
|
|
66
|
+
</li>
|
|
67
|
+
<li class="ws-plan-timeline__row">
|
|
68
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Launch</span><span class="ws-plan-timeline__when">Nov 17 to 23</span></span>
|
|
69
|
+
<span class="ws-plan-timeline__track">
|
|
70
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--wait" href="#launch" style="--start: 77; --span: 7;"><span class="ws-sr">Launch, to come</span></a>
|
|
71
|
+
</span>
|
|
72
|
+
</li>
|
|
73
|
+
<li class="ws-plan-timeline__row">
|
|
74
|
+
<span class="ws-plan-timeline__name"><span class="ws-plan-timeline__title">Retro</span><span class="ws-plan-timeline__when">Nov 24 to 30</span></span>
|
|
75
|
+
<span class="ws-plan-timeline__track">
|
|
76
|
+
<a class="ws-plan-timeline__bar ws-plan-timeline__bar--wait" href="#retro" style="--start: 84; --span: 7;"><span class="ws-sr">Retro, to come</span></a>
|
|
77
|
+
</span>
|
|
78
|
+
</li>
|
|
79
|
+
</ol>
|
|
80
|
+
<span class="ws-plan-timeline__now" style="--at: 70;" aria-hidden="true"><span>Today</span></span>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</section>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div class="ws-stack" style="max-width: 360px;">
|
|
87
|
+
<span class="ws-muted">Loading: the names and bars as ghosts where they will land, the scale already drawn</span>
|
|
88
|
+
<section class="ws-card ws-card--inset ws-stack" aria-labelledby="plan-loading" aria-busy="true">
|
|
89
|
+
<h3 class="ws-section" id="plan-loading">Portal launch plan</h3>
|
|
90
|
+
<div class="ws-plan-timeline" style="--days: 91;">
|
|
91
|
+
<div class="ws-plan-timeline__plot">
|
|
92
|
+
<div class="ws-plan-timeline__scale" aria-hidden="true">
|
|
93
|
+
<span class="ws-plan-timeline__tick" style="--at: 0;">Sep</span>
|
|
94
|
+
<span class="ws-plan-timeline__tick" style="--at: 30;">Oct</span>
|
|
95
|
+
<span class="ws-plan-timeline__tick" style="--at: 61;">Nov</span>
|
|
96
|
+
</div>
|
|
97
|
+
<ol class="ws-plan-timeline__rows" aria-hidden="true">
|
|
98
|
+
<li class="ws-plan-timeline__row"><span class="ws-plan-timeline__name"><span class="ws-skeleton ws-skeleton--line" style="width: 64px;"></span></span><span class="ws-plan-timeline__track"><span class="ws-plan-timeline__bar ws-shimmer" style="--start: 0; --span: 14;"></span></span></li>
|
|
99
|
+
<li class="ws-plan-timeline__row"><span class="ws-plan-timeline__name"><span class="ws-skeleton ws-skeleton--line" style="width: 80px;"></span></span><span class="ws-plan-timeline__track"><span class="ws-plan-timeline__bar ws-shimmer" style="--start: 14; --span: 35;"></span></span></li>
|
|
100
|
+
<li class="ws-plan-timeline__row"><span class="ws-plan-timeline__name"><span class="ws-skeleton ws-skeleton--line" style="width: 72px;"></span></span><span class="ws-plan-timeline__track"><span class="ws-plan-timeline__bar ws-shimmer" style="--start: 49; --span: 28;"></span></span></li>
|
|
101
|
+
</ol>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</section>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
</div>
|
|
108
|
+
</body>
|
|
109
|
+
</html>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* ---- PlanTimeline: a plan's phases and tasks as bars across its dates. A row a phase (a task one step in), its name and
|
|
2
|
+
dates stuck at the left; each bar from its start to its end on one scale (--days in the window, --start and --span in
|
|
3
|
+
days from its first day); the phase in hand navy, done teal, late salmon, to come on the track; milestones diamonds;
|
|
4
|
+
today one fine line in the needs step through every row. Past its box (a phone) it scrolls sideways inside itself, the
|
|
5
|
+
names staying put. ---- */
|
|
6
|
+
.ws-plan-timeline { --ws-plan-timeline-name: var(--space-8xl); --ws-plan-timeline-day: var(--space-xs); container: ws-plan-timeline / inline-size; min-width: 0; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; padding: var(--space-xxs) var(--space-xxs) var(--space-xxs) 0; margin: calc(var(--space-xxs) * -1) calc(var(--space-xxs) * -1) calc(var(--space-xxs) * -1) 0; }
|
|
7
|
+
/* 4 px of room above, below and at the far end (pulled back by the margin) so a bar's focus ring is never cut; none at
|
|
8
|
+
the start, where the names stick. */
|
|
9
|
+
.ws-plan-timeline:focus-visible { outline-offset: calc(var(--ws-focus-width) * -1); }
|
|
10
|
+
/* A bar reached by Tab scrolls clear of the stuck names (the wider name column, so it holds on a phone too). */
|
|
11
|
+
.ws-plan-timeline { scroll-padding-inline-start: calc(var(--space-8xl) + var(--space-xxs)); }
|
|
12
|
+
/* The plot: the names' column and the window, never narrower than a day at 8 px, so a long plan scrolls rather than
|
|
13
|
+
squeezing its bars to slivers. */
|
|
14
|
+
.ws-plan-timeline__plot { position: relative; min-width: calc(var(--ws-plan-timeline-name) + var(--days) * var(--ws-plan-timeline-day)); }
|
|
15
|
+
@container ws-plan-timeline (width < 40rem) { .ws-plan-timeline__plot { --ws-plan-timeline-name: var(--space-7xl); } }
|
|
16
|
+
/* The scale: a tick per month (or week) at its first day, 11 px medium muted, over the window only. Rows and the scale
|
|
17
|
+
are flex rows, not grids, so the stuck names can travel the whole row (a grid item sticks only inside its cell). */
|
|
18
|
+
.ws-plan-timeline__scale { position: relative; display: flex; height: var(--space-lg); }
|
|
19
|
+
.ws-plan-timeline__tick { position: absolute; top: 0; bottom: 0; left: calc(var(--ws-plan-timeline-name) + (100% - var(--ws-plan-timeline-name)) * var(--at) / var(--days)); display: flex; align-items: center; padding-left: var(--space-xxs); border-left: var(--ws-hairline) solid var(--ws-edge-card); font-size: var(--ws-text-micro); line-height: var(--ws-leading-micro); font-weight: 500; color: var(--color-text-muted); white-space: nowrap; }
|
|
20
|
+
.ws-plan-timeline__rows { display: flex; flex-direction: column; }
|
|
21
|
+
.ws-plan-timeline__row { display: flex; border-top: var(--ws-hairline) solid var(--ws-edge-card); }
|
|
22
|
+
/* The name and its dates, stuck at the left on the card's cream. */
|
|
23
|
+
.ws-plan-timeline__name { position: sticky; left: 0; z-index: 2; display: flex; flex: 0 0 var(--ws-plan-timeline-name); flex-direction: column; justify-content: center; min-width: 0; padding: var(--space-xs) var(--space-sm) var(--space-xs) 0; background: var(--ws-plan-timeline-ground, var(--color-bg-page)); }
|
|
24
|
+
/* Names and dates wrap rather than cut: the column is narrow on a phone and a plan's names are its whole point. */
|
|
25
|
+
.ws-plan-timeline__title { font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--color-text-heading); overflow-wrap: anywhere; }
|
|
26
|
+
.ws-plan-timeline__when { font-size: var(--ws-text-dense); line-height: var(--space-md); color: var(--color-text-muted); }
|
|
27
|
+
.ws-plan-timeline__row:has([aria-current]) .ws-plan-timeline__title { font-weight: 600; }
|
|
28
|
+
/* A late phase or task says so under its name, in needs-you words. */
|
|
29
|
+
.ws-plan-timeline__when--late { font-weight: 500; color: var(--ws-word-needs); }
|
|
30
|
+
/* A task: one step in under its phase, its name in the body words, its bar thinner. */
|
|
31
|
+
.ws-plan-timeline__row--task .ws-plan-timeline__name { padding-left: var(--space-md); }
|
|
32
|
+
.ws-plan-timeline__row--task .ws-plan-timeline__title { font-weight: 400; color: var(--color-text-body); }
|
|
33
|
+
.ws-plan-timeline__track { position: relative; flex: 1; min-width: 0; min-height: var(--space-2xl); }
|
|
34
|
+
/* A bar: 4 px corners, at least 24 wide so a one-day task is still a target; a link when it opens the phase. */
|
|
35
|
+
.ws-plan-timeline__bar { --ws-plan-timeline-tone: var(--tone, var(--ws-track)); position: absolute; top: 50%; left: calc(var(--start) / var(--days) * 100%); width: max(calc(var(--span) / var(--days) * 100%), var(--space-lg)); height: var(--space-lg); border-radius: var(--ws-radius-control); background-color: var(--ws-plan-timeline-tone); transform: translateY(-50%); }
|
|
36
|
+
.ws-plan-timeline__bar--wait { box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-edge-card); }
|
|
37
|
+
.ws-plan-timeline__bar--done { --ws-plan-timeline-tone: var(--tone, var(--ws-chart-finished)); }
|
|
38
|
+
.ws-plan-timeline__bar[aria-current] { --ws-plan-timeline-tone: var(--tone, var(--color-text-heading)); }
|
|
39
|
+
.ws-plan-timeline__bar--late { --ws-plan-timeline-tone: var(--tone, var(--ws-chart-under-half)); }
|
|
40
|
+
.ws-plan-timeline__row--task .ws-plan-timeline__bar { height: var(--space-md); }
|
|
41
|
+
/* Every bar that opens keeps a 24 px target (a task's 16 px bar too), 40 on touch (K10). */
|
|
42
|
+
a.ws-plan-timeline__bar::after { content: ""; position: absolute; inset: calc((100% - var(--ws-plan-timeline-hit, var(--space-lg))) / 2) 0; }
|
|
43
|
+
@media (pointer: coarse) { .ws-plan-timeline { --ws-plan-timeline-hit: var(--ws-touch); } }
|
|
44
|
+
a.ws-plan-timeline__bar { color: var(--color-text-heading); cursor: pointer; }
|
|
45
|
+
@media (hover: hover) { a.ws-plan-timeline__bar:hover { background-image: linear-gradient(var(--ws-hover-strong), var(--ws-hover-strong)); } }
|
|
46
|
+
a.ws-plan-timeline__bar:focus-visible { outline: var(--ws-focus-width) solid var(--ws-focus-color); outline-offset: var(--ws-focus-offset); }
|
|
47
|
+
/* A milestone: a 10 px diamond on the day it falls, the cream inside a navy edge until it is reached, teal after. It
|
|
48
|
+
opens nothing (its phase's bar does); its name and date are in its label and title. */
|
|
49
|
+
.ws-plan-timeline__milestone { position: absolute; z-index: 1; top: 50%; left: calc(var(--at) / var(--days) * 100%); width: var(--space-xs-plus); height: var(--space-xs-plus); border-radius: var(--ws-radius-chip); background: var(--color-bg-page); box-shadow: inset 0 0 0 calc(var(--ws-hairline) * 3) var(--color-text-heading); transform: translate(-50%, -50%) rotate(45deg); }
|
|
50
|
+
.ws-plan-timeline__milestone--done { background: var(--ws-chart-finished); box-shadow: inset 0 0 0 calc(var(--ws-hairline) * 3) var(--color-bg-page); }
|
|
51
|
+
/* Today: its word over the window and one 1 px line down through every row, in the salmon's AA step; under the stuck
|
|
52
|
+
names when the plan scrolls. Leave it out when today is outside the window. */
|
|
53
|
+
.ws-plan-timeline__now { position: absolute; z-index: 1; top: 0; bottom: 0; left: calc(var(--ws-plan-timeline-name) + (100% - var(--ws-plan-timeline-name)) * var(--at) / var(--days)); display: flex; flex-direction: column; align-items: center; font-size: var(--ws-text-micro); line-height: var(--space-lg); font-weight: 600; color: var(--ws-word-needs); transform: translateX(-50%); pointer-events: none; }
|
|
54
|
+
/* On a track that scrolls (a phone) the plan opens on today: the browser scrolls to it once, on load. */
|
|
55
|
+
.ws-plan-timeline__now { scroll-snap-align: center; scroll-initial-target: nearest; }
|
|
56
|
+
.ws-plan-timeline__now > span { padding: 0 var(--space-xxs); background: var(--ws-plan-timeline-ground, var(--color-bg-page)); }
|
|
57
|
+
.ws-plan-timeline__now::after { content: ""; flex: 1; width: var(--ws-line); background: var(--ws-word-needs); }
|
|
58
|
+
/* The names' column over the scale, so a tick scrolled under it hides. */
|
|
59
|
+
.ws-plan-timeline__scale::before { content: ""; position: sticky; z-index: 2; left: 0; flex: 0 0 var(--ws-plan-timeline-name); background: var(--ws-plan-timeline-ground, var(--color-bg-page)); }
|
|
60
|
+
/* The far edge fades while days are hidden past it, lifting at the end; a focused plan drops it (the ring says it scrolls). */
|
|
61
|
+
@supports (animation-timeline: scroll()) {
|
|
62
|
+
.ws-plan-timeline { mask-image: linear-gradient(90deg, currentColor calc(100% - var(--ws-fade-end)), transparent); animation: ws-scroll-edges linear; animation-timeline: scroll(self inline); }
|
|
63
|
+
.ws-plan-timeline:focus-visible { mask-image: none; }
|
|
64
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Components
|
|
2
2
|
|
|
3
|
-
The catalog:
|
|
3
|
+
The catalog: 108 components by gallery group, one line each, plus `Cover`, the gallery's cover card (a preview only, no README, nothing to build with). Each folder holds `README.md` (when to use it, its parts, states and the markup to copy), `preview.html` (the gallery card) and `style.css` (its styles; `bundle.css` and `fello.css` carry them all). Choosing components maps a need to a name; the line here says what each one is. Generated by scripts/build-skill.mjs from each README's first paragraph: edit those, not this file.
|
|
4
4
|
|
|
5
5
|
## Actions
|
|
6
6
|
|
|
7
7
|
- [Button](Button/README.md): The one control for every act on the page: a click that does something, in one of six looks, never a styled `<button>`.
|
|
8
|
-
- [Chip](Chip/README.md): A small fact in a 24 px tag, in one of
|
|
8
|
+
- [Chip](Chip/README.md): A small fact in a 24 px tag, in one of seven tones, a rating tone or the Example mark; its sibling `ChangeChip` says a number went up, down or stayed.
|
|
9
9
|
- [IconButton](IconButton/README.md): A square button holding one icon and nothing else, for an act that needs no words to be understood.
|
|
10
10
|
- [Segmented](Segmented/README.md): Every switch and tab row on the platform: Seth's grey well with a navy current item, one component so the current item always moves the same way.
|
|
11
11
|
|
|
@@ -16,7 +16,7 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
16
16
|
- [Fold](Fold/README.md): The one disclosure: something folded away until wanted, in three looks, built on the browser's native `<details>`.
|
|
17
17
|
- [Morph](Morph/README.md): A thing that changes its place or its size goes there as itself: a card flying to the full screen and back, a figure growing open across its row, the chat moving between its modes. The browser's own view transitions, started by `morph()` from the package, on Seth's curves.
|
|
18
18
|
- [Plate](Plate/README.md): A quiet block set apart inside a card: the cream a shade darker, for a card's facts, a track or an aside.
|
|
19
|
-
- [Skeleton](Skeleton/README.md): A ghost of what is coming, in the shape it will take, with North's shimmer
|
|
19
|
+
- [Skeleton](Skeleton/README.md): A ghost of what is coming, in the shape it will take, with North's shimmer passing over it in one quiet grey, so nothing jumps when the real content lands.
|
|
20
20
|
- [Well](Well/README.md): The system's grey well: a plate holding a short list of pressable rows, for every "what to ask" list.
|
|
21
21
|
|
|
22
22
|
## Charts
|
|
@@ -36,7 +36,7 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
36
36
|
- [StepLine](StepLine/README.md): A bill or a rate over time as a step line against a dotted reference, the gap between them hatched, its moments named.
|
|
37
37
|
- [StreakCalendar](StreakCalendar/README.md): Eight weeks of activity as rows, Monday to Sunday across: a done day a pill, an empty day a hairline cell, today outlined, days to come dashed.
|
|
38
38
|
- [TrendBars](TrendBars/README.md): A trend over days as thin rising bars, with one day called out as the moment that explains the shape.
|
|
39
|
-
- [TrendLine](TrendLine/README.md): A value over periods against an axis, as a line with its dots and the hatched area under it, or as columns that collapse into the line's points and back.
|
|
39
|
+
- [TrendLine](TrendLine/README.md): A value over periods against an axis, as a line with its dots and the hatched area under it, or as columns that collapse into the line's points and back; up to three series in one unit as lines with a key.
|
|
40
40
|
|
|
41
41
|
## Chat
|
|
42
42
|
|
|
@@ -51,13 +51,16 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
51
51
|
## Data
|
|
52
52
|
|
|
53
53
|
- [ActionList](ActionList/README.md): A card's ranked list of next acts: who or what, the reason in words, and the one act at the right of each row. `--brief` is North's "what changed" list on a page's head: one quiet line each, its acts appearing on the line.
|
|
54
|
+
- [Calendar](Calendar/README.md): Things on dates: a month (or a week) of days, Monday first, each day holding its items as rows that open, the steps and the view switch over it, today ringed; in a narrow column the same markup reads as an agenda.
|
|
54
55
|
- [CheckRow](CheckRow/README.md): A rimmed list of checks, each row a name, a strip of ticks for its score, the score, a status and a chevron that opens it; or a list of fixes, each row a box to tick, the fix and its effort, its act, and a chevron that opens it in place. Seth's checks list (301:1728) and Fixes checklist (308:2466).
|
|
55
56
|
- [KanbanBoard](KanbanBoard/README.md): Columns of cards for a pipeline: a stage per column, a card per thing moving through it, a count beside each stage's name. `--fill` makes it a board page: the rest of the page's height, every stage scrolling on its own, the sideways bar on screen.
|
|
56
57
|
- [Leaderboard](Leaderboard/README.md): A list that ranks people against one number: a rank, a face and a name, a thin bar for the score, the score itself, with the person's own row lit so they find themselves at once. Every row shares one grid, so the bars start and end on the same lines and no number is ever cut.
|
|
57
58
|
- [ListDetail](ListDetail/README.md): A list and the thing picked from it, side by side: the list one column wide, the open item two, on one three-column grid. Seth's Review inbox (313:2671) and North's board (a chart and the list that drives it), with Tally's vendors.
|
|
58
59
|
- [Matrix](Matrix/README.md): A grid of yes-or-no answers: one row per question, one column per source, each cell lit when the answer is yes. Seth's answers grid (305:2341): which AI assistants named you, for each of the questions a buyer might ask.
|
|
60
|
+
- [PlanTimeline](PlanTimeline/README.md): A plan's phases and tasks as bars across its dates: a row a phase (its tasks one step in), each bar from its start to its end on one scale, the phase in hand navy, milestones as diamonds and today one line through every row.
|
|
59
61
|
- [SideList](SideList/README.md): Short lists with no card of their own: a few groups down a side column, each with a small head and rows joined by fine lines, an act or a value at the right of each row. Its picker form, `__picks`, sits on a card's surface: rows as soft pills, one of them the current one.
|
|
60
62
|
- [Table](Table/README.md): Rows of records inside one card, read down its columns: a head of muted labels, 40 px rows, a first column that stays while the rest scroll, numbers in fixed right-aligned columns, totals in the foot, columns that fold away by priority and a phone fold. This is the whole wide-table pattern; build every records table from it.
|
|
63
|
+
- [TextDiff](TextDiff/README.md): Two versions of a text side by side in one place: what was removed and what was added, by line or inside the words, told apart by a sign, a strike or an underline as well as by colour.
|
|
61
64
|
- [Timeline](Timeline/README.md): A vertical feed of what happened, grouped by day, a coloured dot on a fine line telling what kind of thing each entry was.
|
|
62
65
|
|
|
63
66
|
## Desk
|
|
@@ -68,7 +71,7 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
68
71
|
## Feedback
|
|
69
72
|
|
|
70
73
|
- [Badge](Badge/README.md): A small count or mark riding on the corner of a face, an icon or a nav row, saying "there is something here" at a glance.
|
|
71
|
-
- [Banner](Banner/README.md): A full-width notice for a state of the whole page or card, in one of
|
|
74
|
+
- [Banner](Banner/README.md): A full-width notice for a state of the whole page or card, in one of five quiet tones, never a loud one.
|
|
72
75
|
- [Popover](Popover/README.md): A small lifted card beside its control, for the time a tooltip is too thin and a dialog is too much.
|
|
73
76
|
- [StatusScreen](StatusScreen/README.md): The whole-page word for something that failed: a page that is not there, a server error, or a connection that is not back yet.
|
|
74
77
|
|
|
@@ -76,8 +79,9 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
76
79
|
|
|
77
80
|
- [Checkbox](Checkbox/README.md): A real native checkbox under a skin, drawn with a navy tick when chosen, its label part of the thing you tap.
|
|
78
81
|
- [Combobox](Combobox/README.md): A searchable field for choosing from a long list, matching as you type and offering to create a new value when nothing matches.
|
|
79
|
-
- [DateInput](DateInput/README.md): A date field that works on its own, with a popover month grid for picking a day by eye instead of typing it.
|
|
82
|
+
- [DateInput](DateInput/README.md): A date field that works on its own, with a popover month grid for picking a day by eye instead of typing it; the same shell holds a time of day, and a date with a time.
|
|
80
83
|
- [FileUpload](FileUpload/README.md): A drop zone for one or more files, with a row per file showing its progress, a tick when it lands, or why it was rejected.
|
|
84
|
+
- [InlineEdit](InlineEdit/README.md): Words that become a field in place: a value read and edited where it sits (a task's title, a brief's section, a milestone's name), the same box and the same type at rest and editing, so nothing jumps.
|
|
81
85
|
- [Input](Input/README.md): A single line of typed text, drawn as a field reads as a field on a cream card: white ground, a fine edge, the mid-blue edge while typing.
|
|
82
86
|
- [NumberInput](NumberInput/README.md): A number field with its figures right-aligned and tabular, an optional unit inside it, and small buttons to step the value.
|
|
83
87
|
- [PasswordInput](PasswordInput/README.md): A password field with a visibility toggle and a strength line, so a person can see what they typed and how strong it is.
|
|
@@ -138,6 +142,7 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
138
142
|
## People
|
|
139
143
|
|
|
140
144
|
- [Avatar](Avatar/README.md): A person's own mark: their photo once it loads, or their initials in navy on a neutral disc before and instead; never coloured, never an app's face.
|
|
145
|
+
- [CommentThread](CommentThread/README.md): People commenting on a thing: remarks anchored to a piece of content, with replies, @mentions, an open or resolved state with a count, and a small composer.
|
|
141
146
|
|
|
142
147
|
## Progress
|
|
143
148
|
|
|
@@ -146,6 +151,6 @@ The catalog: 103 components by gallery group, one line each, plus `Cover`, the g
|
|
|
146
151
|
- [PaceBar](PaceBar/README.md): Progress toward a goal on a 14 px track, with a dot where it should be by now. North's bar, used in tiles, lanes and lists.
|
|
147
152
|
- [Ring](Ring/README.md): A circle's own share as one arc, or Seth's split ring: 96 radial ticks in each part's tone, the total in the hole, a key beside.
|
|
148
153
|
- [SegmentedProgress](SegmentedProgress/README.md): Progress split by area and by step: Seth's "1 of 6" figure, a line under it, and one bar of segments with each area named.
|
|
149
|
-
- [Stepper](Stepper/README.md): Ordered steps on a line that fills: done is a tick, the one in hand is ringed, the rest wait their turn.
|
|
154
|
+
- [Stepper](Stepper/README.md): Ordered steps on a line that fills: done is a tick, the one in hand is ringed, the rest wait their turn. Down the page by default; `--across` lays the stages left to right; `--milestones` makes them dated points on one row.
|
|
150
155
|
- [TickRow](TickRow/README.md): One row of fixed-size ticks for a count out of a small whole: the done ticks in one tone, or each its stretch of the gradient.
|
|
151
156
|
- [TickStrip](TickStrip/README.md): A share drawn as equal ticks across the whole width: the done ones in one tone, the rest the plain track. Seth's score strips.
|
|
@@ -41,8 +41,8 @@ A report's score the way Seth draws it: the 96 px figure, a strip of ticks acros
|
|
|
41
41
|
once the draw is half way. The figure does not count up (North: headline figures are static).
|
|
42
42
|
- Not checked: an en dash in muted words in place of the figure (`__figure--none`, with `aria-hidden`; the section's
|
|
43
43
|
label says "not checked"), every tick the track, "Could not check" and why.
|
|
44
|
-
- Loading: a ghost the figure's height, the strip as a ghost (`--loading`) and a ghost line, all
|
|
45
|
-
|
|
44
|
+
- Loading: a ghost the figure's height, the strip as a ghost (`--loading`) and a ghost line, all under the shimmer;
|
|
45
|
+
`aria-busy="true"` on the section.
|
|
46
46
|
- Long sentence: wraps as running text under the rating; the figure never wraps.
|
|
47
47
|
- Reduced motion: no draw, no settle; the ghosts stay still.
|
|
48
48
|
- Hover, focus, pressed: do not apply; it is read, not pressed.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
.ws-score-hero--needs-work { --tone-word: var(--ws-word-needs-work); }
|
|
20
20
|
.ws-score-hero--needs-work .ws-tick-strip { --tone: var(--ws-rating-needs-work); }
|
|
21
21
|
.ws-score-hero--none { --tone-word: var(--color-text-muted); }
|
|
22
|
-
/* Loading: ghost blocks the size of what they stand for
|
|
22
|
+
/* Loading: ghost blocks the size of what they stand for under the shimmer. */
|
|
23
23
|
.ws-score-hero__ghost { width: calc(var(--space-6xl) * 2); max-width: 100%; height: var(--ws-leading-score); }
|
|
24
24
|
.ws-score-hero__ghost--line { width: min(100%, calc(var(--space-9xl) * 2)); height: var(--ws-leading-section); }
|
|
25
25
|
@container (max-width: 26rem) {
|
|
@@ -28,7 +28,7 @@ Where a whole goes: one stacked bar of parts in their tones over what stays, a h
|
|
|
28
28
|
- Draw (`--draw`): each part grows from its left edge in turn, 70 ms apart (`--ws-stagger-part`), over 700 ms on the
|
|
29
29
|
settle curve. Set `--i` on each part.
|
|
30
30
|
- Nothing moves: the bar is all ground; the key says what stays.
|
|
31
|
-
- Loading (`--loading`): the bar as a ghost
|
|
31
|
+
- Loading (`--loading`): the bar as a ghost under the shimmer.
|
|
32
32
|
- Narrow: the head and the key wrap; the bar keeps its parts in proportion.
|
|
33
33
|
- Reduced motion: the parts in place, the ghost still.
|
|
34
34
|
- Hover, focus: none; the key carries the words.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
.ws-share-bar__item::before { content: ""; position: absolute; inset-inline-start: 0; top: calc((var(--space-md) - var(--space-xs)) / 2); width: var(--space-xs); height: var(--space-xs); border-radius: var(--ws-radius-chip); background: var(--tone, var(--ws-chart-rest)); }
|
|
17
17
|
/* Seth's key is one tone: the figure keeps the words' weight and colour, only its numerals are tabular. */
|
|
18
18
|
.ws-share-bar__item b { font-weight: inherit; color: inherit; font-variant-numeric: tabular-nums; }
|
|
19
|
-
/* Loading: the bar as a ghost
|
|
19
|
+
/* Loading: the bar as a ghost under the shimmer, the key held back. */
|
|
20
20
|
.ws-share-bar--loading .ws-share-bar__bar { background: var(--ws-shimmer); background-size: 300% 100%; }
|
|
21
21
|
@media (prefers-reduced-motion: no-preference) {
|
|
22
22
|
.ws-share-bar--loading .ws-share-bar__bar { animation: ws-shimmer var(--ws-loop-shimmer) var(--ws-ease-shimmer) infinite; }
|