@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.
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/cjs/components/ActionList.js +267 -0
- package/dist/cjs/components/AnnouncementBar.js +73 -0
- package/dist/cjs/components/AppProvider.js +245 -0
- package/dist/cjs/components/Autocomplete.js +351 -0
- package/dist/cjs/components/Badge.js +234 -0
- package/dist/cjs/components/Banner.js +264 -0
- package/dist/cjs/components/Box.js +247 -0
- package/dist/cjs/components/Button.js +1018 -0
- package/dist/cjs/components/ButtonGroup.js +196 -0
- package/dist/cjs/components/Card.js +593 -0
- package/dist/cjs/components/Checkbox.js +175 -0
- package/dist/cjs/components/ChoiceList.js +160 -0
- package/dist/cjs/components/Collapsible.js +42 -0
- package/dist/cjs/components/ColorField.js +159 -0
- package/dist/cjs/components/ContextualSaveBar.js +53 -0
- package/dist/cjs/components/DatePicker.js +547 -0
- package/dist/cjs/components/Divider.js +50 -0
- package/dist/cjs/components/DropZone.js +547 -0
- package/dist/cjs/components/EmptyState.js +111 -0
- package/dist/cjs/components/Filters.js +874 -0
- package/dist/cjs/components/FooterHelp.js +48 -0
- package/dist/cjs/components/Form.js +44 -0
- package/dist/cjs/components/Frame.js +386 -0
- package/dist/cjs/components/FrameSaveBar.js +239 -0
- package/dist/cjs/components/Grid.js +151 -0
- package/dist/cjs/components/HorizontalStack.js +180 -0
- package/dist/cjs/components/Icon.js +346 -0
- package/dist/cjs/components/Image.js +191 -0
- package/dist/cjs/components/InlineError.js +57 -0
- package/dist/cjs/components/Label.js +78 -0
- package/dist/cjs/components/Layout.js +228 -0
- package/dist/cjs/components/LayoutSection.js +133 -0
- package/dist/cjs/components/Link.js +128 -0
- package/dist/cjs/components/List.js +69 -0
- package/dist/cjs/components/Listbox.js +211 -0
- package/dist/cjs/components/Loading.js +103 -0
- package/dist/cjs/components/Modal.js +449 -0
- package/dist/cjs/components/Navigation.js +331 -0
- package/dist/cjs/components/Page.js +529 -0
- package/dist/cjs/components/Pagination.js +109 -0
- package/dist/cjs/components/Pane.js +128 -0
- package/dist/cjs/components/Popover.js +365 -0
- package/dist/cjs/components/PopoverManager.js +34 -0
- package/dist/cjs/components/ProgressBar.js +124 -0
- package/dist/cjs/components/RadioButton.js +172 -0
- package/dist/cjs/components/RadioButtonCard.js +193 -0
- package/dist/cjs/components/RangeSlider.js +235 -0
- package/dist/cjs/components/ResourceList.js +105 -0
- package/dist/cjs/components/Select.js +300 -0
- package/dist/cjs/components/SkeletonText.js +130 -0
- package/dist/cjs/components/Spinner.js +72 -0
- package/dist/cjs/components/Table.js +1184 -0
- package/dist/cjs/components/Tabs.js +421 -0
- package/dist/cjs/components/Tag.js +165 -0
- package/dist/cjs/components/Text.js +274 -0
- package/dist/cjs/components/TextField.js +584 -0
- package/dist/cjs/components/Thumbnail.js +73 -0
- package/dist/cjs/components/TimePicker.js +23 -0
- package/dist/cjs/components/Tip.js +220 -0
- package/dist/cjs/components/Tooltip.js +431 -0
- package/dist/cjs/components/TopBar.js +210 -0
- package/dist/cjs/components/VerticalStack.js +161 -0
- package/dist/cjs/index.js +308 -0
- package/dist/cjs/styles/Table.js +591 -0
- package/dist/cjs/utilities/dates.js +339 -0
- package/dist/cjs/utilities/useIndexResourceState.js +175 -0
- package/dist/cjs/utilities/useMounted.js +67 -0
- package/dist/cjs/utilities/useTableScrollState.js +142 -0
- package/dist/esm/components/ActionList.js +216 -0
- package/dist/esm/components/AnnouncementBar.js +63 -0
- package/dist/esm/components/AppProvider.js +185 -0
- package/dist/esm/components/Autocomplete.js +300 -0
- package/dist/esm/components/Badge.js +225 -0
- package/dist/esm/components/Banner.js +254 -0
- package/dist/esm/components/Box.js +238 -0
- package/dist/esm/components/Button.js +967 -0
- package/dist/esm/components/ButtonGroup.js +137 -0
- package/dist/esm/components/Card.js +537 -0
- package/dist/esm/components/Checkbox.js +165 -0
- package/dist/esm/components/ChoiceList.js +145 -0
- package/dist/esm/components/Collapsible.js +32 -0
- package/dist/esm/components/ColorField.js +149 -0
- package/dist/esm/components/ContextualSaveBar.js +43 -0
- package/dist/esm/components/DatePicker.js +532 -0
- package/dist/esm/components/Divider.js +41 -0
- package/dist/esm/components/DropZone.js +537 -0
- package/dist/esm/components/EmptyState.js +101 -0
- package/dist/esm/components/Filters.js +823 -0
- package/dist/esm/components/FooterHelp.js +38 -0
- package/dist/esm/components/Form.js +35 -0
- package/dist/esm/components/Frame.js +376 -0
- package/dist/esm/components/FrameSaveBar.js +229 -0
- package/dist/esm/components/Grid.js +142 -0
- package/dist/esm/components/HorizontalStack.js +171 -0
- package/dist/esm/components/Icon.js +296 -0
- package/dist/esm/components/Image.js +141 -0
- package/dist/esm/components/InlineError.js +43 -0
- package/dist/esm/components/Label.js +63 -0
- package/dist/esm/components/Layout.js +164 -0
- package/dist/esm/components/LayoutSection.js +82 -0
- package/dist/esm/components/Link.js +119 -0
- package/dist/esm/components/List.js +61 -0
- package/dist/esm/components/Listbox.js +201 -0
- package/dist/esm/components/Loading.js +93 -0
- package/dist/esm/components/Modal.js +390 -0
- package/dist/esm/components/Navigation.js +321 -0
- package/dist/esm/components/Page.js +473 -0
- package/dist/esm/components/Pagination.js +99 -0
- package/dist/esm/components/Pane.js +118 -0
- package/dist/esm/components/Popover.js +350 -0
- package/dist/esm/components/PopoverManager.js +24 -0
- package/dist/esm/components/ProgressBar.js +114 -0
- package/dist/esm/components/RadioButton.js +157 -0
- package/dist/esm/components/RadioButtonCard.js +178 -0
- package/dist/esm/components/RangeSlider.js +225 -0
- package/dist/esm/components/ResourceList.js +95 -0
- package/dist/esm/components/Select.js +285 -0
- package/dist/esm/components/SkeletonText.js +120 -0
- package/dist/esm/components/Spinner.js +63 -0
- package/dist/esm/components/Table.js +1129 -0
- package/dist/esm/components/Tabs.js +366 -0
- package/dist/esm/components/Tag.js +151 -0
- package/dist/esm/components/Text.js +265 -0
- package/dist/esm/components/TextField.js +533 -0
- package/dist/esm/components/Thumbnail.js +63 -0
- package/dist/esm/components/TimePicker.js +13 -0
- package/dist/esm/components/Tip.js +169 -0
- package/dist/esm/components/Tooltip.js +380 -0
- package/dist/esm/components/TopBar.js +200 -0
- package/dist/esm/components/VerticalStack.js +152 -0
- package/dist/esm/index.js +61 -0
- package/dist/esm/styles/Table.js +581 -0
- package/dist/esm/utilities/dates.js +289 -0
- package/dist/esm/utilities/useIndexResourceState.js +158 -0
- package/dist/esm/utilities/useMounted.js +57 -0
- package/dist/esm/utilities/useTableScrollState.js +132 -0
- package/index.css +1137 -0
- 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;
|