division-ds 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/package.json +1 -1
- package/public/docs/components/sidebar.md +40 -1
- package/public/manifest/components.json +14 -2
- package/public/manifest/tokens.json +39 -41
package/AGENTS.md
CHANGED
|
@@ -51,7 +51,7 @@ installs these rules into that project's `AGENTS.md`, `GEMINI.md` and Cursor rul
|
|
|
51
51
|
`.claude/skills/` (Claude Code).
|
|
52
52
|
|
|
53
53
|
An agent that supports MCP can have the docs and the same checks as tools instead:
|
|
54
|
-
`claude mcp add division-ds -- npx -y division-ds@0.
|
|
54
|
+
`claude mcp add division-ds -- npx -y division-ds@0.5.0 mcp` (`list_components`, `get_component`,
|
|
55
55
|
`search`, `get_tokens`, `validate_code`, `check_contrast`, `get_add_command`,
|
|
56
56
|
`get_review_checklist`).
|
|
57
57
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "division-ds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Checks a project that uses Division DS components (raw colours, invented tokens, touching buttons, unknown props), and serves the docs and the same checks to agents over MCP.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Victor Ilioiu",
|
|
@@ -20,7 +20,7 @@ Paths are from the Division DS repository root. Installed with shadcn they start
|
|
|
20
20
|
| Prop | Type | Default | Description |
|
|
21
21
|
|---|---|---|---|
|
|
22
22
|
| `label` | `string` | | Required. The name screen readers give the navigation region. |
|
|
23
|
-
| `groups` | `SidebarGroup[]` | | Required. Each group has title, icon, items, collapsible and defaultOpen. |
|
|
23
|
+
| `groups` | `SidebarGroup[]` | | Required. Each group has title, icon, items, collapsible and defaultOpen, and optionally action (a small icon button at the right end of the title row, beside the fold toggle, never inside it) and footer (under the items, lined up with them, hidden while the group is folded). |
|
|
24
24
|
| `header` | `ReactNode` | | Sits above the groups: a product name, a workspace switcher. |
|
|
25
25
|
| `footer` | `ReactNode` | | Pinned below the groups when the Sidebar has a height (h-full in a column layout): the signed-in account, a help link. |
|
|
26
26
|
| `renderLink` | `(props: LinkRenderProps) => ReactNode` | `a plain anchor` | Pass your router's link component here. Map href to its own prop, and pass className, aria-current and onClick through. |
|
|
@@ -54,6 +54,13 @@ export type SidebarGroup = {
|
|
|
54
54
|
collapsible?: boolean
|
|
55
55
|
/** Ignored when the group holds the current item, which always starts open. @default true */
|
|
56
56
|
defaultOpen?: boolean
|
|
57
|
+
/** Drawn at the far right of the title row: a small icon button, e.g. a ghost size="sm" Button
|
|
58
|
+
* with a Plus icon and aria-label="New project". It sits beside the fold toggle, never inside it,
|
|
59
|
+
* so pressing it does not open or close the group. The title truncates before it is pushed out. */
|
|
60
|
+
action?: ReactNode
|
|
61
|
+
/** Drawn under the items, inside the group, lined up with the items' left edge and padding: an
|
|
62
|
+
* "Add project" button. Hidden (and unreachable by Tab) while the group is folded. */
|
|
63
|
+
footer?: ReactNode
|
|
57
64
|
}
|
|
58
65
|
```
|
|
59
66
|
|
|
@@ -104,6 +111,36 @@ const FOOTER = <p className="text-xs text-[var(--color-text-secondary)]">Signed
|
|
|
104
111
|
</div>
|
|
105
112
|
```
|
|
106
113
|
|
|
114
|
+
### A Projects group with an action in its title row and a footer under its items
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
const PROJECT_GROUPS: SidebarGroup[] = [
|
|
118
|
+
{
|
|
119
|
+
title: 'Projects',
|
|
120
|
+
icon: <FolderKanban />,
|
|
121
|
+
action: (
|
|
122
|
+
<IconButton label="New project" variant="ghost" size="sm">
|
|
123
|
+
<Plus aria-hidden="true" />
|
|
124
|
+
</IconButton>
|
|
125
|
+
),
|
|
126
|
+
items: [
|
|
127
|
+
{ label: 'Spring restock', href: '#spring-restock', icon: <Folder /> },
|
|
128
|
+
{ label: 'Warehouse move', href: '#warehouse-move', icon: <Folder /> },
|
|
129
|
+
],
|
|
130
|
+
footer: (
|
|
131
|
+
<Button variant="ghost" size="sm">
|
|
132
|
+
<Plus aria-hidden="true" />
|
|
133
|
+
New project
|
|
134
|
+
</Button>
|
|
135
|
+
),
|
|
136
|
+
},
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
<div className="max-w-64">
|
|
140
|
+
<Sidebar label="Projects navigation" groups={PROJECT_GROUPS} />
|
|
141
|
+
</div>
|
|
142
|
+
```
|
|
143
|
+
|
|
107
144
|
### In a sheet on a narrow screen: picking a link closes the sheet, through renderLink
|
|
108
145
|
|
|
109
146
|
```tsx
|
|
@@ -189,5 +226,7 @@ const closeOnChoose = ({ onClick, ...props }: LinkRenderProps) => (
|
|
|
189
226
|
- **nav**: The navigation region. Screen readers call it by the label prop.
|
|
190
227
|
- **Group title**: A disclosure button (one that shows and hides the list) when the group can fold, plain text when it can't. It's text.secondary, so it still reads on a raised panel. Its list opens and closes by animating its height. Opening also fades and slides each item in, each one a little later than the one before (capped, so a long group never feels slow). Closing fades everything out together, all at once. If someone has asked their system for less motion (prefers-reduced-motion: reduce), both happen instantly.
|
|
191
228
|
- **Item**: An icon, a label and an optional count. The current page gets the fill, plus aria-current, an ARIA attribute (Accessible Rich Internet Applications, the labels screen readers rely on) that tells screen readers this is the page you are on.
|
|
229
|
+
- **Group action**: Optional. A small icon button at the right end of the title row, such as New project. It sits next to the fold toggle, not inside it, so pressing it never folds the group. A long title is cut short before it can push the action out.
|
|
230
|
+
- **Group footer**: Optional. Under the group's items and lined up with them: an Add project button. It folds away with the items.
|
|
192
231
|
- **Header**: Sits above the groups: a product name, a workspace switcher.
|
|
193
232
|
- **Footer**: Pinned below the groups: the signed-in account, a help link.
|
|
@@ -11935,7 +11935,7 @@
|
|
|
11935
11935
|
{
|
|
11936
11936
|
"name": "groups",
|
|
11937
11937
|
"type": "SidebarGroup[]",
|
|
11938
|
-
"description": "Required. Each group has title, icon, items, collapsible and defaultOpen."
|
|
11938
|
+
"description": "Required. Each group has title, icon, items, collapsible and defaultOpen, and optionally action (a small icon button at the right end of the title row, beside the fold toggle, never inside it) and footer (under the items, lined up with them, hidden while the group is folded)."
|
|
11939
11939
|
},
|
|
11940
11940
|
{
|
|
11941
11941
|
"name": "header",
|
|
@@ -11974,7 +11974,7 @@
|
|
|
11974
11974
|
{
|
|
11975
11975
|
"name": "SidebarGroup",
|
|
11976
11976
|
"kind": "type",
|
|
11977
|
-
"code": "export type SidebarGroup = {\n /** Also the React key for this group; unique within a Sidebar. */\n title: string\n /** Drawn before the title, aria-hidden; the title alone names the group. */\n icon?: ReactNode\n items: SidebarItem[]\n /** @default true */\n collapsible?: boolean\n /** Ignored when the group holds the current item, which always starts open. @default true */\n defaultOpen?: boolean\n}",
|
|
11977
|
+
"code": "export type SidebarGroup = {\n /** Also the React key for this group; unique within a Sidebar. */\n title: string\n /** Drawn before the title, aria-hidden; the title alone names the group. */\n icon?: ReactNode\n items: SidebarItem[]\n /** @default true */\n collapsible?: boolean\n /** Ignored when the group holds the current item, which always starts open. @default true */\n defaultOpen?: boolean\n /** Drawn at the far right of the title row: a small icon button, e.g. a ghost size=\"sm\" Button\n * with a Plus icon and aria-label=\"New project\". It sits beside the fold toggle, never inside it,\n * so pressing it does not open or close the group. The title truncates before it is pushed out. */\n action?: ReactNode\n /** Drawn under the items, inside the group, lined up with the items' left edge and padding: an\n * \"Add project\" button. Hidden (and unreachable by Tab) while the group is folded. */\n footer?: ReactNode\n}",
|
|
11978
11978
|
"from": "src/components/organisms/sidebar/Sidebar"
|
|
11979
11979
|
}
|
|
11980
11980
|
],
|
|
@@ -12021,6 +12021,14 @@
|
|
|
12021
12021
|
"part": "Item",
|
|
12022
12022
|
"description": "An icon, a label and an optional count. The current page gets the fill, plus aria-current, an ARIA attribute (Accessible Rich Internet Applications, the labels screen readers rely on) that tells screen readers this is the page you are on."
|
|
12023
12023
|
},
|
|
12024
|
+
{
|
|
12025
|
+
"part": "Group action",
|
|
12026
|
+
"description": "Optional. A small icon button at the right end of the title row, such as New project. It sits next to the fold toggle, not inside it, so pressing it never folds the group. A long title is cut short before it can push the action out."
|
|
12027
|
+
},
|
|
12028
|
+
{
|
|
12029
|
+
"part": "Group footer",
|
|
12030
|
+
"description": "Optional. Under the group's items and lined up with them: an Add project button. It folds away with the items."
|
|
12031
|
+
},
|
|
12024
12032
|
{
|
|
12025
12033
|
"part": "Header",
|
|
12026
12034
|
"description": "Sits above the groups: a product name, a workspace switcher."
|
|
@@ -12035,6 +12043,10 @@
|
|
|
12035
12043
|
"caption": "Dashboard navigation",
|
|
12036
12044
|
"source": "const GROUPS: SidebarGroup[] = [\n {\n title: 'Operations',\n icon: <Warehouse />,\n items: [\n { label: 'Overview', href: '#overview', icon: <LayoutDashboard /> },\n { label: 'Orders', href: '#orders', icon: <Package />, current: true, count: 12 },\n { label: 'Shipments', href: '#shipments', icon: <Truck /> },\n { label: 'Returns', href: '#returns', icon: <Inbox />, count: 3 },\n ],\n },\n {\n title: 'Catalogue',\n icon: <Boxes />,\n defaultOpen: false,\n items: [\n { label: 'Products', href: '#products', icon: <Box /> },\n { label: 'Inventory', href: '#inventory', icon: <Map /> },\n ],\n },\n {\n title: 'Account',\n icon: <UserCog />,\n collapsible: false,\n items: [\n { label: 'Settings', href: '#settings', icon: <Settings /> },\n { label: 'Team', href: '#team', icon: <Users /> },\n ],\n },\n]\n\nconst HEADER = <p className=\"font-display font-semibold\">Hexline ops</p>\n\nconst FOOTER = <p className=\"text-xs text-[var(--color-text-secondary)]\">Signed in as Ana Pop</p>\n\n<div className=\"max-w-64\">\n <Sidebar label=\"Dashboard navigation\" groups={GROUPS} header={HEADER} footer={FOOTER} />\n</div>"
|
|
12037
12045
|
},
|
|
12046
|
+
{
|
|
12047
|
+
"caption": "A Projects group with an action in its title row and a footer under its items",
|
|
12048
|
+
"source": "const PROJECT_GROUPS: SidebarGroup[] = [\n {\n title: 'Projects',\n icon: <FolderKanban />,\n action: (\n <IconButton label=\"New project\" variant=\"ghost\" size=\"sm\">\n <Plus aria-hidden=\"true\" />\n </IconButton>\n ),\n items: [\n { label: 'Spring restock', href: '#spring-restock', icon: <Folder /> },\n { label: 'Warehouse move', href: '#warehouse-move', icon: <Folder /> },\n ],\n footer: (\n <Button variant=\"ghost\" size=\"sm\">\n <Plus aria-hidden=\"true\" />\n New project\n </Button>\n ),\n },\n]\n\n<div className=\"max-w-64\">\n <Sidebar label=\"Projects navigation\" groups={PROJECT_GROUPS} />\n</div>"
|
|
12049
|
+
},
|
|
12038
12050
|
{
|
|
12039
12051
|
"caption": "In a sheet on a narrow screen: picking a link closes the sheet, through renderLink",
|
|
12040
12052
|
"source": "const GROUPS: SidebarGroup[] = [\n {\n title: 'Operations',\n icon: <Warehouse />,\n items: [\n { label: 'Overview', href: '#overview', icon: <LayoutDashboard /> },\n { label: 'Orders', href: '#orders', icon: <Package />, current: true, count: 12 },\n { label: 'Shipments', href: '#shipments', icon: <Truck /> },\n { label: 'Returns', href: '#returns', icon: <Inbox />, count: 3 },\n ],\n },\n {\n title: 'Catalogue',\n icon: <Boxes />,\n defaultOpen: false,\n items: [\n { label: 'Products', href: '#products', icon: <Box /> },\n { label: 'Inventory', href: '#inventory', icon: <Map /> },\n ],\n },\n {\n title: 'Account',\n icon: <UserCog />,\n collapsible: false,\n items: [\n { label: 'Settings', href: '#settings', icon: <Settings /> },\n { label: 'Team', href: '#team', icon: <Users /> },\n ],\n },\n]\n\nconst HEADER = <p className=\"font-display font-semibold\">Hexline ops</p>\n\nconst FOOTER = <p className=\"text-xs text-[var(--color-text-secondary)]\">Signed in as Ana Pop</p>\n\nconst closeOnChoose = ({ onClick, ...props }: LinkRenderProps) => (\n <SheetClose asChild type={undefined}>\n <a {...props} onClick={onClick} />\n </SheetClose>\n)\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"secondary\">Open navigation</Button>\n </SheetTrigger>\n <SheetContent side=\"left\" title=\"Navigation\">\n <Sidebar\n label=\"Dashboard navigation, in a sheet\"\n groups={GROUPS}\n header={HEADER}\n footer={FOOTER}\n renderLink={closeOnChoose}\n />\n </SheetContent>\n</Sheet>"
|
|
@@ -5,57 +5,57 @@
|
|
|
5
5
|
{
|
|
6
6
|
"name": "--color-signal-50",
|
|
7
7
|
"layer": "primitive",
|
|
8
|
-
"value": "#
|
|
8
|
+
"value": "#fff4f0"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"name": "--color-signal-100",
|
|
12
12
|
"layer": "primitive",
|
|
13
|
-
"value": "#
|
|
13
|
+
"value": "#ffccb8"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"name": "--color-signal-200",
|
|
17
17
|
"layer": "primitive",
|
|
18
|
-
"value": "#
|
|
18
|
+
"value": "#ffa581"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"name": "--color-signal-300",
|
|
22
22
|
"layer": "primitive",
|
|
23
|
-
"value": "#
|
|
23
|
+
"value": "#ff7d49"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"name": "--color-signal-400",
|
|
27
27
|
"layer": "primitive",
|
|
28
|
-
"value": "#
|
|
28
|
+
"value": "#ff5512"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"name": "--color-signal-500",
|
|
32
32
|
"layer": "primitive",
|
|
33
|
-
"value": "#
|
|
33
|
+
"value": "#d93e00"
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"name": "--color-signal-600",
|
|
37
37
|
"layer": "primitive",
|
|
38
|
-
"value": "#
|
|
38
|
+
"value": "#b13200"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"name": "--color-signal-700",
|
|
42
42
|
"layer": "primitive",
|
|
43
|
-
"value": "#
|
|
43
|
+
"value": "#882700"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"name": "--color-signal-800",
|
|
47
47
|
"layer": "primitive",
|
|
48
|
-
"value": "#
|
|
48
|
+
"value": "#601b00"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"name": "--color-signal-900",
|
|
52
52
|
"layer": "primitive",
|
|
53
|
-
"value": "#
|
|
53
|
+
"value": "#381000"
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"name": "--color-signal-950",
|
|
57
57
|
"layer": "primitive",
|
|
58
|
-
"value": "#
|
|
58
|
+
"value": "#0f0400"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"name": "--color-hostile-50",
|
|
@@ -566,7 +566,7 @@
|
|
|
566
566
|
{
|
|
567
567
|
"name": "--color-accent-signal-fill",
|
|
568
568
|
"layer": "semantic",
|
|
569
|
-
"value": "#
|
|
569
|
+
"value": "#d93e00",
|
|
570
570
|
"use": "A solid block in the brand colour, exactly as chosen: the primary Button, IconButton, a solid signal Badge. Put accent.signal.ink on it, never text.primary. Never use it as the only sign of a state; use accent.signal.indicator.",
|
|
571
571
|
"measured": {
|
|
572
572
|
"dark": "The brand colour, exactly as chosen: Button, IconButton and solid Badge backgrounds, and brand decoration. Text on it is accent.signal.ink. Never the only sign of a state; that is accent.signal.indicator. The theme builder never moves it.",
|
|
@@ -577,61 +577,61 @@
|
|
|
577
577
|
"name": "--color-accent-signal-text",
|
|
578
578
|
"layer": "semantic",
|
|
579
579
|
"value": {
|
|
580
|
-
"dark": "#
|
|
581
|
-
"light": "#
|
|
580
|
+
"dark": "#ff5512",
|
|
581
|
+
"light": "#b13200"
|
|
582
582
|
},
|
|
583
583
|
"use": "Orange text or icon on a surface: a current nav item, an emphasised figure, a link accent.",
|
|
584
584
|
"measured": {
|
|
585
|
-
"dark": "
|
|
586
|
-
"light": "
|
|
585
|
+
"dark": "6.26:1 on surface.base. A step lighter than the brand fill, which reaches 4.42:1 on the dark page, under the 4.5:1 text needs.",
|
|
586
|
+
"light": "5.73:1 on surface.base. A step darker than dark theme's 400; the brand fill itself reaches only 4.11:1 on the light page, under the 4.5:1 text needs."
|
|
587
587
|
}
|
|
588
588
|
},
|
|
589
589
|
{
|
|
590
590
|
"name": "--color-accent-signal-ink",
|
|
591
591
|
"layer": "semantic",
|
|
592
|
-
"value": "#
|
|
592
|
+
"value": "#ffffff",
|
|
593
593
|
"use": "Text and icons on accent.signal.fill.",
|
|
594
594
|
"measured": {
|
|
595
|
-
"dark": "
|
|
596
|
-
"light": "
|
|
595
|
+
"dark": "White, 4.53:1 on accent.signal.fill",
|
|
596
|
+
"light": "White, 4.53:1 on accent.signal.fill"
|
|
597
597
|
}
|
|
598
598
|
},
|
|
599
599
|
{
|
|
600
600
|
"name": "--color-accent-signal-indicator",
|
|
601
601
|
"layer": "semantic",
|
|
602
|
-
"value": "#
|
|
602
|
+
"value": "#d93e00",
|
|
603
603
|
"use": "The accent where colour alone shows a state or value: a checked control, Switch on, Progress, Slider, Rating stars, the current item in Sidebar, Navbar, Tabs, SegmentedControl, Stepper and highlighted menu rows. Put accent.signal.indicator-ink on it.",
|
|
604
604
|
"measured": {
|
|
605
|
-
"dark": "The accent where colour alone marks a state or a value: checked controls, Switch on, Progress, Slider, Rating stars, the current item of Sidebar, Navbar, Tabs, SegmentedControl, Stepper and highlighted menu rows, and the hero numerals.
|
|
606
|
-
"light": "The accent where colour alone marks a state or a value: checked controls, Switch on, Progress, Slider, Rating stars, the current item of Sidebar, Navbar, Tabs, SegmentedControl, Stepper and highlighted menu rows, and the hero numerals.
|
|
605
|
+
"dark": "The accent where colour alone marks a state or a value: checked controls, Switch on, Progress, Slider, Rating stars, the current item of Sidebar, Navbar, Tabs, SegmentedControl, Stepper and highlighted menu rows, and the hero numerals. 4.42:1 on surface.base. Same stop as accent.signal.fill here; the theme builder moves it to a nearby stop when a chosen accent is too pale or too dark to reach 3:1, and leaves accent.signal.fill alone.",
|
|
606
|
+
"light": "The accent where colour alone marks a state or a value: checked controls, Switch on, Progress, Slider, Rating stars, the current item of Sidebar, Navbar, Tabs, SegmentedControl, Stepper and highlighted menu rows, and the hero numerals. 4.11:1 on surface.base. Same stop as accent.signal.fill here; the theme builder moves it to a nearby stop when a chosen accent is too pale or too dark to reach 3:1, and leaves accent.signal.fill alone."
|
|
607
607
|
}
|
|
608
608
|
},
|
|
609
609
|
{
|
|
610
610
|
"name": "--color-accent-signal-indicator-ink",
|
|
611
611
|
"layer": "semantic",
|
|
612
|
-
"value": "#
|
|
612
|
+
"value": "#ffffff",
|
|
613
613
|
"use": "Text and icons on accent.signal.indicator.",
|
|
614
614
|
"measured": {
|
|
615
|
-
"dark": "Text and icons on accent.signal.indicator
|
|
616
|
-
"light": "Text and icons on accent.signal.indicator
|
|
615
|
+
"dark": "Text and icons on accent.signal.indicator: white, 4.53:1. The theme builder picks white or a dark ink, whichever reaches 4.5:1.",
|
|
616
|
+
"light": "Text and icons on accent.signal.indicator: white, 4.53:1. The theme builder picks white or a dark ink, whichever reaches 4.5:1."
|
|
617
617
|
}
|
|
618
618
|
},
|
|
619
619
|
{
|
|
620
620
|
"name": "--color-accent-signal-wash",
|
|
621
621
|
"layer": "semantic",
|
|
622
|
-
"value": "rgba(
|
|
622
|
+
"value": "rgba(217, 62, 0, 0.12)",
|
|
623
623
|
"use": "The faint orange hover wash under a nav item or an inactive tab.",
|
|
624
624
|
"measured": {
|
|
625
|
-
"dark": "Hover wash under a nav item or an inactive tab. Text on it is text.primary and gated.
|
|
626
|
-
"light": "Hover wash under a nav item or an inactive tab. Text on it is text.primary and gated.
|
|
625
|
+
"dark": "Hover wash under a nav item or an inactive tab. Text on it is text.primary and gated. Neither a checked control's fill nor the focus ring is gated on it, so neither is ever drawn on it.",
|
|
626
|
+
"light": "Hover wash under a nav item or an inactive tab. Text on it is text.primary and gated. Neither a checked control's indicator nor the focus ring is gated on it, so neither is ever drawn on it."
|
|
627
627
|
}
|
|
628
628
|
},
|
|
629
629
|
{
|
|
630
630
|
"name": "--color-accent-signal-glow",
|
|
631
631
|
"layer": "semantic",
|
|
632
632
|
"value": {
|
|
633
|
-
"dark": "rgba(
|
|
634
|
-
"light": "rgba(
|
|
633
|
+
"dark": "rgba(217, 62, 0, 0.38)",
|
|
634
|
+
"light": "rgba(217, 62, 0, 0.3)"
|
|
635
635
|
},
|
|
636
636
|
"use": "The faint shadow of an interactive Card on hover and focus. Used by the Card component only.",
|
|
637
637
|
"measured": {
|
|
@@ -655,7 +655,7 @@
|
|
|
655
655
|
"use": "Error and destructive text or icon on a surface: field errors, an invalid border, a failed status.",
|
|
656
656
|
"measured": {
|
|
657
657
|
"dark": "6.23:1 on surface.base, 5.42:1 on surface.raised, 4.80:1 on raised nested in raised, 5.92:1 on surface.sunken. hostile.500 measured 4.48:1 on surface.raised, under 4.5:1.",
|
|
658
|
-
"light": "
|
|
658
|
+
"light": "5.73:1 on surface.base. A step darker than dark theme's 400; the brand fill itself reaches only 4.11:1 on the light page, under the 4.5:1 text needs."
|
|
659
659
|
}
|
|
660
660
|
},
|
|
661
661
|
{
|
|
@@ -765,7 +765,7 @@
|
|
|
765
765
|
"use": "The dimmed leading zeros of a hero numeral. Decorative; never text that has to be read.",
|
|
766
766
|
"measured": {
|
|
767
767
|
"dark": "The dimmed leading-zero pad on a hero numeral (Overview, Progress readout, docs section index). Decorative and aria-hidden: it is a column width, never a value, so no SC 1.4.3 obligation attaches to it. 5.35:1 on surface.base, which is 31% of text.primary's 17.17:1 there -- that share, not the absolute ratio, is what makes it read as padding rather than as a digit. Holds the same value text.muted holds in this theme and is deliberately NOT an alias of it: text.muted is real secondary text with an AA floor, and the two move for different reasons.",
|
|
768
|
-
"light": "The dimmed leading-zero pad. 3.82:1 on surface.base, 22% of text.primary's 17.55:1 there, against the dark theme's 31%. Light theme needs a LIGHTER step than text.muted for the same role: muted aliases neutral.500 and measures 11.44:1 here, 65% of ink, which does not read as dimmed and out-shouts the signal.fill numeral it is padding (
|
|
768
|
+
"light": "The dimmed leading-zero pad. 3.82:1 on surface.base, 22% of text.primary's 17.55:1 there, against the dark theme's 31%. Light theme needs a LIGHTER step than text.muted for the same role: muted aliases neutral.500 and measures 11.44:1 here, 65% of ink, which does not read as dimmed and out-shouts the signal.fill numeral it is padding (4.11:1 on this surface). neutral.400 would land at 6.58:1 and 38% of ink, closer to dark's share but more than twice the contrast of the digits beside it, so neutral.300 is the step that keeps the pad quieter than what it pads."
|
|
769
769
|
}
|
|
770
770
|
},
|
|
771
771
|
{
|
|
@@ -811,25 +811,23 @@
|
|
|
811
811
|
"name": "--color-focus-ring",
|
|
812
812
|
"layer": "semantic",
|
|
813
813
|
"value": {
|
|
814
|
-
"dark": "#
|
|
815
|
-
"light": "#
|
|
814
|
+
"dark": "#ff5512",
|
|
815
|
+
"light": "#d93e00"
|
|
816
816
|
},
|
|
817
817
|
"use": "The keyboard focus outline. Use it only in focus-visible:outline-[var(--color-focus-ring)], with a 2px outline and a 2px offset.",
|
|
818
818
|
"measured": {
|
|
819
|
-
"
|
|
819
|
+
"dark": "6.26:1 on surface.base. A step lighter than accent.signal.fill, which reaches 3.41:1 on nested panels: the ring is the one mark every keyboard user depends on, so it gets a margin.",
|
|
820
|
+
"light": "4.11:1 on surface.base. The brand colour itself: it clears 3:1 on every light surface, so the ring no longer needs a step of its own."
|
|
820
821
|
}
|
|
821
822
|
},
|
|
822
823
|
{
|
|
823
824
|
"name": "--color-chart-series-1",
|
|
824
825
|
"layer": "semantic",
|
|
825
|
-
"value":
|
|
826
|
-
"dark": "#f2550f",
|
|
827
|
-
"light": "#c6440b"
|
|
828
|
-
},
|
|
826
|
+
"value": "#d93e00",
|
|
829
827
|
"use": "The first data series in a chart. A graphic colour, never text. ChartPanel applies it.",
|
|
830
828
|
"measured": {
|
|
831
|
-
"dark": "First chart series: a line, a bar, a legend swatch. A graphic, 3:1:
|
|
832
|
-
"light": "First chart series: a line, a bar, a legend swatch. A graphic, 3:1: 4.
|
|
829
|
+
"dark": "First chart series: a line, a bar, a legend swatch. A graphic, 3:1: 4.42:1 on surface.base, 3.85:1 on surface.raised, 3.41:1 nested. Never text.",
|
|
830
|
+
"light": "First chart series: a line, a bar, a legend swatch. A graphic, 3:1: 4.11:1 on surface.base, 4.37:1 on surface.raised, 4.45:1 nested. Never text."
|
|
833
831
|
}
|
|
834
832
|
},
|
|
835
833
|
{
|