agentic-ds-kit 0.2.1 → 0.2.2

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/README.md CHANGED
@@ -35,3 +35,13 @@ Contracts live in the package: `agentic-ds-kit/contracts/index.json`. Copy `AGEN
35
35
  ```bash
36
36
  npm run generate:tokens -w agentic-ds-kit
37
37
  ```
38
+
39
+ Components consume **semantic** variables (`--surface-page`, `--action-primary`, `--radius-control-md`). Primitive `--color-*` ramps are the source scale only.
40
+
41
+ ## Theming
42
+
43
+ Override semantic tokens in your CSS after tokens load. Do not rewrite component classes.
44
+
45
+ - Light is `:root`. Dark is `[data-theme="dark"]` on `html` (not a `.dark` class).
46
+ - Brand overlays: omit `data-color` for blue, or set `data-color="violet"` / `data-color="teal"`.
47
+ - For another hue, reassign brand, action, and focus roles to primitive ramps — not hex in React.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "scoreboard",
3
3
  "status": "stable",
4
- "intent": "Metrics strip of kit Scorecards. Two to four fill the row. More than four compose Carousel.",
4
+ "intent": "Metrics strip of kit Scorecards. Two to four fill the row; four stay in one row until the strip narrows. More than four compose Carousel.",
5
5
  "useWhen": [
6
6
  "Showing two or more KPIs side by side at the top of a dashboard",
7
7
  "Replacing ad-hoc flex rows of metric boxes"
@@ -20,7 +20,7 @@
20
20
  "itemContract": "scorecard",
21
21
  "required": true,
22
22
  "minItems": 2,
23
- "note": "2\u20134 fill equal columns. More than 4 pages four-up in kit Carousel."
23
+ "note": "2\u20134 fill equal columns. Four stay four-up until the strip narrows. More than 4 pages four-up in kit Carousel."
24
24
  }
25
25
  },
26
26
  "tokens": [
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "id": "section",
3
3
  "status": "stable",
4
- "intent": "Grouped page block with optional heading, description, and actions. Collapsible, chevron before the title.",
4
+ "intent": "Grouped page block with optional heading, description, and actions on one surface. Pass collapsible false to keep the body always open.",
5
5
  "useWhen": [
6
6
  "Separating metrics, tables, or form groups on a page",
7
7
  "Under PageHeader to structure dashboard or settings content"
8
8
  ],
9
9
  "doNotUseWhen": [
10
10
  "Whole page title \u2014 use PageHeader",
11
- "Framed tiles \u2014 use Card",
11
+ "Compact tiles with image or footer \u2014 use Card",
12
12
  "Form legends and grouped fields \u2014 use FieldSet",
13
13
  "Modal body layout \u2014 keep content minimal inside Modal",
14
14
  "App-wide navigation \u2014 use AppNav",
@@ -45,7 +45,7 @@
45
45
  "collapsible": {
46
46
  "type": "boolean",
47
47
  "default": true,
48
- "note": "When title is set, a chevron sits before the title and toggles the body. False keeps the body always open."
48
+ "note": "Default true: chevron before the title toggles the body. False is always open, no chevron. Requires title."
49
49
  },
50
50
  "defaultOpen": {
51
51
  "type": "boolean",
@@ -63,6 +63,10 @@
63
63
  }
64
64
  },
65
65
  "tokens": [
66
+ "surface.card",
67
+ "border.faint",
68
+ "radius.surface.md",
69
+ "shadow.sm",
66
70
  "text.primary",
67
71
  "text.secondary",
68
72
  "type.size.heading",
@@ -86,12 +90,12 @@
86
90
  "doNot": [
87
91
  "Do not invent a local Section or SectionHeader",
88
92
  "Do not use raw hex",
89
- "Do not frame Section \u2014 that is Card",
93
+ "Do not use Section as a compact marketing tile \u2014 that is Card",
90
94
  "Do not use Section as the page title \u2014 that is PageHeader",
91
95
  "Do not embed one-off metric flex rows \u2014 use Scoreboard",
92
96
  "Actions must be kit Buttons",
93
97
  "Do not compose Accordion or Collapsible for page sections \u2014 Section owns collapse"
94
98
  ],
95
- "snippet": "<Section title=\"Recent activity\" description=\"Last 30 days\" actions={<Button variant=\"secondary\" size=\"sm\">View all</Button>}><Table ... /></Section>",
99
+ "snippet": "<Section title=\"Recent activity\" description=\"Last 30 days\" collapsible={false}><Table ... /></Section>",
96
100
  "contains": []
97
101
  }
@@ -1,11 +1,11 @@
1
- ._scoreboard_v3qsg_1 {
1
+ ._scoreboard_jqkyj_1 {
2
2
  width: 100%;
3
3
  min-width: 0;
4
4
  container-type: inline-size;
5
5
  container-name: scoreboard;
6
6
  }
7
7
 
8
- ._grid_v3qsg_8 {
8
+ ._grid_jqkyj_8 {
9
9
  display: grid;
10
10
  gap: var(--space-4);
11
11
  width: 100%;
@@ -13,39 +13,41 @@
13
13
  align-items: stretch;
14
14
  }
15
15
 
16
- ._count1_v3qsg_16 {
16
+ ._count1_jqkyj_16 {
17
17
  grid-template-columns: minmax(0, 1fr);
18
18
  }
19
19
 
20
- ._count2_v3qsg_20,
21
- ._count4_v3qsg_21 {
20
+ ._count2_jqkyj_20 {
22
21
  grid-template-columns: repeat(2, minmax(0, 1fr));
23
22
  }
24
23
 
25
- ._count3_v3qsg_25 {
24
+ ._count3_jqkyj_24 {
26
25
  grid-template-columns: repeat(3, minmax(0, 1fr));
27
26
  }
28
27
 
29
- @container scoreboard (max-width: calc(2 * var(--layout-metrics-min) + var(--space-4))) {
30
- ._count2_v3qsg_20,
31
- ._count4_v3qsg_21 {
32
- grid-template-columns: minmax(0, 1fr);
33
- }
28
+ ._count4_jqkyj_28 {
29
+ grid-template-columns: repeat(4, minmax(0, 1fr));
34
30
  }
35
31
 
36
- @container scoreboard (max-width: calc(3 * var(--layout-metrics-min) + 2 * var(--space-4))) {
37
- ._count3_v3qsg_25 {
32
+ /* Collapse as the strip narrows. Lengths match tokens: metrics-min 12rem, space-4 1rem. Container queries cannot use calc(var()). */
33
+ @container scoreboard (max-width: 38rem) {
34
+ ._count3_jqkyj_24 {
38
35
  grid-template-columns: minmax(0, 1fr);
39
36
  }
37
+
38
+ ._count4_jqkyj_28 {
39
+ grid-template-columns: repeat(2, minmax(0, 1fr));
40
+ }
40
41
  }
41
42
 
42
- @container scoreboard (min-width: calc(4 * var(--layout-metrics-min) + 3 * var(--space-4))) {
43
- ._count4_v3qsg_21 {
44
- grid-template-columns: repeat(4, minmax(0, 1fr));
43
+ @container scoreboard (max-width: 25rem) {
44
+ ._count2_jqkyj_20,
45
+ ._count4_jqkyj_28 {
46
+ grid-template-columns: minmax(0, 1fr);
45
47
  }
46
48
  }
47
49
 
48
- ._overflow_v3qsg_48 {
50
+ ._overflow_jqkyj_50 {
49
51
  width: 100%;
50
52
  min-width: 0;
51
53
  padding-inline: var(--space-12);
@@ -1,15 +1,15 @@
1
1
  import "./Scoreboard.kit.css";
2
2
  //#region ui/Scoreboard/Scoreboard.module.css
3
- var e = "_scoreboard_v3qsg_1", t = "_grid_v3qsg_8", n = "_count1_v3qsg_16", r = "_count2_v3qsg_20", i = "_count4_v3qsg_21", a = "_count3_v3qsg_25", o = "_overflow_v3qsg_48", s = {
3
+ var e = "_scoreboard_jqkyj_1", t = "_grid_jqkyj_8", n = "_count1_jqkyj_16", r = "_count2_jqkyj_20", i = "_count3_jqkyj_24", a = "_count4_jqkyj_28", o = "_overflow_jqkyj_50", s = {
4
4
  scoreboard: e,
5
5
  grid: t,
6
6
  count1: n,
7
7
  count2: r,
8
- count4: i,
9
- count3: a,
8
+ count3: i,
9
+ count4: a,
10
10
  overflow: o
11
11
  };
12
12
  //#endregion
13
- export { n as count1, r as count2, a as count3, i as count4, s as default, t as grid, o as overflow, e as scoreboard };
13
+ export { n as count1, r as count2, i as count3, a as count4, s as default, t as grid, o as overflow, e as scoreboard };
14
14
 
15
15
  //# sourceMappingURL=Scoreboard.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Scoreboard.module.js","names":[],"sources":["../../../ui/Scoreboard/Scoreboard.module.css"],"sourcesContent":[".scoreboard {\n width: 100%;\n min-width: 0;\n container-type: inline-size;\n container-name: scoreboard;\n}\n\n.grid {\n display: grid;\n gap: var(--space-4);\n width: 100%;\n min-width: 0;\n align-items: stretch;\n}\n\n.count1 {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.count2,\n.count4 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.count3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n@container scoreboard (max-width: calc(2 * var(--layout-metrics-min) + var(--space-4))) {\n .count2,\n .count4 {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@container scoreboard (max-width: calc(3 * var(--layout-metrics-min) + 2 * var(--space-4))) {\n .count3 {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n@container scoreboard (min-width: calc(4 * var(--layout-metrics-min) + 3 * var(--space-4))) {\n .count4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n}\n\n.overflow {\n width: 100%;\n min-width: 0;\n padding-inline: var(--space-12);\n box-sizing: border-box;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Scoreboard.module.js","names":[],"sources":["../../../ui/Scoreboard/Scoreboard.module.css"],"sourcesContent":[".scoreboard {\n width: 100%;\n min-width: 0;\n container-type: inline-size;\n container-name: scoreboard;\n}\n\n.grid {\n display: grid;\n gap: var(--space-4);\n width: 100%;\n min-width: 0;\n align-items: stretch;\n}\n\n.count1 {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.count2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.count3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n.count4 {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n}\n\n/* Collapse as the strip narrows. Lengths match tokens: metrics-min 12rem, space-4 1rem. Container queries cannot use calc(var()). */\n@container scoreboard (max-width: 38rem) {\n .count3 {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .count4 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@container scoreboard (max-width: 25rem) {\n .count2,\n .count4 {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.overflow {\n width: 100%;\n min-width: 0;\n padding-inline: var(--space-12);\n box-sizing: border-box;\n}\n"],"mappings":""}
@@ -1,48 +1,55 @@
1
- ._section_16lix_1 {
1
+ ._section_roa75_1 {
2
2
  --section-space: var(--space-section-md);
3
- --section-header-gap: var(--space-stack-sm);
3
+ --section-header-gap: var(--space-stack-md);
4
+ --section-inset: var(--space-6);
5
+ display: grid;
6
+ gap: var(--section-header-gap);
4
7
  width: 100%;
5
8
  min-width: 0;
6
9
  margin: 0 0 var(--section-space);
10
+ padding: var(--section-inset);
11
+ box-sizing: border-box;
12
+ background: var(--surface-card);
13
+ border: var(--border-width-thin) solid var(--border-faint);
14
+ border-radius: var(--radius-surface-md);
15
+ box-shadow: var(--shadow-sm);
7
16
  }
8
17
 
9
- ._sm_16lix_9 {
18
+ ._sm_roa75_18 {
10
19
  --section-space: var(--space-section-sm);
11
20
  --section-header-gap: var(--space-stack-sm);
21
+ --section-inset: var(--space-4);
12
22
  }
13
23
 
14
- ._md_16lix_14 {
24
+ ._md_roa75_24 {
15
25
  --section-space: var(--space-section-md);
16
26
  --section-header-gap: var(--space-stack-md);
27
+ --section-inset: var(--space-6);
17
28
  }
18
29
 
19
- ._lg_16lix_19 {
30
+ ._lg_roa75_30 {
20
31
  --section-space: var(--space-section-lg);
21
32
  --section-header-gap: var(--space-stack-lg);
33
+ --section-inset: var(--space-8);
22
34
  }
23
35
 
24
- ._header_16lix_24 {
36
+ ._header_roa75_36 {
25
37
  display: flex;
26
38
  flex-wrap: wrap;
27
39
  align-items: flex-start;
28
40
  justify-content: space-between;
29
41
  gap: var(--space-inline-sm) var(--space-inline-lg);
30
42
  margin: 0;
31
- padding-bottom: var(--section-header-gap);
32
- }
33
-
34
- ._collapsible_16lix_34:has(> ._body_16lix_34[hidden]) ._header_16lix_24 {
35
- padding-bottom: 0;
36
43
  }
37
44
 
38
- ._heading_16lix_38 {
45
+ ._heading_roa75_45 {
39
46
  display: grid;
40
47
  gap: var(--space-stack-xs);
41
48
  min-width: 0;
42
49
  flex: 1;
43
50
  }
44
51
 
45
- ._title_16lix_45 {
52
+ ._title_roa75_52 {
46
53
  margin: 0;
47
54
  font-family: var(--font-sans);
48
55
  font-size: var(--type-size-heading);
@@ -51,7 +58,7 @@
51
58
  color: var(--text-primary);
52
59
  }
53
60
 
54
- ._trigger_16lix_54 {
61
+ ._trigger_roa75_61 {
55
62
  display: inline-flex;
56
63
  align-items: center;
57
64
  gap: var(--space-2);
@@ -66,22 +73,22 @@
66
73
  cursor: pointer;
67
74
  }
68
75
 
69
- ._trigger_16lix_54:focus-visible {
76
+ ._trigger_roa75_61:focus-visible {
70
77
  outline: var(--border-focus-width) solid var(--focus-ring);
71
78
  outline-offset: var(--space-inset-2xs);
72
79
  border-radius: var(--radius-control-sm);
73
80
  }
74
81
 
75
- ._chevron_16lix_75 {
82
+ ._chevron_roa75_82 {
76
83
  flex-shrink: 0;
77
84
  color: var(--icon-muted);
78
85
  }
79
86
 
80
- ._collapsible_16lix_34 ._description_16lix_80 {
87
+ ._collapsible_roa75_87 ._description_roa75_87 {
81
88
  padding-inline-start: calc(18px + var(--space-2));
82
89
  }
83
90
 
84
- ._description_16lix_80 {
91
+ ._description_roa75_87 {
85
92
  margin: 0;
86
93
  font-family: var(--font-sans);
87
94
  font-size: var(--type-size-body-sm);
@@ -89,7 +96,7 @@
89
96
  color: var(--text-secondary);
90
97
  }
91
98
 
92
- ._actions_16lix_92 {
99
+ ._actions_roa75_99 {
93
100
  display: flex;
94
101
  flex-wrap: wrap;
95
102
  align-items: center;
@@ -97,7 +104,7 @@
97
104
  flex-shrink: 0;
98
105
  }
99
106
 
100
- ._body_16lix_34 {
107
+ ._body_roa75_107 {
101
108
  width: 100%;
102
109
  min-width: 0;
103
110
  }
@@ -1,21 +1,21 @@
1
1
  import "./Section.kit.css";
2
2
  //#region ui/Section/Section.module.css
3
- var e = "_section_16lix_1", t = "_sm_16lix_9", n = "_md_16lix_14", r = "_lg_16lix_19", i = "_header_16lix_24", a = "_collapsible_16lix_34", o = "_body_16lix_34", s = "_heading_16lix_38", c = "_title_16lix_45", l = "_trigger_16lix_54", u = "_chevron_16lix_75", d = "_description_16lix_80", f = "_actions_16lix_92", p = {
3
+ var e = "_section_roa75_1", t = "_sm_roa75_18", n = "_md_roa75_24", r = "_lg_roa75_30", i = "_header_roa75_36", a = "_heading_roa75_45", o = "_title_roa75_52", s = "_trigger_roa75_61", c = "_chevron_roa75_82", l = "_collapsible_roa75_87", u = "_description_roa75_87", d = "_actions_roa75_99", f = "_body_roa75_107", p = {
4
4
  section: e,
5
5
  sm: t,
6
6
  md: n,
7
7
  lg: r,
8
8
  header: i,
9
- collapsible: a,
10
- body: o,
11
- heading: s,
12
- title: c,
13
- trigger: l,
14
- chevron: u,
15
- description: d,
16
- actions: f
9
+ heading: a,
10
+ title: o,
11
+ trigger: s,
12
+ chevron: c,
13
+ collapsible: l,
14
+ description: u,
15
+ actions: d,
16
+ body: f
17
17
  };
18
18
  //#endregion
19
- export { f as actions, o as body, u as chevron, a as collapsible, p as default, d as description, i as header, s as heading, r as lg, n as md, e as section, t as sm, c as title, l as trigger };
19
+ export { d as actions, f as body, c as chevron, l as collapsible, p as default, u as description, i as header, a as heading, r as lg, n as md, e as section, t as sm, o as title, s as trigger };
20
20
 
21
21
  //# sourceMappingURL=Section.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Section.module.js","names":[],"sources":["../../../ui/Section/Section.module.css"],"sourcesContent":[".section {\n --section-space: var(--space-section-md);\n --section-header-gap: var(--space-stack-sm);\n width: 100%;\n min-width: 0;\n margin: 0 0 var(--section-space);\n}\n\n.sm {\n --section-space: var(--space-section-sm);\n --section-header-gap: var(--space-stack-sm);\n}\n\n.md {\n --section-space: var(--space-section-md);\n --section-header-gap: var(--space-stack-md);\n}\n\n.lg {\n --section-space: var(--space-section-lg);\n --section-header-gap: var(--space-stack-lg);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-inline-sm) var(--space-inline-lg);\n margin: 0;\n padding-bottom: var(--section-header-gap);\n}\n\n.collapsible:has(> .body[hidden]) .header {\n padding-bottom: 0;\n}\n\n.heading {\n display: grid;\n gap: var(--space-stack-xs);\n min-width: 0;\n flex: 1;\n}\n\n.title {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-heading);\n font-weight: var(--type-weight-heading);\n line-height: var(--type-line-heading);\n color: var(--text-primary);\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.trigger:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n border-radius: var(--radius-control-sm);\n}\n\n.chevron {\n flex-shrink: 0;\n color: var(--icon-muted);\n}\n\n.collapsible .description {\n padding-inline-start: calc(18px + var(--space-2));\n}\n\n.description {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n line-height: var(--type-line-body);\n color: var(--text-secondary);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-inline-sm);\n flex-shrink: 0;\n}\n\n.body {\n width: 100%;\n min-width: 0;\n}\n\n"],"mappings":""}
1
+ {"version":3,"file":"Section.module.js","names":[],"sources":["../../../ui/Section/Section.module.css"],"sourcesContent":[".section {\n --section-space: var(--space-section-md);\n --section-header-gap: var(--space-stack-md);\n --section-inset: var(--space-6);\n display: grid;\n gap: var(--section-header-gap);\n width: 100%;\n min-width: 0;\n margin: 0 0 var(--section-space);\n padding: var(--section-inset);\n box-sizing: border-box;\n background: var(--surface-card);\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-surface-md);\n box-shadow: var(--shadow-sm);\n}\n\n.sm {\n --section-space: var(--space-section-sm);\n --section-header-gap: var(--space-stack-sm);\n --section-inset: var(--space-4);\n}\n\n.md {\n --section-space: var(--space-section-md);\n --section-header-gap: var(--space-stack-md);\n --section-inset: var(--space-6);\n}\n\n.lg {\n --section-space: var(--space-section-lg);\n --section-header-gap: var(--space-stack-lg);\n --section-inset: var(--space-8);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-inline-sm) var(--space-inline-lg);\n margin: 0;\n}\n\n.heading {\n display: grid;\n gap: var(--space-stack-xs);\n min-width: 0;\n flex: 1;\n}\n\n.title {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-heading);\n font-weight: var(--type-weight-heading);\n line-height: var(--type-line-heading);\n color: var(--text-primary);\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.trigger:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n border-radius: var(--radius-control-sm);\n}\n\n.chevron {\n flex-shrink: 0;\n color: var(--icon-muted);\n}\n\n.collapsible .description {\n padding-inline-start: calc(18px + var(--space-2));\n}\n\n.description {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n line-height: var(--type-line-body);\n color: var(--text-secondary);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-inline-sm);\n flex-shrink: 0;\n}\n\n.body {\n width: 100%;\n min-width: 0;\n}\n\n"],"mappings":""}
@@ -76,7 +76,6 @@ function g({ breadcrumbs: g }) {
76
76
  /* @__PURE__ */ p(a, {
77
77
  title: "This week",
78
78
  children: /* @__PURE__ */ p(i, {
79
- className: "layout-metrics layout-metrics--fixed-4",
80
79
  "aria-label": "Activity this week",
81
80
  items: h
82
81
  })
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityPattern.js","names":[],"sources":["../../../../ui/patterns/ActivityPattern/ActivityPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../Button\";\nimport { ButtonGroup } from \"../../ButtonGroup\";\nimport { Empty } from \"../../Empty\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport { Tabs } from \"../../Tabs\";\nimport { ActivityFeed } from \"./ActivityFeed\";\nimport { TaskCards, TaskList } from \"./ActivityTasks\";\nimport { TASK_INSIGHTS, TaskDrawer } from \"./TaskDrawer\";\n\ntype TaskView = \"cards\" | \"list\";\n\nconst ACTIVITY_METRICS = [\n { label: \"Today\", value: \"6\", delta: \"+2\", trend: \"up\" as const, hint: \"vs yesterday\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"success\" as const },\n { label: \"Comments\", value: \"5\", delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n { label: \"Status changes\", value: \"4\", delta: \"0\", trend: \"flat\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Ship\", badgeTone: \"brand\" as const },\n { label: \"Mentions\", value: \"2\", delta: \"+2\", trend: \"up\" as const, hint: \"need reply\", size: \"lg\" as const, badge: \"At risk\", badgeTone: \"danger\" as const },\n];\n\nexport interface ActivityPatternProps {\n breadcrumbs?: PageHeaderProps[\"breadcrumbs\"];\n}\n\nexport function ActivityPattern({ breadcrumbs }: ActivityPatternProps) {\n const [dismissed, setDismissed] = useState<string[]>([]);\n const [openTaskId, setOpenTaskId] = useState<string | null>(null);\n const [taskView, setTaskView] = useState<TaskView>(\"cards\");\n\n const tasks = TASK_INSIGHTS.filter((task) => !dismissed.includes(task.id));\n const openTask = TASK_INSIGHTS.find((task) => task.id === openTaskId) ?? null;\n const taskCount =\n tasks.length === 0\n ? \"All caught up\"\n : `${tasks.length} ${tasks.length === 1 ? \"needs\" : \"need\"} attention`;\n\n function dismissTask(id: string) {\n setDismissed((current) => [...current, id]);\n setOpenTaskId((current) => (current === id ? null : current));\n }\n\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Activity\"\n subtitle=\"What the team shipped, blocked, and commented on.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"This week\">\n <Scoreboard\n className=\"layout-metrics layout-metrics--fixed-4\"\n aria-label=\"Activity this week\"\n items={ACTIVITY_METRICS}\n />\n </Section>\n <Section\n title=\"Tasks\"\n description={taskCount}\n actions={\n tasks.length > 0 ? (\n <ButtonGroup ariaLabel=\"Task layout\">\n <Button\n variant={taskView === \"cards\" ? \"secondary\" : \"tertiary\"}\n size=\"sm\"\n onClick={() => setTaskView(\"cards\")}\n >\n Cards\n </Button>\n <Button\n variant={taskView === \"list\" ? \"secondary\" : \"tertiary\"}\n size=\"sm\"\n onClick={() => setTaskView(\"list\")}\n >\n List\n </Button>\n </ButtonGroup>\n ) : undefined\n }\n >\n {tasks.length > 0 ? (\n taskView === \"cards\" ? (\n <TaskCards tasks={tasks} onOpen={setOpenTaskId} onDismiss={dismissTask} />\n ) : (\n <TaskList tasks={tasks} onOpen={setOpenTaskId} onDismiss={dismissTask} />\n )\n ) : (\n <Empty\n title=\"No open tasks\"\n description=\"Nothing in this sprint needs a look right now.\"\n icon=\"Check\"\n outlined\n />\n )}\n </Section>\n <Section title=\"Feed\" description=\"Newest first\">\n <Tabs\n ariaLabel=\"Activity type\"\n variant=\"line\"\n size=\"md\"\n defaultValue=\"all\"\n items={[\n { id: \"all\", label: \"All\", content: <ActivityFeed tab=\"all\" caption=\"All activity\" /> },\n { id: \"comments\", label: \"Comments\", content: <ActivityFeed tab=\"comments\" caption=\"Comments\" /> },\n { id: \"status\", label: \"Status\", content: <ActivityFeed tab=\"status\" caption=\"Status changes\" /> },\n { id: \"mentions\", label: \"Mentions\", content: <ActivityFeed tab=\"mentions\" caption=\"Mentions\" /> },\n ]}\n />\n </Section>\n </div>\n <TaskDrawer task={openTask} onClose={() => setOpenTaskId(null)} />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ActivityPattern.js","names":[],"sources":["../../../../ui/patterns/ActivityPattern/ActivityPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../Button\";\nimport { ButtonGroup } from \"../../ButtonGroup\";\nimport { Empty } from \"../../Empty\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport { Tabs } from \"../../Tabs\";\nimport { ActivityFeed } from \"./ActivityFeed\";\nimport { TaskCards, TaskList } from \"./ActivityTasks\";\nimport { TASK_INSIGHTS, TaskDrawer } from \"./TaskDrawer\";\n\ntype TaskView = \"cards\" | \"list\";\n\nconst ACTIVITY_METRICS = [\n { label: \"Today\", value: \"6\", delta: \"+2\", trend: \"up\" as const, hint: \"vs yesterday\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"success\" as const },\n { label: \"Comments\", value: \"5\", delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n { label: \"Status changes\", value: \"4\", delta: \"0\", trend: \"flat\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Ship\", badgeTone: \"brand\" as const },\n { label: \"Mentions\", value: \"2\", delta: \"+2\", trend: \"up\" as const, hint: \"need reply\", size: \"lg\" as const, badge: \"At risk\", badgeTone: \"danger\" as const },\n];\n\nexport interface ActivityPatternProps {\n breadcrumbs?: PageHeaderProps[\"breadcrumbs\"];\n}\n\nexport function ActivityPattern({ breadcrumbs }: ActivityPatternProps) {\n const [dismissed, setDismissed] = useState<string[]>([]);\n const [openTaskId, setOpenTaskId] = useState<string | null>(null);\n const [taskView, setTaskView] = useState<TaskView>(\"cards\");\n\n const tasks = TASK_INSIGHTS.filter((task) => !dismissed.includes(task.id));\n const openTask = TASK_INSIGHTS.find((task) => task.id === openTaskId) ?? null;\n const taskCount =\n tasks.length === 0\n ? \"All caught up\"\n : `${tasks.length} ${tasks.length === 1 ? \"needs\" : \"need\"} attention`;\n\n function dismissTask(id: string) {\n setDismissed((current) => [...current, id]);\n setOpenTaskId((current) => (current === id ? null : current));\n }\n\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Activity\"\n subtitle=\"What the team shipped, blocked, and commented on.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"This week\">\n <Scoreboard aria-label=\"Activity this week\" items={ACTIVITY_METRICS} />\n </Section>\n <Section\n title=\"Tasks\"\n description={taskCount}\n actions={\n tasks.length > 0 ? (\n <ButtonGroup ariaLabel=\"Task layout\">\n <Button\n variant={taskView === \"cards\" ? \"secondary\" : \"tertiary\"}\n size=\"sm\"\n onClick={() => setTaskView(\"cards\")}\n >\n Cards\n </Button>\n <Button\n variant={taskView === \"list\" ? \"secondary\" : \"tertiary\"}\n size=\"sm\"\n onClick={() => setTaskView(\"list\")}\n >\n List\n </Button>\n </ButtonGroup>\n ) : undefined\n }\n >\n {tasks.length > 0 ? (\n taskView === \"cards\" ? (\n <TaskCards tasks={tasks} onOpen={setOpenTaskId} onDismiss={dismissTask} />\n ) : (\n <TaskList tasks={tasks} onOpen={setOpenTaskId} onDismiss={dismissTask} />\n )\n ) : (\n <Empty\n title=\"No open tasks\"\n description=\"Nothing in this sprint needs a look right now.\"\n icon=\"Check\"\n outlined\n />\n )}\n </Section>\n <Section title=\"Feed\" description=\"Newest first\">\n <Tabs\n ariaLabel=\"Activity type\"\n variant=\"line\"\n size=\"md\"\n defaultValue=\"all\"\n items={[\n { id: \"all\", label: \"All\", content: <ActivityFeed tab=\"all\" caption=\"All activity\" /> },\n { id: \"comments\", label: \"Comments\", content: <ActivityFeed tab=\"comments\" caption=\"Comments\" /> },\n { id: \"status\", label: \"Status\", content: <ActivityFeed tab=\"status\" caption=\"Status changes\" /> },\n { id: \"mentions\", label: \"Mentions\", content: <ActivityFeed tab=\"mentions\" caption=\"Mentions\" /> },\n ]}\n />\n </Section>\n </div>\n <TaskDrawer task={openTask} onClose={() => setOpenTaskId(null)} />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -181,7 +181,6 @@ function d({ breadcrumbs: d }) {
181
181
  /* @__PURE__ */ a(i, {
182
182
  title: "Sprint metrics",
183
183
  children: /* @__PURE__ */ a(r, {
184
- className: "layout-metrics layout-metrics--fixed-4",
185
184
  "aria-label": "Sprint metrics",
186
185
  items: s
187
186
  })
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardPattern.js","names":[],"sources":["../../../../ui/patterns/DashboardPattern/DashboardPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { DataTable } from \"../../DataTable\";\nimport type { DataTableColumn, DataTableRow } from \"../../DataTable\";\nimport { LineChart } from \"../../LineChart\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport type { ChartDatum } from \"../../shared/chartMath\";\n\nconst SPRINT_METRICS = [\n { label: \"Weekly users\", value: \"1.44k\", delta: \"+6.2%\", trend: \"up\" as const, hint: \"vs last week\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"success\" as const },\n { label: \"Open tasks\", value: \"4\", delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n { label: \"Blocked\", value: \"1\", delta: \"0\", trend: \"flat\" as const, hint: \"need owner\", size: \"lg\" as const, badge: \"At risk\", badgeTone: \"danger\" as const },\n { label: \"Ready\", value: \"1\", delta: \"+1\", trend: \"up\" as const, hint: \"to ship\", size: \"lg\" as const, badge: \"Ship\", badgeTone: \"brand\" as const },\n];\n\nconst WEEKLY_USERS: ChartDatum[] = [\n { label: \"Mon\", value: 1280 },\n { label: \"Tue\", value: 1410 },\n { label: \"Wed\", value: 1320 },\n { label: \"Thu\", value: 1480 },\n { label: \"Fri\", value: 1360 },\n { label: \"Sat\", value: 1440 },\n { label: \"Sun\", value: 1390 },\n];\n\nconst TASK_COLUMNS: DataTableColumn[] = [\n { key: \"task\", header: \"Task\", sortable: true },\n { key: \"owner\", header: \"Owner\", sortable: true },\n { key: \"status\", header: \"Status\", sortable: true },\n];\n\nconst TASK_ROWS: DataTableRow[] = [\n {\n id: \"launch-brief\",\n task: { type: \"file\", label: \"Launch brief\" },\n owner: { type: \"avatar\", label: \"Maya Chen\", name: \"Maya Chen\", src: \"/faces/maya-chen.jpg\" },\n status: { type: \"badge\", label: \"In review\", tone: \"warning\" },\n },\n {\n id: \"qa-checklist\",\n task: { type: \"file\", label: \"QA checklist\" },\n owner: { type: \"avatar\", label: \"Unassigned\", name: \"Unassigned\" },\n status: { type: \"badge\", label: \"Blocked\", tone: \"danger\" },\n },\n {\n id: \"release-notes\",\n task: { type: \"file\", label: \"Release notes\" },\n owner: { type: \"avatar\", label: \"Jordan Lee\", name: \"Jordan Lee\", src: \"/faces/jordan-lee.jpg\" },\n status: { type: \"badge\", label: \"Ready\", tone: \"success\" },\n },\n {\n id: \"support-macros\",\n task: { type: \"file\", label: \"Support macros\" },\n owner: { type: \"avatar\", label: \"Alex Rivera\", name: \"Alex Rivera\", src: \"/faces/alex-rivera.jpg\" },\n status: { type: \"badge\", label: \"In progress\", tone: \"info\" },\n },\n];\n\nexport function DashboardPattern({ breadcrumbs }: { breadcrumbs?: PageHeaderProps[\"breadcrumbs\"] }) {\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Overview\"\n subtitle=\"Workspace overview for the current team.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"Sprint metrics\">\n <Scoreboard\n className=\"layout-metrics layout-metrics--fixed-4\"\n aria-label=\"Sprint metrics\"\n items={SPRINT_METRICS}\n />\n </Section>\n <Section title=\"Weekly users\">\n <LineChart data={WEEKLY_USERS} variant=\"line\" showTable={false} />\n </Section>\n <Section title=\"Open tasks\" description=\"4 items need attention\">\n <DataTable\n caption=\"Sprint backlog\"\n selectable\n toolbar\n cellSize=\"sm\"\n searchPlaceholder=\"Search tasks...\"\n filters={[\n { key: \"status\", label: \"Status\" },\n { key: \"owner\", label: \"Owner\" },\n ]}\n columnSettings\n columns={TASK_COLUMNS}\n rows={TASK_ROWS}\n />\n </Section>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DashboardPattern.js","names":[],"sources":["../../../../ui/patterns/DashboardPattern/DashboardPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { DataTable } from \"../../DataTable\";\nimport type { DataTableColumn, DataTableRow } from \"../../DataTable\";\nimport { LineChart } from \"../../LineChart\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport type { ChartDatum } from \"../../shared/chartMath\";\n\nconst SPRINT_METRICS = [\n { label: \"Weekly users\", value: \"1.44k\", delta: \"+6.2%\", trend: \"up\" as const, hint: \"vs last week\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"success\" as const },\n { label: \"Open tasks\", value: \"4\", delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n { label: \"Blocked\", value: \"1\", delta: \"0\", trend: \"flat\" as const, hint: \"need owner\", size: \"lg\" as const, badge: \"At risk\", badgeTone: \"danger\" as const },\n { label: \"Ready\", value: \"1\", delta: \"+1\", trend: \"up\" as const, hint: \"to ship\", size: \"lg\" as const, badge: \"Ship\", badgeTone: \"brand\" as const },\n];\n\nconst WEEKLY_USERS: ChartDatum[] = [\n { label: \"Mon\", value: 1280 },\n { label: \"Tue\", value: 1410 },\n { label: \"Wed\", value: 1320 },\n { label: \"Thu\", value: 1480 },\n { label: \"Fri\", value: 1360 },\n { label: \"Sat\", value: 1440 },\n { label: \"Sun\", value: 1390 },\n];\n\nconst TASK_COLUMNS: DataTableColumn[] = [\n { key: \"task\", header: \"Task\", sortable: true },\n { key: \"owner\", header: \"Owner\", sortable: true },\n { key: \"status\", header: \"Status\", sortable: true },\n];\n\nconst TASK_ROWS: DataTableRow[] = [\n {\n id: \"launch-brief\",\n task: { type: \"file\", label: \"Launch brief\" },\n owner: { type: \"avatar\", label: \"Maya Chen\", name: \"Maya Chen\", src: \"/faces/maya-chen.jpg\" },\n status: { type: \"badge\", label: \"In review\", tone: \"warning\" },\n },\n {\n id: \"qa-checklist\",\n task: { type: \"file\", label: \"QA checklist\" },\n owner: { type: \"avatar\", label: \"Unassigned\", name: \"Unassigned\" },\n status: { type: \"badge\", label: \"Blocked\", tone: \"danger\" },\n },\n {\n id: \"release-notes\",\n task: { type: \"file\", label: \"Release notes\" },\n owner: { type: \"avatar\", label: \"Jordan Lee\", name: \"Jordan Lee\", src: \"/faces/jordan-lee.jpg\" },\n status: { type: \"badge\", label: \"Ready\", tone: \"success\" },\n },\n {\n id: \"support-macros\",\n task: { type: \"file\", label: \"Support macros\" },\n owner: { type: \"avatar\", label: \"Alex Rivera\", name: \"Alex Rivera\", src: \"/faces/alex-rivera.jpg\" },\n status: { type: \"badge\", label: \"In progress\", tone: \"info\" },\n },\n];\n\nexport function DashboardPattern({ breadcrumbs }: { breadcrumbs?: PageHeaderProps[\"breadcrumbs\"] }) {\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Overview\"\n subtitle=\"Workspace overview for the current team.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"Sprint metrics\">\n <Scoreboard aria-label=\"Sprint metrics\" items={SPRINT_METRICS} />\n </Section>\n <Section title=\"Weekly users\">\n <LineChart data={WEEKLY_USERS} variant=\"line\" showTable={false} />\n </Section>\n <Section title=\"Open tasks\" description=\"4 items need attention\">\n <DataTable\n caption=\"Sprint backlog\"\n selectable\n toolbar\n cellSize=\"sm\"\n searchPlaceholder=\"Search tasks...\"\n filters={[\n { key: \"status\", label: \"Status\" },\n { key: \"owner\", label: \"Owner\" },\n ]}\n columnSettings\n columns={TASK_COLUMNS}\n rows={TASK_ROWS}\n />\n </Section>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -108,7 +108,6 @@ function S({ breadcrumbs: r }) {
108
108
  /* @__PURE__ */ v(s, {
109
109
  title: "At a glance",
110
110
  children: /* @__PURE__ */ v(o, {
111
- className: "layout-metrics layout-metrics--fixed-4",
112
111
  "aria-label": "Inbox this week",
113
112
  items: [
114
113
  {
@@ -1 +1 @@
1
- {"version":3,"file":"InboxPattern.js","names":[],"sources":["../../../../ui/patterns/InboxPattern/InboxPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Avatar } from \"../../Avatar\";\nimport { Badge } from \"../../Badge\";\nimport { Button } from \"../../Button\";\nimport { Cell } from \"../../Cell\";\nimport { Empty } from \"../../Empty\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport { Table } from \"../../Table\";\nimport { Tabs } from \"../../Tabs\";\nimport { Toast } from \"../../Toast\";\nimport { filterMessages, INBOX, type InboxMessage } from \"./inbox-data\";\nimport { InboxReplyDrawer } from \"./InboxReplyDrawer\";\nimport styles from \"./InboxPattern.module.css\";\n\nconst COLUMNS = [\n { key: \"from\", header: \"From\", emphasis: true },\n { key: \"subject\", header: \"Subject\" },\n { key: \"kind\", header: \"Type\" },\n { key: \"when\", header: \"When\" },\n { key: \"open\", header: \"\" },\n];\n\nfunction InboxTable({\n messages,\n onOpen,\n}: {\n messages: InboxMessage[];\n onOpen: (id: string) => void;\n}) {\n return (\n <Table\n caption=\"Inbox\"\n size=\"sm\"\n emptyLabel=\"No messages in this filter.\"\n columns={COLUMNS}\n rows={messages.map((item) => ({\n from: <Cell type=\"avatar\" size=\"sm\" name={item.from} src={item.fromSrc} label={item.from} />,\n subject: item.subject,\n kind: <Badge tone={item.kindTone} size=\"sm\">{item.kind}</Badge>,\n when: item.when,\n open: (\n <Button variant=\"tertiary\" size=\"sm\" onClick={() => onOpen(item.id)}>\n Open\n </Button>\n ),\n }))}\n />\n );\n}\n\nexport interface InboxPatternProps {\n breadcrumbs?: PageHeaderProps[\"breadcrumbs\"];\n}\n\nexport function InboxPattern({ breadcrumbs }: InboxPatternProps) {\n const [messages, setMessages] = useState(INBOX);\n const [tab, setTab] = useState(\"all\");\n const [selectedId, setSelectedId] = useState<string | null>(INBOX[0]?.id ?? null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [toastOpen, setToastOpen] = useState(false);\n\n const selected = messages.find((item) => item.id === selectedId) ?? null;\n const unread = messages.filter((item) => item.unread).length;\n\n useEffect(() => {\n const next = filterMessages(messages, tab);\n if (selectedId && next.some((item) => item.id === selectedId)) return;\n setSelectedId(next[0]?.id ?? null);\n setDrawerOpen(false);\n }, [selectedId, tab, messages]);\n\n function archive(id: string) {\n setMessages((current) => current.filter((item) => item.id !== id));\n setDrawerOpen(false);\n }\n\n function openMessage(id: string) {\n setSelectedId(id);\n setDrawerOpen(true);\n }\n\n function sendReply() {\n if (!selected) return;\n setMessages((current) =>\n current.map((item) => (item.id === selected.id ? { ...item, unread: false } : item)),\n );\n setToastOpen(true);\n }\n\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Inbox\"\n subtitle=\"Replies, mentions, and requests waiting on you.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"At a glance\">\n <Scoreboard\n className=\"layout-metrics layout-metrics--fixed-4\"\n aria-label=\"Inbox this week\"\n items={[\n { label: \"Unread\", value: String(unread), delta: `+${unread}`, trend: \"up\" as const, hint: \"need a look\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"danger\" as const },\n { label: \"Mentions\", value: String(messages.filter((item) => item.kind === \"Mention\").length), delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"You\", badgeTone: \"brand\" as const },\n { label: \"Requests\", value: String(messages.filter((item) => item.kind === \"Request\").length), delta: \"+2\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Review\", badgeTone: \"warning\" as const },\n { label: \"Open\", value: String(messages.length), delta: \"0\", trend: \"flat\" as const, hint: \"in inbox\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n ]}\n />\n </Section>\n <Section title=\"Messages\" description={`${unread} unread`}>\n <Tabs\n ariaLabel=\"Inbox type\"\n variant=\"line\"\n size=\"md\"\n value={tab}\n onChange={setTab}\n items={[\n { id: \"all\", label: \"All\", content: <InboxTable messages={filterMessages(messages, \"all\")} onOpen={openMessage} /> },\n { id: \"unread\", label: \"Unread\", content: <InboxTable messages={filterMessages(messages, \"unread\")} onOpen={openMessage} /> },\n { id: \"mentions\", label: \"Mentions\", content: <InboxTable messages={filterMessages(messages, \"mentions\")} onOpen={openMessage} /> },\n { id: \"requests\", label: \"Requests\", content: <InboxTable messages={filterMessages(messages, \"requests\")} onOpen={openMessage} /> },\n ]}\n />\n </Section>\n <Section\n title={selected?.subject ?? \"Message\"}\n description={selected ? `${selected.from} · ${selected.when}` : \"Select a row\"}\n actions={\n selected ? (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => archive(selected.id)}>\n Archive\n </Button>\n <Button\n variant={drawerOpen ? \"secondary\" : \"primary\"}\n size=\"sm\"\n onClick={() => openMessage(selected.id)}\n >\n Reply\n </Button>\n </>\n ) : undefined\n }\n >\n {selected ? (\n <div className={styles.detail}>\n <div className={styles.meta}>\n <Avatar name={selected.from} src={selected.fromSrc} size=\"md\" />\n <div className={styles.copy}>\n <p className={styles.label}>From</p>\n <p className={styles.value}>{selected.from}</p>\n </div>\n <Badge tone={selected.kindTone}>{selected.kind}</Badge>\n </div>\n <p className={styles.body}>{selected.body}</p>\n </div>\n ) : (\n <Empty\n title=\"No message selected\"\n description=\"Open a row to read it here.\"\n icon=\"Mail\"\n outlined\n />\n )}\n </Section>\n </div>\n <InboxReplyDrawer\n key={selected?.id ?? \"none\"}\n message={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onSend={sendReply}\n />\n <Toast\n open={toastOpen}\n title=\"Reply sent\"\n description=\"It will show up in the thread.\"\n status=\"success\"\n duration={3000}\n onClose={() => setToastOpen(false)}\n onOpenChange={setToastOpen}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InboxPattern.js","names":[],"sources":["../../../../ui/patterns/InboxPattern/InboxPattern.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Avatar } from \"../../Avatar\";\nimport { Badge } from \"../../Badge\";\nimport { Button } from \"../../Button\";\nimport { Cell } from \"../../Cell\";\nimport { Empty } from \"../../Empty\";\nimport { PageHeader } from \"../../PageHeader\";\nimport type { PageHeaderProps } from \"../../PageHeader\";\nimport { Scoreboard } from \"../../Scoreboard\";\nimport { Section } from \"../../Section\";\nimport { Table } from \"../../Table\";\nimport { Tabs } from \"../../Tabs\";\nimport { Toast } from \"../../Toast\";\nimport { filterMessages, INBOX, type InboxMessage } from \"./inbox-data\";\nimport { InboxReplyDrawer } from \"./InboxReplyDrawer\";\nimport styles from \"./InboxPattern.module.css\";\n\nconst COLUMNS = [\n { key: \"from\", header: \"From\", emphasis: true },\n { key: \"subject\", header: \"Subject\" },\n { key: \"kind\", header: \"Type\" },\n { key: \"when\", header: \"When\" },\n { key: \"open\", header: \"\" },\n];\n\nfunction InboxTable({\n messages,\n onOpen,\n}: {\n messages: InboxMessage[];\n onOpen: (id: string) => void;\n}) {\n return (\n <Table\n caption=\"Inbox\"\n size=\"sm\"\n emptyLabel=\"No messages in this filter.\"\n columns={COLUMNS}\n rows={messages.map((item) => ({\n from: <Cell type=\"avatar\" size=\"sm\" name={item.from} src={item.fromSrc} label={item.from} />,\n subject: item.subject,\n kind: <Badge tone={item.kindTone} size=\"sm\">{item.kind}</Badge>,\n when: item.when,\n open: (\n <Button variant=\"tertiary\" size=\"sm\" onClick={() => onOpen(item.id)}>\n Open\n </Button>\n ),\n }))}\n />\n );\n}\n\nexport interface InboxPatternProps {\n breadcrumbs?: PageHeaderProps[\"breadcrumbs\"];\n}\n\nexport function InboxPattern({ breadcrumbs }: InboxPatternProps) {\n const [messages, setMessages] = useState(INBOX);\n const [tab, setTab] = useState(\"all\");\n const [selectedId, setSelectedId] = useState<string | null>(INBOX[0]?.id ?? null);\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [toastOpen, setToastOpen] = useState(false);\n\n const selected = messages.find((item) => item.id === selectedId) ?? null;\n const unread = messages.filter((item) => item.unread).length;\n\n useEffect(() => {\n const next = filterMessages(messages, tab);\n if (selectedId && next.some((item) => item.id === selectedId)) return;\n setSelectedId(next[0]?.id ?? null);\n setDrawerOpen(false);\n }, [selectedId, tab, messages]);\n\n function archive(id: string) {\n setMessages((current) => current.filter((item) => item.id !== id));\n setDrawerOpen(false);\n }\n\n function openMessage(id: string) {\n setSelectedId(id);\n setDrawerOpen(true);\n }\n\n function sendReply() {\n if (!selected) return;\n setMessages((current) =>\n current.map((item) => (item.id === selected.id ? { ...item, unread: false } : item)),\n );\n setToastOpen(true);\n }\n\n return (\n <div className=\"layout-canvas layout-canvas--sticky-header\">\n <div className=\"layout-header\">\n <PageHeader\n title=\"Inbox\"\n subtitle=\"Replies, mentions, and requests waiting on you.\"\n breadcrumbs={breadcrumbs}\n />\n </div>\n <div className=\"layout-content\">\n <Section title=\"At a glance\">\n <Scoreboard\n aria-label=\"Inbox this week\"\n items={[\n { label: \"Unread\", value: String(unread), delta: `+${unread}`, trend: \"up\" as const, hint: \"need a look\", size: \"lg\" as const, badge: \"Live\", badgeTone: \"danger\" as const },\n { label: \"Mentions\", value: String(messages.filter((item) => item.kind === \"Mention\").length), delta: \"+1\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"You\", badgeTone: \"brand\" as const },\n { label: \"Requests\", value: String(messages.filter((item) => item.kind === \"Request\").length), delta: \"+2\", trend: \"up\" as const, hint: \"this sprint\", size: \"lg\" as const, badge: \"Review\", badgeTone: \"warning\" as const },\n { label: \"Open\", value: String(messages.length), delta: \"0\", trend: \"flat\" as const, hint: \"in inbox\", size: \"lg\" as const, badge: \"Sprint\", badgeTone: \"info\" as const },\n ]}\n />\n </Section>\n <Section title=\"Messages\" description={`${unread} unread`}>\n <Tabs\n ariaLabel=\"Inbox type\"\n variant=\"line\"\n size=\"md\"\n value={tab}\n onChange={setTab}\n items={[\n { id: \"all\", label: \"All\", content: <InboxTable messages={filterMessages(messages, \"all\")} onOpen={openMessage} /> },\n { id: \"unread\", label: \"Unread\", content: <InboxTable messages={filterMessages(messages, \"unread\")} onOpen={openMessage} /> },\n { id: \"mentions\", label: \"Mentions\", content: <InboxTable messages={filterMessages(messages, \"mentions\")} onOpen={openMessage} /> },\n { id: \"requests\", label: \"Requests\", content: <InboxTable messages={filterMessages(messages, \"requests\")} onOpen={openMessage} /> },\n ]}\n />\n </Section>\n <Section\n title={selected?.subject ?? \"Message\"}\n description={selected ? `${selected.from} · ${selected.when}` : \"Select a row\"}\n actions={\n selected ? (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => archive(selected.id)}>\n Archive\n </Button>\n <Button\n variant={drawerOpen ? \"secondary\" : \"primary\"}\n size=\"sm\"\n onClick={() => openMessage(selected.id)}\n >\n Reply\n </Button>\n </>\n ) : undefined\n }\n >\n {selected ? (\n <div className={styles.detail}>\n <div className={styles.meta}>\n <Avatar name={selected.from} src={selected.fromSrc} size=\"md\" />\n <div className={styles.copy}>\n <p className={styles.label}>From</p>\n <p className={styles.value}>{selected.from}</p>\n </div>\n <Badge tone={selected.kindTone}>{selected.kind}</Badge>\n </div>\n <p className={styles.body}>{selected.body}</p>\n </div>\n ) : (\n <Empty\n title=\"No message selected\"\n description=\"Open a row to read it here.\"\n icon=\"Mail\"\n outlined\n />\n )}\n </Section>\n </div>\n <InboxReplyDrawer\n key={selected?.id ?? \"none\"}\n message={selected}\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n onSend={sendReply}\n />\n <Toast\n open={toastOpen}\n title=\"Reply sent\"\n description=\"It will show up in the thread.\"\n status=\"success\"\n duration={3000}\n onClose={() => setToastOpen(false)}\n onOpenChange={setToastOpen}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -7,7 +7,7 @@ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
7
  function s({ title: s, description: c, legend: l, children: u, table: d, footnote: f, isEmpty: p = !1, emptyLabel: m = "No data for this range", isLoading: h = !1, className: g = "" }) {
8
8
  let [_, v] = n("chart"), y = t(), b = t(), x = t(), S = _ === "table" && !!d;
9
9
  return /* @__PURE__ */ o("figure", {
10
- className: `${e.frame} ${g}`.trim(),
10
+ className: `${s || c || d || f || l ? e.frame : e.flush} ${g}`.trim(),
11
11
  "aria-labelledby": s ? y : void 0,
12
12
  "aria-describedby": c ? b : void 0,
13
13
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"ChartFrame.js","names":[],"sources":["../../../ui/shared/ChartFrame.tsx"],"sourcesContent":["\"use client\";\n\nimport { BarChart3, Table2 } from \"lucide-react\";\nimport { useId, useState, type ReactNode } from \"react\";\nimport styles from \"./ChartFrame.module.css\";\n\nexport interface ChartFrameProps {\n title?: string;\n description?: string;\n legend?: ReactNode;\n children: ReactNode;\n table?: ReactNode;\n footnote?: string;\n isEmpty?: boolean;\n emptyLabel?: string;\n isLoading?: boolean;\n className?: string;\n}\n\nexport function ChartFrame({\n title,\n description,\n legend,\n children,\n table,\n footnote,\n isEmpty = false,\n emptyLabel = \"No data for this range\",\n isLoading = false,\n className = \"\",\n}: ChartFrameProps) {\n const [view, setView] = useState<\"chart\" | \"table\">(\"chart\");\n const titleId = useId();\n const descriptionId = useId();\n const panelId = useId();\n const showTable = view === \"table\" && Boolean(table);\n\n return (\n <figure\n className={`${styles.frame} ${className}`.trim()}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n >\n {title || table ? (\n <figcaption className={styles.header}>\n <div className={styles.heading}>\n {title ? (\n <h3 id={titleId} className={styles.title}>\n {title}\n </h3>\n ) : null}\n {description ? (\n <p id={descriptionId} className={styles.description}>\n {description}\n </p>\n ) : null}\n </div>\n {table ? (\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={styles.toggle}\n onClick={() => setView(showTable ? \"chart\" : \"table\")}\n aria-expanded={showTable}\n aria-controls={panelId}\n >\n {showTable ? <BarChart3 aria-hidden=\"true\" size={14} /> : <Table2 aria-hidden=\"true\" size={14} />}\n <span>{showTable ? \"Chart\" : \"Table\"}</span>\n </button>\n </div>\n ) : null}\n </figcaption>\n ) : null}\n\n {legend}\n\n <div\n id={panelId}\n className={`${styles.body}${isLoading ? ` ${styles.loading}` : \"\"}`}\n >\n {isEmpty ? <p className={styles.empty}>{emptyLabel}</p> : showTable ? table : children}\n </div>\n\n {footnote ? <p className={styles.footnote}>{footnote}</p> : null}\n </figure>\n );\n}\n"],"mappings":";;;;;;AAmBA,SAAgB,EAAW,EACzB,UACA,gBACA,WACA,aACA,UACA,aACA,aAAU,IACV,gBAAa,0BACb,eAAY,IACZ,eAAY,MACM;CAClB,IAAM,CAAC,GAAM,KAAW,EAA4B,OAAO,GACrD,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAU,EAAM,GAChB,IAAY,MAAS,WAAW,EAAQ;CAE9C,OACE,kBAAC,UAAD;EACE,WAAW,GAAG,EAAO,MAAM,GAAG,IAAY,KAAK;EAC/C,mBAAiB,IAAQ,IAAU,KAAA;EACnC,oBAAkB,IAAc,IAAgB,KAAA;EAHlD,UAAA;GAKG,KAAS,IACR,kBAAC,cAAD;IAAY,WAAW,EAAO;IAA9B,UAAA,CACE,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAvB,UAAA,CACG,IACC,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAW,EAAO;MAChC,UAAA;KACC,CAAA,IACF,MACH,IACC,kBAAC,KAAD;MAAG,IAAI;MAAe,WAAW,EAAO;MACrC,UAAA;KACA,CAAA,IACD,IACD;IACJ,CAAA,GAAA,IACC,kBAAC,OAAD;KAAK,WAAW,EAAO;KACrB,UAAA,kBAAC,UAAD;MACE,MAAK;MACL,WAAW,EAAO;MAClB,eAAe,EAAQ,IAAY,UAAU,OAAO;MACpD,iBAAe;MACf,iBAAe;MALjB,UAAA,CAOe,EAAZ,IAAa,IAA6C,GAA9C;OAAW,eAAY;OAAO,MAAM;MAAK,CAA0C,GAChG,kBAAC,QAAD,EAAA,UAAO,IAAY,UAAU,QAAc,CAAA,CACrC;;IACL,CAAA,IACH,IACM;GACV,CAAA,IAAA;GAEH;GAED,kBAAC,OAAD;IACE,IAAI;IACJ,WAAW,GAAG,EAAO,OAAO,IAAY,IAAI,EAAO,YAAY;IAE9D,UAAA,IAAU,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAQ,UAAA;IAAc,CAAA,IAAI,IAAY,IAAQ;GAC3E,CAAA;GAEJ,IAAW,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAW,UAAA;GAAY,CAAA,IAAI;EACtD;;AAEZ"}
1
+ {"version":3,"file":"ChartFrame.js","names":[],"sources":["../../../ui/shared/ChartFrame.tsx"],"sourcesContent":["\"use client\";\n\nimport { BarChart3, Table2 } from \"lucide-react\";\nimport { useId, useState, type ReactNode } from \"react\";\nimport styles from \"./ChartFrame.module.css\";\n\nexport interface ChartFrameProps {\n title?: string;\n description?: string;\n legend?: ReactNode;\n children: ReactNode;\n table?: ReactNode;\n footnote?: string;\n isEmpty?: boolean;\n emptyLabel?: string;\n isLoading?: boolean;\n className?: string;\n}\n\nexport function ChartFrame({\n title,\n description,\n legend,\n children,\n table,\n footnote,\n isEmpty = false,\n emptyLabel = \"No data for this range\",\n isLoading = false,\n className = \"\",\n}: ChartFrameProps) {\n const [view, setView] = useState<\"chart\" | \"table\">(\"chart\");\n const titleId = useId();\n const descriptionId = useId();\n const panelId = useId();\n const showTable = view === \"table\" && Boolean(table);\n const hasChrome = Boolean(title || description || table || footnote || legend);\n\n return (\n <figure\n className={`${hasChrome ? styles.frame : styles.flush} ${className}`.trim()}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n >\n {title || table ? (\n <figcaption className={styles.header}>\n <div className={styles.heading}>\n {title ? (\n <h3 id={titleId} className={styles.title}>\n {title}\n </h3>\n ) : null}\n {description ? (\n <p id={descriptionId} className={styles.description}>\n {description}\n </p>\n ) : null}\n </div>\n {table ? (\n <div className={styles.actions}>\n <button\n type=\"button\"\n className={styles.toggle}\n onClick={() => setView(showTable ? \"chart\" : \"table\")}\n aria-expanded={showTable}\n aria-controls={panelId}\n >\n {showTable ? <BarChart3 aria-hidden=\"true\" size={14} /> : <Table2 aria-hidden=\"true\" size={14} />}\n <span>{showTable ? \"Chart\" : \"Table\"}</span>\n </button>\n </div>\n ) : null}\n </figcaption>\n ) : null}\n\n {legend}\n\n <div\n id={panelId}\n className={`${styles.body}${isLoading ? ` ${styles.loading}` : \"\"}`}\n >\n {isEmpty ? <p className={styles.empty}>{emptyLabel}</p> : showTable ? table : children}\n </div>\n\n {footnote ? <p className={styles.footnote}>{footnote}</p> : null}\n </figure>\n );\n}\n"],"mappings":";;;;;;AAmBA,SAAgB,EAAW,EACzB,UACA,gBACA,WACA,aACA,UACA,aACA,aAAU,IACV,gBAAa,0BACb,eAAY,IACZ,eAAY,MACM;CAClB,IAAM,CAAC,GAAM,KAAW,EAA4B,OAAO,GACrD,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAU,EAAM,GAChB,IAAY,MAAS,WAAW,EAAQ;CAG9C,OACE,kBAAC,UAAD;EACE,WAAW,GAJW,KAAS,KAAe,KAAS,KAAY,IAIzC,EAAO,QAAQ,EAAO,MAAM,GAAG,IAAY,KAAK;EAC1E,mBAAiB,IAAQ,IAAU,KAAA;EACnC,oBAAkB,IAAc,IAAgB,KAAA;EAHlD,UAAA;GAKG,KAAS,IACR,kBAAC,cAAD;IAAY,WAAW,EAAO;IAA9B,UAAA,CACE,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAvB,UAAA,CACG,IACC,kBAAC,MAAD;MAAI,IAAI;MAAS,WAAW,EAAO;MAChC,UAAA;KACC,CAAA,IACF,MACH,IACC,kBAAC,KAAD;MAAG,IAAI;MAAe,WAAW,EAAO;MACrC,UAAA;KACA,CAAA,IACD,IACD;IACJ,CAAA,GAAA,IACC,kBAAC,OAAD;KAAK,WAAW,EAAO;KACrB,UAAA,kBAAC,UAAD;MACE,MAAK;MACL,WAAW,EAAO;MAClB,eAAe,EAAQ,IAAY,UAAU,OAAO;MACpD,iBAAe;MACf,iBAAe;MALjB,UAAA,CAOe,EAAZ,IAAa,IAA6C,GAA9C;OAAW,eAAY;OAAO,MAAM;MAAK,CAA0C,GAChG,kBAAC,QAAD,EAAA,UAAO,IAAY,UAAU,QAAc,CAAA,CACrC;;IACL,CAAA,IACH,IACM;GACV,CAAA,IAAA;GAEH;GAED,kBAAC,OAAD;IACE,IAAI;IACJ,WAAW,GAAG,EAAO,OAAO,IAAY,IAAI,EAAO,YAAY;IAE9D,UAAA,IAAU,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAQ,UAAA;IAAc,CAAA,IAAI,IAAY,IAAQ;GAC3E,CAAA;GAEJ,IAAW,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAW,UAAA;GAAY,CAAA,IAAI;EACtD;;AAEZ"}
@@ -1,4 +1,4 @@
1
- ._frame_ioq0h_1 {
1
+ ._frame_1gfzm_1 {
2
2
  display: grid;
3
3
  gap: var(--space-4);
4
4
  margin: 0;
@@ -13,7 +13,21 @@
13
13
  color: var(--text-primary);
14
14
  }
15
15
 
16
- ._header_ioq0h_16 {
16
+ ._flush_1gfzm_16 {
17
+ display: grid;
18
+ gap: var(--space-4);
19
+ margin: 0;
20
+ padding: 0;
21
+ width: 100%;
22
+ min-width: 0;
23
+ box-sizing: border-box;
24
+ border: 0;
25
+ background: transparent;
26
+ box-shadow: none;
27
+ color: var(--text-primary);
28
+ }
29
+
30
+ ._header_1gfzm_30 {
17
31
  display: flex;
18
32
  flex-wrap: wrap;
19
33
  align-items: flex-start;
@@ -22,13 +36,13 @@
22
36
  min-width: 0;
23
37
  }
24
38
 
25
- ._heading_ioq0h_25 {
39
+ ._heading_1gfzm_39 {
26
40
  display: grid;
27
41
  gap: var(--space-1);
28
42
  min-width: 0;
29
43
  }
30
44
 
31
- ._title_ioq0h_31 {
45
+ ._title_1gfzm_45 {
32
46
  margin: 0;
33
47
  font-family: var(--font-sans);
34
48
  font-size: var(--type-size-heading-sm);
@@ -37,7 +51,7 @@
37
51
  color: var(--text-primary);
38
52
  }
39
53
 
40
- ._description_ioq0h_40 {
54
+ ._description_1gfzm_54 {
41
55
  margin: 0;
42
56
  font-family: var(--font-sans);
43
57
  font-size: var(--type-size-caption);
@@ -45,13 +59,13 @@
45
59
  color: var(--text-secondary);
46
60
  }
47
61
 
48
- ._actions_ioq0h_48 {
62
+ ._actions_1gfzm_62 {
49
63
  display: flex;
50
64
  align-items: center;
51
65
  gap: var(--space-1);
52
66
  }
53
67
 
54
- ._toggle_ioq0h_54 {
68
+ ._toggle_1gfzm_68 {
55
69
  display: inline-flex;
56
70
  align-items: center;
57
71
  gap: var(--space-1);
@@ -69,27 +83,27 @@
69
83
  border-color var(--motion-interaction-duration) var(--motion-interaction-easing);
70
84
  }
71
85
 
72
- ._toggle_ioq0h_54:hover {
86
+ ._toggle_1gfzm_68:hover {
73
87
  border-color: var(--border-strong);
74
88
  color: var(--text-primary);
75
89
  }
76
90
 
77
- ._toggle_ioq0h_54:focus-visible {
91
+ ._toggle_1gfzm_68:focus-visible {
78
92
  outline: var(--border-focus-width) solid var(--focus-ring);
79
93
  outline-offset: var(--space-inset-2xs);
80
94
  }
81
95
 
82
- ._body_ioq0h_82 {
96
+ ._body_1gfzm_96 {
83
97
  min-width: 0;
84
98
  overflow: visible;
85
99
  }
86
100
 
87
- ._loading_ioq0h_87 {
101
+ ._loading_1gfzm_101 {
88
102
  opacity: 0.6;
89
103
  transition: opacity var(--motion-interaction-duration) var(--motion-interaction-easing);
90
104
  }
91
105
 
92
- ._empty_ioq0h_92 {
106
+ ._empty_1gfzm_106 {
93
107
  display: grid;
94
108
  place-items: center;
95
109
  min-height: 15rem;
@@ -101,14 +115,14 @@
101
115
  color: var(--text-muted);
102
116
  }
103
117
 
104
- ._footnote_ioq0h_104 {
118
+ ._footnote_1gfzm_118 {
105
119
  margin: 0;
106
120
  font-family: var(--font-sans);
107
121
  font-size: var(--type-size-caption);
108
122
  color: var(--text-muted);
109
123
  }
110
124
 
111
- ._legend_ioq0h_111 {
125
+ ._legend_1gfzm_125 {
112
126
  display: flex;
113
127
  flex-wrap: wrap;
114
128
  gap: var(--space-2) var(--space-4);
@@ -117,17 +131,17 @@
117
131
  list-style: none;
118
132
  }
119
133
 
120
- ._legendInteractive_ioq0h_120 > li {
134
+ ._legendInteractive_1gfzm_134 > li {
121
135
  display: contents;
122
136
  }
123
137
 
124
- ._legendVertical_ioq0h_124 {
138
+ ._legendVertical_1gfzm_138 {
125
139
  display: grid;
126
140
  gap: var(--space-2);
127
141
  align-content: center;
128
142
  }
129
143
 
130
- ._legendItem_ioq0h_130 {
144
+ ._legendItem_1gfzm_144 {
131
145
  display: inline-flex;
132
146
  align-items: center;
133
147
  gap: var(--space-1);
@@ -136,7 +150,7 @@
136
150
  color: var(--text-secondary);
137
151
  }
138
152
 
139
- ._legendVertical_ioq0h_124 ._legendItem_ioq0h_130 {
153
+ ._legendVertical_1gfzm_138 ._legendItem_1gfzm_144 {
140
154
  display: grid;
141
155
  grid-template-columns: auto 1fr auto;
142
156
  align-items: center;
@@ -144,7 +158,7 @@
144
158
  width: 100%;
145
159
  }
146
160
 
147
- ._legendButton_ioq0h_147 {
161
+ ._legendButton_1gfzm_161 {
148
162
  margin: 0;
149
163
  padding: 0;
150
164
  border: 0;
@@ -157,40 +171,40 @@
157
171
  transition: opacity 0.56s cubic-bezier(0.22, 1, 0.36, 1);
158
172
  }
159
173
 
160
- ._legendButton_ioq0h_147:focus-visible {
174
+ ._legendButton_1gfzm_161:focus-visible {
161
175
  outline: var(--border-focus-width) solid var(--focus-ring);
162
176
  outline-offset: var(--space-inset-2xs);
163
177
  }
164
178
 
165
- ._legendItemDimmed_ioq0h_165 {
179
+ ._legendItemDimmed_1gfzm_179 {
166
180
  opacity: 0.45;
167
181
  }
168
182
 
169
- ._legendSwatch_ioq0h_169 {
183
+ ._legendSwatch_1gfzm_183 {
170
184
  width: 0.625rem;
171
185
  height: 0.625rem;
172
186
  border-radius: var(--radius-control-sm);
173
187
  flex: none;
174
188
  }
175
189
 
176
- ._legendSwatchPill_ioq0h_176 {
190
+ ._legendSwatchPill_1gfzm_190 {
177
191
  width: 0.5rem;
178
192
  height: 0.375rem;
179
193
  border-radius: var(--radius-pill);
180
194
  }
181
195
 
182
- ._legendSwatchLine_ioq0h_182 {
196
+ ._legendSwatchLine_1gfzm_196 {
183
197
  width: 0.75rem;
184
198
  height: 0.156rem;
185
199
  border-radius: var(--radius-pill);
186
200
  }
187
201
 
188
- ._legendMeta_ioq0h_188 {
202
+ ._legendMeta_1gfzm_202 {
189
203
  color: var(--text-muted);
190
204
  font-variant-numeric: tabular-nums;
191
205
  }
192
206
 
193
- ._legendPercent_ioq0h_193 {
207
+ ._legendPercent_1gfzm_207 {
194
208
  color: var(--text-primary);
195
209
  font-variant-numeric: tabular-nums;
196
210
  font-weight: var(--type-weight-label);
@@ -198,16 +212,16 @@
198
212
  }
199
213
 
200
214
  @media (prefers-reduced-motion: reduce) {
201
- ._legendButton_ioq0h_147 {
215
+ ._legendButton_1gfzm_161 {
202
216
  transition: none;
203
217
  }
204
218
  }
205
219
 
206
- ._tableScroll_ioq0h_206 {
220
+ ._tableScroll_1gfzm_220 {
207
221
  overflow-x: auto;
208
222
  }
209
223
 
210
- ._table_ioq0h_206 {
224
+ ._table_1gfzm_220 {
211
225
  width: 100%;
212
226
  border-collapse: collapse;
213
227
  font-family: var(--font-sans);
@@ -215,33 +229,33 @@
215
229
  line-height: var(--type-line-body);
216
230
  }
217
231
 
218
- ._table_ioq0h_206 th,
219
- ._table_ioq0h_206 td {
232
+ ._table_1gfzm_220 th,
233
+ ._table_1gfzm_220 td {
220
234
  padding: var(--space-1) var(--space-2);
221
235
  border-bottom: var(--border-width-thin) solid var(--border-faint);
222
236
  text-align: start;
223
237
  background-color: var(--surface-card);
224
238
  }
225
239
 
226
- ._table_ioq0h_206 thead th {
240
+ ._table_1gfzm_220 thead th {
227
241
  color: var(--text-secondary);
228
242
  font-size: var(--type-size-caption);
229
243
  font-weight: var(--type-weight-label);
230
244
  white-space: nowrap;
231
245
  }
232
246
 
233
- ._table_ioq0h_206 tbody th {
247
+ ._table_1gfzm_220 tbody th {
234
248
  color: var(--text-primary);
235
249
  font-weight: var(--type-weight-label);
236
250
  }
237
251
 
238
- ._table_ioq0h_206 td {
252
+ ._table_1gfzm_220 td {
239
253
  color: var(--text-primary);
240
254
  font-variant-numeric: tabular-nums;
241
255
  text-align: end;
242
256
  }
243
257
 
244
- ._tooltip_ioq0h_244 {
258
+ ._tooltip_1gfzm_258 {
245
259
  position: absolute;
246
260
  z-index: var(--z-tooltip);
247
261
  min-width: 9.5rem;
@@ -256,18 +270,18 @@
256
270
  transform: translate(0.5rem, -50%);
257
271
  }
258
272
 
259
- ._tooltipFlip_ioq0h_259 {
273
+ ._tooltipFlip_1gfzm_273 {
260
274
  transform: translate(calc(-100% - 0.5rem), -50%);
261
275
  }
262
276
 
263
- ._tooltipTitle_ioq0h_263 {
277
+ ._tooltipTitle_1gfzm_277 {
264
278
  margin: 0;
265
279
  font-size: var(--type-size-caption);
266
280
  font-weight: var(--type-weight-label);
267
281
  color: var(--text-primary);
268
282
  }
269
283
 
270
- ._tooltipRow_ioq0h_270 {
284
+ ._tooltipRow_1gfzm_284 {
271
285
  display: flex;
272
286
  align-items: center;
273
287
  gap: var(--space-2);
@@ -276,19 +290,19 @@
276
290
  color: var(--text-secondary);
277
291
  }
278
292
 
279
- ._tooltipKey_ioq0h_279 {
293
+ ._tooltipKey_1gfzm_293 {
280
294
  width: 0.5rem;
281
295
  height: 0.375rem;
282
296
  border-radius: var(--radius-pill);
283
297
  flex: none;
284
298
  }
285
299
 
286
- ._tooltipShare_ioq0h_286 {
300
+ ._tooltipShare_1gfzm_300 {
287
301
  flex: 1;
288
302
  min-width: 0;
289
303
  }
290
304
 
291
- ._tooltipValue_ioq0h_291 {
305
+ ._tooltipValue_1gfzm_305 {
292
306
  color: var(--text-primary);
293
307
  font-variant-numeric: tabular-nums;
294
308
  font-weight: var(--type-weight-label);
@@ -1,39 +1,40 @@
1
1
  import "./ChartFrame.kit.css";
2
2
  //#region ui/shared/ChartFrame.module.css
3
- var e = "_frame_ioq0h_1", t = "_header_ioq0h_16", n = "_heading_ioq0h_25", r = "_title_ioq0h_31", i = "_description_ioq0h_40", a = "_actions_ioq0h_48", o = "_toggle_ioq0h_54", s = "_body_ioq0h_82", c = "_loading_ioq0h_87", l = "_empty_ioq0h_92", u = "_footnote_ioq0h_104", d = "_legend_ioq0h_111", f = "_legendInteractive_ioq0h_120", p = "_legendVertical_ioq0h_124", m = "_legendItem_ioq0h_130", h = "_legendButton_ioq0h_147", g = "_legendItemDimmed_ioq0h_165", _ = "_legendSwatch_ioq0h_169", v = "_legendSwatchPill_ioq0h_176", y = "_legendSwatchLine_ioq0h_182", b = "_legendMeta_ioq0h_188", x = "_legendPercent_ioq0h_193", S = "_tableScroll_ioq0h_206", C = "_table_ioq0h_206", w = "_tooltip_ioq0h_244", T = "_tooltipFlip_ioq0h_259", E = "_tooltipTitle_ioq0h_263", D = "_tooltipRow_ioq0h_270", O = "_tooltipKey_ioq0h_279", k = "_tooltipShare_ioq0h_286", A = "_tooltipValue_ioq0h_291", j = {
3
+ var e = "_frame_1gfzm_1", t = "_flush_1gfzm_16", n = "_header_1gfzm_30", r = "_heading_1gfzm_39", i = "_title_1gfzm_45", a = "_description_1gfzm_54", o = "_actions_1gfzm_62", s = "_toggle_1gfzm_68", c = "_body_1gfzm_96", l = "_loading_1gfzm_101", u = "_empty_1gfzm_106", d = "_footnote_1gfzm_118", f = "_legend_1gfzm_125", p = "_legendInteractive_1gfzm_134", m = "_legendVertical_1gfzm_138", h = "_legendItem_1gfzm_144", g = "_legendButton_1gfzm_161", _ = "_legendItemDimmed_1gfzm_179", v = "_legendSwatch_1gfzm_183", y = "_legendSwatchPill_1gfzm_190", b = "_legendSwatchLine_1gfzm_196", x = "_legendMeta_1gfzm_202", S = "_legendPercent_1gfzm_207", C = "_tableScroll_1gfzm_220", w = "_table_1gfzm_220", T = "_tooltip_1gfzm_258", E = "_tooltipFlip_1gfzm_273", D = "_tooltipTitle_1gfzm_277", O = "_tooltipRow_1gfzm_284", k = "_tooltipKey_1gfzm_293", A = "_tooltipShare_1gfzm_300", j = "_tooltipValue_1gfzm_305", M = {
4
4
  frame: e,
5
- header: t,
6
- heading: n,
7
- title: r,
8
- description: i,
9
- actions: a,
10
- toggle: o,
11
- body: s,
12
- loading: c,
13
- empty: l,
14
- footnote: u,
15
- legend: d,
16
- legendInteractive: f,
17
- legendVertical: p,
18
- legendItem: m,
19
- legendButton: h,
20
- legendItemDimmed: g,
21
- legendSwatch: _,
22
- legendSwatchPill: v,
23
- legendSwatchLine: y,
24
- legendMeta: b,
25
- legendPercent: x,
26
- tableScroll: S,
27
- table: C,
28
- tooltip: w,
29
- tooltipFlip: T,
30
- tooltipTitle: E,
31
- tooltipRow: D,
32
- tooltipKey: O,
33
- tooltipShare: k,
34
- tooltipValue: A
5
+ flush: t,
6
+ header: n,
7
+ heading: r,
8
+ title: i,
9
+ description: a,
10
+ actions: o,
11
+ toggle: s,
12
+ body: c,
13
+ loading: l,
14
+ empty: u,
15
+ footnote: d,
16
+ legend: f,
17
+ legendInteractive: p,
18
+ legendVertical: m,
19
+ legendItem: h,
20
+ legendButton: g,
21
+ legendItemDimmed: _,
22
+ legendSwatch: v,
23
+ legendSwatchPill: y,
24
+ legendSwatchLine: b,
25
+ legendMeta: x,
26
+ legendPercent: S,
27
+ tableScroll: C,
28
+ table: w,
29
+ tooltip: T,
30
+ tooltipFlip: E,
31
+ tooltipTitle: D,
32
+ tooltipRow: O,
33
+ tooltipKey: k,
34
+ tooltipShare: A,
35
+ tooltipValue: j
35
36
  };
36
37
  //#endregion
37
- export { a as actions, s as body, j as default, i as description, l as empty, u as footnote, e as frame, t as header, n as heading, d as legend, h as legendButton, f as legendInteractive, m as legendItem, g as legendItemDimmed, b as legendMeta, x as legendPercent, _ as legendSwatch, y as legendSwatchLine, v as legendSwatchPill, p as legendVertical, c as loading, C as table, S as tableScroll, r as title, o as toggle, w as tooltip, T as tooltipFlip, O as tooltipKey, D as tooltipRow, k as tooltipShare, E as tooltipTitle, A as tooltipValue };
38
+ export { o as actions, c as body, M as default, a as description, u as empty, t as flush, d as footnote, e as frame, n as header, r as heading, f as legend, g as legendButton, p as legendInteractive, h as legendItem, _ as legendItemDimmed, x as legendMeta, S as legendPercent, v as legendSwatch, b as legendSwatchLine, y as legendSwatchPill, m as legendVertical, l as loading, w as table, C as tableScroll, i as title, s as toggle, T as tooltip, E as tooltipFlip, k as tooltipKey, O as tooltipRow, A as tooltipShare, D as tooltipTitle, j as tooltipValue };
38
39
 
39
40
  //# sourceMappingURL=ChartFrame.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartFrame.module.js","names":[],"sources":["../../../ui/shared/ChartFrame.module.css"],"sourcesContent":[".frame {\n display: grid;\n gap: var(--space-4);\n margin: 0;\n padding: var(--space-6);\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-surface-md);\n background: var(--surface-card);\n box-shadow: var(--shadow-sm);\n color: var(--text-primary);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.heading {\n display: grid;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-heading-sm);\n font-weight: var(--type-weight-heading);\n line-height: var(--type-line-heading);\n color: var(--text-primary);\n}\n\n.description {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n line-height: var(--type-line-body);\n color: var(--text-secondary);\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n padding: var(--space-1) var(--space-2);\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-control-sm);\n background: var(--surface-card);\n color: var(--text-secondary);\n cursor: pointer;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n transition:\n color var(--motion-interaction-duration) var(--motion-interaction-easing),\n border-color var(--motion-interaction-duration) var(--motion-interaction-easing);\n}\n\n.toggle:hover {\n border-color: var(--border-strong);\n color: var(--text-primary);\n}\n\n.toggle:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n}\n\n.body {\n min-width: 0;\n overflow: visible;\n}\n\n.loading {\n opacity: 0.6;\n transition: opacity var(--motion-interaction-duration) var(--motion-interaction-easing);\n}\n\n.empty {\n display: grid;\n place-items: center;\n min-height: 15rem;\n margin: 0;\n padding-inline: var(--space-4);\n text-align: center;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n color: var(--text-muted);\n}\n\n.footnote {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n color: var(--text-muted);\n}\n\n.legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2) var(--space-4);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.legendInteractive > li {\n display: contents;\n}\n\n.legendVertical {\n display: grid;\n gap: var(--space-2);\n align-content: center;\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n color: var(--text-secondary);\n}\n\n.legendVertical .legendItem {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n column-gap: var(--space-2);\n width: 100%;\n}\n\n.legendButton {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n color: inherit;\n text-align: inherit;\n cursor: pointer;\n border-radius: var(--radius-control-sm);\n transition: opacity 0.56s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.legendButton:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n}\n\n.legendItemDimmed {\n opacity: 0.45;\n}\n\n.legendSwatch {\n width: 0.625rem;\n height: 0.625rem;\n border-radius: var(--radius-control-sm);\n flex: none;\n}\n\n.legendSwatchPill {\n width: 0.5rem;\n height: 0.375rem;\n border-radius: var(--radius-pill);\n}\n\n.legendSwatchLine {\n width: 0.75rem;\n height: 0.156rem;\n border-radius: var(--radius-pill);\n}\n\n.legendMeta {\n color: var(--text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n.legendPercent {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n font-weight: var(--type-weight-label);\n text-align: end;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .legendButton {\n transition: none;\n }\n}\n\n.tableScroll {\n overflow-x: auto;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n line-height: var(--type-line-body);\n}\n\n.table th,\n.table td {\n padding: var(--space-1) var(--space-2);\n border-bottom: var(--border-width-thin) solid var(--border-faint);\n text-align: start;\n background-color: var(--surface-card);\n}\n\n.table thead th {\n color: var(--text-secondary);\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n white-space: nowrap;\n}\n\n.table tbody th {\n color: var(--text-primary);\n font-weight: var(--type-weight-label);\n}\n\n.table td {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n text-align: end;\n}\n\n.tooltip {\n position: absolute;\n z-index: var(--z-tooltip);\n min-width: 9.5rem;\n padding: var(--space-2) var(--space-3);\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-surface-md);\n background: var(--surface-card);\n box-shadow: var(--shadow-md);\n color: var(--text-primary);\n font-family: var(--font-sans);\n pointer-events: none;\n transform: translate(0.5rem, -50%);\n}\n\n.tooltipFlip {\n transform: translate(calc(-100% - 0.5rem), -50%);\n}\n\n.tooltipTitle {\n margin: 0;\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n color: var(--text-primary);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin-top: var(--space-1);\n font-size: var(--type-size-caption);\n color: var(--text-secondary);\n}\n\n.tooltipKey {\n width: 0.5rem;\n height: 0.375rem;\n border-radius: var(--radius-pill);\n flex: none;\n}\n\n.tooltipShare {\n flex: 1;\n min-width: 0;\n}\n\n.tooltipValue {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n font-weight: var(--type-weight-label);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ChartFrame.module.js","names":[],"sources":["../../../ui/shared/ChartFrame.module.css"],"sourcesContent":[".frame {\n display: grid;\n gap: var(--space-4);\n margin: 0;\n padding: var(--space-6);\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-surface-md);\n background: var(--surface-card);\n box-shadow: var(--shadow-sm);\n color: var(--text-primary);\n}\n\n.flush {\n display: grid;\n gap: var(--space-4);\n margin: 0;\n padding: 0;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n background: transparent;\n box-shadow: none;\n color: var(--text-primary);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.heading {\n display: grid;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-heading-sm);\n font-weight: var(--type-weight-heading);\n line-height: var(--type-line-heading);\n color: var(--text-primary);\n}\n\n.description {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n line-height: var(--type-line-body);\n color: var(--text-secondary);\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.toggle {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n padding: var(--space-1) var(--space-2);\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-control-sm);\n background: var(--surface-card);\n color: var(--text-secondary);\n cursor: pointer;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n transition:\n color var(--motion-interaction-duration) var(--motion-interaction-easing),\n border-color var(--motion-interaction-duration) var(--motion-interaction-easing);\n}\n\n.toggle:hover {\n border-color: var(--border-strong);\n color: var(--text-primary);\n}\n\n.toggle:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n}\n\n.body {\n min-width: 0;\n overflow: visible;\n}\n\n.loading {\n opacity: 0.6;\n transition: opacity var(--motion-interaction-duration) var(--motion-interaction-easing);\n}\n\n.empty {\n display: grid;\n place-items: center;\n min-height: 15rem;\n margin: 0;\n padding-inline: var(--space-4);\n text-align: center;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n color: var(--text-muted);\n}\n\n.footnote {\n margin: 0;\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n color: var(--text-muted);\n}\n\n.legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2) var(--space-4);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.legendInteractive > li {\n display: contents;\n}\n\n.legendVertical {\n display: grid;\n gap: var(--space-2);\n align-content: center;\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n font-family: var(--font-sans);\n font-size: var(--type-size-caption);\n color: var(--text-secondary);\n}\n\n.legendVertical .legendItem {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n column-gap: var(--space-2);\n width: 100%;\n}\n\n.legendButton {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n color: inherit;\n text-align: inherit;\n cursor: pointer;\n border-radius: var(--radius-control-sm);\n transition: opacity 0.56s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.legendButton:focus-visible {\n outline: var(--border-focus-width) solid var(--focus-ring);\n outline-offset: var(--space-inset-2xs);\n}\n\n.legendItemDimmed {\n opacity: 0.45;\n}\n\n.legendSwatch {\n width: 0.625rem;\n height: 0.625rem;\n border-radius: var(--radius-control-sm);\n flex: none;\n}\n\n.legendSwatchPill {\n width: 0.5rem;\n height: 0.375rem;\n border-radius: var(--radius-pill);\n}\n\n.legendSwatchLine {\n width: 0.75rem;\n height: 0.156rem;\n border-radius: var(--radius-pill);\n}\n\n.legendMeta {\n color: var(--text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n.legendPercent {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n font-weight: var(--type-weight-label);\n text-align: end;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .legendButton {\n transition: none;\n }\n}\n\n.tableScroll {\n overflow-x: auto;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-sans);\n font-size: var(--type-size-body-sm);\n line-height: var(--type-line-body);\n}\n\n.table th,\n.table td {\n padding: var(--space-1) var(--space-2);\n border-bottom: var(--border-width-thin) solid var(--border-faint);\n text-align: start;\n background-color: var(--surface-card);\n}\n\n.table thead th {\n color: var(--text-secondary);\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n white-space: nowrap;\n}\n\n.table tbody th {\n color: var(--text-primary);\n font-weight: var(--type-weight-label);\n}\n\n.table td {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n text-align: end;\n}\n\n.tooltip {\n position: absolute;\n z-index: var(--z-tooltip);\n min-width: 9.5rem;\n padding: var(--space-2) var(--space-3);\n border: var(--border-width-thin) solid var(--border-faint);\n border-radius: var(--radius-surface-md);\n background: var(--surface-card);\n box-shadow: var(--shadow-md);\n color: var(--text-primary);\n font-family: var(--font-sans);\n pointer-events: none;\n transform: translate(0.5rem, -50%);\n}\n\n.tooltipFlip {\n transform: translate(calc(-100% - 0.5rem), -50%);\n}\n\n.tooltipTitle {\n margin: 0;\n font-size: var(--type-size-caption);\n font-weight: var(--type-weight-label);\n color: var(--text-primary);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin-top: var(--space-1);\n font-size: var(--type-size-caption);\n color: var(--text-secondary);\n}\n\n.tooltipKey {\n width: 0.5rem;\n height: 0.375rem;\n border-radius: var(--radius-pill);\n flex: none;\n}\n\n.tooltipShare {\n flex: 1;\n min-width: 0;\n}\n\n.tooltipValue {\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n font-weight: var(--type-weight-label);\n}\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-ds-kit",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Code-only agentic design system: contracts, tokens, and React components.",
5
5
  "license": "MIT",
6
6
  "repository": {