@heymantle/litho 0.0.9 → 0.0.12

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 (97) hide show
  1. package/dist/cjs/components/Banner.js +6 -1
  2. package/dist/cjs/components/Button.js +33 -4
  3. package/dist/cjs/components/ButtonGroup.js +19 -4
  4. package/dist/cjs/components/Card.js +39 -3
  5. package/dist/cjs/components/Checkbox.js +13 -2
  6. package/dist/cjs/components/ChoiceList.js +3 -2
  7. package/dist/cjs/components/Code.js +227 -0
  8. package/dist/cjs/components/Filters.js +1 -1
  9. package/dist/cjs/components/Frame.js +2 -2
  10. package/dist/cjs/components/Layout.js +16 -4
  11. package/dist/cjs/components/Link.js +35 -4
  12. package/dist/cjs/components/Modal.js +4 -0
  13. package/dist/cjs/components/Page.js +5 -2
  14. package/dist/cjs/components/Pane.js +669 -84
  15. package/dist/cjs/components/ResourceList.js +2 -2
  16. package/dist/cjs/components/TabNavigation.js +300 -0
  17. package/dist/cjs/components/TextField.js +3 -0
  18. package/dist/cjs/components/Tip.js +3 -0
  19. package/dist/cjs/components/Tooltip.js +12 -13
  20. package/dist/cjs/index.js +4 -0
  21. package/dist/cjs/stories/Checkbox.stories.js +172 -1
  22. package/dist/cjs/stories/Pane.stories.js +352 -3
  23. package/dist/cjs/utilities/useBodyScrollLock.js +63 -0
  24. package/dist/cjs/utilities/useKeyboardAction.js +19 -0
  25. package/dist/cjs/utilities/useLocalStorage.js +126 -0
  26. package/dist/cjs/utilities/useMobile.js +92 -0
  27. package/dist/cjs/utilities/usePaneState.js +340 -0
  28. package/dist/cjs/utilities/useTabStorage.js +325 -0
  29. package/dist/esm/components/Banner.js +7 -2
  30. package/dist/esm/components/Button.js +33 -4
  31. package/dist/esm/components/ButtonGroup.js +19 -4
  32. package/dist/esm/components/Card.js +39 -3
  33. package/dist/esm/components/Checkbox.js +13 -2
  34. package/dist/esm/components/ChoiceList.js +3 -2
  35. package/dist/esm/components/Code.js +212 -0
  36. package/dist/esm/components/Filters.js +2 -2
  37. package/dist/esm/components/Frame.js +2 -2
  38. package/dist/esm/components/Layout.js +16 -4
  39. package/dist/esm/components/Link.js +31 -5
  40. package/dist/esm/components/Modal.js +4 -0
  41. package/dist/esm/components/Page.js +5 -2
  42. package/dist/esm/components/Pane.js +619 -83
  43. package/dist/esm/components/ResourceList.js +2 -2
  44. package/dist/esm/components/TabNavigation.js +285 -0
  45. package/dist/esm/components/TextField.js +4 -1
  46. package/dist/esm/components/Tip.js +4 -1
  47. package/dist/esm/components/Tooltip.js +12 -13
  48. package/dist/esm/index.js +1 -0
  49. package/dist/esm/stories/Checkbox.stories.js +166 -1
  50. package/dist/esm/stories/Pane.stories.js +346 -3
  51. package/dist/esm/utilities/useBodyScrollLock.js +53 -0
  52. package/dist/esm/utilities/useKeyboardAction.js +25 -0
  53. package/dist/esm/utilities/useLocalStorage.js +115 -0
  54. package/dist/esm/utilities/useMobile.js +79 -0
  55. package/dist/esm/utilities/usePaneState.js +334 -0
  56. package/dist/esm/utilities/useTabStorage.js +311 -0
  57. package/dist/types/components/Banner.d.ts.map +1 -1
  58. package/dist/types/components/Button.d.ts +2 -2
  59. package/dist/types/components/Button.d.ts.map +1 -1
  60. package/dist/types/components/ButtonGroup.d.ts.map +1 -1
  61. package/dist/types/components/Card.d.ts +34 -1
  62. package/dist/types/components/Card.d.ts.map +1 -1
  63. package/dist/types/components/Checkbox.d.ts +11 -2
  64. package/dist/types/components/Checkbox.d.ts.map +1 -1
  65. package/dist/types/components/Code.d.ts +28 -0
  66. package/dist/types/components/Code.d.ts.map +1 -0
  67. package/dist/types/components/Filters.d.ts.map +1 -1
  68. package/dist/types/components/Layout.d.ts +2 -0
  69. package/dist/types/components/Layout.d.ts.map +1 -1
  70. package/dist/types/components/Link.d.ts +4 -0
  71. package/dist/types/components/Link.d.ts.map +1 -1
  72. package/dist/types/components/Modal.d.ts +2 -0
  73. package/dist/types/components/Modal.d.ts.map +1 -1
  74. package/dist/types/components/Page.d.ts.map +1 -1
  75. package/dist/types/components/Pane.d.ts +2 -0
  76. package/dist/types/components/Pane.d.ts.map +1 -1
  77. package/dist/types/components/TabNavigation.d.ts +3 -0
  78. package/dist/types/components/TabNavigation.d.ts.map +1 -0
  79. package/dist/types/components/TextField.d.ts.map +1 -1
  80. package/dist/types/components/Tip.d.ts.map +1 -1
  81. package/dist/types/components/Tooltip.d.ts +2 -0
  82. package/dist/types/components/Tooltip.d.ts.map +1 -1
  83. package/dist/types/index.d.ts +1 -0
  84. package/dist/types/utilities/useBodyScrollLock.d.ts +12 -0
  85. package/dist/types/utilities/useBodyScrollLock.d.ts.map +1 -0
  86. package/dist/types/utilities/useKeyboardAction.d.ts +2 -0
  87. package/dist/types/utilities/useKeyboardAction.d.ts.map +1 -0
  88. package/dist/types/utilities/useLocalStorage.d.ts +13 -0
  89. package/dist/types/utilities/useLocalStorage.d.ts.map +1 -0
  90. package/dist/types/utilities/useMobile.d.ts +9 -0
  91. package/dist/types/utilities/useMobile.d.ts.map +1 -0
  92. package/dist/types/utilities/usePaneState.d.ts +2 -0
  93. package/dist/types/utilities/usePaneState.d.ts.map +1 -0
  94. package/dist/types/utilities/useTabStorage.d.ts +8 -0
  95. package/dist/types/utilities/useTabStorage.d.ts.map +1 -0
  96. package/index.css +77 -6
  97. package/package.json +1 -1
@@ -0,0 +1,325 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ function _export(target, all) {
7
+ for(var name in all)Object.defineProperty(target, name, {
8
+ enumerable: true,
9
+ get: Object.getOwnPropertyDescriptor(all, name).get
10
+ });
11
+ }
12
+ _export(exports, {
13
+ get default () {
14
+ return _default;
15
+ },
16
+ get useTabStorage () {
17
+ return useTabStorage;
18
+ }
19
+ });
20
+ var _react = require("react");
21
+ var _usePaneState = require("./usePaneState");
22
+ function _array_like_to_array(arr, len) {
23
+ if (len == null || len > arr.length) len = arr.length;
24
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
25
+ return arr2;
26
+ }
27
+ function _array_without_holes(arr) {
28
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
29
+ }
30
+ function _define_property(obj, key, value) {
31
+ if (key in obj) {
32
+ Object.defineProperty(obj, key, {
33
+ value: value,
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true
37
+ });
38
+ } else {
39
+ obj[key] = value;
40
+ }
41
+ return obj;
42
+ }
43
+ function _iterable_to_array(iter) {
44
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
45
+ }
46
+ function _non_iterable_spread() {
47
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
+ }
49
+ function _object_spread(target) {
50
+ for(var i = 1; i < arguments.length; i++){
51
+ var source = arguments[i] != null ? arguments[i] : {};
52
+ var ownKeys = Object.keys(source);
53
+ if (typeof Object.getOwnPropertySymbols === "function") {
54
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
55
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
56
+ }));
57
+ }
58
+ ownKeys.forEach(function(key) {
59
+ _define_property(target, key, source[key]);
60
+ });
61
+ }
62
+ return target;
63
+ }
64
+ function _to_consumable_array(arr) {
65
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
66
+ }
67
+ function _unsupported_iterable_to_array(o, minLen) {
68
+ if (!o) return;
69
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
70
+ var n = Object.prototype.toString.call(o).slice(8, -1);
71
+ if (n === "Object" && o.constructor) n = o.constructor.name;
72
+ if (n === "Map" || n === "Set") return Array.from(n);
73
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
74
+ }
75
+ function useTabStorage() {
76
+ var orgId = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
77
+ // Use a default orgId if none is provided to ensure functionality works
78
+ var currentOrgId = orgId || 'default';
79
+ var _usePaneState1 = (0, _usePaneState.usePaneState)(currentOrgId), paneState = _usePaneState1.state, setPaneTabs = _usePaneState1.setTabs, setPaneActiveTabId = _usePaneState1.setActiveTabId, setPaneCollapsed = _usePaneState1.setCollapsed;
80
+ // Use paneState directly - no need for local state or sync logic
81
+ var tabs = Array.isArray(paneState.tabs) ? paneState.tabs : [];
82
+ var activeTabId = paneState.activeTabId || null;
83
+ // Helper to dispatch change event (for backward compatibility)
84
+ var notifyTabChange = (0, _react.useCallback)(function() {
85
+ window.dispatchEvent(new CustomEvent('litho-pane-tabs-changed'));
86
+ }, []);
87
+ // Add a new tab
88
+ var addTab = (0, _react.useCallback)(function(tabData) {
89
+ if (!setPaneTabs || !setPaneActiveTabId) {
90
+ console.warn('Cannot add tab: orgId is required');
91
+ return null;
92
+ }
93
+ var resultTabId = null;
94
+ // Use functional updater to check for duplicates and add tab atomically
95
+ setPaneTabs(function(prevTabs) {
96
+ var currentTabs = prevTabs || [];
97
+ // If an explicit ID is provided, check if a tab with that ID already exists
98
+ if (tabData.id) {
99
+ var existingTabById = currentTabs.find(function(tab) {
100
+ return tab.id === tabData.id;
101
+ });
102
+ if (existingTabById) {
103
+ resultTabId = existingTabById.id;
104
+ return currentTabs; // Return unchanged - tab already exists
105
+ }
106
+ }
107
+ // Create new tab
108
+ var newTab = _object_spread({
109
+ id: tabData.id || "tab-".concat(Date.now(), "-").concat(Math.random().toString(36).substring(2, 11)),
110
+ title: tabData.title,
111
+ subtitle: tabData.subtitle,
112
+ content: tabData.content,
113
+ header: tabData.header,
114
+ footer: tabData.footer,
115
+ actions: tabData.actions || [],
116
+ createdAt: Date.now()
117
+ }, tabData);
118
+ resultTabId = newTab.id;
119
+ return _to_consumable_array(currentTabs).concat([
120
+ newTab
121
+ ]);
122
+ });
123
+ // Set active tab ID if a new tab was created
124
+ if (resultTabId) {
125
+ setPaneActiveTabId(resultTabId);
126
+ notifyTabChange();
127
+ }
128
+ return resultTabId;
129
+ }, [
130
+ setPaneTabs,
131
+ setPaneActiveTabId,
132
+ notifyTabChange
133
+ ]);
134
+ // Remove a tab
135
+ var removeTab = (0, _react.useCallback)(function(tabId) {
136
+ if (!setPaneTabs || !setPaneActiveTabId) {
137
+ console.warn('Cannot remove tab: orgId is required');
138
+ return;
139
+ }
140
+ var removedTabIndex = tabs.findIndex(function(tab) {
141
+ return tab.id === tabId;
142
+ });
143
+ var tabsAfterRemoval = tabs.filter(function(tab) {
144
+ return tab.id !== tabId;
145
+ });
146
+ setPaneTabs(tabsAfterRemoval);
147
+ // Handle tab switching if the removed tab was the active tab
148
+ if (activeTabId === tabId && removedTabIndex >= 0) {
149
+ var newActiveIndex = removedTabIndex > 0 ? removedTabIndex - 1 : 0;
150
+ var newActiveTab = tabsAfterRemoval[newActiveIndex];
151
+ setPaneActiveTabId(newActiveTab ? newActiveTab.id : null);
152
+ }
153
+ notifyTabChange();
154
+ }, [
155
+ tabs,
156
+ activeTabId,
157
+ setPaneTabs,
158
+ setPaneActiveTabId,
159
+ notifyTabChange
160
+ ]);
161
+ // Set active tab
162
+ var setActiveTab = (0, _react.useCallback)(function(tabId) {
163
+ if (!setPaneActiveTabId) {
164
+ console.warn('Cannot set active tab: orgId is required');
165
+ return;
166
+ }
167
+ setPaneActiveTabId(tabId);
168
+ notifyTabChange();
169
+ }, [
170
+ setPaneActiveTabId,
171
+ notifyTabChange
172
+ ]);
173
+ // Update a tab's properties
174
+ var updateTab = (0, _react.useCallback)(function(tabId, updates) {
175
+ if (!setPaneTabs) {
176
+ console.warn('Cannot update tab: orgId is required');
177
+ return;
178
+ }
179
+ setPaneTabs(function(prevTabs) {
180
+ return prevTabs.map(function(tab) {
181
+ return tab.id === tabId ? _object_spread({}, tab, updates) : tab;
182
+ });
183
+ });
184
+ notifyTabChange();
185
+ }, [
186
+ setPaneTabs,
187
+ notifyTabChange
188
+ ]);
189
+ // Clear all tabs (useful for scope switching if needed)
190
+ var clearAllTabs = (0, _react.useCallback)(function() {
191
+ if (!setPaneTabs || !setPaneActiveTabId) {
192
+ console.warn('Cannot clear tabs: orgId is required');
193
+ return;
194
+ }
195
+ setPaneTabs([]);
196
+ setPaneActiveTabId(null);
197
+ notifyTabChange();
198
+ }, [
199
+ setPaneTabs,
200
+ setPaneActiveTabId,
201
+ notifyTabChange
202
+ ]);
203
+ /**
204
+ * Attempts to expand the pane using multiple strategies to ensure it works
205
+ * regardless of timing issues with React state updates
206
+ * @param {Object} tabStorageInstance - The tabStorage instance (for accessing expandPaneRef)
207
+ */ var attemptExpandPane = (0, _react.useCallback)(function(tabStorageInstance) {
208
+ if (!tabStorageInstance) return;
209
+ var expandPane = function() {
210
+ var _tabStorageInstance_expandPaneRef_current, _tabStorageInstance_expandPaneRef;
211
+ (_tabStorageInstance_expandPaneRef = tabStorageInstance.expandPaneRef) === null || _tabStorageInstance_expandPaneRef === void 0 ? void 0 : (_tabStorageInstance_expandPaneRef_current = _tabStorageInstance_expandPaneRef.current) === null || _tabStorageInstance_expandPaneRef_current === void 0 ? void 0 : _tabStorageInstance_expandPaneRef_current.call(_tabStorageInstance_expandPaneRef);
212
+ };
213
+ // Try immediate expansion first (in case ref is ready)
214
+ expandPane();
215
+ // Then try after next frame (ensures React has updated)
216
+ if (typeof window !== 'undefined' && window.requestAnimationFrame) {
217
+ requestAnimationFrame(function() {
218
+ expandPane();
219
+ // Also try after another frame as backup
220
+ requestAnimationFrame(expandPane);
221
+ });
222
+ }
223
+ // Also try with setTimeout as additional fallback
224
+ setTimeout(expandPane, 0);
225
+ }, []);
226
+ /**
227
+ * Generic helper: find existing tab by predicate, or create new one
228
+ * @param {function} predicate - Function to find existing tab
229
+ * @param {Object} tabData - Data for new tab if not found
230
+ * @param {Object} tabStorageInstance - The tabStorage instance (for accessing expandPaneRef)
231
+ * @returns {string|null} Tab ID (existing or newly created), or null if tabStorage is not available
232
+ */ var findOrCreateTab = (0, _react.useCallback)(function(predicate, tabData, tabStorageInstance) {
233
+ // Return null if tabStorage is not available
234
+ if (!setPaneTabs || !setPaneActiveTabId) {
235
+ return null;
236
+ }
237
+ var existing = tabs.find(predicate);
238
+ if (existing) {
239
+ setActiveTab(existing.id);
240
+ // Attempt to expand pane (expandPaneRef will be set by Pane component on tabStorage)
241
+ if (tabStorageInstance) {
242
+ attemptExpandPane(tabStorageInstance);
243
+ }
244
+ return existing.id;
245
+ }
246
+ // Create new tab
247
+ var newTabId = addTab(tabData);
248
+ // Attempt to expand pane after creating new tab
249
+ if (newTabId && tabStorageInstance) {
250
+ attemptExpandPane(tabStorageInstance);
251
+ }
252
+ return newTabId;
253
+ }, [
254
+ tabs,
255
+ addTab,
256
+ setActiveTab,
257
+ attemptExpandPane
258
+ ]);
259
+ /**
260
+ * Expands the pane if it's collapsed
261
+ * @param {Object} tabStorageInstance - The tabStorage instance (for accessing expandPaneRef)
262
+ * @returns {boolean} Whether the pane was expanded (true) or not (false)
263
+ */ var expandIfCollapsed = (0, _react.useCallback)(function(tabStorageInstance) {
264
+ var _tabStorageInstance_isCollapsed;
265
+ // Check isCollapsed from Pane component (source of truth)
266
+ var wasCollapsed = (_tabStorageInstance_isCollapsed = tabStorageInstance === null || tabStorageInstance === void 0 ? void 0 : tabStorageInstance.isCollapsed) !== null && _tabStorageInstance_isCollapsed !== void 0 ? _tabStorageInstance_isCollapsed : paneState.collapsed;
267
+ if (wasCollapsed) {
268
+ var _tabStorageInstance_expandPaneRef;
269
+ // Update state to match
270
+ setPaneCollapsed(false);
271
+ // Expand via ref if available
272
+ if (tabStorageInstance === null || tabStorageInstance === void 0 ? void 0 : (_tabStorageInstance_expandPaneRef = tabStorageInstance.expandPaneRef) === null || _tabStorageInstance_expandPaneRef === void 0 ? void 0 : _tabStorageInstance_expandPaneRef.current) {
273
+ tabStorageInstance.expandPaneRef.current();
274
+ }
275
+ return true;
276
+ }
277
+ return false;
278
+ }, [
279
+ paneState.collapsed,
280
+ setPaneCollapsed
281
+ ]);
282
+ // Create tabStorage instance with self-referencing methods
283
+ var tabStorageInstanceRef = (0, _react.useRef)(null);
284
+ var tabStorageInstance = (0, _react.useMemo)(function() {
285
+ var instance = {
286
+ tabs: tabs,
287
+ activeTabId: activeTabId,
288
+ addTab: addTab,
289
+ removeTab: removeTab,
290
+ setActiveTab: setActiveTab,
291
+ updateTab: updateTab,
292
+ clearAllTabs: clearAllTabs,
293
+ findOrCreateTab: function(predicate, tabData) {
294
+ // Use the ref to avoid circular dependency
295
+ var currentInstance = tabStorageInstanceRef.current || instance;
296
+ return findOrCreateTab(predicate, tabData, currentInstance);
297
+ },
298
+ attemptExpandPane: function() {
299
+ var currentInstance = tabStorageInstanceRef.current || instance;
300
+ attemptExpandPane(currentInstance);
301
+ },
302
+ expandIfCollapsed: function() {
303
+ var currentInstance = tabStorageInstanceRef.current || instance;
304
+ return expandIfCollapsed(currentInstance);
305
+ },
306
+ orgId: currentOrgId
307
+ };
308
+ tabStorageInstanceRef.current = instance;
309
+ return instance;
310
+ }, [
311
+ tabs,
312
+ activeTabId,
313
+ addTab,
314
+ removeTab,
315
+ setActiveTab,
316
+ updateTab,
317
+ clearAllTabs,
318
+ findOrCreateTab,
319
+ attemptExpandPane,
320
+ expandIfCollapsed,
321
+ currentOrgId
322
+ ]);
323
+ return tabStorageInstance;
324
+ }
325
+ var _default = useTabStorage;
@@ -5,7 +5,7 @@ import Spinner from "./Spinner.js";
5
5
  import Text from "./Text.js";
6
6
  import Button from "./Button.js";
7
7
  import Link from "./Link.js";
8
- import { CancelMinor, CircleAlertMajor, CircleInformationMajor, TickMinor } from "@shopify/polaris-icons";
8
+ import { CancelMinor, CircleAlertMajor, CircleInformationMajor, MagicMajor, TickMinor } from "@shopify/polaris-icons";
9
9
  var styles = tv({
10
10
  base: "Litho-Banner relative rounded-md shadow-card bg-surface-highest outline outline-tint-3"
11
11
  });
@@ -153,10 +153,15 @@ var STATUS_STYLES = {
153
153
  }),
154
154
  !icon && !spinner && /*#__PURE__*/ _jsxs(_Fragment, {
155
155
  children: [
156
+ status === "insight" && /*#__PURE__*/ _jsx(Icon, {
157
+ source: MagicMajor,
158
+ color: statusColors.icon
159
+ }),
156
160
  ![
157
161
  "warning",
158
162
  "attention",
159
- "success"
163
+ "success",
164
+ "insight"
160
165
  ].includes(status) && /*#__PURE__*/ _jsx(Icon, {
161
166
  source: CircleInformationMajor,
162
167
  color: statusColors.icon
@@ -432,6 +432,23 @@ var styles = tv({
432
432
  highlight: true,
433
433
  loading: true,
434
434
  class: "bg-btn-highlight-disabled text-btn-highlight-disabled-fg"
435
+ },
436
+ // Insight buttons
437
+ {
438
+ insight: true,
439
+ disabled: false,
440
+ loading: false,
441
+ class: "bg-btn-insight hover:bg-btn-insight-low active:bg-btn-insight-lower text-btn-insight-fg hover:text-btn-insight-fg-alt border-btn-insight-border hover:border-btn-insight-border-low active:border-btn-insight-border-low\n dark:outline-hidden dark:border-transparent dark:shadow-btn-dark dark:border-t-tint-alt-6 dark:hover:border-t-tint-alt-7 dark:active:border-t-tint-alt-8"
442
+ },
443
+ {
444
+ primary: true,
445
+ disabled: true,
446
+ class: "bg-btn-primary-disabled text-btn-primary-disabled-fg"
447
+ },
448
+ {
449
+ primary: true,
450
+ loading: true,
451
+ class: "bg-btn-primary-disabled text-btn-primary-disabled-fg"
435
452
  }
436
453
  ],
437
454
  defaultVariants: {
@@ -440,7 +457,8 @@ var styles = tv({
440
457
  insideButtonGroup: false,
441
458
  shadow: false,
442
459
  darkMode: false,
443
- bordered: false
460
+ bordered: false,
461
+ insight: false
444
462
  }
445
463
  });
446
464
  var contentStyles = tv({
@@ -577,6 +595,10 @@ var textStyles = tv({
577
595
  true: "",
578
596
  false: ""
579
597
  },
598
+ insight: {
599
+ true: "",
600
+ false: ""
601
+ },
580
602
  naked: {
581
603
  true: "",
582
604
  false: ""
@@ -607,6 +629,7 @@ var textStyles = tv({
607
629
  plain: false,
608
630
  link: false,
609
631
  naked: false,
632
+ insight: false,
610
633
  class: "text-btn-secondary-fg"
611
634
  },
612
635
  {
@@ -745,7 +768,7 @@ var connectedDisclosureStyles = tv({
745
768
  * @param {boolean} [props.disclosureRight=false] - Whether to show the disclosure on the right.
746
769
  * @param {boolean} [props.plain=false] - Whether to show plain styling without background.
747
770
  * @param {boolean} [props.naked=false] - Whether to show the naked styling.
748
- * @param {"small" | "medium" | "large" | "stepper"} [props.size='medium'] - Size of the button ('small', 'medium', 'large', 'stepper').
771
+ * @param {"mini" | "small" | "medium" | "large" | "stepper"} [props.size='medium'] - Size of the button ('mini', 'small', 'medium', 'large', 'stepper').
749
772
  * @param {boolean} [props.fullWidth] - Whether the button should take full width.
750
773
  * @param {"left" | "center" | "right"} [props.align='center'] - Alignment of the button content ('left', 'center', 'right').
751
774
  * @param {string} [props.tooltip] - Tooltip to show when hovering over the button.
@@ -801,7 +824,7 @@ var connectedDisclosureStyles = tv({
801
824
  var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
802
825
  var darkMode = useDarkMode().darkMode;
803
826
  var _useState = _sliced_to_array(useState(false), 2), showConnectedDisclosurePopover = _useState[0], setShowConnectedDisclosurePopover = _useState[1];
804
- var id = props.id, children = props.children, url = props.url, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, external = props.external, target = props.target, submit = props.submit, _props_loading = props.loading, loading = _props_loading === void 0 ? false : _props_loading, _props_pressed = props.pressed, pressed = _props_pressed === void 0 ? false : _props_pressed, accessibilityLabel = props.accessibilityLabel, role = props.role, ariaControls = props.ariaControls, ariaExpanded = props.ariaExpanded, ariaDescribedBy = props.ariaDescribedBy, ariaChecked = props.ariaChecked, icon = props.icon, _iconColor = props.iconColor, _props_iconSize = props.iconSize, iconSize = _props_iconSize === void 0 ? "default" : _props_iconSize, _props_bordered = props.bordered, bordered = _props_bordered === void 0 ? false : _props_bordered, _props_primary = props.primary, primary = _props_primary === void 0 ? false : _props_primary, _props_highlight = props.highlight, highlight = _props_highlight === void 0 ? false : _props_highlight, _props_link = props.link, link = _props_link === void 0 ? false : _props_link, _props_destructive = props.destructive, destructive = _props_destructive === void 0 ? false : _props_destructive, _props_disclosure = props.disclosure, disclosure = _props_disclosure === void 0 ? false : _props_disclosure, _props_disclosureRight = props.disclosureRight, disclosureRight = _props_disclosureRight === void 0 ? false : _props_disclosureRight, _props_plain = props.plain, plain = _props_plain === void 0 ? false : _props_plain, _props_naked = props.naked, naked = _props_naked === void 0 ? false : _props_naked, _props_size = props.size, size = _props_size === void 0 ? "medium" : _props_size, fullWidth = props.fullWidth, _props_align = props.align, align = _props_align === void 0 ? "center" : _props_align, connectedDisclosure = props.connectedDisclosure, className = props.className, contentClassName = props.contentClassName, rounded = props.rounded, onClick = props.onClick, onMouseDown = props.onMouseDown, tooltip = props.tooltip, _props_tooltipAlignment = props.tooltipAlignment, tooltipAlignment = _props_tooltipAlignment === void 0 ? "right" : _props_tooltipAlignment, _props_tooltipPosition = props.tooltipPosition, tooltipPosition = _props_tooltipPosition === void 0 ? "above" : _props_tooltipPosition, _props_tooltipDisplay = props.tooltipDisplay, tooltipDisplay = _props_tooltipDisplay === void 0 ? "inline-block" : _props_tooltipDisplay, shadow = props.shadow, restProps = _object_without_properties(props, [
827
+ var id = props.id, children = props.children, url = props.url, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, external = props.external, target = props.target, submit = props.submit, _props_loading = props.loading, loading = _props_loading === void 0 ? false : _props_loading, _props_pressed = props.pressed, pressed = _props_pressed === void 0 ? false : _props_pressed, accessibilityLabel = props.accessibilityLabel, role = props.role, ariaControls = props.ariaControls, ariaExpanded = props.ariaExpanded, ariaDescribedBy = props.ariaDescribedBy, ariaChecked = props.ariaChecked, icon = props.icon, _iconColor = props.iconColor, _props_iconSize = props.iconSize, iconSize = _props_iconSize === void 0 ? "default" : _props_iconSize, _props_bordered = props.bordered, bordered = _props_bordered === void 0 ? false : _props_bordered, _props_primary = props.primary, primary = _props_primary === void 0 ? false : _props_primary, _props_highlight = props.highlight, highlight = _props_highlight === void 0 ? false : _props_highlight, _props_link = props.link, link = _props_link === void 0 ? false : _props_link, _props_destructive = props.destructive, destructive = _props_destructive === void 0 ? false : _props_destructive, _props_disclosure = props.disclosure, disclosure = _props_disclosure === void 0 ? false : _props_disclosure, _props_disclosureRight = props.disclosureRight, disclosureRight = _props_disclosureRight === void 0 ? false : _props_disclosureRight, _props_insight = props.insight, insight = _props_insight === void 0 ? false : _props_insight, _props_plain = props.plain, plain = _props_plain === void 0 ? false : _props_plain, _props_naked = props.naked, naked = _props_naked === void 0 ? false : _props_naked, _props_size = props.size, size = _props_size === void 0 ? "medium" : _props_size, fullWidth = props.fullWidth, _props_align = props.align, align = _props_align === void 0 ? "center" : _props_align, connectedDisclosure = props.connectedDisclosure, className = props.className, contentClassName = props.contentClassName, rounded = props.rounded, onClick = props.onClick, onMouseDown = props.onMouseDown, tooltip = props.tooltip, _props_tooltipAlignment = props.tooltipAlignment, tooltipAlignment = _props_tooltipAlignment === void 0 ? "right" : _props_tooltipAlignment, _props_tooltipPosition = props.tooltipPosition, tooltipPosition = _props_tooltipPosition === void 0 ? "above" : _props_tooltipPosition, _props_tooltipDisplay = props.tooltipDisplay, tooltipDisplay = _props_tooltipDisplay === void 0 ? "inline-block" : _props_tooltipDisplay, shadow = props.shadow, restProps = _object_without_properties(props, [
805
828
  "id",
806
829
  "children",
807
830
  "url",
@@ -827,6 +850,7 @@ var connectedDisclosureStyles = tv({
827
850
  "destructive",
828
851
  "disclosure",
829
852
  "disclosureRight",
853
+ "insight",
830
854
  "plain",
831
855
  "naked",
832
856
  "size",
@@ -855,9 +879,10 @@ var connectedDisclosureStyles = tv({
855
879
  link: "btn-link".concat(base),
856
880
  destructive: "btn-destructive".concat(base),
857
881
  highlight: "btn-highlight".concat(base),
882
+ insight: "btn-insight".concat(base),
858
883
  default: "btn-secondary".concat(base)
859
884
  };
860
- var iconColor = iconColorMap[primary ? "primary" : plain ? "plain" : link ? "link" : destructive ? "destructive" : highlight ? "highlight" : "default"];
885
+ var iconColor = iconColorMap[primary ? "primary" : plain ? "plain" : link ? "link" : destructive ? "destructive" : highlight ? "highlight" : insight ? "insight" : "default"];
861
886
  var iconOnly = hasIcon && !hasChildren;
862
887
  var connectedDisclosureActions = (connectedDisclosure === null || connectedDisclosure === void 0 ? void 0 : connectedDisclosure.actions) || [];
863
888
  var showConnectedDisclosure = connectedDisclosure && connectedDisclosureActions.length > 0;
@@ -867,6 +892,7 @@ var connectedDisclosureStyles = tv({
867
892
  link: link,
868
893
  destructive: destructive,
869
894
  highlight: highlight,
895
+ insight: insight,
870
896
  insideButtonGroup: insideButtonGroup,
871
897
  loading: loading,
872
898
  disabled: disabled,
@@ -897,6 +923,7 @@ var connectedDisclosureStyles = tv({
897
923
  link: link,
898
924
  destructive: destructive,
899
925
  highlight: highlight,
926
+ insight: insight,
900
927
  pressed: pressed,
901
928
  loading: loading,
902
929
  disabled: disabled,
@@ -908,6 +935,7 @@ var connectedDisclosureStyles = tv({
908
935
  link: link,
909
936
  destructive: destructive,
910
937
  highlight: highlight,
938
+ insight: insight,
911
939
  loading: loading,
912
940
  disabled: disabled
913
941
  });
@@ -991,6 +1019,7 @@ var connectedDisclosureStyles = tv({
991
1019
  link: link,
992
1020
  destructive: destructive,
993
1021
  highlight: highlight,
1022
+ insight: insight,
994
1023
  icon: CaretDownMinor,
995
1024
  disclosureRight: true,
996
1025
  iconColor: _iconColor,
@@ -86,14 +86,26 @@ var styles = tv({
86
86
  variants: {
87
87
  segmented: {
88
88
  true: "Litho-ButtonGroup--Segmented",
89
- false: "gap-2"
89
+ false: ""
90
90
  },
91
91
  noWrap: {
92
92
  true: "flex-nowrap"
93
93
  },
94
94
  fullWidth: {
95
95
  true: "Litho-ButtonGroup--FullWidth"
96
+ },
97
+ gap: {
98
+ "0": "gap-0",
99
+ "1": "gap-1",
100
+ "2": "gap-2",
101
+ "3": "gap-3",
102
+ "4": "gap-4",
103
+ "5": "gap-5",
104
+ "6": "gap-6"
96
105
  }
106
+ },
107
+ defaultVariants: {
108
+ gap: "2"
97
109
  }
98
110
  });
99
111
  export var ButtonGroupContext = /*#__PURE__*/ createContext(false);
@@ -111,18 +123,21 @@ export var ButtonGroupContext = /*#__PURE__*/ createContext(false);
111
123
  * @returns {JSX.Element} The rendered ButtonGroup component.
112
124
  */ function ButtonGroup() {
113
125
  var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
114
- var children = props.children, _props_segmented = props.segmented, segmented = _props_segmented === void 0 ? false : _props_segmented, id = props.id, className = props.className, _props_fullWidth = props.fullWidth, fullWidth = _props_fullWidth === void 0 ? false : _props_fullWidth, _props_noWrap = props.noWrap, noWrap = _props_noWrap === void 0 ? false : _props_noWrap, restProps = _object_without_properties(props, [
126
+ var children = props.children, _props_segmented = props.segmented, segmented = _props_segmented === void 0 ? false : _props_segmented, id = props.id, className = props.className, _props_fullWidth = props.fullWidth, fullWidth = _props_fullWidth === void 0 ? false : _props_fullWidth, _props_noWrap = props.noWrap, noWrap = _props_noWrap === void 0 ? false : _props_noWrap, tmp = props.gap, _gap = tmp === void 0 ? "2" : tmp, restProps = _object_without_properties(props, [
115
127
  "children",
116
128
  "segmented",
117
129
  "id",
118
130
  "className",
119
131
  "fullWidth",
120
- "noWrap"
132
+ "noWrap",
133
+ "gap"
121
134
  ]);
135
+ var gap = segmented ? "0" : _gap;
122
136
  var classes = styles({
123
137
  segmented: segmented,
124
138
  noWrap: noWrap,
125
- fullWidth: fullWidth
139
+ fullWidth: fullWidth,
140
+ gap: gap
126
141
  });
127
142
  return /*#__PURE__*/ _jsx(ButtonGroupContext.Provider, {
128
143
  value: segmented,
@@ -414,7 +414,7 @@ var sectionBodyStyles = tv({
414
414
  *
415
415
  * @returns {React.ReactElement} The rendered Section component.
416
416
  */ Card.Section = function(param) {
417
- var title = param.title, _param_titleVariant = param.titleVariant, titleVariant = _param_titleVariant === void 0 ? "headingSm" : _param_titleVariant, action = param.action, children = param.children, _param_padded = param.padded, padded = _param_padded === void 0 ? true : _param_padded, _param_paddedHalf = param.paddedHalf, paddedHalf = _param_paddedHalf === void 0 ? false : _param_paddedHalf, _param_isFirst = param.isFirst, isFirst = _param_isFirst === void 0 ? false : _param_isFirst, _param_cardHasHeader = param.cardHasHeader, cardHasHeader = _param_cardHasHeader === void 0 ? false : _param_cardHasHeader, _param_borderBottom = param.borderBottom, borderBottom = _param_borderBottom === void 0 ? true : _param_borderBottom, _param_borderTop = param.borderTop, borderTop = _param_borderTop === void 0 ? false : _param_borderTop, _param_subdued = param.subdued, subdued = _param_subdued === void 0 ? false : _param_subdued, _param_headerGap = param.headerGap, headerGap = _param_headerGap === void 0 ? "0" : _param_headerGap, _param_gap = param.gap, gap = _param_gap === void 0 ? "0" : _param_gap, icon = param.icon, tooltip = param.tooltip, description = param.description, accessory = param.accessory, _param_emptyState = param.emptyState, emptyState = _param_emptyState === void 0 ? {} : _param_emptyState, className = param.className;
417
+ var title = param.title, _param_titleVariant = param.titleVariant, titleVariant = _param_titleVariant === void 0 ? "headingSm" : _param_titleVariant, action = param.action, children = param.children, _param_padded = param.padded, padded = _param_padded === void 0 ? true : _param_padded, _param_paddedHalf = param.paddedHalf, paddedHalf = _param_paddedHalf === void 0 ? false : _param_paddedHalf, _param_isFirst = param.isFirst, isFirst = _param_isFirst === void 0 ? false : _param_isFirst, _param_cardHasHeader = param.cardHasHeader, cardHasHeader = _param_cardHasHeader === void 0 ? false : _param_cardHasHeader, _param_borderBottom = param.borderBottom, borderBottom = _param_borderBottom === void 0 ? true : _param_borderBottom, _param_borderTop = param.borderTop, borderTop = _param_borderTop === void 0 ? false : _param_borderTop, _param_subdued = param.subdued, subdued = _param_subdued === void 0 ? false : _param_subdued, _param_headerGap = param.headerGap, headerGap = _param_headerGap === void 0 ? "0" : _param_headerGap, _param_gap = param.gap, gap = _param_gap === void 0 ? "0" : _param_gap, icon = param.icon, tooltip = param.tooltip, description = param.description, accessory = param.accessory, _param_emptyState = param.emptyState, emptyState = _param_emptyState === void 0 ? {} : _param_emptyState, className = param.className, sectionBodyClassName = param.sectionBodyClassName;
418
418
  var showHeader = !!(title || action);
419
419
  var sectionClasses = sectionStyles({
420
420
  borderBottom: borderBottom,
@@ -484,7 +484,7 @@ var sectionBodyStyles = tv({
484
484
  ]
485
485
  }),
486
486
  /*#__PURE__*/ _jsxs("div", {
487
- className: sectionBodyClasses,
487
+ className: "".concat(sectionBodyClasses).concat(sectionBodyClassName ? " ".concat(sectionBodyClassName) : ""),
488
488
  children: [
489
489
  emptyState.showIf && /*#__PURE__*/ _jsx("div", {
490
490
  className: paddedHalf ? "px-2 @md:px-2.5 pb-2" : !padded ? "px-4 @md:px-5 pb-4" : "",
@@ -501,7 +501,7 @@ var sectionBodyStyles = tv({
501
501
  };
502
502
  Card.Section.displayName = "Card.Section";
503
503
  var clickableRowStyles = tv({
504
- base: "Litho-Card__ClickableRow flex py-1.5 px-2.5 cursor-pointer rounded-md hover:bg-tint-2 active:bg-tint-3",
504
+ base: "Litho-Card__Row py-1.5 px-2.5 cursor-pointer rounded-md hover:bg-tint-2 active:bg-tint-3",
505
505
  variants: {
506
506
  disabled: {
507
507
  true: "opacity-50 cursor-not-allowed pointer-events-none"
@@ -536,4 +536,40 @@ var clickableRowStyles = tv({
536
536
  });
537
537
  };
538
538
  Card.ClickableRow.displayName = "Card.ClickableRow";
539
+ Card.Rows = function(param) {
540
+ var children = param.children;
541
+ return /*#__PURE__*/ _jsx("div", {
542
+ className: "px-1.5 pb-1.5 @md:pb-2 @md:px-2",
543
+ children: children
544
+ });
545
+ };
546
+ Card.Rows.displayName = "Card.Rows";
547
+ /**
548
+ * Row component for creating clickable rows inside the Card.
549
+ *
550
+ * @component
551
+ * @param {Object} props - Props for the Row component.
552
+ * @param {React.ReactNode} [props.children] - Child elements to render inside the row.
553
+ * @param {Function} [props.onClick] - Click handler for the row.
554
+ * @param {string} [props.id] - ID to apply to the row element.
555
+ * @param {string} [props.url] - URL to open when the row is clicked.
556
+ * @param {string} [props.className] - Additional classes to apply to the row.
557
+ * @param {boolean} [props.disabled=false] - Disables interaction with the row.
558
+ *
559
+ * @returns {React.ReactElement} The rendered Row component.
560
+ */ Card.Row = function(param) {
561
+ var children = param.children, onClick = param.onClick, id = param.id, url = param.url, _param_disabled = param.disabled, disabled = _param_disabled === void 0 ? false : _param_disabled, className = param.className;
562
+ var classes = clickableRowStyles({
563
+ disabled: disabled
564
+ });
565
+ return /*#__PURE__*/ _jsx("div", {
566
+ id: id,
567
+ onClick: url ? function() {
568
+ return window.open(url, "_blank");
569
+ } : onClick,
570
+ className: "".concat(classes).concat(className ? " ".concat(className) : ""),
571
+ children: children
572
+ });
573
+ };
574
+ Card.Row.displayName = "Card.Row";
539
575
  export default Card;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { tv } from "tailwind-variants";
3
+ import { isValidElement } from "react";
3
4
  import Icon from "./Icon.js";
4
5
  import Label from "./Label.js";
5
6
  import Text from "./Text.js";
@@ -54,7 +55,7 @@ var checkboxStyles = tv({
54
55
  * @component
55
56
  *
56
57
  * @param {Object} props - Props for the Checkbox component.
57
- * @param {string} [props.label] - The text label for the checkbox.
58
+ * @param {string|React.ReactNode} [props.label] - The label for the checkbox. Can be a string or a React element (e.g., text with a badge).
58
59
  * @param {boolean} [props.labelHidden=false] - If true, hides the label visually but keeps it available for screen readers.
59
60
  * @param {string} [props.id] - The unique identifier for the checkbox input.
60
61
  * @param {string} [props.name] - The name attribute for the checkbox input.
@@ -73,6 +74,7 @@ var checkboxStyles = tv({
73
74
  * @returns {JSX.Element} The rendered Checkbox component.
74
75
  *
75
76
  * @example
77
+ * // Basic usage with string label
76
78
  * <Checkbox
77
79
  * label="Accept Terms"
78
80
  * id="accept-terms"
@@ -82,11 +84,20 @@ var checkboxStyles = tv({
82
84
  * helpText="You must accept the terms to proceed."
83
85
  * onChange={(e) => console.log('Checkbox changed:', e.target.checked)}
84
86
  * />
87
+ *
88
+ * @example
89
+ * // With React element label (e.g., text with badge)
90
+ * <Checkbox
91
+ * label={<Stack horizontal gap="xs" blockAlign="center"><span>Premium Feature</span><Badge>Pro</Badge></Stack>}
92
+ * checked={false}
93
+ * onChange={(checked) => console.log('Checkbox changed:', checked)}
94
+ * />
85
95
  */ function Checkbox() {
86
96
  var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
87
97
  var label = props.label, tooltip = props.tooltip, labelHidden = props.labelHidden, id = props.id, name = props.name, value = props.value, error = props.error, tmp = props.checked, _checked = tmp === void 0 ? false : tmp, _props_indeterminate = props.indeterminate, indeterminate = _props_indeterminate === void 0 ? false : _props_indeterminate, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, helpText = props.helpText, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, className = props.className;
88
98
  var checked = !!_checked;
89
99
  var hasError = !!error;
100
+ var labelIsReactElement = /*#__PURE__*/ isValidElement(label);
90
101
  var classes = styles({
91
102
  disabled: disabled
92
103
  });
@@ -149,7 +160,7 @@ var checkboxStyles = tv({
149
160
  label && !labelHidden && /*#__PURE__*/ _jsx(Label, {
150
161
  tooltip: tooltip,
151
162
  disabled: disabled,
152
- as: "p",
163
+ as: labelIsReactElement ? "div" : "p",
153
164
  children: label
154
165
  })
155
166
  ]