@arbor-education/design-system.components 0.16.1 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.gather/instructions/project-overview.md +0 -4
  2. package/.gather/skills/aroo-hunni/SKILL.md +58 -0
  3. package/CHANGELOG.md +31 -0
  4. package/CONTRIBUTING.md +1 -0
  5. package/dist/components/arborLogo/ArborLogo.d.ts +9 -0
  6. package/dist/components/arborLogo/ArborLogo.d.ts.map +1 -0
  7. package/dist/components/arborLogo/ArborLogo.js +17 -0
  8. package/dist/components/arborLogo/ArborLogo.js.map +1 -0
  9. package/dist/components/arborLogo/ArborLogo.stories.d.ts +94 -0
  10. package/dist/components/arborLogo/ArborLogo.stories.d.ts.map +1 -0
  11. package/dist/components/arborLogo/ArborLogo.stories.js +418 -0
  12. package/dist/components/arborLogo/ArborLogo.stories.js.map +1 -0
  13. package/dist/components/arborLogo/ArborLogo.test.d.ts +2 -0
  14. package/dist/components/arborLogo/ArborLogo.test.d.ts.map +1 -0
  15. package/dist/components/arborLogo/ArborLogo.test.js +32 -0
  16. package/dist/components/arborLogo/ArborLogo.test.js.map +1 -0
  17. package/dist/components/dataViewCard/DataViewCard.d.ts +19 -0
  18. package/dist/components/dataViewCard/DataViewCard.d.ts.map +1 -0
  19. package/dist/components/dataViewCard/DataViewCard.js +13 -0
  20. package/dist/components/dataViewCard/DataViewCard.js.map +1 -0
  21. package/dist/components/dataViewCard/DataViewCard.stories.d.ts +100 -0
  22. package/dist/components/dataViewCard/DataViewCard.stories.d.ts.map +1 -0
  23. package/dist/components/dataViewCard/DataViewCard.stories.js +317 -0
  24. package/dist/components/dataViewCard/DataViewCard.stories.js.map +1 -0
  25. package/dist/components/dataViewCard/DataViewCard.test.d.ts +2 -0
  26. package/dist/components/dataViewCard/DataViewCard.test.d.ts.map +1 -0
  27. package/dist/components/dataViewCard/DataViewCard.test.js +67 -0
  28. package/dist/components/dataViewCard/DataViewCard.test.js.map +1 -0
  29. package/dist/components/row/Row.d.ts +2 -1
  30. package/dist/components/row/Row.d.ts.map +1 -1
  31. package/dist/components/row/Row.js +2 -2
  32. package/dist/components/row/Row.js.map +1 -1
  33. package/dist/components/treeRow/TreeRow.d.ts +32 -0
  34. package/dist/components/treeRow/TreeRow.d.ts.map +1 -0
  35. package/dist/components/treeRow/TreeRow.js +19 -0
  36. package/dist/components/treeRow/TreeRow.js.map +1 -0
  37. package/dist/components/treeRow/TreeRow.stories.d.ts +13 -0
  38. package/dist/components/treeRow/TreeRow.stories.d.ts.map +1 -0
  39. package/dist/components/treeRow/TreeRow.stories.js +774 -0
  40. package/dist/components/treeRow/TreeRow.stories.js.map +1 -0
  41. package/dist/components/treeRow/TreeRow.test.d.ts +2 -0
  42. package/dist/components/treeRow/TreeRow.test.d.ts.map +1 -0
  43. package/dist/components/treeRow/TreeRow.test.js +262 -0
  44. package/dist/components/treeRow/TreeRow.test.js.map +1 -0
  45. package/dist/components/treeRow/TreeRowSection.d.ts +12 -0
  46. package/dist/components/treeRow/TreeRowSection.d.ts.map +1 -0
  47. package/dist/components/treeRow/TreeRowSection.js +20 -0
  48. package/dist/components/treeRow/TreeRowSection.js.map +1 -0
  49. package/dist/index.css +146 -1
  50. package/dist/index.css.map +1 -1
  51. package/dist/index.d.ts +4 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +4 -1
  54. package/dist/index.js.map +1 -1
  55. package/package.json +2 -1
  56. package/src/components/arborLogo/ArborLogo.stories.tsx +663 -0
  57. package/src/components/arborLogo/ArborLogo.test.tsx +36 -0
  58. package/src/components/arborLogo/ArborLogo.tsx +92 -0
  59. package/src/components/arborLogo/__snapshots__/ArborLogo.test.tsx.snap +424 -0
  60. package/src/components/dataViewCard/DataViewCard.stories.tsx +464 -0
  61. package/src/components/dataViewCard/DataViewCard.test.tsx +127 -0
  62. package/src/components/dataViewCard/DataViewCard.tsx +62 -0
  63. package/src/components/dataViewCard/dataViewCard.scss +25 -0
  64. package/src/components/row/Row.tsx +4 -1
  65. package/src/components/row/row.scss +9 -1
  66. package/src/components/treeRow/TreeRow.stories.tsx +870 -0
  67. package/src/components/treeRow/TreeRow.test.tsx +371 -0
  68. package/src/components/treeRow/TreeRow.tsx +85 -0
  69. package/src/components/treeRow/TreeRowSection.tsx +56 -0
  70. package/src/components/treeRow/treeRow.scss +134 -0
  71. package/src/docs/Contributing.mdx +1 -0
  72. package/src/index.scss +2 -0
  73. package/src/index.ts +4 -1
@@ -0,0 +1,418 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Controls, Heading as DocHeading, Markdown, Primary as DocPrimary, Stories, Subtitle, Title, } from '@storybook/addon-docs/blocks';
3
+ import { ArborLogo } from './ArborLogo';
4
+ const DESCRIPTION_INTRO = `
5
+ ArborLogo renders the Arbor Education brand mark as an inline SVG with a built-in \`<title>\` element for accessibility.
6
+
7
+ Reach for it whenever the Arbor identity needs to appear on screen — application headers, login and splash screens, homepage links, email and report headers, and any dark hero panel that calls for the white wordmark variant.
8
+ `.trim();
9
+ const USAGE_GUIDANCE = `
10
+ ### When to use
11
+
12
+ - **Application headers** — the icon-only mark fits compact top-nav bars and rails where horizontal space is precious.
13
+ - **Login, onboarding, and splash screens** — the full wordmark establishes brand context the moment a user lands.
14
+ - **Homepage links** — wrap the logo in an anchor and pass \`aria-label="Arbor home"\` so assistive tech announces the destination clearly.
15
+ - **Email and report headers** — the dark wordmark on a light background is the canonical lockup for printed and emailed artefacts.
16
+ - **Dark hero panels and sidebars** — switch to \`textColor="white"\` so the wordmark stays legible.
17
+
18
+ ---
19
+
20
+ ### When NOT to use
21
+
22
+ | Scenario | Use instead |
23
+ |---|---|
24
+ | Generic decorative iconography | [\`Icon\`](?path=/docs/components-icon--docs) |
25
+ | Arbitrary image asset | A plain \`<img>\` with the hosted asset URL |
26
+ | A school's crest or logo | A separate, school-supplied image — ArborLogo is the *Arbor Education* mark only |
27
+ | Repeating decorative flourish where any abstract shape would do | Don't dilute the brand — pick a neutral shape or pattern instead |
28
+ `.trim();
29
+ const DEVELOPER_NOTES = `
30
+ ### Critical usage patterns
31
+
32
+ **\`textColor\` is silently ignored when \`showText\` is falsy.** The icon-only mark uses fixed brand colours that cannot be customised — \`textColor\` only affects the wordmark.
33
+
34
+ **\`aria-label\` becomes the \`<title>\` text, not an \`aria-label\` attribute.** If you inspect the DOM you'll find \`aria-labelledby="..."\` pointing to a \`<title>\` element, not \`aria-label="..."\` on the SVG itself. The two are functionally equivalent for screen readers but visually different in DevTools.
35
+
36
+ **\`aria-hidden\` strips ALL accessibility attributes.** When set, the SVG drops \`role\`, \`aria-labelledby\`, and the inner \`<title>\` element entirely — and any \`aria-label\` you pass is silently ignored. Don't combine the two.
37
+
38
+ **The "black" wordmark is \`#2F2F2F\`, not pure black.** That's a brand decision, equivalent to \`--color-grey-900\`. If a designer asks why it isn't \`#000\`, that's the answer.
39
+
40
+ **SVG dimensions are hardcoded.** The icon-only variant is 25×25 px and the full logo is 66×26 px. To resize, apply CSS via \`className\` (for example \`width: 120px; height: auto\`). Setting width without \`height: auto\` distorts the aspect ratio. There are no \`width\` or \`height\` props.
41
+
42
+ **Multiple ArborLogos on one page won't clash.** Internal \`<clipPath>\` and \`<title>\` IDs are generated with React's \`useId()\`, so duplicate instances stay isolated.
43
+
44
+ ---
45
+
46
+ ### Accessibility
47
+
48
+ - By default the SVG has \`role="img"\` and the inner \`<title>\` provides the accessible name (\`"Arbor"\` unless overridden).
49
+ - For brand context override, pass \`aria-label\` — for example \`aria-label="Arbor home"\` when the logo links to the homepage.
50
+ - For decorative use alongside visible "Arbor" text, pass \`aria-hidden\` so screen readers don't announce the brand twice.
51
+ - Never combine \`aria-label\` and \`aria-hidden\` — \`aria-label\` is ignored when the SVG is hidden.
52
+
53
+ ---
54
+
55
+ ### TypeScript types
56
+
57
+ \`\`\`ts
58
+ import type { ArborLogoProps } from '@arbor-education/design-system.components';
59
+ \`\`\`
60
+
61
+ | Prop | Type | Default |
62
+ |---|---|---|
63
+ | \`showText\` | \`boolean\` | \`undefined\` (icon-only) |
64
+ | \`textColor\` | \`'white' \\| 'black'\` | \`'black'\` |
65
+ | \`aria-label\` | \`string\` | \`'Arbor'\` |
66
+ | \`aria-hidden\` | \`boolean\` | \`undefined\` |
67
+ | \`className\` | \`string\` | \`undefined\` |
68
+ `.trim();
69
+ const RELATED_COMPONENTS = `
70
+ ## Related components
71
+
72
+ [Icon](?path=/docs/components-icon--docs)
73
+ `.trim();
74
+ const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
75
+ function ArborLogoDocsPage() {
76
+ return (_jsxs(_Fragment, { children: [_jsx(Title, {}), _jsx(Subtitle, {}), _jsx(Markdown, { children: DESCRIPTION_INTRO }), _jsx(DocHeading, { children: "Interactive example" }), _jsx(Markdown, { children: PROPS_INTRO }), _jsx(DocPrimary, {}), _jsx(Controls, {}), _jsx(DocHeading, { children: "Usage guidance" }), _jsx(Markdown, { children: USAGE_GUIDANCE }), _jsx(DocHeading, { children: "Developer notes" }), _jsx(Markdown, { children: DEVELOPER_NOTES }), _jsx(DocHeading, { children: "Examples" }), _jsx(Stories, { title: "" }), _jsx(Markdown, { children: RELATED_COMPONENTS })] }));
77
+ }
78
+ const meta = {
79
+ title: 'Components/ArborLogo',
80
+ component: ArborLogo,
81
+ tags: ['autodocs'],
82
+ parameters: {
83
+ layout: 'padded',
84
+ docs: {
85
+ page: ArborLogoDocsPage,
86
+ },
87
+ },
88
+ argTypes: {
89
+ 'showText': {
90
+ description: 'When true, renders the full 66×26 px logo with wordmark. When falsy, renders the 25×25 px icon-only mark.',
91
+ control: { type: 'boolean' },
92
+ table: {
93
+ type: { summary: 'boolean' },
94
+ defaultValue: { summary: 'undefined' },
95
+ },
96
+ },
97
+ 'textColor': {
98
+ description: 'Wordmark colour. Only takes effect when `showText` is true. The "black" value renders as `#2F2F2F` (equivalent to `--color-grey-900`).',
99
+ control: { type: 'radio' },
100
+ options: ['white', 'black'],
101
+ table: {
102
+ type: { summary: '\'white\' | \'black\'' },
103
+ defaultValue: { summary: '\'black\'' },
104
+ },
105
+ },
106
+ 'aria-label': {
107
+ description: 'Accessible name. Rendered as the SVG\'s inner `<title>` text and referenced via `aria-labelledby`. Ignored when `aria-hidden` is set.',
108
+ control: { type: 'text' },
109
+ table: {
110
+ type: { summary: 'string' },
111
+ defaultValue: { summary: '\'Arbor\'' },
112
+ },
113
+ },
114
+ 'aria-hidden': {
115
+ description: 'When truthy, marks the SVG as decorative — strips `role`, `aria-labelledby`, and the inner `<title>`. Use when adjacent visible text already conveys the brand name.',
116
+ control: { type: 'boolean' },
117
+ table: {
118
+ type: { summary: 'boolean' },
119
+ defaultValue: { summary: 'undefined' },
120
+ },
121
+ },
122
+ 'className': {
123
+ description: 'Class applied to the root SVG. Use this to resize via CSS (for example `width: 120px; height: auto`) — there are no width/height props.',
124
+ control: { type: 'text' },
125
+ table: {
126
+ type: { summary: 'string' },
127
+ },
128
+ },
129
+ },
130
+ };
131
+ export default meta;
132
+ const withDescription = (story, description) => ({
133
+ ...story,
134
+ parameters: {
135
+ ...story.parameters,
136
+ docs: {
137
+ ...story.parameters?.docs,
138
+ description: {
139
+ story: description,
140
+ },
141
+ },
142
+ },
143
+ });
144
+ export const Default = withDescription({
145
+ args: {
146
+ 'showText': true,
147
+ 'textColor': 'black',
148
+ 'aria-label': 'Arbor',
149
+ 'aria-hidden': false,
150
+ },
151
+ decorators: [
152
+ (StoryFn, context) => {
153
+ const isDark = context.args.textColor === 'white';
154
+ return (_jsx("div", { style: {
155
+ alignItems: 'center',
156
+ backgroundColor: isDark
157
+ ? 'var(--color-grey-800)'
158
+ : 'var(--color-grey-050)',
159
+ borderRadius: 'var(--border-radius-xsmall)',
160
+ display: 'flex',
161
+ justifyContent: 'center',
162
+ padding: 'var(--spacing-xlarge)',
163
+ }, children: _jsx(StoryFn, {}) }));
164
+ },
165
+ ],
166
+ render: args => _jsx(ArborLogo, { ...args }),
167
+ }, 'Interactive playground. Toggle `showText` to switch between the icon-only mark and the full wordmark, then flip `textColor` — the wrapper background swaps automatically so the white variant stays visible.');
168
+ export const IconOnly = withDescription({
169
+ parameters: {
170
+ controls: { disable: true },
171
+ docs: {
172
+ source: {
173
+ language: 'tsx',
174
+ code: `
175
+ import { ArborLogo } from '@arbor-education/design-system.components';
176
+
177
+ function ArborLogoIconOnlyExample() {
178
+ return <ArborLogo aria-label="Arbor" />;
179
+ }
180
+ export default ArborLogoIconOnlyExample;
181
+ `.trim(),
182
+ },
183
+ },
184
+ },
185
+ render: () => (_jsx("div", { style: {
186
+ alignItems: 'center',
187
+ backgroundColor: 'var(--color-grey-050)',
188
+ borderRadius: 'var(--border-radius-xsmall)',
189
+ display: 'flex',
190
+ justifyContent: 'center',
191
+ padding: 'var(--spacing-xlarge)',
192
+ }, children: _jsx(ArborLogo, { "aria-label": "Arbor" }) })),
193
+ }, 'The 25×25 px icon-only mark. Reach for this in compact spaces — top-nav rails, app icons, favourited shortcuts — where the wordmark would crowd the layout.');
194
+ export const WithWordmark = withDescription({
195
+ parameters: {
196
+ controls: { disable: true },
197
+ docs: {
198
+ source: {
199
+ language: 'tsx',
200
+ code: `
201
+ import { ArborLogo } from '@arbor-education/design-system.components';
202
+
203
+ function ArborLogoWithWordmarkExample() {
204
+ return <ArborLogo showText aria-label="Arbor" />;
205
+ }
206
+ export default ArborLogoWithWordmarkExample;
207
+ `.trim(),
208
+ },
209
+ },
210
+ },
211
+ render: () => (_jsx("div", { style: {
212
+ alignItems: 'center',
213
+ backgroundColor: 'var(--color-grey-050)',
214
+ borderRadius: 'var(--border-radius-xsmall)',
215
+ display: 'flex',
216
+ justifyContent: 'center',
217
+ padding: 'var(--spacing-xlarge)',
218
+ }, children: _jsx(ArborLogo, { showText: true, "aria-label": "Arbor" }) })),
219
+ }, 'The canonical brand lockup — full 66×26 px logo with the dark `#2F2F2F` wordmark on a light surface. Use this for login screens, email headers, and printed reports.');
220
+ const WhiteWordmarkTemplate = () => (_jsxs("div", { style: {
221
+ display: 'flex',
222
+ flexDirection: 'column',
223
+ gap: 'var(--spacing-large)',
224
+ }, children: [_jsx("div", { style: {
225
+ alignItems: 'center',
226
+ backgroundColor: 'var(--color-grey-800)',
227
+ borderRadius: 'var(--border-radius-xsmall)',
228
+ display: 'flex',
229
+ justifyContent: 'center',
230
+ padding: 'var(--spacing-xlarge)',
231
+ }, children: _jsx(ArborLogo, { showText: true, textColor: "white", "aria-label": "Arbor" }) }), _jsx("span", { className: "ds-text", style: {
232
+ color: 'var(--color-grey-600)',
233
+ fontStyle: 'italic',
234
+ }, children: "The dark background is part of the story, not the component \u2014 pair the white wordmark with a sufficiently dark surface in your own layout." })] }));
235
+ export const WhiteWordmark = withDescription({
236
+ parameters: {
237
+ controls: { disable: true },
238
+ docs: {
239
+ source: {
240
+ language: 'tsx',
241
+ code: `
242
+ import { ArborLogo } from '@arbor-education/design-system.components';
243
+
244
+ function ArborLogoWhiteWordmarkExample() {
245
+ return (
246
+ <div style={{ background: 'var(--color-grey-800)', padding: 'var(--spacing-xlarge)', display: 'inline-flex' }}>
247
+ <ArborLogo showText textColor="white" aria-label="Arbor" />
248
+ </div>
249
+ );
250
+ }
251
+ export default ArborLogoWhiteWordmarkExample;
252
+ `.trim(),
253
+ },
254
+ },
255
+ },
256
+ render: WhiteWordmarkTemplate,
257
+ }, 'Switch the wordmark to white for dark hero panels, marketing splash screens, and inverted sidebars. The component itself does nothing to the surrounding background — that is the consumer\'s responsibility.');
258
+ const DecorativeTemplate = () => (_jsxs("div", { style: {
259
+ display: 'flex',
260
+ flexDirection: 'column',
261
+ gap: 'var(--spacing-xxlarge)',
262
+ }, children: [_jsxs("div", { style: {
263
+ display: 'flex',
264
+ flexDirection: 'column',
265
+ gap: 'var(--spacing-large)',
266
+ }, children: [_jsxs("div", { style: {
267
+ alignItems: 'center',
268
+ backgroundColor: 'var(--color-grey-050)',
269
+ borderRadius: 'var(--border-radius-xsmall)',
270
+ display: 'flex',
271
+ gap: 'var(--spacing-small)',
272
+ padding: 'var(--spacing-xlarge)',
273
+ }, children: [_jsx(ArborLogo, { "aria-hidden": true }), _jsx("span", { className: "ds-text", children: "Arbor" })] }), _jsxs("span", { className: "ds-text", style: {
274
+ color: 'var(--color-grey-600)',
275
+ fontStyle: 'italic',
276
+ }, children: ["Screen reader announces:", ' ', _jsx("strong", { children: "\u201CArbor\u201D" }), ' ', "\u2014 once, from the visible text."] })] }), _jsxs("div", { style: {
277
+ display: 'flex',
278
+ flexDirection: 'column',
279
+ gap: 'var(--spacing-large)',
280
+ }, children: [_jsxs("div", { style: {
281
+ alignItems: 'center',
282
+ backgroundColor: 'var(--color-grey-050)',
283
+ borderRadius: 'var(--border-radius-xsmall)',
284
+ display: 'flex',
285
+ gap: 'var(--spacing-small)',
286
+ padding: 'var(--spacing-xlarge)',
287
+ }, children: [_jsx(ArborLogo, { showText: true, "aria-hidden": true }), _jsx("span", { className: "ds-text", children: "\u2014 Dashboard" })] }), _jsxs("span", { className: "ds-text", style: {
288
+ color: 'var(--color-grey-600)',
289
+ fontStyle: 'italic',
290
+ }, children: ["Screen reader announces:", ' ', _jsx("strong", { children: "\u201C\u2014 Dashboard\u201D" }), ' ', "\u2014 the logo is skipped because the wordmark is already visible."] })] })] }));
291
+ export const Decorative = withDescription({
292
+ parameters: {
293
+ controls: { disable: true },
294
+ docs: {
295
+ source: {
296
+ language: 'tsx',
297
+ code: `
298
+ import { ArborLogo } from '@arbor-education/design-system.components';
299
+
300
+ function ArborLogoDecorativeExample() {
301
+ return (
302
+ <header style={{ display: 'flex', alignItems: 'center', gap: 'var(--spacing-small)' }}>
303
+ <ArborLogo aria-hidden />
304
+ <span>Arbor</span>
305
+ </header>
306
+ );
307
+ }
308
+ export default ArborLogoDecorativeExample;
309
+ `.trim(),
310
+ },
311
+ },
312
+ },
313
+ render: DecorativeTemplate,
314
+ }, 'Use `aria-hidden` whenever an adjacent visible "Arbor" wordmark already announces the brand — repeating it via the SVG just doubles the screen-reader output. Both examples below show the same content with the logo correctly hidden from assistive tech.');
315
+ const CustomAccessibleNameTemplate = () => (_jsxs("div", { style: {
316
+ display: 'flex',
317
+ flexDirection: 'column',
318
+ gap: 'var(--spacing-large)',
319
+ }, children: [_jsx("div", { style: {
320
+ alignItems: 'center',
321
+ backgroundColor: 'var(--color-grey-050)',
322
+ borderRadius: 'var(--border-radius-xsmall)',
323
+ display: 'flex',
324
+ justifyContent: 'center',
325
+ padding: 'var(--spacing-xlarge)',
326
+ }, children: _jsx("a", { href: "/", style: {
327
+ alignItems: 'center',
328
+ display: 'inline-flex',
329
+ padding: 'var(--spacing-small)',
330
+ textDecoration: 'none',
331
+ }, children: _jsx(ArborLogo, { showText: true, "aria-label": "Arbor home" }) }) }), _jsxs("span", { className: "ds-text", style: {
332
+ color: 'var(--color-grey-600)',
333
+ fontStyle: 'italic',
334
+ }, children: ["Screen reader announces:", ' ', _jsx("strong", { children: "\u201CArbor home, link\u201D" }), ' ', "\u2014 the accessible name clarifies that the brand mark is also the homepage destination."] })] }));
335
+ export const CustomAccessibleName = withDescription({
336
+ parameters: {
337
+ controls: { disable: true },
338
+ docs: {
339
+ source: {
340
+ language: 'tsx',
341
+ code: `
342
+ import { ArborLogo } from '@arbor-education/design-system.components';
343
+
344
+ function ArborLogoCustomAccessibleNameExample() {
345
+ return (
346
+ <a href="/">
347
+ <ArborLogo showText aria-label="Arbor home" />
348
+ </a>
349
+ );
350
+ }
351
+ export default ArborLogoCustomAccessibleNameExample;
352
+ `.trim(),
353
+ },
354
+ },
355
+ },
356
+ render: CustomAccessibleNameTemplate,
357
+ }, 'When the logo is the homepage link, override `aria-label` so screen-reader users hear the destination, not just the brand name. The default `"Arbor"` label is fine for purely decorative brand placement, but link targets deserve more context.');
358
+ // Inline <style> tags inside the template inject the CSS rules referenced by
359
+ // the className examples below. In a real app these rules would live in your
360
+ // stylesheet — Storybook can't resize the SVG without them because width/height
361
+ // are baked into the SVG attributes.
362
+ const CustomSizingTemplate = () => (_jsxs(_Fragment, { children: [_jsx("style", { children: `
363
+ .my-arbor-logo--favicon { width: 16px; height: auto; }
364
+ .my-arbor-logo--hero { width: 240px; height: auto; }
365
+ ` }), _jsxs("div", { style: {
366
+ display: 'flex',
367
+ flexDirection: 'column',
368
+ gap: 'var(--spacing-large)',
369
+ }, children: [_jsxs("div", { style: {
370
+ alignItems: 'flex-end',
371
+ backgroundColor: 'var(--color-grey-050)',
372
+ borderRadius: 'var(--border-radius-xsmall)',
373
+ display: 'flex',
374
+ gap: 'var(--spacing-xxlarge)',
375
+ justifyContent: 'center',
376
+ padding: 'var(--spacing-xlarge)',
377
+ }, children: [_jsxs("div", { style: {
378
+ alignItems: 'center',
379
+ display: 'flex',
380
+ flexDirection: 'column',
381
+ gap: 'var(--spacing-small)',
382
+ }, children: [_jsx(ArborLogo, { showText: true, "aria-label": "Arbor", className: "my-arbor-logo--favicon" }), _jsx("span", { className: "ds-text", style: { color: 'var(--color-grey-600)' }, children: "16 px (favicon)" })] }), _jsxs("div", { style: {
383
+ alignItems: 'center',
384
+ display: 'flex',
385
+ flexDirection: 'column',
386
+ gap: 'var(--spacing-small)',
387
+ }, children: [_jsx(ArborLogo, { showText: true, "aria-label": "Arbor" }), _jsx("span", { className: "ds-text", style: { color: 'var(--color-grey-600)' }, children: "66 px (default)" })] }), _jsxs("div", { style: {
388
+ alignItems: 'center',
389
+ display: 'flex',
390
+ flexDirection: 'column',
391
+ gap: 'var(--spacing-small)',
392
+ }, children: [_jsx(ArborLogo, { showText: true, "aria-label": "Arbor", className: "my-arbor-logo--hero" }), _jsx("span", { className: "ds-text", style: { color: 'var(--color-grey-600)' }, children: "240 px (hero / login)" })] })] }), _jsxs("span", { className: "ds-text", style: {
393
+ color: 'var(--color-grey-600)',
394
+ fontStyle: 'italic',
395
+ }, children: ["Resizing happens via CSS in your own stylesheet \u2014 for example", ' ', _jsx("code", { children: ".my-arbor-logo--hero { width: 240px; height: auto; }" }), ". Always set", ' ', _jsx("code", { children: "height: auto" }), ' ', "alongside", ' ', _jsx("code", { children: "width" }), ' ', "to preserve the 66:26 aspect ratio."] })] })] }));
396
+ export const CustomSizing = withDescription({
397
+ parameters: {
398
+ controls: { disable: true },
399
+ docs: {
400
+ source: {
401
+ language: 'tsx',
402
+ code: `
403
+ import { ArborLogo } from '@arbor-education/design-system.components';
404
+
405
+ // In your stylesheet:
406
+ // .my-arbor-logo--hero { width: 240px; height: auto; }
407
+
408
+ function ArborLogoCustomSizingExample() {
409
+ return <ArborLogo showText aria-label="Arbor" className="my-arbor-logo--hero" />;
410
+ }
411
+ export default ArborLogoCustomSizingExample;
412
+ `.trim(),
413
+ },
414
+ },
415
+ },
416
+ render: CustomSizingTemplate,
417
+ }, 'SVG width and height are baked into the component — to resize, target the SVG with CSS via `className`. Always pair `width` with `height: auto` to preserve the 66:26 aspect ratio. The three sizes shown here cover the realistic range: favicon, default, and login hero.');
418
+ //# sourceMappingURL=ArborLogo.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArborLogo.stories.js","sourceRoot":"","sources":["../../../src/components/arborLogo/ArborLogo.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '@testing-library/jest-dom/vitest';
2
+ //# sourceMappingURL=ArborLogo.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArborLogo.test.d.ts","sourceRoot":"","sources":["../../../src/components/arborLogo/ArborLogo.test.tsx"],"names":[],"mappings":"AAEA,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, describe, it } from 'vitest';
3
+ import { render } from '@testing-library/react';
4
+ import '@testing-library/jest-dom/vitest';
5
+ import { ArborLogo } from './ArborLogo';
6
+ describe('ArborLogo', () => {
7
+ it('renders the icon-only variant', () => {
8
+ const { container } = render(_jsx(ArborLogo, {}));
9
+ expect(container.firstChild).toMatchSnapshot();
10
+ });
11
+ it('renders the icon-only variant with aria-hidden', () => {
12
+ const { container } = render(_jsx(ArborLogo, { "aria-hidden": true }));
13
+ expect(container.firstChild).toMatchSnapshot();
14
+ });
15
+ it('renders the icon-only variant with a custom aria-label', () => {
16
+ const { container } = render(_jsx(ArborLogo, { "aria-label": "Arbor Education logo" }));
17
+ expect(container.firstChild).toMatchSnapshot();
18
+ });
19
+ it('renders the text variant with black text', () => {
20
+ const { container } = render(_jsx(ArborLogo, { showText: true }));
21
+ expect(container.firstChild).toMatchSnapshot();
22
+ });
23
+ it('renders the text variant with white text', () => {
24
+ const { container } = render(_jsx(ArborLogo, { showText: true, textColor: "white" }));
25
+ expect(container.firstChild).toMatchSnapshot();
26
+ });
27
+ it('renders the text variant with aria-hidden', () => {
28
+ const { container } = render(_jsx(ArborLogo, { showText: true, "aria-hidden": true }));
29
+ expect(container.firstChild).toMatchSnapshot();
30
+ });
31
+ });
32
+ //# sourceMappingURL=ArborLogo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArborLogo.test.js","sourceRoot":"","sources":["../../../src/components/arborLogo/ArborLogo.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,kCAAkC,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,0BAAe,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,kBAAY,sBAAsB,GAAG,CAAC,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,IAAC,QAAQ,SAAG,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,IAAC,QAAQ,QAAC,SAAS,EAAC,OAAO,GAAG,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,SAAS,IAAC,QAAQ,8BAAe,CAAC,CAAC;QACjE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Avatar } from '../avatar/Avatar';
2
+ import { Card } from '../card/Card';
3
+ import { Row } from '../row/Row';
4
+ export type DataViewCardRow = Row.Props;
5
+ type DataViewCardBaseProps = {
6
+ className?: string;
7
+ header: string;
8
+ avatar?: Avatar.Props;
9
+ rows: DataViewCardRow[];
10
+ disabled?: boolean;
11
+ };
12
+ export type DataViewCardProps = DataViewCardBaseProps & Card.InteractionProps;
13
+ export declare const DataViewCard: (props: DataViewCardProps) => React.JSX.Element;
14
+ export declare namespace DataViewCard {
15
+ type Props = DataViewCardProps;
16
+ type RowData = DataViewCardRow;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=DataViewCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataViewCard.d.ts","sourceRoot":"","sources":["../../../src/components/dataViewCard/DataViewCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,IAAI,EAA2B,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC;AAExC,KAAK,qBAAqB,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;IACtB,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAE9E,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,KAAG,KAAK,CAAC,GAAG,CAAC,OAoCjE,CAAC;AAEF,yBAAiB,YAAY,CAAC;IAC5B,KAAY,KAAK,GAAG,iBAAiB,CAAC;IACtC,KAAY,OAAO,GAAG,eAAe,CAAC;CACvC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import { Fragment } from 'react';
4
+ import { Avatar } from '../avatar/Avatar';
5
+ import { Card, getCardInteractionProps } from '../card/Card';
6
+ import { Heading } from '../heading/Heading';
7
+ import { Row } from '../row/Row';
8
+ import { Separator } from '../separator/Separator';
9
+ export const DataViewCard = (props) => {
10
+ const { className, header, avatar, rows, disabled = false } = props;
11
+ return (_jsx(Card, { ...getCardInteractionProps(props), className: classNames('ds-data-view-card__container', className), disabled: disabled, spacing: "default", children: _jsxs("article", { className: "ds-data-view-card", children: [avatar && (_jsx(Avatar, { size: "extra-large", ...avatar, className: classNames('ds-data-view-card__avatar', avatar.className) })), _jsxs("div", { className: "ds-data-view-card__content", children: [_jsx(Heading, { level: 4, className: "ds-data-view-card__header", children: header }), _jsx(Separator, {}), rows.map((row, index) => (_jsxs(Fragment, { children: [_jsx(Row, { ...row }), index < rows.length - 1 && _jsx(Separator, {})] }, `${row.label}-${index}`)))] })] }) }));
12
+ };
13
+ //# sourceMappingURL=DataViewCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataViewCard.js","sourceRoot":"","sources":["../../../src/components/dataViewCard/DataViewCard.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAc3D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAwB,EAAqB,EAAE;IAC1E,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IAEpE,OAAO,CACL,KAAC,IAAI,OACC,uBAAuB,CAAC,KAAK,CAAC,EAClC,SAAS,EAAE,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,EAChE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAC,SAAS,YAEjB,mBAAS,SAAS,EAAC,mBAAmB,aACnC,MAAM,IAAI,CACT,KAAC,MAAM,IACL,IAAI,EAAC,aAAa,KACd,MAAM,EACV,SAAS,EAAE,UAAU,CACnB,2BAA2B,EAC3B,MAAM,CAAC,SAAS,CACjB,GACD,CACH,EACD,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAC,2BAA2B,YACrD,MAAM,GACC,EACV,KAAC,SAAS,KAAG,EACZ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,MAAC,QAAQ,eACP,KAAC,GAAG,OAAK,GAAG,GAAI,EACf,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAC,SAAS,KAAG,KAF5B,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,CAG3B,CACZ,CAAC,IACE,IACE,GACL,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,100 @@
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ import { DataViewCard } from './DataViewCard';
3
+ declare function DataViewCardDocsPage(): import("react/jsx-runtime").JSX.Element;
4
+ declare const meta: {
5
+ title: string;
6
+ component: (props: import("./DataViewCard").DataViewCardProps) => React.JSX.Element;
7
+ parameters: {
8
+ layout: string;
9
+ docs: {
10
+ page: typeof DataViewCardDocsPage;
11
+ };
12
+ };
13
+ tags: string[];
14
+ argTypes: {
15
+ header: {
16
+ control: "text";
17
+ description: string;
18
+ table: {
19
+ type: {
20
+ summary: string;
21
+ };
22
+ };
23
+ };
24
+ avatar: {
25
+ control: "object";
26
+ description: string;
27
+ table: {
28
+ type: {
29
+ summary: string;
30
+ };
31
+ };
32
+ };
33
+ rows: {
34
+ control: "object";
35
+ description: string;
36
+ table: {
37
+ type: {
38
+ summary: string;
39
+ };
40
+ };
41
+ };
42
+ disabled: {
43
+ control: "boolean";
44
+ description: string;
45
+ table: {
46
+ type: {
47
+ summary: string;
48
+ };
49
+ defaultValue: {
50
+ summary: string;
51
+ };
52
+ };
53
+ };
54
+ onClick: {
55
+ control: false;
56
+ description: string;
57
+ table: {
58
+ type: {
59
+ summary: string;
60
+ };
61
+ };
62
+ };
63
+ 'aria-label': {
64
+ control: "text";
65
+ description: string;
66
+ table: {
67
+ type: {
68
+ summary: string;
69
+ };
70
+ };
71
+ };
72
+ 'aria-labelledby': {
73
+ control: false;
74
+ description: string;
75
+ table: {
76
+ type: {
77
+ summary: string;
78
+ };
79
+ };
80
+ };
81
+ className: {
82
+ control: false;
83
+ description: string;
84
+ table: {
85
+ type: {
86
+ summary: string;
87
+ };
88
+ };
89
+ };
90
+ };
91
+ };
92
+ export default meta;
93
+ type Story = StoryObj<typeof DataViewCard>;
94
+ export declare const Default: Story;
95
+ export declare const Grid: Story;
96
+ export declare const NoAvatar: Story;
97
+ export declare const Static: Story;
98
+ export declare const Disabled: Story;
99
+ export declare const WithNote: Story;
100
+ //# sourceMappingURL=DataViewCard.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataViewCard.stories.d.ts","sourceRoot":"","sources":["../../../src/components/dataViewCard/DataViewCard.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAU5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiF9C,iBAAS,oBAAoB,4CAmB5B;AAcD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE2B,CAAC;AAEtC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AA8J3C,eAAO,MAAM,OAAO,EAAE,KAerB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KA6ClB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KASpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC"}