@heymantle/litho 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/cjs/components/ActionList.js +267 -0
  4. package/dist/cjs/components/AnnouncementBar.js +73 -0
  5. package/dist/cjs/components/AppProvider.js +245 -0
  6. package/dist/cjs/components/Autocomplete.js +351 -0
  7. package/dist/cjs/components/Badge.js +234 -0
  8. package/dist/cjs/components/Banner.js +264 -0
  9. package/dist/cjs/components/Box.js +247 -0
  10. package/dist/cjs/components/Button.js +1018 -0
  11. package/dist/cjs/components/ButtonGroup.js +196 -0
  12. package/dist/cjs/components/Card.js +593 -0
  13. package/dist/cjs/components/Checkbox.js +175 -0
  14. package/dist/cjs/components/ChoiceList.js +160 -0
  15. package/dist/cjs/components/Collapsible.js +42 -0
  16. package/dist/cjs/components/ColorField.js +159 -0
  17. package/dist/cjs/components/ContextualSaveBar.js +53 -0
  18. package/dist/cjs/components/DatePicker.js +547 -0
  19. package/dist/cjs/components/Divider.js +50 -0
  20. package/dist/cjs/components/DropZone.js +547 -0
  21. package/dist/cjs/components/EmptyState.js +111 -0
  22. package/dist/cjs/components/Filters.js +874 -0
  23. package/dist/cjs/components/FooterHelp.js +48 -0
  24. package/dist/cjs/components/Form.js +44 -0
  25. package/dist/cjs/components/Frame.js +386 -0
  26. package/dist/cjs/components/FrameSaveBar.js +239 -0
  27. package/dist/cjs/components/Grid.js +151 -0
  28. package/dist/cjs/components/HorizontalStack.js +180 -0
  29. package/dist/cjs/components/Icon.js +346 -0
  30. package/dist/cjs/components/Image.js +191 -0
  31. package/dist/cjs/components/InlineError.js +57 -0
  32. package/dist/cjs/components/Label.js +78 -0
  33. package/dist/cjs/components/Layout.js +228 -0
  34. package/dist/cjs/components/LayoutSection.js +133 -0
  35. package/dist/cjs/components/Link.js +128 -0
  36. package/dist/cjs/components/List.js +69 -0
  37. package/dist/cjs/components/Listbox.js +211 -0
  38. package/dist/cjs/components/Loading.js +103 -0
  39. package/dist/cjs/components/Modal.js +449 -0
  40. package/dist/cjs/components/Navigation.js +331 -0
  41. package/dist/cjs/components/Page.js +529 -0
  42. package/dist/cjs/components/Pagination.js +109 -0
  43. package/dist/cjs/components/Pane.js +128 -0
  44. package/dist/cjs/components/Popover.js +365 -0
  45. package/dist/cjs/components/PopoverManager.js +34 -0
  46. package/dist/cjs/components/ProgressBar.js +124 -0
  47. package/dist/cjs/components/RadioButton.js +172 -0
  48. package/dist/cjs/components/RadioButtonCard.js +193 -0
  49. package/dist/cjs/components/RangeSlider.js +235 -0
  50. package/dist/cjs/components/ResourceList.js +105 -0
  51. package/dist/cjs/components/Select.js +300 -0
  52. package/dist/cjs/components/SkeletonText.js +130 -0
  53. package/dist/cjs/components/Spinner.js +72 -0
  54. package/dist/cjs/components/Table.js +1184 -0
  55. package/dist/cjs/components/Tabs.js +421 -0
  56. package/dist/cjs/components/Tag.js +165 -0
  57. package/dist/cjs/components/Text.js +274 -0
  58. package/dist/cjs/components/TextField.js +584 -0
  59. package/dist/cjs/components/Thumbnail.js +73 -0
  60. package/dist/cjs/components/TimePicker.js +23 -0
  61. package/dist/cjs/components/Tip.js +220 -0
  62. package/dist/cjs/components/Tooltip.js +431 -0
  63. package/dist/cjs/components/TopBar.js +210 -0
  64. package/dist/cjs/components/VerticalStack.js +161 -0
  65. package/dist/cjs/index.js +308 -0
  66. package/dist/cjs/styles/Table.js +591 -0
  67. package/dist/cjs/utilities/dates.js +339 -0
  68. package/dist/cjs/utilities/useIndexResourceState.js +175 -0
  69. package/dist/cjs/utilities/useMounted.js +67 -0
  70. package/dist/cjs/utilities/useTableScrollState.js +142 -0
  71. package/dist/esm/components/ActionList.js +216 -0
  72. package/dist/esm/components/AnnouncementBar.js +63 -0
  73. package/dist/esm/components/AppProvider.js +185 -0
  74. package/dist/esm/components/Autocomplete.js +300 -0
  75. package/dist/esm/components/Badge.js +225 -0
  76. package/dist/esm/components/Banner.js +254 -0
  77. package/dist/esm/components/Box.js +238 -0
  78. package/dist/esm/components/Button.js +967 -0
  79. package/dist/esm/components/ButtonGroup.js +137 -0
  80. package/dist/esm/components/Card.js +537 -0
  81. package/dist/esm/components/Checkbox.js +165 -0
  82. package/dist/esm/components/ChoiceList.js +145 -0
  83. package/dist/esm/components/Collapsible.js +32 -0
  84. package/dist/esm/components/ColorField.js +149 -0
  85. package/dist/esm/components/ContextualSaveBar.js +43 -0
  86. package/dist/esm/components/DatePicker.js +532 -0
  87. package/dist/esm/components/Divider.js +41 -0
  88. package/dist/esm/components/DropZone.js +537 -0
  89. package/dist/esm/components/EmptyState.js +101 -0
  90. package/dist/esm/components/Filters.js +823 -0
  91. package/dist/esm/components/FooterHelp.js +38 -0
  92. package/dist/esm/components/Form.js +35 -0
  93. package/dist/esm/components/Frame.js +376 -0
  94. package/dist/esm/components/FrameSaveBar.js +229 -0
  95. package/dist/esm/components/Grid.js +142 -0
  96. package/dist/esm/components/HorizontalStack.js +171 -0
  97. package/dist/esm/components/Icon.js +296 -0
  98. package/dist/esm/components/Image.js +141 -0
  99. package/dist/esm/components/InlineError.js +43 -0
  100. package/dist/esm/components/Label.js +63 -0
  101. package/dist/esm/components/Layout.js +164 -0
  102. package/dist/esm/components/LayoutSection.js +82 -0
  103. package/dist/esm/components/Link.js +119 -0
  104. package/dist/esm/components/List.js +61 -0
  105. package/dist/esm/components/Listbox.js +201 -0
  106. package/dist/esm/components/Loading.js +93 -0
  107. package/dist/esm/components/Modal.js +390 -0
  108. package/dist/esm/components/Navigation.js +321 -0
  109. package/dist/esm/components/Page.js +473 -0
  110. package/dist/esm/components/Pagination.js +99 -0
  111. package/dist/esm/components/Pane.js +118 -0
  112. package/dist/esm/components/Popover.js +350 -0
  113. package/dist/esm/components/PopoverManager.js +24 -0
  114. package/dist/esm/components/ProgressBar.js +114 -0
  115. package/dist/esm/components/RadioButton.js +157 -0
  116. package/dist/esm/components/RadioButtonCard.js +178 -0
  117. package/dist/esm/components/RangeSlider.js +225 -0
  118. package/dist/esm/components/ResourceList.js +95 -0
  119. package/dist/esm/components/Select.js +285 -0
  120. package/dist/esm/components/SkeletonText.js +120 -0
  121. package/dist/esm/components/Spinner.js +63 -0
  122. package/dist/esm/components/Table.js +1129 -0
  123. package/dist/esm/components/Tabs.js +366 -0
  124. package/dist/esm/components/Tag.js +151 -0
  125. package/dist/esm/components/Text.js +265 -0
  126. package/dist/esm/components/TextField.js +533 -0
  127. package/dist/esm/components/Thumbnail.js +63 -0
  128. package/dist/esm/components/TimePicker.js +13 -0
  129. package/dist/esm/components/Tip.js +169 -0
  130. package/dist/esm/components/Tooltip.js +380 -0
  131. package/dist/esm/components/TopBar.js +200 -0
  132. package/dist/esm/components/VerticalStack.js +152 -0
  133. package/dist/esm/index.js +61 -0
  134. package/dist/esm/styles/Table.js +581 -0
  135. package/dist/esm/utilities/dates.js +289 -0
  136. package/dist/esm/utilities/useIndexResourceState.js +158 -0
  137. package/dist/esm/utilities/useMounted.js +57 -0
  138. package/dist/esm/utilities/useTableScrollState.js +132 -0
  139. package/index.css +1137 -0
  140. package/package.json +53 -0
@@ -0,0 +1,584 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function() {
9
+ return _default;
10
+ }
11
+ });
12
+ var _jsxruntime = require("react/jsx-runtime");
13
+ var _polarisicons = require("@shopify/polaris-icons");
14
+ var _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
15
+ var _tailwindvariants = require("tailwind-variants");
16
+ var _index = require("../index");
17
+ function _array_like_to_array(arr, len) {
18
+ if (len == null || len > arr.length) len = arr.length;
19
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
20
+ return arr2;
21
+ }
22
+ function _array_with_holes(arr) {
23
+ if (Array.isArray(arr)) return arr;
24
+ }
25
+ function _getRequireWildcardCache(nodeInterop) {
26
+ if (typeof WeakMap !== "function") return null;
27
+ var cacheBabelInterop = new WeakMap();
28
+ var cacheNodeInterop = new WeakMap();
29
+ return (_getRequireWildcardCache = function(nodeInterop) {
30
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
31
+ })(nodeInterop);
32
+ }
33
+ function _interop_require_wildcard(obj, nodeInterop) {
34
+ if (!nodeInterop && obj && obj.__esModule) {
35
+ return obj;
36
+ }
37
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
38
+ return {
39
+ default: obj
40
+ };
41
+ }
42
+ var cache = _getRequireWildcardCache(nodeInterop);
43
+ if (cache && cache.has(obj)) {
44
+ return cache.get(obj);
45
+ }
46
+ var newObj = {
47
+ __proto__: null
48
+ };
49
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
50
+ for(var key in obj){
51
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
52
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
53
+ if (desc && (desc.get || desc.set)) {
54
+ Object.defineProperty(newObj, key, desc);
55
+ } else {
56
+ newObj[key] = obj[key];
57
+ }
58
+ }
59
+ }
60
+ newObj.default = obj;
61
+ if (cache) {
62
+ cache.set(obj, newObj);
63
+ }
64
+ return newObj;
65
+ }
66
+ function _iterable_to_array_limit(arr, i) {
67
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
68
+ if (_i == null) return;
69
+ var _arr = [];
70
+ var _n = true;
71
+ var _d = false;
72
+ var _s, _e;
73
+ try {
74
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
75
+ _arr.push(_s.value);
76
+ if (i && _arr.length === i) break;
77
+ }
78
+ } catch (err) {
79
+ _d = true;
80
+ _e = err;
81
+ } finally{
82
+ try {
83
+ if (!_n && _i["return"] != null) _i["return"]();
84
+ } finally{
85
+ if (_d) throw _e;
86
+ }
87
+ }
88
+ return _arr;
89
+ }
90
+ function _non_iterable_rest() {
91
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
92
+ }
93
+ function _sliced_to_array(arr, i) {
94
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
95
+ }
96
+ function _unsupported_iterable_to_array(o, minLen) {
97
+ if (!o) return;
98
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
99
+ var n = Object.prototype.toString.call(o).slice(8, -1);
100
+ if (n === "Object" && o.constructor) n = o.constructor.name;
101
+ if (n === "Map" || n === "Set") return Array.from(n);
102
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
103
+ }
104
+ var styles = (0, _tailwindvariants.tv)({
105
+ base: "Litho-TextField group relative rounded-md border min-h-8 cursor-text",
106
+ variants: {
107
+ disabled: {
108
+ true: "bg-form-bg-disabled border-form-border"
109
+ },
110
+ hasError: {
111
+ true: "bg-form-bg-error border-form-border-error",
112
+ false: ""
113
+ },
114
+ subdued: {
115
+ true: "border-transparent",
116
+ false: ""
117
+ },
118
+ transparent: {
119
+ true: "border-transparent",
120
+ false: ""
121
+ }
122
+ },
123
+ compoundVariants: [
124
+ {
125
+ focused: true,
126
+ hasError: false,
127
+ class: "bg-form-bg-focus ring ring-form-focus border-form-border-focus"
128
+ },
129
+ {
130
+ focused: true,
131
+ hasError: true,
132
+ class: "ring ring-form-focus-error"
133
+ },
134
+ {
135
+ disabled: false,
136
+ hasError: false,
137
+ subdued: false,
138
+ focused: false,
139
+ class: "bg-form-bg border-form-border"
140
+ },
141
+ {
142
+ disabled: false,
143
+ hasError: false,
144
+ subdued: false,
145
+ focused: false,
146
+ class: "bg-form-bg hover:border-form-border-hover"
147
+ },
148
+ {
149
+ focused: false,
150
+ disabled: false,
151
+ hasError: false,
152
+ subdued: true,
153
+ class: "bg-tint-2 border-transparent hover:bg-tint-3 active:bg-tint-4"
154
+ },
155
+ {
156
+ focused: false,
157
+ disabled: false,
158
+ hasError: false,
159
+ transparent: true,
160
+ class: "bg-transparent hover:border-transparent hover:bg-tint-2 dark:hover:bg-tint-12 border-transparent"
161
+ },
162
+ {
163
+ focused: true,
164
+ disabled: false,
165
+ hasError: false,
166
+ subdued: true,
167
+ class: "bg-form-bg"
168
+ }
169
+ ],
170
+ defaultVariants: {
171
+ disabled: false,
172
+ hasError: false,
173
+ focused: false
174
+ }
175
+ });
176
+ var inputStyles = (0, _tailwindvariants.tv)({
177
+ base: "Litho-TextField__Input appearance-none block bg-transparent border-0 outline-hidden h-full w-full",
178
+ variants: {
179
+ align: {
180
+ left: "",
181
+ center: "text-center",
182
+ right: "text-right"
183
+ },
184
+ hasSuffix: {
185
+ true: "pr-2",
186
+ false: "pr-2"
187
+ },
188
+ hasPrefix: {
189
+ true: "pl-2",
190
+ false: "pl-3"
191
+ },
192
+ hasMultiline: {
193
+ true: "py-[5px] h-full resize-none leading-5",
194
+ false: "h-7.5 py-[5px] leading-7.5"
195
+ },
196
+ disabled: {
197
+ true: "text-lowest",
198
+ false: "text-highest dark:text-higher"
199
+ },
200
+ hasError: {
201
+ true: "placeholder-form-placeholder-error",
202
+ false: "placeholder-form-placeholder"
203
+ },
204
+ type: {
205
+ time: "hide-time-picker"
206
+ }
207
+ }
208
+ });
209
+ var iconStyles = (0, _tailwindvariants.tv)({
210
+ base: "Litho-TextField__Icon pl-0.5"
211
+ });
212
+ var clearButtonStyles = (0, _tailwindvariants.tv)({
213
+ base: "Litho-TextField__ClearButton mr-1 rounded-md h-6 w-6 flex self-center items-center justify-center cursor-pointer bg-btn-outline hover:bg-btn-outline-low active:bg-btn-outline-lower",
214
+ variants: {
215
+ visible: {
216
+ true: "opacity-70 hover:opacity-100 ",
217
+ false: "pointer-events-none opacity-0 group-hover:opacity-0"
218
+ }
219
+ }
220
+ });
221
+ /**
222
+ * Renders a TextField component.
223
+ *
224
+ * @function TextField
225
+ * @param {Object} props - The properties for the TextField component.
226
+ * @param {string} [props.prefix] - Text content to display before the input.
227
+ * @param {string} [props.suffix] - Text content to display after the input.
228
+ * @param {string} [props.placeholder] - Placeholder text for the input.
229
+ * @param {string} [props.value=''] - The current value of the input.
230
+ * @param {string} [props.helpText] - Helper text to display below the input.
231
+ * @param {string} [props.label] - Label text for the input field.
232
+ * @param {string} [props.labelVariant='bodyMd'] - Visual variant for the label text.
233
+ * @param {Object} [props.labelAction] - Action button to display next to the label.
234
+ * @param {boolean} [props.labelHidden] - Whether to visually hide the label.
235
+ * @param {boolean} [props.disabled=false] - Whether the input is disabled. Defaults to false.
236
+ * @param {boolean} [props.clearButton] - Whether to show a clear button.
237
+ * @param {boolean} [props.readOnly] - Whether the input is read-only.
238
+ * @param {boolean} [props.autoFocus] - Whether to focus the input on mount.
239
+ * @param {boolean} [props.focused] - Whether the input is focused.
240
+ * @param {number} [props.multiline=1] - Number of lines for multiline input (1 for single line). Defaults to 1.
241
+ * @param {boolean} [props.autoGrow=false] - Whether textarea should automatically grow with content. Only applies when multiline > 1.
242
+ * @param {number} [props.maxHeight] - Maximum height in pixels before scrolling starts. Only applies when autoGrow is true.
243
+ * @param {string} [props.error] - Error message to display.
244
+ * @param {ReactNode} [props.connectedRight] - React element to connect to the right of the input.
245
+ * @param {ReactNode} [props.connectedLeft] - React element to connect to the left of the input.
246
+ * @param {string} [props.type='text'] - HTML input type. Defaults to 'text'.
247
+ * @param {boolean} [props.subdued=false] - Whether to use subdued styling.
248
+ * @param {string} [props.name] - Name attribute for the input.
249
+ * @param {string} [props.id] - ID for the input element.
250
+ * @param {string} [props.role] - ARIA role.
251
+ * @param {number} [props.step] - Step value for number inputs.
252
+ * @param {number} [props.largeStep=10] - Large step value when using shift + arrows.
253
+ * @param {string} [props.autoComplete] - HTML autocomplete attribute.
254
+ * @param {number} [props.max] - Maximum value for number inputs.
255
+ * @param {number} [props.maxLength] - Maximum length for text input.
256
+ * @param {number} [props.min] - Minimum value for number inputs.
257
+ * @param {number} [props.minLength] - Minimum length for text input.
258
+ * @param {string} [props.pattern] - Input validation pattern.
259
+ * @param {boolean} [props.spellCheck] - Whether to enable spell checking.
260
+ * @param {string} [props.ariaOwns] - ARIA owns attribute.
261
+ * @param {string} [props.ariaControls] - ARIA controls attribute.
262
+ * @param {boolean} [props.ariaExpanded] - ARIA expanded attribute.
263
+ * @param {string} [props.ariaActiveDescendant] - ARIA active descendant attribute.
264
+ * @param {string} [props.ariaAutocomplete] - ARIA autocomplete attribute.
265
+ * @param {('left'|'center'|'right')} [props.align='left'] - Text alignment within the input.
266
+ * @param {boolean} [props.requiredIndicator] - Whether to show a required field indicator.
267
+ * @param {boolean} [props.selectTextOnFocus] - Whether to select all text when focused.
268
+ * @param {Function} [props.onClearButtonClick] - Handler for clear button click.
269
+ * @param {Function} [props.onChange] - Handler for value changes.
270
+ * @param {Function} [props.onFocus] - Handler for input focus.
271
+ * @param {Function} [props.onBlur] - Handler for input blur.
272
+ * @param {Function} [props.onKeyDown] - Handler for key down.
273
+ * @param {ReactNode} [props.tooltip] - Tooltip content for the label.
274
+ * @param {string} [props.className] - Additional CSS classes.
275
+ * @returns {JSX.Element} The rendered TextField component.
276
+ */ function TextField() {
277
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
278
+ var prefix = props.prefix, _suffix = props.suffix, placeholder = props.placeholder, _props_value = props.value, value = _props_value === void 0 ? "" : _props_value, helpText = props.helpText, label = props.label, _props_labelVariant = props.labelVariant, labelVariant = _props_labelVariant === void 0 ? "bodyMd" : _props_labelVariant, labelAction = props.labelAction, labelHidden = props.labelHidden, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, clearButton = props.clearButton, readOnly = props.readOnly, autoFocus = props.autoFocus, _focused = props.focused, _props_multiline = props.multiline, multiline = _props_multiline === void 0 ? 1 : _props_multiline, _props_autoGrow = props.autoGrow, autoGrow = _props_autoGrow === void 0 ? false : _props_autoGrow, maxHeight = props.maxHeight, error = props.error, connectedRight = props.connectedRight, connectedLeft = props.connectedLeft, _props_type = props.type, type = _props_type === void 0 ? "text" : _props_type, _props_subdued = props.subdued, subdued = _props_subdued === void 0 ? false : _props_subdued, name = props.name, _id = props.id, role = props.role, step = props.step, _props_largeStep = props.largeStep, largeStep = _props_largeStep === void 0 ? 10 : _props_largeStep, autoComplete = props.autoComplete, max = props.max, maxLength = props.maxLength, min = props.min, minLength = props.minLength, _props_showCharacterCount = props.showCharacterCount, showCharacterCount = _props_showCharacterCount === void 0 ? false : _props_showCharacterCount, pattern = props.pattern, spellCheck = props.spellCheck, ariaOwns = props.ariaOwns, ariaControls = props.ariaControls, ariaExpanded = props.ariaExpanded, ariaActiveDescendant = props.ariaActiveDescendant, ariaAutocomplete = props.ariaAutocomplete, _props_align = props.align, align = _props_align === void 0 ? "left" : _props_align, requiredIndicator = props.requiredIndicator, selectTextOnFocus = props.selectTextOnFocus, onClearButtonClick = props.onClearButtonClick, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, tooltip = props.tooltip, className = props.className, _inputRef = props.inputRef, icon = props.icon, _props_transparent = props.transparent, transparent = _props_transparent === void 0 ? false : _props_transparent, _props_showNumberSteppers = props.showNumberSteppers, showNumberSteppers = _props_showNumberSteppers === void 0 ? true : _props_showNumberSteppers, onKeyDown = props.onKeyDown;
279
+ var suffix = maxLength && showCharacterCount ? "".concat(value.length, " / ").concat(maxLength) : _suffix;
280
+ var _internalRef = (0, _react.useRef)(null);
281
+ var inputRef = _inputRef || _internalRef;
282
+ var _useState = _sliced_to_array((0, _react.useState)(null), 2), textareaHeight = _useState[0], setTextareaHeight = _useState[1];
283
+ var _useState1 = _sliced_to_array((0, _react.useState)(_focused), 2), focused = _useState1[0], setFocused = _useState1[1];
284
+ var hasError = !!error;
285
+ var hasSuffix = !!suffix || maxLength && showCharacterCount;
286
+ var hasPrefix = !!prefix || !!icon;
287
+ var hasMultiline = multiline > 1;
288
+ var hasConnectedLeft = !!connectedLeft;
289
+ var hasConnectedRight = !!connectedRight;
290
+ var idValue = (0, _react.useId)();
291
+ var idRef = (0, _react.useRef)(_id || idValue);
292
+ var id = idRef.current;
293
+ var _useState2 = _sliced_to_array((0, _react.useState)(false), 2), isShiftPressed = _useState2[0], setIsShiftPressed = _useState2[1];
294
+ (0, _react.useEffect)(function() {
295
+ var handleKeyDown = function(e) {
296
+ if (e.key === "Shift") {
297
+ setIsShiftPressed(true);
298
+ }
299
+ };
300
+ var handleKeyUp = function(e) {
301
+ if (e.key === "Shift") {
302
+ setIsShiftPressed(false);
303
+ }
304
+ };
305
+ window.addEventListener("keydown", handleKeyDown);
306
+ window.addEventListener("keyup", handleKeyUp);
307
+ return function() {
308
+ window.removeEventListener("keydown", handleKeyDown);
309
+ window.removeEventListener("keyup", handleKeyUp);
310
+ };
311
+ }, []);
312
+ var handleFocus = function(event) {
313
+ setFocused(true);
314
+ if (selectTextOnFocus && inputRef.current) {
315
+ var _inputRef_current;
316
+ (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.select();
317
+ }
318
+ if (onFocus) {
319
+ onFocus(event);
320
+ }
321
+ };
322
+ (0, _react.useEffect)(function() {
323
+ if (autoFocus && inputRef.current) {
324
+ setTimeout(function() {
325
+ var _inputRef_current;
326
+ (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
327
+ if (selectTextOnFocus) {
328
+ var _inputRef_current1;
329
+ (_inputRef_current1 = inputRef.current) === null || _inputRef_current1 === void 0 ? void 0 : _inputRef_current1.select();
330
+ }
331
+ }, 0);
332
+ }
333
+ }, []);
334
+ var classes = styles({
335
+ disabled: Boolean(disabled || readOnly),
336
+ hasError: hasError,
337
+ focused: Boolean(focused && !readOnly),
338
+ subdued: subdued,
339
+ transparent: transparent
340
+ });
341
+ var iconClasses = iconStyles();
342
+ var inputClasses = inputStyles({
343
+ hasSuffix: hasSuffix,
344
+ hasPrefix: hasPrefix,
345
+ hasMultiline: hasMultiline,
346
+ disabled: disabled,
347
+ hasError: hasError,
348
+ readOnly: readOnly,
349
+ align: align,
350
+ type: type
351
+ });
352
+ var clearButtonClasses = clearButtonStyles({
353
+ visible: (value === null || value === void 0 ? void 0 : value.length) > 0 && !readOnly && !disabled
354
+ });
355
+ var handleBlur = function(event) {
356
+ setFocused(false);
357
+ if (onBlur) {
358
+ onBlur(event);
359
+ }
360
+ };
361
+ var InputElement = hasMultiline ? "textarea" : "input";
362
+ var leftContent = hasConnectedLeft ? connectedLeft : null;
363
+ var rightContent = hasConnectedRight ? connectedRight : null;
364
+ var inputHeight = parseInt(multiline) * 20 + 10;
365
+ var focusInput = function() {
366
+ var _inputRef_current;
367
+ (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
368
+ };
369
+ var adjustValue = function(delta) {
370
+ var increment = isShiftPressed ? largeStep : step || 1;
371
+ var newValue = Number(value || 0) + delta * increment;
372
+ if (!focused) {
373
+ var _inputRef_current;
374
+ (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
375
+ }
376
+ if ((max === undefined || newValue <= max) && (min === undefined || newValue >= min)) {
377
+ onChange(String(newValue));
378
+ }
379
+ };
380
+ var memoizedIcon = (0, _react.useMemo)(function() {
381
+ return icon;
382
+ }, [
383
+ icon
384
+ ]);
385
+ (0, _react.useEffect)(function() {
386
+ // Handle auto-growing textarea
387
+ if (hasMultiline && autoGrow && inputRef.current) {
388
+ var updateHeight = function() {
389
+ // Reset height to allow proper scrollHeight calculation
390
+ inputRef.current.style.height = 'auto';
391
+ // Get the scroll height (content height)
392
+ var scrollHeight = inputRef.current.scrollHeight;
393
+ // Apply the height with a minimum based on multiline prop
394
+ var minHeight = parseInt(multiline) * 20 + 10;
395
+ var newHeight = Math.max(minHeight, scrollHeight);
396
+ // If maxHeight is provided, cap the height and enable scrolling
397
+ if (maxHeight && newHeight > maxHeight) {
398
+ inputRef.current.style.height = "".concat(maxHeight, "px");
399
+ inputRef.current.style.overflowY = 'auto';
400
+ } else {
401
+ inputRef.current.style.height = "".concat(newHeight, "px");
402
+ inputRef.current.style.overflowY = 'hidden';
403
+ }
404
+ setTextareaHeight(newHeight);
405
+ };
406
+ updateHeight();
407
+ }
408
+ }, [
409
+ value,
410
+ hasMultiline,
411
+ autoGrow,
412
+ multiline,
413
+ maxHeight
414
+ ]);
415
+ var inputContent = /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
416
+ className: "".concat(classes).concat(className ? " ".concat(className) : ""),
417
+ onClick: focusInput,
418
+ children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
419
+ className: "flex justify-stretch items-center",
420
+ onClick: focusInput,
421
+ children: [
422
+ hasPrefix && /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
423
+ className: "min-h-7.5 pl-2 flex items-center cursor-text self-start",
424
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Text, {
425
+ color: "subdued",
426
+ className: "pointer-events-none whitespace-nowrap",
427
+ as: typeof prefix === "string" ? "p" : "div",
428
+ children: prefix
429
+ })
430
+ }),
431
+ memoizedIcon && /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
432
+ className: iconClasses,
433
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Icon, {
434
+ source: memoizedIcon,
435
+ color: "subdued"
436
+ })
437
+ }),
438
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(InputElement, {
439
+ ref: inputRef,
440
+ className: inputClasses,
441
+ name: name,
442
+ id: id,
443
+ value: value,
444
+ onChange: function(e) {
445
+ if (onChange) {
446
+ onChange(e.target.value);
447
+ }
448
+ },
449
+ onKeyDownCapture: onKeyDown,
450
+ onFocus: handleFocus,
451
+ onBlur: handleBlur,
452
+ placeholder: placeholder,
453
+ disabled: disabled,
454
+ type: hasMultiline ? undefined : type,
455
+ style: hasMultiline ? autoGrow ? {} // Height will be managed by the useEffect hook
456
+ : {
457
+ height: "".concat(inputHeight, "px")
458
+ } : {},
459
+ readOnly: readOnly,
460
+ max: max,
461
+ maxLength: maxLength,
462
+ min: min,
463
+ minLength: minLength,
464
+ pattern: pattern,
465
+ spellCheck: spellCheck,
466
+ autoComplete: autoComplete,
467
+ step: type === "number" ? step : undefined,
468
+ "aria-owns": ariaOwns,
469
+ "aria-controls": ariaControls,
470
+ "aria-expanded": ariaExpanded,
471
+ "aria-activedescendant": ariaActiveDescendant,
472
+ "aria-autocomplete": ariaAutocomplete,
473
+ role: role,
474
+ onKeyDown: function(e) {
475
+ if (type === "number" && !readOnly) {
476
+ if (e.key === "ArrowUp") {
477
+ e.preventDefault();
478
+ adjustValue(1);
479
+ } else if (e.key === "ArrowDown") {
480
+ e.preventDefault();
481
+ adjustValue(-1);
482
+ }
483
+ }
484
+ }
485
+ }),
486
+ hasSuffix && /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
487
+ className: "min-h-7.5 pr-3 flex items-center cursor-text self-start",
488
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Text, {
489
+ color: "subdued",
490
+ className: "pointer-events-none whitespace-nowrap",
491
+ children: suffix
492
+ })
493
+ }),
494
+ type === "number" && showNumberSteppers && !readOnly && !disabled && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
495
+ className: "flex flex-col h-full max-h-7.5 border border-transparent",
496
+ children: [
497
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Button, {
498
+ plain: true,
499
+ size: "stepper",
500
+ className: max !== undefined && value >= max ? "opacity-0 group-hover:opacity-20 pointer-events-none" : "opacity-0 group-hover:opacity-100",
501
+ contentClassName: "px-0.5!",
502
+ onMouseDown: function(e) {
503
+ e.preventDefault();
504
+ adjustValue(1);
505
+ },
506
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Icon, {
507
+ source: _polarisicons.CaretUpMinor,
508
+ color: "subdued",
509
+ className: "pointer-events-none"
510
+ })
511
+ }),
512
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Button, {
513
+ plain: true,
514
+ size: "stepper",
515
+ className: min !== undefined && value <= min ? "opacity-0 group-hover:opacity-20 pointer-events-none" : "opacity-0 group-hover:opacity-100",
516
+ contentClassName: "px-0.5!",
517
+ onMouseDown: function(e) {
518
+ e.preventDefault();
519
+ adjustValue(-1);
520
+ },
521
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Icon, {
522
+ source: _polarisicons.CaretDownMinor,
523
+ color: "subdued",
524
+ className: "pointer-events-none"
525
+ })
526
+ })
527
+ ]
528
+ }),
529
+ clearButton && onClearButtonClick && /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
530
+ className: clearButtonClasses,
531
+ onClick: onClearButtonClick,
532
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Icon, {
533
+ source: _polarisicons.CancelSmallMinor,
534
+ color: "subdued"
535
+ })
536
+ })
537
+ ]
538
+ })
539
+ });
540
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
541
+ className: "Litho-TextFieldContainer flex flex-col gap-1",
542
+ children: [
543
+ label && !labelHidden && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
544
+ className: "flex justify-between items-end",
545
+ children: [
546
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Label, {
547
+ id: id,
548
+ hidden: labelHidden,
549
+ disabled: disabled,
550
+ requiredIndicator: requiredIndicator,
551
+ tooltip: tooltip,
552
+ variant: labelVariant,
553
+ children: label
554
+ }),
555
+ labelAction && /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Link, {
556
+ onClick: labelAction.onAction,
557
+ removeUnderline: true,
558
+ children: labelAction.content
559
+ })
560
+ ]
561
+ }),
562
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
563
+ className: "flex items-center gap-1",
564
+ children: [
565
+ leftContent,
566
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
567
+ className: "flex-1",
568
+ children: inputContent
569
+ }),
570
+ rightContent
571
+ ]
572
+ }),
573
+ error && /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.InlineError, {
574
+ message: error,
575
+ icon: _polarisicons.CircleAlertMajor
576
+ }),
577
+ helpText && /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Text, {
578
+ color: "subdued",
579
+ children: helpText
580
+ })
581
+ ]
582
+ });
583
+ }
584
+ var _default = TextField;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _tailwindvariants = require("tailwind-variants");
13
+ var _index = require("../index");
14
+ var _polarisicons = require("@shopify/polaris-icons");
15
+ var imageContainerStyles = (0, _tailwindvariants.tv)({
16
+ base: "relative flex items-center justify-center overflow-hidden rounded-lg border border-tint-4 bg-surface-higher group",
17
+ variants: {
18
+ size: {
19
+ small: "w-6 h-6",
20
+ medium: "w-10 h-10",
21
+ large: "w-12 h-12"
22
+ },
23
+ skeleton: {
24
+ true: "Litho-Thumbnail-Skeleton"
25
+ }
26
+ }
27
+ });
28
+ var imageStyles = (0, _tailwindvariants.tv)({
29
+ base: "w-full max-w-full max-h-full h-auto object-cover object-top transition-transform duration-500 group-hover:translate-y-[-20%]",
30
+ defaultVariants: {
31
+ size: "medium"
32
+ }
33
+ });
34
+ /**
35
+ * Thumbnail component to display an image or a placeholder icon.
36
+ *
37
+ * @param {Object} props - The component props.
38
+ * @param {string} [props.src] - The image source URL.
39
+ * @param {string} [props.alt] - The alternative text for the image.
40
+ * @param {("small"|"medium"|"large"|number)} [props.size="medium"] - The size of the thumbnail. Can be "small", "medium", "large", or a numeric pixel value.
41
+ * @param {boolean} [props.skeleton=false] - Whether to show a skeleton loader instead of the image.
42
+ * @returns {JSX.Element} The rendered Thumbnail component.
43
+ */ function Thumbnail() {
44
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
45
+ var src = props.src, alt = props.alt, _props_size = props.size, size = _props_size === void 0 ? "medium" : _props_size, _props_skeleton = props.skeleton, skeleton = _props_skeleton === void 0 ? false : _props_skeleton;
46
+ var sizeIsInteger = Number.isInteger(size);
47
+ var hasImage = Boolean(src);
48
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
49
+ className: imageContainerStyles({
50
+ skeleton: skeleton,
51
+ size: sizeIsInteger ? undefined : size
52
+ }),
53
+ style: sizeIsInteger ? {
54
+ width: "".concat(size, "px"),
55
+ height: "".concat(size, "px")
56
+ } : {},
57
+ children: skeleton ? null : hasImage ? /*#__PURE__*/ (0, _jsxruntime.jsx)("img", {
58
+ src: src,
59
+ alt: alt,
60
+ className: imageStyles({
61
+ size: sizeIsInteger ? undefined : size
62
+ }),
63
+ style: sizeIsInteger ? {
64
+ width: "".concat(size, "px"),
65
+ height: "".concat(size, "px")
66
+ } : {}
67
+ }) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.Icon, {
68
+ source: _polarisicons.ImageMajor,
69
+ color: "subdued"
70
+ })
71
+ });
72
+ }
73
+ var _default = Thumbnail;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _index = require("../index");
13
+ function TimePicker() {
14
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
15
+ var _props_label = props.label, label = _props_label === void 0 ? "Time:" : _props_label, _props_labelInline = props.labelInline, labelInline = _props_labelInline === void 0 ? true : _props_labelInline, value = props.value, onChange = props.onChange;
16
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_index.TextField, {
17
+ type: "time",
18
+ prefix: labelInline ? label : null,
19
+ value: value,
20
+ onChange: onChange
21
+ });
22
+ }
23
+ var _default = TimePicker;