@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,285 @@
1
+ "use client";
2
+ function _array_like_to_array(arr, len) {
3
+ if (len == null || len > arr.length) len = arr.length;
4
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
5
+ return arr2;
6
+ }
7
+ function _array_with_holes(arr) {
8
+ if (Array.isArray(arr)) return arr;
9
+ }
10
+ function _iterable_to_array_limit(arr, i) {
11
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
12
+ if (_i == null) return;
13
+ var _arr = [];
14
+ var _n = true;
15
+ var _d = false;
16
+ var _s, _e;
17
+ try {
18
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
19
+ _arr.push(_s.value);
20
+ if (i && _arr.length === i) break;
21
+ }
22
+ } catch (err) {
23
+ _d = true;
24
+ _e = err;
25
+ } finally{
26
+ try {
27
+ if (!_n && _i["return"] != null) _i["return"]();
28
+ } finally{
29
+ if (_d) throw _e;
30
+ }
31
+ }
32
+ return _arr;
33
+ }
34
+ function _non_iterable_rest() {
35
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
36
+ }
37
+ function _sliced_to_array(arr, i) {
38
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
39
+ }
40
+ function _unsupported_iterable_to_array(o, minLen) {
41
+ if (!o) return;
42
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
43
+ var n = Object.prototype.toString.call(o).slice(8, -1);
44
+ if (n === "Object" && o.constructor) n = o.constructor.name;
45
+ if (n === "Map" || n === "Set") return Array.from(n);
46
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
47
+ }
48
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
49
+ import { useState } from "react";
50
+ import { tv } from "tailwind-variants";
51
+ import Icon from "./Icon.js";
52
+ import Label from "./Label.js";
53
+ import Link from "./Link.js";
54
+ import Text from "./Text.js";
55
+ import { CaretDownMinor, CircleAlertMajor } from "@shopify/polaris-icons";
56
+ var styles = tv({
57
+ base: "Litho-Select relative border border-form-border rounded-md",
58
+ variants: {
59
+ disabled: {
60
+ false: ""
61
+ }
62
+ },
63
+ compoundVariants: [
64
+ {
65
+ focused: true,
66
+ hasError: false,
67
+ class: "ring ring-form-focus border-form-border-focus"
68
+ },
69
+ {
70
+ focused: true,
71
+ hasError: true,
72
+ class: "ring ring-form-focus-error border-form-border-error"
73
+ },
74
+ {
75
+ disabled: false,
76
+ focused: false,
77
+ class: "hover:border-form-border-hover"
78
+ },
79
+ {
80
+ disabled: true,
81
+ hasError: true,
82
+ class: "bg-surface-higher"
83
+ },
84
+ {
85
+ disabled: true,
86
+ hasError: false,
87
+ class: "bg-form-bg-disabled"
88
+ },
89
+ {
90
+ disabled: false,
91
+ hasError: true,
92
+ class: "border-form-border-error focus:ring-form-focus-error bg-form-bg-error hover:border-form-border-error-hover"
93
+ },
94
+ {
95
+ disabled: false,
96
+ hasError: false,
97
+ class: "bg-form-bg"
98
+ }
99
+ ]
100
+ });
101
+ var contentStyles = tv({
102
+ base: "Litho-Select__Content min-h-7.5 pl-3 pr-2 flex items-center justify-between gap-2"
103
+ });
104
+ /**
105
+ * @function Select
106
+ * @description A dropdown component that allows users to select an option from a list.
107
+ * @param {Object} props - The properties for the Select component.
108
+ * @param {Array} props.options - Array of option objects for the select dropdown. Options can include groups.
109
+ * @param {string} [props.label] - Label for the select input.
110
+ * @param {Object} [props.labelAction] - An action object for the label. Includes `onAction` and `content`.
111
+ * @param {boolean} [props.labelHidden] - Whether to hide the label visually.
112
+ * @param {boolean} [props.labelInline] - Whether to display the label inline with the select.
113
+ * @param {boolean} [props.disabled=false] - Whether the select is disabled.
114
+ * @param {string} [props.helpText] - Optional help text displayed below the select.
115
+ * @param {string} [props.placeholder] - Placeholder text for the select input.
116
+ * @param {string} props.id - The ID for the select input.
117
+ * @param {string} props.name - The name for the select input.
118
+ * @param {string} props.value - The selected value.
119
+ * @param {React.ReactNode|import("./Tooltip").TooltipContentObject} props.tooltip - Tooltip content for the select.
120
+ * @param {string|boolean} [props.error] - Error message or flag indicating the select has an error.
121
+ * @param {function} props.onChange - Callback for when the selected value changes.
122
+ * @param {function} props.onFocus - Callback for when the select gains focus.
123
+ * @param {function} props.onBlur - Callback for when the select loses focus.
124
+ * @param {boolean} [props.requiredIndicator] - Whether to show a required indicator next to the label.
125
+ * @returns {JSX.Element} The rendered Select component.
126
+ */ function Select() {
127
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
128
+ var options = props.options, label = props.label, tooltip = props.tooltip, labelAction = props.labelAction, labelHidden = props.labelHidden, labelInline = props.labelInline, _props_disabled = props.disabled, disabled = _props_disabled === void 0 ? false : _props_disabled, helpText = props.helpText, placeholder = props.placeholder, id = props.id, name = props.name, value = props.value, error = props.error, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, requiredIndicator = props.requiredIndicator, className = props.className, contentClassName = props.contentClassName;
129
+ var _useState = _sliced_to_array(useState(false), 2), focused = _useState[0], setFocused = _useState[1];
130
+ var handleFocus = function(event) {
131
+ setFocused(true);
132
+ if (onFocus) {
133
+ onFocus(event);
134
+ }
135
+ };
136
+ var handleBlur = function(event) {
137
+ setFocused(false);
138
+ if (onBlur) {
139
+ onBlur(event);
140
+ }
141
+ };
142
+ var hasError = !!error;
143
+ var classes = styles({
144
+ disabled: disabled,
145
+ hasError: hasError,
146
+ focused: focused
147
+ });
148
+ var contentClasses = contentStyles();
149
+ var selectedOption = options.reduce(function(found, option) {
150
+ if (found) return found;
151
+ if (option.options) {
152
+ return option.options.find(function(subOption) {
153
+ return subOption.value === value;
154
+ });
155
+ } else {
156
+ return option.value === value ? option : null;
157
+ }
158
+ }, null);
159
+ var firstOption = options.reduce(function(found, option) {
160
+ if (found) return found;
161
+ if (option.options) {
162
+ return option.options[0];
163
+ } else {
164
+ return option;
165
+ }
166
+ }, null);
167
+ var handleContentClick = function(e) {
168
+ e.preventDefault();
169
+ var selectElement = e.currentTarget.previousElementSibling;
170
+ selectElement === null || selectElement === void 0 ? void 0 : selectElement.focus();
171
+ selectElement === null || selectElement === void 0 ? void 0 : selectElement.click();
172
+ };
173
+ return /*#__PURE__*/ _jsxs("div", {
174
+ className: "Litho-SelectContainer flex flex-col gap-1",
175
+ children: [
176
+ label && !labelHidden && !labelInline && /*#__PURE__*/ _jsxs("div", {
177
+ className: "flex justify-between items-end",
178
+ children: [
179
+ /*#__PURE__*/ _jsx(Label, {
180
+ id: id,
181
+ hidden: labelHidden,
182
+ disabled: disabled,
183
+ requiredIndicator: requiredIndicator,
184
+ tooltip: tooltip,
185
+ children: label
186
+ }),
187
+ labelAction && /*#__PURE__*/ _jsx(Link, {
188
+ onClick: labelAction.onAction,
189
+ removeUnderline: true,
190
+ children: labelAction.content
191
+ })
192
+ ]
193
+ }),
194
+ /*#__PURE__*/ _jsxs("div", {
195
+ className: "".concat(classes).concat(className ? " ".concat(className) : ""),
196
+ children: [
197
+ /*#__PURE__*/ _jsxs("select", {
198
+ className: "Litho-Select__Input opacity-0 absolute inset-0",
199
+ name: name,
200
+ id: id,
201
+ value: value || "",
202
+ onChange: function(e) {
203
+ return onChange(e.target.value);
204
+ },
205
+ onFocus: handleFocus,
206
+ onBlur: handleBlur,
207
+ placeholder: placeholder,
208
+ disabled: disabled,
209
+ children: [
210
+ placeholder && /*#__PURE__*/ _jsx("option", {
211
+ value: "",
212
+ disabled: focused,
213
+ children: placeholder
214
+ }),
215
+ options.map(function(option) {
216
+ if (option.options) {
217
+ return /*#__PURE__*/ _jsx("optgroup", {
218
+ label: option.title,
219
+ children: option.options.map(function(subOption) {
220
+ return /*#__PURE__*/ _jsx("option", {
221
+ value: subOption.value,
222
+ disabled: subOption.disabled,
223
+ children: subOption.label
224
+ }, subOption.value);
225
+ })
226
+ }, option.title);
227
+ } else {
228
+ return /*#__PURE__*/ _jsx("option", {
229
+ value: option.value,
230
+ disabled: option.disabled,
231
+ children: option.label
232
+ }, option.value);
233
+ }
234
+ })
235
+ ]
236
+ }),
237
+ /*#__PURE__*/ _jsxs("div", {
238
+ className: "".concat(contentClasses).concat(contentClassName ? " ".concat(contentClassName) : ""),
239
+ onClick: handleContentClick,
240
+ children: [
241
+ /*#__PURE__*/ _jsxs("div", {
242
+ className: "flex gap-2",
243
+ children: [
244
+ label && !labelHidden && labelInline && /*#__PURE__*/ _jsx(Text, {
245
+ color: disabled ? "disabled" : "subdued",
246
+ className: "line-clamp-1!",
247
+ children: label
248
+ }),
249
+ /*#__PURE__*/ _jsx(Text, {
250
+ color: disabled ? "disabled" : "default",
251
+ className: "line-clamp-1!",
252
+ children: (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || placeholder || (firstOption === null || firstOption === void 0 ? void 0 : firstOption.label)
253
+ })
254
+ ]
255
+ }),
256
+ /*#__PURE__*/ _jsx(Icon, {
257
+ source: CaretDownMinor,
258
+ color: disabled ? "disabled" : "subdued",
259
+ className: "pointer-events-none"
260
+ })
261
+ ]
262
+ })
263
+ ]
264
+ }),
265
+ error && /*#__PURE__*/ _jsxs("div", {
266
+ className: "flex gap-2",
267
+ children: [
268
+ /*#__PURE__*/ _jsx(Icon, {
269
+ source: CircleAlertMajor,
270
+ color: "critical"
271
+ }),
272
+ /*#__PURE__*/ _jsx(Text, {
273
+ color: "critical",
274
+ children: error
275
+ })
276
+ ]
277
+ }),
278
+ helpText && /*#__PURE__*/ _jsx(Text, {
279
+ color: "subdued",
280
+ children: helpText
281
+ })
282
+ ]
283
+ });
284
+ }
285
+ export default Select;
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { tv } from "tailwind-variants";
3
+ import { useMemo } from "react";
4
+ var styles = tv({
5
+ base: "Litho-SkeletonText flex flex-col",
6
+ variants: {
7
+ gap: {
8
+ small: "gap-2",
9
+ medium: "gap-3",
10
+ large: "gap-4"
11
+ },
12
+ align: {
13
+ start: "items-start",
14
+ center: "items-center",
15
+ end: "items-end"
16
+ }
17
+ }
18
+ });
19
+ var lineStyles = tv({
20
+ base: "Litho-SkeletonText__Line rounded-sm bg-tint-4 dark:bg-tint-alt-4",
21
+ variants: {
22
+ type: {
23
+ body: "h-3"
24
+ }
25
+ },
26
+ compoundVariants: [
27
+ {
28
+ type: "body",
29
+ size: "md",
30
+ class: "h-3"
31
+ },
32
+ {
33
+ type: "body",
34
+ size: "lg",
35
+ class: "h-4"
36
+ },
37
+ {
38
+ type: "body",
39
+ size: "xl",
40
+ class: "h-5"
41
+ },
42
+ {
43
+ type: "heading",
44
+ size: "xs",
45
+ class: "h-5"
46
+ },
47
+ {
48
+ type: "heading",
49
+ size: "sm",
50
+ class: "h-7"
51
+ },
52
+ {
53
+ type: "heading",
54
+ size: "md",
55
+ class: "h-8"
56
+ },
57
+ {
58
+ type: "heading",
59
+ size: "lg",
60
+ class: "h-9"
61
+ }
62
+ ]
63
+ });
64
+ /**
65
+ * SkeletonText component for displaying placeholder text content.
66
+ *
67
+ * @param {Object} props - The component properties.
68
+ * @param {number} [props.lines=3] - The number of lines to render. Defaults to 3 for body text.
69
+ * @param {"body"|"heading"} [props.type="body"] - The type of skeleton text
70
+ * @param {"xs"|"sm"|"md"|"lg"|"xl"} [props.size="md"] - The size of the skeleton text
71
+ * @param {number} [props.width] - The width of the skeleton text lines. If not provided, random widths are generated.
72
+ * @param {boolean} [props.fullWidth=false] - Whether the skeleton text lines should be full width.
73
+ * @param {"start"|"center"|"end"} [props.align="start"] - The alignment of the skeleton text lines.
74
+ * @param {string} [props.className] - Additional class names to apply to the root element.
75
+ *
76
+ * @returns {JSX.Element} A JSX element rendering a skeleton placeholder text block.
77
+ *
78
+ * @example
79
+ * <SkeletonText lines={5} type="heading" size="lg" width={80} className="custom-class" />
80
+ */ function SkeletonText() {
81
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
82
+ var tmp = props.lines, _lines = tmp === void 0 ? 3 : tmp, _props_type = props.type, type = _props_type === void 0 ? "body" : _props_type, _props_size = props.size, size = _props_size === void 0 ? "md" : _props_size, _width = props.width, _props_fullWidth = props.fullWidth, fullWidth = _props_fullWidth === void 0 ? false : _props_fullWidth, className = props.className, _props_gap = props.gap, gap = _props_gap === void 0 ? "medium" : _props_gap, _props_align = props.align, align = _props_align === void 0 ? "start" : _props_align;
83
+ var lines = type === "heading" ? 1 : _lines;
84
+ var classes = styles({
85
+ lines: lines,
86
+ type: type,
87
+ size: size,
88
+ gap: gap,
89
+ align: align
90
+ });
91
+ var lineClasses = lineStyles({
92
+ type: type,
93
+ size: size
94
+ });
95
+ var randomWidths = useMemo(function() {
96
+ return Array.from({
97
+ length: lines
98
+ }, function() {
99
+ return Math.floor(Math.random() * (70 - 40 + 1)) + 40;
100
+ });
101
+ }, [
102
+ lines
103
+ ]);
104
+ return /*#__PURE__*/ _jsx("div", {
105
+ className: "".concat(classes).concat(className ? " ".concat(className) : ""),
106
+ children: Array.from({
107
+ length: lines
108
+ }, function(_, i) {
109
+ var lastLine = i === lines - 1;
110
+ var width = _width || ((type === "heading" || lastLine) && !fullWidth ? "".concat(randomWidths[i], "%") : "100%");
111
+ return /*#__PURE__*/ _jsx("div", {
112
+ className: lineClasses,
113
+ style: {
114
+ width: width
115
+ }
116
+ }, i);
117
+ })
118
+ });
119
+ }
120
+ export default SkeletonText;
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { tv } from "tailwind-variants";
3
+ var styles = tv({
4
+ base: "Litho-Spinner",
5
+ variants: {
6
+ size: {
7
+ small: "w-4 h-4",
8
+ medium: "w-5 h-5",
9
+ large: "w-7 h-7"
10
+ }
11
+ }
12
+ });
13
+ var svgStyles = tv({
14
+ base: "Litho-Spinner__Svg animate-spin-fast",
15
+ variants: {
16
+ color: {
17
+ default: "fill-brand",
18
+ subdued: "fill-tint-10"
19
+ }
20
+ }
21
+ });
22
+ /**
23
+ * Spinner Component
24
+ *
25
+ * This component renders a loading spinner with customizable size, color, and accessibility label.
26
+ *
27
+ * @param {Object} props - The props object.
28
+ * @param {('small'|'large')} [props.size='large'] - The size of the spinner, either "small" or "large".
29
+ * @param {('default'|'subdued')} [props.color='default'] - The color variant of the spinner.
30
+ * @param {string} [props.accessibilityLabel='Loading...'] - The accessible label for screen readers, describing the spinner's purpose.
31
+ * @returns {JSX.Element} The rendered Spinner component.
32
+ */ function Spinner() {
33
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
34
+ var _props_size = props.size, size = _props_size === void 0 ? "large" : _props_size, _props_color = props.color, color = _props_color === void 0 ? "default" : _props_color, _props_accessibilityLabel = props.accessibilityLabel, accessibilityLabel = _props_accessibilityLabel === void 0 ? "Loading..." : _props_accessibilityLabel;
35
+ var classes = styles({
36
+ size: size
37
+ });
38
+ var svgClasses = svgStyles({
39
+ color: color
40
+ });
41
+ return /*#__PURE__*/ _jsx("div", {
42
+ className: classes,
43
+ "aria-label": accessibilityLabel,
44
+ role: "status",
45
+ children: size === 'large' ? /*#__PURE__*/ _jsx("svg", {
46
+ className: svgClasses,
47
+ viewBox: "0 0 44 44",
48
+ xmlns: "http://www.w3.org/2000/svg",
49
+ children: /*#__PURE__*/ _jsx("path", {
50
+ d: "M15.542 1.487A21.507 21.507 0 00.5 22c0 11.874 9.626 21.5 21.5 21.5 9.847 0 18.364-6.675 20.809-16.072a1.5 1.5 0 00-2.904-.756C37.803 34.755 30.473 40.5 22 40.5 11.783 40.5 3.5 32.217 3.5 22c0-8.137 5.3-15.247 12.942-17.65a1.5 1.5 0 10-.9-2.863z"
51
+ })
52
+ }) : /*#__PURE__*/ _jsx("svg", {
53
+ className: svgClasses,
54
+ viewBox: "0 0 20 20",
55
+ xmlns: "http://www.w3.org/2000/svg",
56
+ children: /*#__PURE__*/ _jsx("path", {
57
+ d: "M7.229 1.173a9.25 9.25 0 1011.655 11.412 1.25 1.25 0 10-2.4-.698 6.75 6.75 0 11-8.506-8.329 1.25 1.25 0 10-.75-2.385z"
58
+ })
59
+ })
60
+ });
61
+ }
62
+ ;
63
+ export default Spinner;