@donotdev/components 0.0.17 → 0.0.18

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 (76) hide show
  1. package/dist/advanced/Code/CodeContent.d.ts.map +1 -1
  2. package/dist/advanced/Code/CodeContent.js +22 -5
  3. package/dist/advanced/Code/CodeSkeleton.js +4 -4
  4. package/dist/advanced/ImageGallery/ImageGallery.d.ts.map +1 -1
  5. package/dist/advanced/ImageGallery/ImageGallery.js +11 -5
  6. package/dist/advanced/JsonViewer/JsonViewer.d.ts +1 -1
  7. package/dist/advanced/JsonViewer/JsonViewer.d.ts.map +1 -1
  8. package/dist/advanced/JsonViewer/JsonViewer.js +9 -3
  9. package/dist/atomic/ActionButton/index.js +2 -2
  10. package/dist/atomic/ActionButton/useAction.d.ts.map +1 -1
  11. package/dist/atomic/ActionButton/useAction.js +18 -5
  12. package/dist/atomic/Alert/index.d.ts.map +1 -1
  13. package/dist/atomic/Button/index.d.ts +1 -1
  14. package/dist/atomic/Button/index.d.ts.map +1 -1
  15. package/dist/atomic/CallToAction/index.d.ts +2 -1
  16. package/dist/atomic/CallToAction/index.d.ts.map +1 -1
  17. package/dist/atomic/CallToAction/index.js +2 -1
  18. package/dist/atomic/Combobox/index.d.ts.map +1 -1
  19. package/dist/atomic/Combobox/index.js +3 -3
  20. package/dist/atomic/CopyToClipboard/index.d.ts.map +1 -1
  21. package/dist/atomic/CopyToClipboard/index.js +20 -4
  22. package/dist/atomic/Dialog/index.js +1 -1
  23. package/dist/atomic/DropdownMenu/index.js +1 -1
  24. package/dist/atomic/Grid/GridArea.d.ts +2 -2
  25. package/dist/atomic/Grid/GridArea.js +2 -2
  26. package/dist/atomic/Grid/index.d.ts +37 -20
  27. package/dist/atomic/Grid/index.d.ts.map +1 -1
  28. package/dist/atomic/Grid/index.js +54 -25
  29. package/dist/atomic/HeroSection/index.d.ts +3 -0
  30. package/dist/atomic/HeroSection/index.d.ts.map +1 -1
  31. package/dist/atomic/HeroSection/index.js +4 -1
  32. package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts.map +1 -1
  33. package/dist/atomic/HoverCard/HoverCardPrimitive.js +1 -1
  34. package/dist/atomic/HoverCard/index.d.ts +19 -4
  35. package/dist/atomic/HoverCard/index.d.ts.map +1 -1
  36. package/dist/atomic/HoverCard/index.js +24 -5
  37. package/dist/atomic/Icons/Icon.d.ts.map +1 -1
  38. package/dist/atomic/Icons/Icon.js +11 -10
  39. package/dist/atomic/InfiniteScroll/index.d.ts +4 -2
  40. package/dist/atomic/InfiniteScroll/index.d.ts.map +1 -1
  41. package/dist/atomic/InfiniteScroll/index.js +2 -2
  42. package/dist/atomic/Pagination/index.js +1 -1
  43. package/dist/atomic/Popover/PopoverPrimitive.d.ts +1 -1
  44. package/dist/atomic/Popover/PopoverPrimitive.d.ts.map +1 -1
  45. package/dist/atomic/Popover/PopoverPrimitive.js +2 -2
  46. package/dist/atomic/Popover/index.d.ts +2 -2
  47. package/dist/atomic/Popover/index.d.ts.map +1 -1
  48. package/dist/atomic/Section/index.d.ts +9 -6
  49. package/dist/atomic/Section/index.d.ts.map +1 -1
  50. package/dist/atomic/Section/index.js +2 -1
  51. package/dist/atomic/Select/index.d.ts.map +1 -1
  52. package/dist/atomic/Select/index.js +2 -3
  53. package/dist/atomic/Stepper/index.d.ts +4 -0
  54. package/dist/atomic/Stepper/index.d.ts.map +1 -1
  55. package/dist/atomic/Stepper/index.js +8 -5
  56. package/dist/atomic/Table/index.d.ts +4 -4
  57. package/dist/atomic/Table/index.d.ts.map +1 -1
  58. package/dist/atomic/Toaster/ToastPrimitive.d.ts.map +1 -1
  59. package/dist/atomic/Toaster/ToastPrimitive.js +1 -13
  60. package/dist/atomic/index.d.ts +1 -1
  61. package/dist/atomic/index.d.ts.map +1 -1
  62. package/dist/hooks/useToast.d.ts.map +1 -1
  63. package/dist/hooks/useToast.js +18 -3
  64. package/dist/hooks/useViewportVisibility.d.ts.map +1 -1
  65. package/dist/hooks/useViewportVisibility.js +10 -12
  66. package/dist/index.d.ts +0 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +6 -6
  69. package/dist/styles/index.css +234 -75
  70. package/dist/types.d.ts +1 -1
  71. package/dist/utils/constants.d.ts +13 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +12 -0
  74. package/dist/utils/intersectionObserver.d.ts.map +1 -1
  75. package/dist/utils/intersectionObserver.js +1 -11
  76. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CodeContent.d.ts","sourceRoot":"","sources":["../../../src/advanced/Code/CodeContent.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,IAAI,CAAC,EACZ,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,eAAsB,EACtB,SAAiB,EACjB,cAAqB,EACrB,MAAM,EACN,OAAe,GAChB,EAAE,SAAS,2CAsOX;AAED,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"CodeContent.d.ts","sourceRoot":"","sources":["../../../src/advanced/Code/CodeContent.tsx"],"names":[],"mappings":"AA6BA,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,IAAI,CAAC,EACZ,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,eAAsB,EACtB,SAAiB,EACjB,cAAqB,EACrB,MAAM,EACN,OAAe,GAChB,EAAE,SAAS,2CAwPX;AAED,eAAe,IAAI,CAAC"}
@@ -90,9 +90,11 @@ function Code({ children, language = 'tsx', className, showLineNumbers = true, w
90
90
  if (error instanceof Error &&
91
91
  (error.message.includes("Cannot find module 'shiki'") ||
92
92
  error.message.includes('Failed to fetch dynamically imported module'))) {
93
- console.info('[Code] Shiki not available. Using Text code variant fallback. To enable syntax highlighting: npm install shiki');
93
+ if (process.env.NODE_ENV === 'development') {
94
+ console.info('[Code] Shiki not available. Using Text code variant fallback. To enable syntax highlighting: npm install shiki');
95
+ }
94
96
  }
95
- else {
97
+ else if (process.env.NODE_ENV === 'development') {
96
98
  console.warn('[Code] Failed to initialize Shiki:', error);
97
99
  }
98
100
  if (mounted) {
@@ -117,17 +119,32 @@ function Code({ children, language = 'tsx', className, showLineNumbers = true, w
117
119
  const lang = language || 'text';
118
120
  // Check if language is supported
119
121
  if (!highlighter.getLoadedLanguages().includes(lang)) {
120
- console.warn(`[Code] Language '${language}' not supported by Shiki`);
122
+ if (process.env.NODE_ENV === 'development') {
123
+ console.warn(`[Code] Language '${language}' not supported by Shiki`);
124
+ }
121
125
  return null; // Use Text code variant fallback
122
126
  }
123
127
  const html = highlighter.codeToHtml(children, {
124
128
  lang,
125
129
  theme,
126
130
  });
127
- return html;
131
+ // Strip Shiki's outer <pre><code>...</code></pre> wrapper.
132
+ // We already render our own <pre> and <code> — nesting them
133
+ // creates conflicting line-height/font-size and breaks sync
134
+ // between line numbers and content.
135
+ // Also strip \n between </span> and <span — the .line spans
136
+ // are display:block, so newlines would create double line breaks
137
+ // under white-space:pre.
138
+ const inner = html
139
+ .replace(/^<pre[^>]*><code[^>]*>/, '')
140
+ .replace(/<\/code><\/pre>$/, '')
141
+ .replace(/\n/g, '');
142
+ return inner;
128
143
  }
129
144
  catch (error) {
130
- console.warn(`[Code] Failed to highlight code for language: ${language}`, error);
145
+ if (process.env.NODE_ENV === 'development') {
146
+ console.warn(`[Code] Failed to highlight code for language: ${language}`, error);
147
+ }
131
148
  return null; // Use Text code variant fallback
132
149
  }
133
150
  }, [
@@ -17,10 +17,10 @@ function CodeSkeleton({ className, showLineNumbers = true, showCopyButton = true
17
17
  border: '1px solid var(--border)',
18
18
  backgroundColor: 'var(--muted)',
19
19
  }, role: "status", "aria-label": "Loading code", children: _jsxs(Stack, { direction: "row", children: [showLineNumbers && (_jsx("div", { className: "dndev-flex-shrink-0", style: {
20
- borderRight: '1px solid var(--border)',
20
+ borderInlineEnd: '1px solid var(--border)',
21
21
  backgroundColor: 'var(--muted)',
22
22
  padding: '1rem',
23
- textAlign: 'right',
23
+ textAlign: 'end',
24
24
  fontSize: 'var(--font-size-sm)',
25
25
  color: 'var(--muted-foreground)',
26
26
  opacity: 'var(--opacity-subtle)',
@@ -28,7 +28,7 @@ function CodeSkeleton({ className, showLineNumbers = true, showCopyButton = true
28
28
  userSelect: 'none',
29
29
  }, children: Array.from({ length: lineCount }).map((_, i) => (_jsx("div", { style: { height: '1.25rem', lineHeight: '1.25rem' }, children: i + 1 }, i))) })), _jsx("div", { className: "dndev-flex-1 dndev-min-w-0", children: _jsxs("div", { className: "dndev-relative", children: [showCopyButton && (_jsx("div", { className: "dndev-absolute dndev-z-breadcrumbs dndev-animate-pulse", style: {
30
30
  top: '0.5rem',
31
- right: '0.5rem',
31
+ insetInlineEnd: '0.5rem',
32
32
  width: '2rem',
33
33
  height: '2rem',
34
34
  backgroundColor: 'var(--muted)',
@@ -42,7 +42,7 @@ function CodeSkeleton({ className, showLineNumbers = true, showCopyButton = true
42
42
  marginBottom: '0.25rem',
43
43
  }, children: _jsx("span", { className: "dndev-inline dndev-animate-pulse", style: {
44
44
  display: 'inline-block',
45
- width: `${Math.random() * 40 + 20}%`,
45
+ width: `${((i * 37 + 13) % 40) + 20}%`,
46
46
  height: '1em',
47
47
  backgroundColor: 'var(--muted)',
48
48
  borderRadius: 'var(--radius)',
@@ -1 +1 @@
1
- {"version":3,"file":"ImageGallery.d.ts","sourceRoot":"","sources":["../../../src/advanced/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,MAAM,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAClC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAkBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,WAAoB,EACpB,SAAmB,EACnB,aAAa,GACd,EAAE,iBAAiB,GAAG,YAAY,CAqOlC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ImageGallery.d.ts","sourceRoot":"","sources":["../../../src/advanced/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,MAAM,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAClC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAkBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,WAAoB,EACpB,SAAmB,EACnB,aAAa,GACd,EAAE,iBAAiB,GAAG,YAAY,CA2OlC;AAED,eAAe,YAAY,CAAC"}
@@ -48,10 +48,15 @@ export function ImageGallery({ images, aspectRatio = '16/9', altPrefix = 'Image'
48
48
  const [loadedFullUrls, setLoadedFullUrls] = useState(new Set());
49
49
  const containerRef = useRef(null);
50
50
  const thumbnailRefs = useRef([]);
51
+ // Track whether the index changed via user navigation (not initial mount)
52
+ const isUserNavigationRef = useRef(false);
51
53
  const normalizedImages = images.map(normalizeImage);
52
54
  const hasMultiple = normalizedImages.length > 1;
55
+ // Trim stale refs when the image list shrinks
56
+ thumbnailRefs.current = thumbnailRefs.current.slice(0, normalizedImages.length);
53
57
  const goToImage = useCallback((index) => {
54
58
  const newIndex = (index + normalizedImages.length) % normalizedImages.length;
59
+ isUserNavigationRef.current = true;
55
60
  setSelectedIndex(newIndex);
56
61
  onImageChange?.(newIndex);
57
62
  // Preload full image if not already loaded
@@ -91,8 +96,11 @@ export function ImageGallery({ images, aspectRatio = '16/9', altPrefix = 'Image'
91
96
  break;
92
97
  }
93
98
  }, [hasMultiple, goPrev, goNext, goToImage, normalizedImages.length]);
94
- // Focus thumbnail when selected
99
+ // Focus thumbnail only on user-driven navigation, not on initial mount (WCAG)
95
100
  useEffect(() => {
101
+ if (!isUserNavigationRef.current)
102
+ return;
103
+ isUserNavigationRef.current = false;
96
104
  thumbnailRefs.current[selectedIndex]?.focus();
97
105
  }, [selectedIndex]);
98
106
  if (normalizedImages.length === 0) {
@@ -102,8 +110,7 @@ export function ImageGallery({ images, aspectRatio = '16/9', altPrefix = 'Image'
102
110
  const currentImage = normalizedImages[selectedIndex];
103
111
  return (_jsxs("div", { ref: containerRef, className: "image-gallery", onKeyDown: handleKeyDown, tabIndex: 0, role: "region", "aria-label": "Image gallery", "aria-roledescription": "carousel", children: [_jsxs("div", { className: "image-gallery__main", style: { aspectRatio }, children: [currentImage.full !== currentImage.thumb && (_jsx("img", { src: currentImage.thumb, alt: "", className: "image-gallery__main-image", style: {
104
112
  position: 'absolute',
105
- top: 0,
106
- left: 0,
113
+ inset: 0,
107
114
  width: '100%',
108
115
  height: '100%',
109
116
  objectFit: 'cover',
@@ -114,8 +121,7 @@ export function ImageGallery({ images, aspectRatio = '16/9', altPrefix = 'Image'
114
121
  position: currentImage.full !== currentImage.thumb
115
122
  ? 'absolute'
116
123
  : 'relative',
117
- top: 0,
118
- left: 0,
124
+ inset: 0,
119
125
  width: '100%',
120
126
  height: '100%',
121
127
  objectFit: 'cover',
@@ -1,6 +1,6 @@
1
1
  export interface JsonViewerProps {
2
2
  /** JSON data to display */
3
- data: any;
3
+ data: unknown;
4
4
  /** Maximum depth to expand by default */
5
5
  defaultDepth?: number;
6
6
  /** Show copy button */
@@ -1 +1 @@
1
- {"version":3,"file":"JsonViewer.d.ts","sourceRoot":"","sources":["../../../src/advanced/JsonViewer/JsonViewer.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,IAAI,EAAE,GAAG,CAAC;IAEV,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,uBAAuB;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoID;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,QAAA,MAAM,UAAU;oEAMb,eAAe;;CA0FjB,CAAC;AAIF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"JsonViewer.d.ts","sourceRoot":"","sources":["../../../src/advanced/JsonViewer/JsonViewer.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IAEd,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,uBAAuB;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAwID;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,QAAA,MAAM,UAAU;oEAMb,eAAe;;CA4FjB,CAAC;AAIF,eAAe,UAAU,CAAC"}
@@ -56,13 +56,17 @@ const JsonNode = ({ data, keyName, depth, defaultDepth, path, collapsed, onToggl
56
56
  if (isEmpty) {
57
57
  return (_jsxs("div", { className: "dndev-json-node", children: [keyName && _jsxs("span", { className: "dndev-json-key", children: [keyName, ":"] }), _jsx("span", { className: "dndev-json-value dndev-json-value-null", children: isArray ? '[]' : '{}' })] }));
58
58
  }
59
- const items = isArray ? data : Object.entries(data);
59
+ const items = isArray
60
+ ? data
61
+ : Object.entries(data);
60
62
  const bracketOpen = isArray ? '[' : '{';
61
63
  const bracketClose = isArray ? ']' : '}';
62
64
  return (_jsxs("div", { children: [_jsxs("div", { className: "dndev-json-toggle", onClick: handleToggle, children: [keyName && _jsxs("span", { className: "dndev-json-key", children: [keyName, ":"] }), _jsx("span", { className: "dndev-json-bracket", children: bracketOpen }), isExpanded ? (_jsx(ChevronDown, { className: "dndev-json-icon" })) : (_jsx(ChevronRight, { className: "dndev-json-icon" })), !isExpanded && (_jsx("span", { className: "dndev-json-count", children: isArray
63
65
  ? `${data.length} item${data.length !== 1 ? 's' : ''}`
64
66
  : `${Object.keys(data).length} key${Object.keys(data).length !== 1 ? 's' : ''}` })), !isExpanded && (_jsx("span", { className: "dndev-json-bracket", children: bracketClose }))] }), isExpanded && (_jsxs("div", { className: "dndev-json-children", children: [items.map((item, index) => {
65
- const [itemKey, itemValue] = isArray ? [index, item] : item;
67
+ const [itemKey, itemValue] = isArray
68
+ ? [index, item]
69
+ : item;
66
70
  const itemPath = `${path}.${itemKey}`;
67
71
  return (_jsx(JsonNode, { data: itemValue, keyName: isArray ? undefined : String(itemKey), depth: depth + 1, defaultDepth: defaultDepth, path: itemPath, collapsed: collapsed, onToggle: onToggle, expandedPaths: expandedPaths }, itemPath));
68
72
  }), _jsx("span", { className: "dndev-json-bracket", children: bracketClose })] }))] }));
@@ -125,7 +129,9 @@ const JsonViewer = ({ data, defaultDepth = 2, showCopyButton = true, className,
125
129
  await navigator.clipboard.writeText(jsonString);
126
130
  }
127
131
  catch (error) {
128
- console.error('Failed to copy JSON:', error);
132
+ if (process.env.NODE_ENV !== 'production') {
133
+ console.error('Failed to copy JSON:', error);
134
+ }
129
135
  }
130
136
  }, [data]);
131
137
  const jsonString = useMemo(() => {
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
3
  // packages/components/src/atomic/ActionButton/index.tsx
2
4
  /**
3
5
  * @fileoverview ActionButton Component
@@ -7,8 +9,6 @@
7
9
  * @since 0.0.1
8
10
  * @author AMBROISE PARK Consulting
9
11
  */
10
- 'use client';
11
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
12
12
  import { useState } from 'react';
13
13
  import AlertDialog from '../AlertDialog';
14
14
  import Button from '../Button';
@@ -1 +1 @@
1
- {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../../../src/atomic/ActionButton/useAction.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,kCAAkC;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,wCAAwC;IACxC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,yBAAyB;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACtC,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAyB1C"}
1
+ {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../../../src/atomic/ActionButton/useAction.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,kCAAkC;IAClC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,wCAAwC;IACxC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,yBAAyB;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACtC,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAuC1C"}
@@ -7,7 +7,7 @@
7
7
  * @since 0.0.1
8
8
  * @author AMBROISE PARK Consulting
9
9
  */
10
- import { useState, useCallback } from 'react';
10
+ import { useState, useCallback, useRef, useEffect } from 'react';
11
11
  /**
12
12
  * Hook for wrapping async actions with loading/error state management.
13
13
  *
@@ -27,9 +27,17 @@ import { useState, useCallback } from 'react';
27
27
  export function useAction({ action, onSuccess, onError, }) {
28
28
  const [loading, setLoading] = useState(false);
29
29
  const [error, setError] = useState(null);
30
+ const loadingRef = useRef(false);
31
+ const mountedRef = useRef(true);
32
+ useEffect(() => {
33
+ return () => {
34
+ mountedRef.current = false;
35
+ };
36
+ }, []);
30
37
  const execute = useCallback(async () => {
31
- if (loading)
38
+ if (loadingRef.current)
32
39
  return undefined;
40
+ loadingRef.current = true;
33
41
  setLoading(true);
34
42
  setError(null);
35
43
  try {
@@ -39,13 +47,18 @@ export function useAction({ action, onSuccess, onError, }) {
39
47
  }
40
48
  catch (err) {
41
49
  const error = err instanceof Error ? err : new Error(String(err));
42
- setError(error);
50
+ if (mountedRef.current) {
51
+ setError(error);
52
+ }
43
53
  onError?.(error);
44
54
  return undefined;
45
55
  }
46
56
  finally {
47
- setLoading(false);
57
+ loadingRef.current = false;
58
+ if (mountedRef.current) {
59
+ setLoading(false);
60
+ }
48
61
  }
49
- }, [action, onSuccess, onError, loading]);
62
+ }, [action, onSuccess, onError]);
50
63
  return { execute, loading, error };
51
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Alert/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQlE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,QAAA,MAAM,aAAa;;8EAajB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE9E,MAAM,WAAW,UACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,EAC7C,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,KAAK,GAAI,mFASZ,UAAU,4CAsDZ,CAAC;AAEF,eAAe,KAAK,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Alert/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQlE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,QAAA,MAAM,aAAa;;8EAajB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE9E,MAAM,WAAW,UACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,EAC7C,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,QAAA,MAAM,KAAK,GAAI,mFASZ,UAAU,4CAqDZ,CAAC;AAEF,eAAe,KAAK,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -50,7 +50,7 @@ export interface ButtonRenderProps {
50
50
  'data-full-width'?: string;
51
51
  role?: string;
52
52
  tabIndex?: number;
53
- [key: string]: any;
53
+ [key: string]: unknown;
54
54
  }
55
55
  export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
56
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Button/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAM1D,OAAO,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;CAKjB,CAAC;AAEX,QAAA,MAAM,cAAc;;8EAmBlB,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WACf,SACE,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,CAAC;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IACjD,yDAAyD;IACzD,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,QAAA,MAAM,MAAM,2GAiKX,CAAC;AAIF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Button/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAM1D,OAAO,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5E;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;CAKjB,CAAC;AAEX,QAAA,MAAM,cAAc;;8EAmBlB,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WACf,SACE,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,CAAC;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IACjD,yDAAyD;IACzD,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,QAAA,MAAM,MAAM,2GAiKX,CAAC;AAIF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -33,6 +33,7 @@
33
33
  * @author AMBROISE PARK Consulting
34
34
  */
35
35
  import { type ElementType, type ComponentPropsWithRef, type ReactNode } from 'react';
36
+ import { type Tone } from '../../utils/constants';
36
37
  import './CallToAction.css';
37
38
  /**
38
39
  * CallToAction-specific props (content directives)
@@ -63,7 +64,7 @@ interface CallToActionOwnProps {
63
64
  * Tone system for background colors (matches Section component)
64
65
  * @default 'ghost'
65
66
  */
66
- tone?: 'ghost' | 'base' | 'muted' | 'elevated' | 'contrast' | 'accent';
67
+ tone?: Tone;
67
68
  /** Additional children (for custom content) */
68
69
  children?: ReactNode;
69
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CallToAction/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,UAAU,oBAAoB;IAC5B;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;IAEjC,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,qEAAqE;IACrE,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,uEAAuE;IACvE,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEnC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IAEvE,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,IAC7D,oBAAoB,GAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,oBAAoB,CAAC,CAAC;AAE/D,QAAA,MAAM,YAAY,mIAuDjB,CAAC;AAIF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CallToAction/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,UAAU,oBAAoB;IAC5B;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;IAEjC,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,qEAAqE;IACrE,aAAa,CAAC,EAAE,SAAS,CAAC;IAE1B,uEAAuE;IACvE,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEnC;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,IAC7D,oBAAoB,GAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,oBAAoB,CAAC,CAAC;AAE/D,QAAA,MAAM,YAAY,mIAuDjB,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -35,10 +35,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
35
35
  * @author AMBROISE PARK Consulting
36
36
  */
37
37
  import { createElement, forwardRef, } from 'react';
38
+ import { TONE } from '../../utils/constants';
38
39
  import { cn } from '../../utils/helpers';
39
40
  import Text, { TEXT_VARIANT } from '../Text';
40
41
  import './CallToAction.css';
41
- const CallToAction = forwardRef(function CallToAction({ as = 'section', title, subtitle, primaryAction, secondaryAction, align = 'center', tone = 'ghost', children, className, ...props }, ref) {
42
+ const CallToAction = forwardRef(function CallToAction({ as = 'section', title, subtitle, primaryAction, secondaryAction, align = 'center', tone = TONE.GHOST, children, className, ...props }, ref) {
42
43
  const Component = as;
43
44
  return createElement(Component, {
44
45
  ref,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Combobox/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM7E,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,QAAQ,GAAI,yLAiBf,aAAa,4CA4Uf,CAAC;AAEF,eAAe,QAAQ,CAAC;AACxB,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC;AAC/C,YAAY,EAAE,cAAc,IAAI,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Combobox/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM7E,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,QAAQ,GAAI,yLAiBf,aAAa,4CAqVf,CAAC;AAEF,eAAe,QAAQ,CAAC;AACxB,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC;AAC/C,YAAY,EAAE,cAAc,IAAI,eAAe,EAAE,CAAC"}
@@ -170,7 +170,7 @@ const Combobox = ({ value, onValueChange, placeholder = 'Select...', emptyMessag
170
170
  setOpen(isOpen);
171
171
  onOpenChange?.(isOpen);
172
172
  };
173
- return (_jsxs("div", { ref: containerRef, className: cn('dndev-relative', open && 'dndev-combobox-open'), style: { width: '100%' }, children: [_jsxs("div", { className: "dndev-relative", children: [_jsx(Input, { ref: inputRef, id: id, label: label, value: displayValue, onChange: handleInputChange, onFocus: handleInputFocus, onClick: handleInputClick, onKeyDown: handleKeyDown, placeholder: placeholder, disabled: disabled || isLoading, icon: isLoading ? _jsx(Spinner, {}) : ChevronDown, iconEnd: true, required: required, "data-variant": variant, style: {
173
+ return (_jsxs("div", { ref: containerRef, className: cn('dndev-relative', open && 'dndev-combobox-open'), style: { width: '100%' }, children: [_jsxs("div", { className: "dndev-relative", children: [_jsx(Input, { ref: inputRef, id: id, label: label, value: displayValue, onChange: handleInputChange, onFocus: handleInputFocus, onClick: handleInputClick, onKeyDown: handleKeyDown, placeholder: placeholder, disabled: disabled || isLoading, icon: isLoading ? _jsx(Spinner, {}) : ChevronDown, iconEnd: true, required: required, role: "combobox", "aria-expanded": open, "aria-controls": `${id}-listbox`, "aria-autocomplete": "list", "data-variant": variant, style: {
174
174
  '--chevron-rotation': open ? '180deg' : '0deg',
175
175
  } }), clearable && hasSelection && !disabled && (_jsx("button", { type: "button", onClick: handleClear, className: "dndev-absolute", style: {
176
176
  insetInlineEnd: 'calc(var(--gap-md) + var(--icon-md) + var(--gap-sm))',
@@ -196,7 +196,7 @@ const Combobox = ({ value, onValueChange, placeholder = 'Select...', emptyMessag
196
196
  marginTop: 'var(--gap-tight)',
197
197
  padding: 'var(--gap-tight)',
198
198
  textAlign: 'start',
199
- }, "data-glow": "blank", children: _jsx(ScrollArea, { className: "dndev-menu-scroll-area", end: true, children: _jsx("div", { ref: listRef, style: {
199
+ }, "data-glow": "blank", children: _jsx(ScrollArea, { className: "dndev-menu-scroll-area", end: true, children: _jsx("div", { ref: listRef, id: `${id}-listbox`, role: "listbox", "aria-label": label || placeholder, style: {
200
200
  display: 'flex',
201
201
  flexDirection: 'column',
202
202
  gap: 'var(--gap-none)',
@@ -204,7 +204,7 @@ const Combobox = ({ value, onValueChange, placeholder = 'Select...', emptyMessag
204
204
  const isSelected = selectedValues.includes(option.value);
205
205
  const isHighlighted = index === highlightedIndex;
206
206
  const isCreateOption = option.isCreateOption;
207
- return (_jsx("button", { type: "button", onClick: () => !option.disabled && handleSelect(option.value), disabled: option.disabled, className: cn('dndev-interactive dndev-combobox-option', isHighlighted && 'dndev-combobox-option-highlighted', isSelected && 'dndev-combobox-option-selected', isCreateOption && 'dndev-combobox-option-create'), onMouseEnter: () => setHighlightedIndex(index), children: option.content ? (option.content) : (_jsxs(_Fragment, { children: [isCreateOption && (_jsx(Plus, { className: "dndev-combobox-option-create-icon" })), _jsxs("div", { className: "dndev-combobox-option-content", children: [_jsx("span", { className: "dndev-combobox-option-label", children: option.label }), option.description && (_jsx("span", { className: "dndev-combobox-option-description", children: option.description }))] }), isSelected && !isCreateOption && (_jsx(Check, { className: "dndev-combobox-option-check" }))] })) }, isCreateOption ? `create-${option.value}` : option.value));
207
+ return (_jsx("button", { type: "button", role: "option", "aria-selected": isSelected, onClick: () => !option.disabled && handleSelect(option.value), disabled: option.disabled, className: cn('dndev-interactive dndev-combobox-option', isHighlighted && 'dndev-combobox-option-highlighted', isSelected && 'dndev-combobox-option-selected', isCreateOption && 'dndev-combobox-option-create'), onMouseEnter: () => setHighlightedIndex(index), children: option.content ? (option.content) : (_jsxs(_Fragment, { children: [isCreateOption && (_jsx(Plus, { className: "dndev-combobox-option-create-icon" })), _jsxs("div", { className: "dndev-combobox-option-content", children: [_jsx("span", { className: "dndev-combobox-option-label", children: option.label }), option.description && (_jsx("span", { className: "dndev-combobox-option-description", children: option.description }))] }), isSelected && !isCreateOption && (_jsx(Check, { className: "dndev-combobox-option-check" }))] })) }, isCreateOption ? `create-${option.value}` : option.value));
208
208
  })) }) }) }))] }));
209
209
  };
210
210
  export default Combobox;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CopyToClipboard/index.tsx"],"names":[],"mappings":"AAgBA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,WAAW,EACX,UAAU,GAAG,MAAM,GAAG,QAAQ,CAC/B;IACC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uCAAuC;IACvC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oFAAoF;IACpF,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC3D,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CA2DrE,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/CopyToClipboard/index.tsx"],"names":[],"mappings":"AAgBA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,WAAW,EACX,UAAU,GAAG,MAAM,GAAG,QAAQ,CAC/B;IACC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,uCAAuC;IACvC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oFAAoF;IACpF,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC3D,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CA4ErE,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -9,7 +9,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
9
9
  * @author AMBROISE PARK Consulting
10
10
  */
11
11
  import { Copy, Check } from 'lucide-react';
12
- import { useState, useCallback } from 'react';
12
+ import { useState, useCallback, useEffect, useRef } from 'react';
13
13
  import { DISPLAY } from '../../styles/componentConstants';
14
14
  import { cn } from '../../utils/helpers';
15
15
  import Button, {} from '../Button';
@@ -21,21 +21,37 @@ import './CopyToClipboard.css';
21
21
  */
22
22
  export const CopyToClipboard = ({ text, children, variant = 'ghost', className, onCopy, onClick, tooltipText = 'Copy to clipboard', copiedTooltipText = 'Copied!', showTooltip = true, ariaLabel, ...buttonProps }) => {
23
23
  const [copied, setCopied] = useState(false);
24
+ const resetTimerRef = useRef(null);
25
+ // Clear the reset timer on unmount to avoid setState on unmounted component
26
+ useEffect(() => {
27
+ return () => {
28
+ if (resetTimerRef.current !== null) {
29
+ clearTimeout(resetTimerRef.current);
30
+ }
31
+ };
32
+ }, []);
24
33
  const handleCopy = useCallback(async (e) => {
25
34
  try {
26
35
  if (typeof window === 'undefined' || !navigator?.clipboard) {
27
- console.warn('Clipboard API not available');
36
+ if (process.env.NODE_ENV === 'development') {
37
+ console.warn('Clipboard API not available');
38
+ }
28
39
  return;
29
40
  }
30
41
  await navigator.clipboard.writeText(text);
31
42
  setCopied(true);
32
43
  onCopy?.(text);
33
- setTimeout(() => setCopied(false), 2000);
44
+ if (resetTimerRef.current !== null) {
45
+ clearTimeout(resetTimerRef.current);
46
+ }
47
+ resetTimerRef.current = setTimeout(() => setCopied(false), 2000);
34
48
  // Call onClick handler if provided (e.g., for stopPropagation)
35
49
  onClick?.(e);
36
50
  }
37
51
  catch (error) {
38
- console.error('Failed to copy to clipboard:', error);
52
+ if (process.env.NODE_ENV === 'development') {
53
+ console.error('Failed to copy to clipboard:', error);
54
+ }
39
55
  // No fallback - modern browsers should support clipboard API
40
56
  }
41
57
  }, [text, onCopy, onClick]);
@@ -57,7 +57,7 @@ const Dialog = ({ trigger, title, description, children, footer, open, onOpenCha
57
57
  const variantAttrs = getVariantDataAttrs({
58
58
  variant: variant !== SURFACE_VARIANT.DEFAULT ? variant : undefined,
59
59
  });
60
- return (_jsxs(Root, { open: open, onOpenChange: onOpenChange, children: [trigger && _jsx(Trigger, { asChild: true, children: trigger }), _jsxs(DialogContent, { className: cn('dndev-surface dndev-modal-content', className), noSwipe: noSwipe, closeButtonRef: closeButtonRef, onOpenChange: onOpenChange, ...variantAttrs, ...contentProps, children: [title ? (_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { className: "dndev-sr-only", children: description || 'Dialog content' })] })) : (_jsxs(_Fragment, { children: [_jsx(DialogTitle, { className: "dndev-sr-only", children: "Dialog" }), _jsx(DialogDescription, { className: "dndev-sr-only", children: description || 'Dialog content' })] })), _jsx("div", { className: "dndev-modal-body", children: children }), (footer || actions) && (_jsxs(DialogFooter, { children: [footer, actions && (_jsxs(_Fragment, { children: [actions.cancel && (_jsx(Close, { asChild: true, children: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, onClick: actions.cancel.onClick, children: actions.cancel.label }) })), actions.confirm && (_jsx(Button, { variant: actions.confirm.variant || BUTTON_VARIANT.PRIMARY, onClick: actions.confirm.onClick, children: actions.confirm.label }))] }))] })), showClose && (_jsx(Close, { ref: closeButtonRef, asChild: true, children: _jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: X, className: "dndev-modal-close", "aria-label": "Close" }) }))] })] }));
60
+ return (_jsxs(Root, { open: open, onOpenChange: onOpenChange, children: [trigger && _jsx(Trigger, { asChild: true, children: trigger }), _jsxs(DialogContent, { className: className, noSwipe: noSwipe, closeButtonRef: closeButtonRef, onOpenChange: onOpenChange, ...variantAttrs, ...contentProps, children: [title ? (_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { className: "dndev-sr-only", children: description || 'Dialog content' })] })) : (_jsxs(_Fragment, { children: [_jsx(DialogTitle, { className: "dndev-sr-only", children: "Dialog" }), _jsx(DialogDescription, { className: "dndev-sr-only", children: description || 'Dialog content' })] })), _jsx("div", { className: "dndev-modal-body", children: children }), (footer || actions) && (_jsxs(DialogFooter, { children: [footer, actions && (_jsxs(_Fragment, { children: [actions.cancel && (_jsx(Close, { asChild: true, children: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, onClick: actions.cancel.onClick, children: actions.cancel.label }) })), actions.confirm && (_jsx(Button, { variant: actions.confirm.variant || BUTTON_VARIANT.PRIMARY, onClick: actions.confirm.onClick, children: actions.confirm.label }))] }))] })), showClose && (_jsx(Close, { ref: closeButtonRef, asChild: true, children: _jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: X, className: "dndev-modal-close", "aria-label": "Close" }) }))] })] }));
61
61
  };
62
62
  export default Dialog;
63
63
  export { SURFACE_VARIANT as DIALOG_VARIANT } from '../../utils/constants';
@@ -74,7 +74,7 @@ const DropdownMenu = ({ trigger, items = [], children, contentWidth, contentAlig
74
74
  !hasSubLabel && { 'data-display': 'compact' }), children: [Icon && _jsx(Icon, {}), _jsx("span", { children: submenuItem.label }), _jsx(ChevronRight, { className: "dndev-dropdown-menu-trailing" })] }), _jsx(DropdownMenuPortalPrimitive, { children: _jsx(DropdownMenuSubContentPrimitive, { className: cn('dndev-floating dndev-z-tooltip', submenuItem.subContent
75
75
  ? 'dndev-dropdown-sub-content-custom'
76
76
  : ''), children: submenuItem.subContent ||
77
- submenuItem.subItems.map((subItem, subIndex) => {
77
+ submenuItem.subItems?.map((subItem, subIndex) => {
78
78
  // Handle label/separator in submenu
79
79
  if (subItem.type === 'label') {
80
80
  return (_jsx(DropdownMenuLabelPrimitive, { className: cn('dndev-menu-label', subItem.className), children: subItem.label }, subIndex));
@@ -9,7 +9,7 @@
9
9
  * @example
10
10
  * ```tsx
11
11
  * // Generic grid areas (default)
12
- * <Grid areas="left center right" templateColumns="1fr auto 1fr">
12
+ * <Grid areas="left center right" cols=fr">
13
13
  * <GridArea name="left">{leftContent}</GridArea>
14
14
  * <GridArea name="center">{centerContent}</GridArea>
15
15
  * <GridArea name="right">{rightContent}</GridArea>
@@ -19,7 +19,7 @@
19
19
  * @example
20
20
  * ```tsx
21
21
  * // Semantic grid layout
22
- * <Grid areas="header main sidebar footer" templateColumns="1fr 3fr 1fr">
22
+ * <Grid areas="header main sidebar footer" cols=r">
23
23
  * <GridArea as="header" name="header">Header</GridArea>
24
24
  * <GridArea as="main" name="main">Main Content</GridArea>
25
25
  * <GridArea as="aside" name="sidebar">Sidebar</GridArea>
@@ -10,7 +10,7 @@
10
10
  * @example
11
11
  * ```tsx
12
12
  * // Generic grid areas (default)
13
- * <Grid areas="left center right" templateColumns="1fr auto 1fr">
13
+ * <Grid areas="left center right" cols=fr">
14
14
  * <GridArea name="left">{leftContent}</GridArea>
15
15
  * <GridArea name="center">{centerContent}</GridArea>
16
16
  * <GridArea name="right">{rightContent}</GridArea>
@@ -20,7 +20,7 @@
20
20
  * @example
21
21
  * ```tsx
22
22
  * // Semantic grid layout
23
- * <Grid areas="header main sidebar footer" templateColumns="1fr 3fr 1fr">
23
+ * <Grid areas="header main sidebar footer" cols=r">
24
24
  * <GridArea as="header" name="header">Header</GridArea>
25
25
  * <GridArea as="main" name="main">Main Content</GridArea>
26
26
  * <GridArea as="aside" name="sidebar">Sidebar</GridArea>
@@ -11,23 +11,31 @@
11
11
  * <Card />
12
12
  * </Grid>
13
13
  *
14
- * // Responsive grid: [mobile, tablet, laptop, desktop]
15
- * // 1 col on mobile/tablet, 2 on laptop, 3 on desktop
14
+ * // Responsive equal columns: [mobile, tablet, laptop, desktop]
16
15
  * <Grid cols={[1, 1, 2, 3]}>
17
16
  * <Card />
18
17
  * <Card />
19
18
  * <Card />
20
19
  * </Grid>
21
20
  *
22
- * // Named grid areas
23
- * <Grid areas="left center right" templateColumns="1fr auto 1fr">
21
+ * // Custom column template (static)
22
+ * <Grid cols="1fr auto 1fr" areas="left center right">
24
23
  * <GridArea name="left">{left}</GridArea>
25
24
  * <GridArea name="center">{center}</GridArea>
26
25
  * <GridArea name="right">{right}</GridArea>
27
26
  * </Grid>
27
+ *
28
+ * // Custom column template (responsive) + responsive areas
29
+ * <Grid
30
+ * cols={["1fr", "1fr", "1fr 3fr", "1fr 3fr"]}
31
+ * areas={['"a" "b"', '"a" "b"', '"a b"', '"a b"']}
32
+ * >
33
+ * <GridArea name="a">{left}</GridArea>
34
+ * <GridArea name="b">{right}</GridArea>
35
+ * </Grid>
28
36
  * ```
29
37
  *
30
- * @version 0.0.4
38
+ * @version 0.0.5
31
39
  * @since 0.0.1
32
40
  * @author AMBROISE PARK Consulting
33
41
  */
@@ -38,6 +46,15 @@ import './Grid.css';
38
46
  * @example [1, 1, 2, 3] - 1 col on mobile/tablet, 2 on laptop, 3 on desktop
39
47
  */
40
48
  export type ResponsiveCols = [number, number, number, number];
49
+ /**
50
+ * Responsive template array: [mobile, tablet, laptop, desktop]
51
+ * @example ["1fr", "1fr", "1fr 3fr", "1fr 3fr"] - stacked on mobile/tablet, 1:3 ratio on laptop/desktop
52
+ */
53
+ export type ResponsiveTemplate = [string, string, string, string];
54
+ /**
55
+ * Unified column type: equal columns (number) or custom template (string), static or responsive
56
+ */
57
+ export type GridCols = number | string | ResponsiveCols | ResponsiveTemplate;
41
58
  /**
42
59
  * Grid-specific props (layout directives)
43
60
  */
@@ -49,15 +66,18 @@ interface GridOwnProps {
49
66
  */
50
67
  as?: ElementType;
51
68
  /**
52
- * Number of columns - fixed or responsive
53
- * - number: fixed columns (same on all breakpoints)
54
- * - [mobile, tablet, laptop, desktop]: responsive columns per breakpoint
69
+ * Column layout unified prop for all column patterns:
70
+ * - number: fixed equal columns → repeat(N, 1fr)
71
+ * - string: custom template raw grid-template-columns value
72
+ * - [number x4]: responsive equal columns per breakpoint
73
+ * - [string x4]: responsive custom template per breakpoint
55
74
  * @default 1
56
- * @example 3 - always 3 columns
57
- * @example [1, 1, 2, 3] - 1 col mobile/tablet, 2 laptop, 3 desktop
58
- * @example [1, 2, 3, 3] - 1 mobile, 2 tablet, 3 laptop/desktop
75
+ * @example 3 - always 3 equal columns
76
+ * @example "1fr 3fr" - custom ratio
77
+ * @example [1, 1, 2, 3] - responsive equal: 1 mobile/tablet, 2 laptop, 3 desktop
78
+ * @example ["1fr", "1fr", "1fr 3fr", "1fr 3fr"] - responsive template: stacked mobile, 1:3 desktop
59
79
  */
60
- cols?: number | ResponsiveCols;
80
+ cols?: GridCols;
61
81
  /**
62
82
  * Spacing between items
63
83
  * @default 'medium'
@@ -76,15 +96,12 @@ interface GridOwnProps {
76
96
  /**
77
97
  * Named grid areas (CSS grid-template-areas)
78
98
  * Use with GridArea component for semantic grid layouts
79
- * @example "left center right", "left right", "header header" / "sidebar main"
80
- */
81
- areas?: string;
82
- /**
83
- * Grid template columns (CSS grid-template-columns)
84
- * Required when using `areas` prop
85
- * @example "1fr auto 1fr", "1fr auto", "200px 1fr"
99
+ * - string: static areas (same on all breakpoints)
100
+ * - [mobile, tablet, laptop, desktop]: responsive areas per breakpoint
101
+ * @example "left center right"
102
+ * @example ['"a" "b"', '"a" "b"', '"a b"', '"a b"'] - stacked mobile, side-by-side desktop
86
103
  */
87
- templateColumns?: string;
104
+ areas?: string | ResponsiveTemplate;
88
105
  /** Content */
89
106
  children: ReactNode;
90
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Grid/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,OAAO,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9D;;GAEG;AACH,UAAU,YAAY;IACpB;;;;OAIG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAE/B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE5C;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAE/C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAEjD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc;IACd,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,KAAK,IAAI,YAAY,GACjE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,YAAY,CAAC,CAAC;AAErD;;;;;GAKG;AACH,QAAA,MAAM,IAAI,uHA2DT,CAAC;AAIF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atomic/Grid/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,OAAO,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAE7E;;GAEG;AACH,UAAU,YAAY;IACpB;;;;OAIG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAEhB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE5C;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAE/C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAEjD;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAEpC,cAAc;IACd,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,KAAK,IAAI,YAAY,GACjE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,YAAY,CAAC,CAAC;AAErD;;;;;GAKG;AACH,QAAA,MAAM,IAAI,uHA8ET,CAAC;AAIF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAe,IAAI,CAAC"}