@holmdigital/components 1.2.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +135 -60
  2. package/dist/AccessibilityStatement/AccessibilityStatement.d.mts +29 -0
  3. package/dist/AccessibilityStatement/AccessibilityStatement.d.ts +29 -0
  4. package/dist/AccessibilityStatement/AccessibilityStatement.js +483 -0
  5. package/dist/AccessibilityStatement/AccessibilityStatement.mjs +6 -0
  6. package/dist/Button/Button.js +1 -1
  7. package/dist/Button/Button.mjs +1 -1
  8. package/dist/Card/Card.d.mts +12 -0
  9. package/dist/Card/Card.d.ts +12 -0
  10. package/dist/Card/Card.js +81 -0
  11. package/dist/Card/Card.mjs +6 -0
  12. package/dist/Combobox/Combobox.d.mts +19 -0
  13. package/dist/Combobox/Combobox.d.ts +19 -0
  14. package/dist/Combobox/Combobox.js +271 -0
  15. package/dist/Combobox/Combobox.mjs +6 -0
  16. package/dist/DataTable/DataTable.d.mts +18 -0
  17. package/dist/DataTable/DataTable.d.ts +18 -0
  18. package/dist/DataTable/DataTable.js +125 -0
  19. package/dist/DataTable/DataTable.mjs +6 -0
  20. package/dist/DatePicker/DatePicker.d.mts +11 -0
  21. package/dist/DatePicker/DatePicker.d.ts +11 -0
  22. package/dist/DatePicker/DatePicker.js +110 -0
  23. package/dist/DatePicker/DatePicker.mjs +6 -0
  24. package/dist/ErrorSummary/ErrorSummary.d.mts +14 -0
  25. package/dist/ErrorSummary/ErrorSummary.d.ts +14 -0
  26. package/dist/ErrorSummary/ErrorSummary.js +119 -0
  27. package/dist/ErrorSummary/ErrorSummary.mjs +6 -0
  28. package/dist/LiveRegion/LiveRegion.d.mts +10 -0
  29. package/dist/LiveRegion/LiveRegion.d.ts +10 -0
  30. package/dist/LiveRegion/LiveRegion.js +69 -0
  31. package/dist/LiveRegion/LiveRegion.mjs +6 -0
  32. package/dist/Modal/Modal.d.mts +1 -2
  33. package/dist/Modal/Modal.d.ts +1 -2
  34. package/dist/MultiSelect/MultiSelect.d.mts +19 -0
  35. package/dist/MultiSelect/MultiSelect.d.ts +19 -0
  36. package/dist/MultiSelect/MultiSelect.js +263 -0
  37. package/dist/MultiSelect/MultiSelect.mjs +6 -0
  38. package/dist/Pagination/Pagination.d.mts +12 -0
  39. package/dist/Pagination/Pagination.d.ts +12 -0
  40. package/dist/Pagination/Pagination.js +149 -0
  41. package/dist/Pagination/Pagination.mjs +6 -0
  42. package/dist/Tooltip/Tooltip.d.mts +1 -1
  43. package/dist/Tooltip/Tooltip.d.ts +1 -1
  44. package/dist/Tooltip/Tooltip.js +1 -1
  45. package/dist/Tooltip/Tooltip.mjs +1 -1
  46. package/dist/TreeView/TreeView.d.mts +16 -0
  47. package/dist/TreeView/TreeView.d.ts +16 -0
  48. package/dist/TreeView/TreeView.js +250 -0
  49. package/dist/TreeView/TreeView.mjs +6 -0
  50. package/dist/chunk-4UONERC6.mjs +45 -0
  51. package/dist/chunk-57NZTQBX.mjs +86 -0
  52. package/dist/chunk-6REI7HHO.mjs +226 -0
  53. package/dist/chunk-EVNHLNS5.mjs +125 -0
  54. package/dist/chunk-HSUDZAQ6.mjs +101 -0
  55. package/dist/{chunk-C5M6C7KT.mjs → chunk-MCEJNWZT.mjs} +1 -1
  56. package/dist/{chunk-7V2LETZ6.mjs → chunk-MYXIUDCP.mjs} +1 -1
  57. package/dist/chunk-NECEXNCF.mjs +57 -0
  58. package/dist/chunk-OFTOD72G.mjs +462 -0
  59. package/dist/chunk-OMSIXECN.mjs +247 -0
  60. package/dist/chunk-P2IXX552.mjs +95 -0
  61. package/dist/chunk-VM3O36W4.mjs +239 -0
  62. package/dist/index.d.mts +42 -1
  63. package/dist/index.d.ts +42 -1
  64. package/dist/index.js +1873 -2
  65. package/dist/index.mjs +244 -6
  66. package/package.json +48 -6
package/dist/index.mjs CHANGED
@@ -1,3 +1,6 @@
1
+ import {
2
+ Pagination
3
+ } from "./chunk-EVNHLNS5.mjs";
1
4
  import {
2
5
  RadioGroup
3
6
  } from "./chunk-YMSNGQN6.mjs";
@@ -22,28 +25,55 @@ import {
22
25
  TooltipContent,
23
26
  TooltipProvider,
24
27
  TooltipTrigger
25
- } from "./chunk-C5M6C7KT.mjs";
28
+ } from "./chunk-MCEJNWZT.mjs";
26
29
  import {
27
- Button
28
- } from "./chunk-7V2LETZ6.mjs";
30
+ TreeView
31
+ } from "./chunk-6REI7HHO.mjs";
32
+ import {
33
+ ErrorSummary
34
+ } from "./chunk-P2IXX552.mjs";
29
35
  import {
30
36
  FormField
31
37
  } from "./chunk-PLT5CAFO.mjs";
32
- import {
33
- Checkbox
34
- } from "./chunk-NOE5QKC2.mjs";
35
38
  import {
36
39
  Heading
37
40
  } from "./chunk-2RP6SWY7.mjs";
41
+ import {
42
+ LiveRegion
43
+ } from "./chunk-4UONERC6.mjs";
38
44
  import {
39
45
  Modal
40
46
  } from "./chunk-Z4AIS75A.mjs";
41
47
  import {
42
48
  Dialog
43
49
  } from "./chunk-HIGQ6URZ.mjs";
50
+ import {
51
+ MultiSelect
52
+ } from "./chunk-VM3O36W4.mjs";
44
53
  import {
45
54
  NavigationMenu
46
55
  } from "./chunk-GK4BYT56.mjs";
56
+ import {
57
+ AccessibilityStatement
58
+ } from "./chunk-OFTOD72G.mjs";
59
+ import {
60
+ Button
61
+ } from "./chunk-MYXIUDCP.mjs";
62
+ import {
63
+ Checkbox
64
+ } from "./chunk-NOE5QKC2.mjs";
65
+ import {
66
+ Card
67
+ } from "./chunk-NECEXNCF.mjs";
68
+ import {
69
+ Combobox
70
+ } from "./chunk-OMSIXECN.mjs";
71
+ import {
72
+ DataTable
73
+ } from "./chunk-HSUDZAQ6.mjs";
74
+ import {
75
+ DatePicker
76
+ } from "./chunk-57NZTQBX.mjs";
47
77
 
48
78
  // src/Breadcrumbs/Breadcrumbs.tsx
49
79
  import React, { Children, isValidElement, cloneElement } from "react";
@@ -274,7 +304,203 @@ var TabsContent = ({ value, children, className }) => {
274
304
  }
275
305
  );
276
306
  };
307
+
308
+ // src/ProgressBar/ProgressBar.tsx
309
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
310
+ var ProgressBar = ({
311
+ value,
312
+ min = 0,
313
+ max = 100,
314
+ label,
315
+ showValueLabel = false,
316
+ valueText,
317
+ variant = "primary",
318
+ className = ""
319
+ }) => {
320
+ const clampedValue = Math.min(Math.max(value, min), max);
321
+ const percentage = Math.round((clampedValue - min) / (max - min) * 100);
322
+ const getVariantColor = () => {
323
+ switch (variant) {
324
+ case "success":
325
+ return "#10B981";
326
+ // Green
327
+ case "warning":
328
+ return "#F59E0B";
329
+ // Amber
330
+ case "danger":
331
+ return "#EF4444";
332
+ // Red
333
+ default:
334
+ return "#2563EB";
335
+ }
336
+ };
337
+ const styles = {
338
+ container: {
339
+ width: "100%",
340
+ backgroundColor: "#E5E7EB",
341
+ // Gray-200
342
+ borderRadius: "9999px",
343
+ height: "1rem",
344
+ overflow: "hidden",
345
+ position: "relative"
346
+ },
347
+ bar: {
348
+ height: "100%",
349
+ backgroundColor: getVariantColor(),
350
+ width: `${percentage}%`,
351
+ transition: "width 0.3s ease-in-out",
352
+ borderRadius: "9999px"
353
+ },
354
+ labelFn: {
355
+ fontSize: "0.875rem",
356
+ color: "#374151",
357
+ marginBottom: "0.25rem",
358
+ display: "flex",
359
+ justifyContent: "space-between"
360
+ }
361
+ };
362
+ return /* @__PURE__ */ jsxs3("div", { className: `hd-progress-root ${className}`, children: [
363
+ /* @__PURE__ */ jsxs3("div", { style: styles.labelFn, id: `progress-label-${label.replace(/\s+/g, "-")}`, children: [
364
+ /* @__PURE__ */ jsx4("span", { className: "hd-progress-label-text", children: label }),
365
+ showValueLabel && /* @__PURE__ */ jsxs3("span", { children: [
366
+ percentage,
367
+ "%"
368
+ ] })
369
+ ] }),
370
+ /* @__PURE__ */ jsx4(
371
+ "div",
372
+ {
373
+ role: "progressbar",
374
+ "aria-valuenow": clampedValue,
375
+ "aria-valuemin": min,
376
+ "aria-valuemax": max,
377
+ "aria-label": label,
378
+ "aria-valuetext": valueText,
379
+ style: styles.container,
380
+ children: /* @__PURE__ */ jsx4("div", { style: styles.bar })
381
+ }
382
+ )
383
+ ] });
384
+ };
385
+
386
+ // src/Skeleton/Skeleton.tsx
387
+ import { Fragment, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
388
+ var Skeleton = ({
389
+ variant = "text",
390
+ width,
391
+ height,
392
+ animation = "pulse",
393
+ className = ""
394
+ }) => {
395
+ const baseStyle = {
396
+ backgroundColor: "#E5E7EB",
397
+ // Gray-200
398
+ borderRadius: variant === "circular" ? "50%" : "4px",
399
+ display: "inline-block",
400
+ width: width ?? (variant === "text" ? "100%" : void 0),
401
+ height: height ?? (variant === "text" ? "1em" : void 0)
402
+ };
403
+ const getAnimationClass = () => {
404
+ switch (animation) {
405
+ case "pulse":
406
+ return "hd-skeleton-pulse";
407
+ case "wave":
408
+ return "hd-skeleton-wave";
409
+ default:
410
+ return "";
411
+ }
412
+ };
413
+ const styles = `
414
+ @keyframes hd-pulse {
415
+ 0%, 100% { opacity: 1; }
416
+ 50% { opacity: .5; }
417
+ }
418
+ @keyframes hd-wave {
419
+ 0% { transform: translateX(-100%); }
420
+ 100% { transform: translateX(100%); }
421
+ }
422
+ .hd-skeleton-pulse {
423
+ animation: hd-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
424
+ }
425
+ .hd-skeleton-wave {
426
+ position: relative;
427
+ overflow: hidden;
428
+ }
429
+ .hd-skeleton-wave::after {
430
+ content: "";
431
+ position: absolute;
432
+ top: 0;
433
+ left: 0;
434
+ right: 0;
435
+ bottom: 0;
436
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.5), transparent);
437
+ animation: hd-wave 1.6s linear infinite;
438
+ }
439
+ `;
440
+ return /* @__PURE__ */ jsxs4(Fragment, { children: [
441
+ /* @__PURE__ */ jsx5("style", { children: styles }),
442
+ /* @__PURE__ */ jsx5(
443
+ "span",
444
+ {
445
+ className: `hd-skeleton ${getAnimationClass()} ${className}`,
446
+ style: baseStyle,
447
+ "aria-hidden": "true"
448
+ }
449
+ )
450
+ ] });
451
+ };
452
+
453
+ // src/HelpText/HelpText.tsx
454
+ import { Info, AlertCircle } from "lucide-react";
455
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
456
+ var HelpText = ({
457
+ id,
458
+ children,
459
+ variant = "default",
460
+ showIcon = false,
461
+ className = ""
462
+ }) => {
463
+ const getColor = () => {
464
+ switch (variant) {
465
+ case "error":
466
+ return "#EF4444";
467
+ // Red-500
468
+ case "valid":
469
+ return "#10B981";
470
+ // Green-500
471
+ default:
472
+ return "#6B7280";
473
+ }
474
+ };
475
+ const style = {
476
+ fontSize: "0.875rem",
477
+ marginTop: "0.25rem",
478
+ color: getColor(),
479
+ display: "flex",
480
+ alignItems: "center",
481
+ gap: "0.25rem"
482
+ };
483
+ const Icon = () => {
484
+ if (!showIcon) return null;
485
+ if (variant === "error") return /* @__PURE__ */ jsx6(AlertCircle, { size: 14 });
486
+ if (variant === "default") return /* @__PURE__ */ jsx6(Info, { size: 14 });
487
+ return null;
488
+ };
489
+ return /* @__PURE__ */ jsxs5(
490
+ "div",
491
+ {
492
+ id,
493
+ className: `hd-help-text ${className}`,
494
+ style,
495
+ children: [
496
+ /* @__PURE__ */ jsx6(Icon, {}),
497
+ /* @__PURE__ */ jsx6("span", { children })
498
+ ]
499
+ }
500
+ );
501
+ };
277
502
  export {
503
+ AccessibilityStatement,
278
504
  Accordion,
279
505
  AccordionContent,
280
506
  AccordionItem,
@@ -282,17 +508,28 @@ export {
282
508
  BreadcrumbItem,
283
509
  Breadcrumbs,
284
510
  Button,
511
+ Card,
285
512
  Checkbox,
513
+ Combobox,
514
+ DataTable,
515
+ DatePicker,
286
516
  Dialog,
517
+ ErrorSummary,
287
518
  FormField,
288
519
  Heading,
520
+ HelpText,
521
+ LiveRegion,
289
522
  Modal,
523
+ MultiSelect,
290
524
  NavigationMenu,
525
+ Pagination,
526
+ ProgressBar,
291
527
  RadioGroup,
292
528
  Select,
293
529
  SelectContent,
294
530
  SelectItem,
295
531
  SelectTrigger,
532
+ Skeleton,
296
533
  SkipLink,
297
534
  Switch,
298
535
  TabTrigger,
@@ -304,5 +541,6 @@ export {
304
541
  TooltipContent,
305
542
  TooltipProvider,
306
543
  TooltipTrigger,
544
+ TreeView,
307
545
  useToast
308
546
  };
package/package.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@holmdigital/components",
3
3
  "author": "Holm Digital AB",
4
- "version": "1.2.4",
4
+ "version": "2.1.0",
5
5
  "private": false,
6
6
  "publishConfig": {
7
- "access": "public",
8
- "registry": "https://registry.npmjs.org/"
7
+ "access": "public"
9
8
  },
10
9
  "description": "Prescriptive, accessible React components for regulatory compliance",
11
10
  "repository": {
@@ -73,6 +72,46 @@
73
72
  "./Heading": {
74
73
  "types": "./dist/Heading/Heading.d.ts",
75
74
  "import": "./dist/Heading/Heading.mjs"
75
+ },
76
+ "./AccessibilityStatement": {
77
+ "types": "./dist/AccessibilityStatement/AccessibilityStatement.d.ts",
78
+ "import": "./dist/AccessibilityStatement/AccessibilityStatement.mjs"
79
+ },
80
+ "./ErrorSummary": {
81
+ "types": "./dist/ErrorSummary/ErrorSummary.d.ts",
82
+ "import": "./dist/ErrorSummary/ErrorSummary.mjs"
83
+ },
84
+ "./Combobox": {
85
+ "types": "./dist/Combobox/Combobox.d.ts",
86
+ "import": "./dist/Combobox/Combobox.mjs"
87
+ },
88
+ "./DatePicker": {
89
+ "types": "./dist/DatePicker/DatePicker.d.ts",
90
+ "import": "./dist/DatePicker/DatePicker.mjs"
91
+ },
92
+ "./MultiSelect": {
93
+ "types": "./dist/MultiSelect/MultiSelect.d.ts",
94
+ "import": "./dist/MultiSelect/MultiSelect.mjs"
95
+ },
96
+ "./DataTable": {
97
+ "types": "./dist/DataTable/DataTable.d.ts",
98
+ "import": "./dist/DataTable/DataTable.mjs"
99
+ },
100
+ "./Pagination": {
101
+ "types": "./dist/Pagination/Pagination.d.ts",
102
+ "import": "./dist/Pagination/Pagination.mjs"
103
+ },
104
+ "./Card": {
105
+ "types": "./dist/Card/Card.d.ts",
106
+ "import": "./dist/Card/Card.mjs"
107
+ },
108
+ "./TreeView": {
109
+ "types": "./dist/TreeView/TreeView.d.ts",
110
+ "import": "./dist/TreeView/TreeView.mjs"
111
+ },
112
+ "./LiveRegion": {
113
+ "types": "./dist/LiveRegion/LiveRegion.d.ts",
114
+ "import": "./dist/LiveRegion/LiveRegion.mjs"
76
115
  }
77
116
  },
78
117
  "files": [
@@ -80,8 +119,8 @@
80
119
  "README.md"
81
120
  ],
82
121
  "scripts": {
83
- "build": "tsup src/index.ts src/Button/Button.tsx src/FormField/FormField.tsx src/Dialog/Dialog.tsx src/Modal/Modal.tsx src/SkipLink/SkipLink.tsx src/NavigationMenu/NavigationMenu.tsx src/Checkbox/Checkbox.tsx src/RadioGroup/RadioGroup.tsx src/Select/Select.tsx src/Switch/Switch.tsx src/Toast/Toast.tsx src/Tooltip/Tooltip.tsx src/Heading/Heading.tsx --format cjs,esm --dts --clean --external react",
84
- "dev": "tsup src/index.ts src/Button/Button.tsx src/FormField/FormField.tsx src/Dialog/Dialog.tsx src/Modal/Modal.tsx src/SkipLink/SkipLink.tsx src/NavigationMenu/NavigationMenu.tsx src/Checkbox/Checkbox.tsx src/RadioGroup/RadioGroup.tsx src/Select/Select.tsx src/Switch/Switch.tsx src/Toast/Toast.tsx src/Tooltip/Tooltip.tsx src/Heading/Heading.tsx --format cjs,esm --dts --watch --external react",
122
+ "build": "tsup src/index.ts src/Button/Button.tsx src/FormField/FormField.tsx src/Dialog/Dialog.tsx src/Modal/Modal.tsx src/SkipLink/SkipLink.tsx src/NavigationMenu/NavigationMenu.tsx src/Checkbox/Checkbox.tsx src/RadioGroup/RadioGroup.tsx src/Select/Select.tsx src/Switch/Switch.tsx src/Toast/Toast.tsx src/Tooltip/Tooltip.tsx src/Heading/Heading.tsx src/AccessibilityStatement/AccessibilityStatement.tsx src/ErrorSummary/ErrorSummary.tsx src/Combobox/Combobox.tsx src/DatePicker/DatePicker.tsx src/MultiSelect/MultiSelect.tsx src/DataTable/DataTable.tsx src/Pagination/Pagination.tsx src/Card/Card.tsx src/TreeView/TreeView.tsx src/LiveRegion/LiveRegion.tsx --format cjs,esm --dts --clean --external react --external @holmdigital/standards",
123
+ "dev": "tsup src/index.ts src/Button/Button.tsx src/FormField/FormField.tsx src/Dialog/Dialog.tsx src/Modal/Modal.tsx src/SkipLink/SkipLink.tsx src/NavigationMenu/NavigationMenu.tsx src/Checkbox/Checkbox.tsx src/RadioGroup/RadioGroup.tsx src/Select/Select.tsx src/Switch/Switch.tsx src/Toast/Toast.tsx src/Tooltip/Tooltip.tsx src/Heading/Heading.tsx src/AccessibilityStatement/AccessibilityStatement.tsx src/ErrorSummary/ErrorSummary.tsx src/Combobox/Combobox.tsx src/DatePicker/DatePicker.tsx src/MultiSelect/MultiSelect.tsx src/DataTable/DataTable.tsx src/Pagination/Pagination.tsx src/Card/Card.tsx src/TreeView/TreeView.tsx src/LiveRegion/LiveRegion.tsx --format cjs,esm --dts --watch --external react --external @holmdigital/standards",
85
124
  "lint": "eslint src --ext .ts,.tsx",
86
125
  "test": "vitest",
87
126
  "test:ci": "vitest run",
@@ -104,15 +143,18 @@
104
143
  "react-dom": ">=18.0.0"
105
144
  },
106
145
  "devDependencies": {
146
+ "@testing-library/react": "^16.3.2",
107
147
  "@types/react": "^18.2.0",
108
148
  "@types/react-dom": "^18.2.0",
149
+ "jsdom": "^28.0.0",
109
150
  "react": "^18.2.0",
110
151
  "react-dom": "^18.2.0",
111
- "storybook": "^7.6.0",
152
+ "storybook": "^10.2.4",
112
153
  "tsup": "^8.3.5",
113
154
  "typescript": "^5.7.2"
114
155
  },
115
156
  "dependencies": {
157
+ "@holmdigital/standards": "^2.1.0",
116
158
  "lucide-react": "^0.556.0"
117
159
  }
118
160
  }