torch-glare 2.3.0 → 2.4.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/README.md +8 -0
- package/apps/lib/components/ActionButton.tsx +7 -12
- package/apps/lib/components/ActionsGroup.tsx +4 -15
- package/apps/lib/components/AlertDialog.tsx +173 -191
- package/apps/lib/components/Avatar.tsx +13 -16
- package/apps/lib/components/Badge.tsx +7 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +20 -19
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +2 -13
- package/apps/lib/components/ChartBlockTool.ts +17 -52
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ContextMenu.tsx +110 -106
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
- package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
- package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
- package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
- package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
- package/apps/lib/components/DataViews/InboxView.tsx +22 -68
- package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
- package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
- package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
- package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
- package/apps/lib/components/DataViews/TableView.tsx +8 -28
- package/apps/lib/components/DataViews/TreeView.tsx +12 -40
- package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
- package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
- package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
- package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
- package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
- package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
- package/apps/lib/components/DataViews/index.ts +26 -26
- package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
- package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
- package/apps/lib/components/DataViews/types.ts +111 -114
- package/apps/lib/components/DatePicker.tsx +198 -191
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +79 -139
- package/apps/lib/components/DropdownMenu.tsx +144 -181
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/HeaderBar.tsx +119 -0
- package/apps/lib/components/ImageAttachment.tsx +111 -73
- package/apps/lib/components/InnerLabelField.tsx +20 -16
- package/apps/lib/components/Input.tsx +171 -172
- package/apps/lib/components/InputField.tsx +44 -45
- package/apps/lib/components/InputOTP.tsx +68 -69
- package/apps/lib/components/Label.tsx +31 -35
- package/apps/lib/components/LabelField.tsx +4 -5
- package/apps/lib/components/LabeledCheckBox.tsx +8 -12
- package/apps/lib/components/LabeledRadio.tsx +7 -5
- package/apps/lib/components/LinkButton.tsx +2 -9
- package/apps/lib/components/LoginButton.tsx +4 -9
- package/apps/lib/components/PasswordLevel.tsx +5 -5
- package/apps/lib/components/Popover.tsx +15 -33
- package/apps/lib/components/ProfileMenu.tsx +67 -72
- package/apps/lib/components/Radio.tsx +1 -5
- package/apps/lib/components/RadioCard.tsx +9 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +46 -52
- package/apps/lib/components/SearchableTable.tsx +199 -219
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +4 -16
- package/apps/lib/components/Select.tsx +53 -80
- package/apps/lib/components/SimpleSelect.tsx +196 -187
- package/apps/lib/components/Skeleton.tsx +9 -12
- package/apps/lib/components/SlideDatePicker.tsx +215 -166
- package/apps/lib/components/SpinLoading.tsx +33 -49
- package/apps/lib/components/Stepper.tsx +13 -56
- package/apps/lib/components/Switch.tsx +8 -10
- package/apps/lib/components/TabFormItem.tsx +3 -12
- package/apps/lib/components/TabSwitch.tsx +7 -34
- package/apps/lib/components/Table.tsx +60 -75
- package/apps/lib/components/TableDnDWrapper.ts +15 -48
- package/apps/lib/components/TextEditor.tsx +93 -104
- package/apps/lib/components/Textarea.tsx +8 -12
- package/apps/lib/components/Timeline.tsx +21 -41
- package/apps/lib/components/Toast.tsx +83 -83
- package/apps/lib/components/Toggle.tsx +112 -114
- package/apps/lib/components/ToggleButton.tsx +1 -1
- package/apps/lib/components/Tooltip.tsx +24 -19
- package/apps/lib/components/TransparentLabel.tsx +61 -62
- package/apps/lib/components/TreeDropDown.tsx +86 -52
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
- package/apps/lib/components/TreeFolder/icons.tsx +14 -17
- package/apps/lib/components/TreeFolder/index.ts +15 -8
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
- package/apps/lib/components/TreeFolder/types.ts +32 -32
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
- package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
- package/apps/lib/hooks/useClickOutside.ts +21 -20
- package/apps/lib/hooks/useDataViewsState.ts +86 -80
- package/apps/lib/hooks/useIsMobile.ts +12 -12
- package/apps/lib/hooks/useResize.ts +54 -65
- package/apps/lib/hooks/useTagSelection.ts +201 -201
- package/apps/lib/layouts/CNLayout.tsx +181 -140
- package/apps/lib/layouts/DataViewCard.tsx +4 -18
- package/apps/lib/layouts/FieldSection.tsx +2 -6
- package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
- package/apps/lib/providers/ThemeProvider.tsx +8 -23
- package/apps/lib/registry.json +1004 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/utils/cn.ts +1 -1
- package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
- package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
- package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
- package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
- package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
- package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
- package/apps/lib/utils/dateFormat.ts +64 -54
- package/apps/lib/utils/markdownParser.ts +2 -7
- package/apps/lib/utils/resize.ts +21 -25
- package/apps/lib/utils/types.ts +13 -13
- package/dist/bin/index.js +8 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
- package/dist/src/shared/getAvailableFiles.js +6 -1
- package/dist/src/shared/getAvailableFiles.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +7 -0
- package/dist/src/shared/loadRegistry.d.ts.map +1 -0
- package/dist/src/shared/loadRegistry.js +31 -0
- package/dist/src/shared/loadRegistry.js.map +1 -0
- package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
- package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
- package/dist/src/shared/resolveInstallPlan.js +39 -0
- package/dist/src/shared/resolveInstallPlan.js.map +1 -0
- package/dist/src/types/main.d.ts +24 -0
- package/dist/src/types/main.d.ts.map +1 -1
- package/docs/README.md +10 -2
- package/docs/components/action-button.md +30 -24
- package/docs/components/actions-group.md +26 -20
- package/docs/components/alert-dialog.md +45 -45
- package/docs/components/avatar.md +6 -2
- package/docs/components/badge-field.md +6 -2
- package/docs/components/badge.md +7 -1
- package/docs/components/breadcrumb.md +15 -40
- package/docs/components/button-group.md +13 -10
- package/docs/components/button.md +58 -33
- package/docs/components/calendar.md +26 -19
- package/docs/components/card.md +19 -16
- package/docs/components/chart-block-tool.md +128 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/context-menu.md +47 -24
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +18 -14
- package/docs/components/data-views-layout.md +20 -17
- package/docs/components/date-picker.md +30 -23
- package/docs/components/dialog.md +43 -42
- package/docs/components/divider.md +10 -4
- package/docs/components/drawer.md +8 -33
- package/docs/components/dropdown-menu.md +51 -32
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +187 -0
- package/docs/components/image-attachment.md +33 -41
- package/docs/components/inbox-view.md +16 -5
- package/docs/components/inner-label-field.md +34 -24
- package/docs/components/input-field.md +18 -10
- package/docs/components/input-otp.md +14 -11
- package/docs/components/input.md +22 -16
- package/docs/components/kanban-view.md +15 -5
- package/docs/components/label-field.md +32 -22
- package/docs/components/label.md +43 -32
- package/docs/components/labeled-check-box.md +16 -8
- package/docs/components/labeled-radio.md +18 -11
- package/docs/components/link-button.md +7 -1
- package/docs/components/login-button.md +8 -2
- package/docs/components/password-level.md +37 -24
- package/docs/components/popover.md +26 -23
- package/docs/components/profile-menu.md +38 -27
- package/docs/components/radio-card.md +16 -9
- package/docs/components/radio.md +16 -8
- package/docs/components/scroll-area.md +6 -2
- package/docs/components/search-field.md +14 -6
- package/docs/components/searchable-select.md +19 -14
- package/docs/components/searchable-table.md +60 -41
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +130 -4
- package/docs/components/select.md +23 -18
- package/docs/components/simple-select.md +14 -10
- package/docs/components/skeleton.md +43 -33
- package/docs/components/slide-date-picker.md +37 -29
- package/docs/components/spin-loading.md +32 -23
- package/docs/components/stepper.md +6 -0
- package/docs/components/switch.md +14 -6
- package/docs/components/tab-form-item.md +7 -1
- package/docs/components/tab-switch.md +13 -6
- package/docs/components/table-dnd-wrapper.md +105 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +19 -13
- package/docs/components/textarea.md +15 -7
- package/docs/components/timeline.md +6 -0
- package/docs/components/toast.md +35 -26
- package/docs/components/toggle-button.md +24 -21
- package/docs/components/toggle.md +23 -15
- package/docs/components/tooltip.md +42 -30
- package/docs/components/transparent-label.md +29 -20
- package/docs/components/tree-drop-down.md +31 -23
- package/docs/components/tree-sub-layout.md +6 -2
- package/docs/components/tree-view.md +16 -5
- package/docs/explanation/architecture.md +54 -0
- package/docs/explanation/design-system.md +52 -0
- package/docs/how-to/data-views-from-backend-response.md +7 -4
- package/docs/how-to/guides.md +24 -18
- package/docs/migration/changelog.md +38 -0
- package/docs/reference/cli.md +87 -0
- package/docs/reference/components.md +11 -12
- package/docs/reference/hooks.md +8 -8
- package/docs/reference/providers.md +22 -22
- package/docs/reference/tailwind-plugins.md +2 -2
- package/docs/reference/theme.md +85 -0
- package/docs/reference/types.md +4 -4
- package/docs/reference/utilities.md +19 -26
- package/docs/tutorials/building-first-form.md +20 -13
- package/docs/tutorials/component-composition.md +34 -50
- package/docs/tutorials/getting-started.md +2 -2
- package/docs/tutorials/theming-basics.md +13 -10
- package/package.json +31 -3
- package/dist/src/commands/block.d.ts +0 -5
- package/dist/src/commands/block.d.ts.map +0 -1
- package/dist/src/commands/block.js +0 -255
- package/dist/src/commands/block.js.map +0 -1
- package/dist/src/shared/configureFonts.d.ts +0 -6
- package/dist/src/shared/configureFonts.d.ts.map +0 -1
- package/dist/src/shared/configureFonts.js +0 -106
- package/dist/src/shared/configureFonts.js.map +0 -1
- package/dist/src/shared/configureGlobalCss.d.ts +0 -6
- package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
- package/dist/src/shared/configureGlobalCss.js +0 -154
- package/dist/src/shared/configureGlobalCss.js.map +0 -1
- package/dist/src/shared/configureTailwind.d.ts +0 -7
- package/dist/src/shared/configureTailwind.d.ts.map +0 -1
- package/dist/src/shared/configureTailwind.js +0 -163
- package/dist/src/shared/configureTailwind.js.map +0 -1
- package/dist/src/shared/detectFramework.d.ts +0 -23
- package/dist/src/shared/detectFramework.d.ts.map +0 -1
- package/dist/src/shared/detectFramework.js +0 -119
- package/dist/src/shared/detectFramework.js.map +0 -1
- package/dist/src/shared/installBaseUtils.d.ts +0 -5
- package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
- package/dist/src/shared/installBaseUtils.js +0 -79
- package/dist/src/shared/installBaseUtils.js.map +0 -1
- package/dist/src/shared/resolveAliases.d.ts +0 -24
- package/dist/src/shared/resolveAliases.d.ts.map +0 -1
- package/dist/src/shared/resolveAliases.js +0 -98
- package/dist/src/shared/resolveAliases.js.map +0 -1
|
@@ -11,12 +11,22 @@ keywords: [skeleton, loading, placeholder, shimmer, pulse, loader, content-loade
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add Skeleton
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `Skeleton` depends on.
|
|
15
23
|
|
|
16
24
|
## Import
|
|
17
25
|
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
20
30
|
```
|
|
21
31
|
|
|
22
32
|
## Quick Examples
|
|
@@ -24,7 +34,7 @@ import { Skeleton } from '@torch-ui/components'
|
|
|
24
34
|
### Basic Usage
|
|
25
35
|
|
|
26
36
|
```typescript
|
|
27
|
-
import { Skeleton } from
|
|
37
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
28
38
|
|
|
29
39
|
function Example() {
|
|
30
40
|
return <Skeleton className="h-4 w-[250px]" />
|
|
@@ -34,7 +44,7 @@ function Example() {
|
|
|
34
44
|
### Text Lines
|
|
35
45
|
|
|
36
46
|
```typescript
|
|
37
|
-
import { Skeleton } from
|
|
47
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
38
48
|
|
|
39
49
|
function TextSkeleton() {
|
|
40
50
|
return (
|
|
@@ -50,7 +60,7 @@ function TextSkeleton() {
|
|
|
50
60
|
### Card Skeleton
|
|
51
61
|
|
|
52
62
|
```typescript
|
|
53
|
-
import { Skeleton } from
|
|
63
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
54
64
|
|
|
55
65
|
function CardSkeleton() {
|
|
56
66
|
return (
|
|
@@ -67,7 +77,7 @@ function CardSkeleton() {
|
|
|
67
77
|
### Profile Skeleton
|
|
68
78
|
|
|
69
79
|
```typescript
|
|
70
|
-
import { Skeleton } from
|
|
80
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
71
81
|
|
|
72
82
|
function ProfileSkeleton() {
|
|
73
83
|
return (
|
|
@@ -88,7 +98,7 @@ function ProfileSkeleton() {
|
|
|
88
98
|
### Table Skeleton
|
|
89
99
|
|
|
90
100
|
```typescript
|
|
91
|
-
import { Skeleton } from
|
|
101
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
92
102
|
|
|
93
103
|
function TableSkeleton() {
|
|
94
104
|
return (
|
|
@@ -118,7 +128,7 @@ function TableSkeleton() {
|
|
|
118
128
|
### Button Skeleton
|
|
119
129
|
|
|
120
130
|
```typescript
|
|
121
|
-
import { Skeleton } from
|
|
131
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
122
132
|
|
|
123
133
|
function ButtonSkeleton() {
|
|
124
134
|
return <Skeleton className="h-10 w-32 rounded-md" />
|
|
@@ -128,7 +138,7 @@ function ButtonSkeleton() {
|
|
|
128
138
|
### Image Skeleton
|
|
129
139
|
|
|
130
140
|
```typescript
|
|
131
|
-
import { Skeleton } from
|
|
141
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
132
142
|
|
|
133
143
|
function ImageSkeleton() {
|
|
134
144
|
return (
|
|
@@ -146,7 +156,7 @@ function ImageSkeleton() {
|
|
|
146
156
|
### List Skeleton
|
|
147
157
|
|
|
148
158
|
```typescript
|
|
149
|
-
import { Skeleton } from
|
|
159
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
150
160
|
|
|
151
161
|
function ListSkeleton() {
|
|
152
162
|
return (
|
|
@@ -168,7 +178,7 @@ function ListSkeleton() {
|
|
|
168
178
|
### Dashboard Skeleton
|
|
169
179
|
|
|
170
180
|
```typescript
|
|
171
|
-
import { Skeleton } from
|
|
181
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
172
182
|
|
|
173
183
|
function DashboardSkeleton() {
|
|
174
184
|
return (
|
|
@@ -194,7 +204,7 @@ function DashboardSkeleton() {
|
|
|
194
204
|
### Conditional Loading
|
|
195
205
|
|
|
196
206
|
```typescript
|
|
197
|
-
import { Skeleton } from
|
|
207
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
198
208
|
import { useState, useEffect } from 'react'
|
|
199
209
|
|
|
200
210
|
interface User {
|
|
@@ -241,7 +251,7 @@ function UserProfile() {
|
|
|
241
251
|
### Grid Skeleton
|
|
242
252
|
|
|
243
253
|
```typescript
|
|
244
|
-
import { Skeleton } from
|
|
254
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
245
255
|
|
|
246
256
|
function GridSkeleton() {
|
|
247
257
|
return (
|
|
@@ -289,7 +299,7 @@ export const Skeleton: React.FC<SkeletonProps>
|
|
|
289
299
|
### Usage with TypeScript
|
|
290
300
|
|
|
291
301
|
```typescript
|
|
292
|
-
import { Skeleton } from
|
|
302
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
293
303
|
|
|
294
304
|
function TypedSkeleton() {
|
|
295
305
|
const skeletonProps: React.ComponentProps<typeof Skeleton> = {
|
|
@@ -306,14 +316,14 @@ function TypedSkeleton() {
|
|
|
306
316
|
### Reusable Skeleton Components
|
|
307
317
|
|
|
308
318
|
```typescript
|
|
309
|
-
import { Skeleton } from
|
|
319
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
310
320
|
|
|
311
321
|
// Avatar skeleton
|
|
312
|
-
export function AvatarSkeleton({ size = '
|
|
322
|
+
export function AvatarSkeleton({ size = 'M' }: { size?: 'S' | 'M' | 'L' }) {
|
|
313
323
|
const sizeClasses = {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
324
|
+
S: 'h-8 w-8',
|
|
325
|
+
M: 'h-12 w-12',
|
|
326
|
+
L: 'h-16 w-16',
|
|
317
327
|
}
|
|
318
328
|
|
|
319
329
|
return <Skeleton className={`${sizeClasses[size]} rounded-full`} />
|
|
@@ -334,14 +344,14 @@ export function TextSkeleton({ lines = 3 }: { lines?: number }) {
|
|
|
334
344
|
}
|
|
335
345
|
|
|
336
346
|
// Usage
|
|
337
|
-
<AvatarSkeleton size="
|
|
347
|
+
<AvatarSkeleton size="L" />
|
|
338
348
|
<TextSkeleton lines={4} />
|
|
339
349
|
```
|
|
340
350
|
|
|
341
351
|
### With Suspense
|
|
342
352
|
|
|
343
353
|
```typescript
|
|
344
|
-
import { Skeleton } from
|
|
354
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
345
355
|
import { Suspense } from 'react'
|
|
346
356
|
|
|
347
357
|
function ProfileSkeleton() {
|
|
@@ -368,7 +378,7 @@ function App() {
|
|
|
368
378
|
### Loading States Hook
|
|
369
379
|
|
|
370
380
|
```typescript
|
|
371
|
-
import { Skeleton } from
|
|
381
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
372
382
|
import { useState, useEffect } from 'react'
|
|
373
383
|
|
|
374
384
|
function useLoading<T>(fetchFn: () => Promise<T>) {
|
|
@@ -399,7 +409,7 @@ function DataDisplay() {
|
|
|
399
409
|
### Delayed Skeleton
|
|
400
410
|
|
|
401
411
|
```typescript
|
|
402
|
-
import { Skeleton } from
|
|
412
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
403
413
|
import { useState, useEffect } from 'react'
|
|
404
414
|
|
|
405
415
|
function DelayedSkeleton({ delay = 300, children }) {
|
|
@@ -477,7 +487,7 @@ function FastLoading() {
|
|
|
477
487
|
|
|
478
488
|
```typescript
|
|
479
489
|
import { render, screen } from '@testing-library/react'
|
|
480
|
-
import { Skeleton } from
|
|
490
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
481
491
|
|
|
482
492
|
describe('Skeleton', () => {
|
|
483
493
|
it('renders skeleton with correct classes', () => {
|
|
@@ -500,7 +510,7 @@ describe('Skeleton', () => {
|
|
|
500
510
|
|
|
501
511
|
```typescript
|
|
502
512
|
import { render, screen, waitFor } from '@testing-library/react'
|
|
503
|
-
import { Skeleton } from
|
|
513
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
504
514
|
|
|
505
515
|
function ComponentWithLoading() {
|
|
506
516
|
const [loading, setLoading] = useState(true)
|
|
@@ -553,7 +563,7 @@ test('shows skeleton then content', async () => {
|
|
|
553
563
|
### Enhanced Accessibility
|
|
554
564
|
|
|
555
565
|
```typescript
|
|
556
|
-
import { Skeleton } from
|
|
566
|
+
import { Skeleton } from "@/components/Skeleton";
|
|
557
567
|
|
|
558
568
|
function AccessibleSkeleton() {
|
|
559
569
|
return (
|
|
@@ -600,7 +610,7 @@ function AccessibleSkeleton() {
|
|
|
600
610
|
|
|
601
611
|
```diff
|
|
602
612
|
- import Skeleton from 'react-loading-skeleton'
|
|
603
|
-
+ import { Skeleton } from
|
|
613
|
+
+ import { Skeleton } from "@/components/Skeleton";
|
|
604
614
|
|
|
605
615
|
- <Skeleton count={3} />
|
|
606
616
|
+ {[...Array(3)].map((_, i) => (
|
|
@@ -612,12 +622,12 @@ function AccessibleSkeleton() {
|
|
|
612
622
|
|
|
613
623
|
```diff
|
|
614
624
|
- import { Skeleton } from '@mui/material'
|
|
615
|
-
+ import { Skeleton } from
|
|
625
|
+
+ import { Skeleton } from "@/components/Skeleton";
|
|
616
626
|
|
|
617
|
-
- <Skeleton
|
|
627
|
+
- <Skeleton width={210} height={60} /> {/* MUI text variant */}
|
|
618
628
|
+ <Skeleton className="h-[60px] w-[210px]" />
|
|
619
629
|
|
|
620
|
-
- <Skeleton
|
|
630
|
+
- <Skeleton width={40} height={40} /> {/* MUI circular variant */}
|
|
621
631
|
+ <Skeleton className="h-10 w-10 rounded-full" />
|
|
622
632
|
```
|
|
623
633
|
|
|
@@ -625,12 +635,12 @@ function AccessibleSkeleton() {
|
|
|
625
635
|
|
|
626
636
|
```diff
|
|
627
637
|
- import { Skeleton } from 'antd'
|
|
628
|
-
+ import { Skeleton } from
|
|
638
|
+
+ import { Skeleton } from "@/components/Skeleton";
|
|
629
639
|
|
|
630
640
|
- <Skeleton active />
|
|
631
641
|
+ <Skeleton className="h-4 w-full" />
|
|
632
642
|
|
|
633
|
-
- <Skeleton.Avatar active
|
|
643
|
+
- <Skeleton.Avatar active /> {/* Ant large avatar */}
|
|
634
644
|
+ <Skeleton className="h-16 w-16 rounded-full" />
|
|
635
645
|
```
|
|
636
646
|
|
|
@@ -11,15 +11,22 @@ keywords: [slide-picker, date, wheel, mobile, picker, scroll]
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
+
|
|
14
17
|
```bash
|
|
15
|
-
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add SlideDatePicker
|
|
16
20
|
```
|
|
17
21
|
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `SlideDatePicker` depends on.
|
|
23
|
+
|
|
18
24
|
## Import
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
23
30
|
```
|
|
24
31
|
|
|
25
32
|
## Quick Examples
|
|
@@ -27,7 +34,7 @@ import type { SlideDatePickerProps } from '@torch-ui/components'
|
|
|
27
34
|
### Basic Usage
|
|
28
35
|
|
|
29
36
|
```typescript
|
|
30
|
-
import { SlideDatePicker } from
|
|
37
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
31
38
|
import { useState } from 'react'
|
|
32
39
|
|
|
33
40
|
function Example() {
|
|
@@ -45,7 +52,7 @@ function Example() {
|
|
|
45
52
|
### Custom Date Format
|
|
46
53
|
|
|
47
54
|
```typescript
|
|
48
|
-
import { SlideDatePicker } from
|
|
55
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
49
56
|
import { useState } from 'react'
|
|
50
57
|
|
|
51
58
|
function CustomFormat() {
|
|
@@ -64,8 +71,8 @@ function CustomFormat() {
|
|
|
64
71
|
### With Custom Trigger
|
|
65
72
|
|
|
66
73
|
```typescript
|
|
67
|
-
import { SlideDatePicker } from
|
|
68
|
-
import { Button } from
|
|
74
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
75
|
+
import { Button } from "@/components/Button";
|
|
69
76
|
import { useState } from 'react'
|
|
70
77
|
|
|
71
78
|
function CustomTrigger() {
|
|
@@ -76,7 +83,7 @@ function CustomTrigger() {
|
|
|
76
83
|
value={date}
|
|
77
84
|
onChange={(e) => setDate(e.target.value)}
|
|
78
85
|
>
|
|
79
|
-
<Button variant="
|
|
86
|
+
<Button variant="BluSecStyle">
|
|
80
87
|
<i className="ri-calendar-2-line" />
|
|
81
88
|
{date.toLocaleDateString()}
|
|
82
89
|
</Button>
|
|
@@ -88,7 +95,7 @@ function CustomTrigger() {
|
|
|
88
95
|
### Dark/Light Theme
|
|
89
96
|
|
|
90
97
|
```typescript
|
|
91
|
-
import { SlideDatePicker } from
|
|
98
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
92
99
|
|
|
93
100
|
function ThemedPicker() {
|
|
94
101
|
const [date, setDate] = useState<Date>(new Date())
|
|
@@ -114,8 +121,8 @@ function ThemedPicker() {
|
|
|
114
121
|
### Birthday Picker
|
|
115
122
|
|
|
116
123
|
```typescript
|
|
117
|
-
import { SlideDatePicker } from
|
|
118
|
-
import { InputField } from
|
|
124
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
125
|
+
import { InputField } from "@/components/InputField";
|
|
119
126
|
import { useState } from 'react'
|
|
120
127
|
|
|
121
128
|
function BirthdayPicker() {
|
|
@@ -139,8 +146,8 @@ function BirthdayPicker() {
|
|
|
139
146
|
### Appointment Scheduler
|
|
140
147
|
|
|
141
148
|
```typescript
|
|
142
|
-
import { SlideDatePicker } from
|
|
143
|
-
import { InputField } from
|
|
149
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
150
|
+
import { InputField } from "@/components/InputField";
|
|
144
151
|
import { useState } from 'react'
|
|
145
152
|
|
|
146
153
|
function AppointmentScheduler() {
|
|
@@ -179,7 +186,7 @@ function AppointmentScheduler() {
|
|
|
179
186
|
### With Initial Date
|
|
180
187
|
|
|
181
188
|
```typescript
|
|
182
|
-
import { SlideDatePicker } from
|
|
189
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
183
190
|
import { useState } from 'react'
|
|
184
191
|
|
|
185
192
|
function WithInitialDate() {
|
|
@@ -201,8 +208,8 @@ function WithInitialDate() {
|
|
|
201
208
|
### Multiple Date Pickers
|
|
202
209
|
|
|
203
210
|
```typescript
|
|
204
|
-
import { SlideDatePicker } from
|
|
205
|
-
import { InputField } from
|
|
211
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
212
|
+
import { InputField } from "@/components/InputField";
|
|
206
213
|
import { useState } from 'react'
|
|
207
214
|
|
|
208
215
|
function DateRangePicker() {
|
|
@@ -248,8 +255,9 @@ function DateRangePicker() {
|
|
|
248
255
|
### Form Integration
|
|
249
256
|
|
|
250
257
|
```typescript
|
|
251
|
-
import { SlideDatePicker } from
|
|
252
|
-
import {
|
|
258
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
259
|
+
import { Button } from "@/components/Button";
|
|
260
|
+
import { InputField } from "@/components/InputField";
|
|
253
261
|
import { useState } from 'react'
|
|
254
262
|
|
|
255
263
|
function RegistrationForm() {
|
|
@@ -292,7 +300,7 @@ function RegistrationForm() {
|
|
|
292
300
|
### Localized Date Format
|
|
293
301
|
|
|
294
302
|
```typescript
|
|
295
|
-
import { SlideDatePicker } from
|
|
303
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
296
304
|
import { useState } from 'react'
|
|
297
305
|
|
|
298
306
|
function LocalizedPicker() {
|
|
@@ -359,7 +367,7 @@ type SlideValues = {
|
|
|
359
367
|
|
|
360
368
|
```typescript
|
|
361
369
|
import { ComponentProps, ReactElement } from 'react'
|
|
362
|
-
import { InputField } from
|
|
370
|
+
import { InputField } from "@/components/InputField";
|
|
363
371
|
|
|
364
372
|
interface SlideDatePickerProps extends Omit<ComponentProps<typeof InputField>, 'onChange'> {
|
|
365
373
|
onChange?: (e: { target: { value: Date } }) => void
|
|
@@ -377,7 +385,7 @@ export const SlideDatePicker: React.ForwardRefExoticComponent<
|
|
|
377
385
|
### Usage with Types
|
|
378
386
|
|
|
379
387
|
```typescript
|
|
380
|
-
import { SlideDatePicker } from
|
|
388
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
381
389
|
import { useRef, useState } from 'react'
|
|
382
390
|
|
|
383
391
|
function TypedExample() {
|
|
@@ -405,8 +413,8 @@ function TypedExample() {
|
|
|
405
413
|
### Age Verification
|
|
406
414
|
|
|
407
415
|
```typescript
|
|
408
|
-
import { SlideDatePicker } from
|
|
409
|
-
import { InputField } from
|
|
416
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
417
|
+
import { InputField } from "@/components/InputField";
|
|
410
418
|
import { useState } from 'react'
|
|
411
419
|
|
|
412
420
|
function AgeVerification() {
|
|
@@ -457,8 +465,8 @@ function AgeVerification() {
|
|
|
457
465
|
### Expiration Date Picker
|
|
458
466
|
|
|
459
467
|
```typescript
|
|
460
|
-
import { SlideDatePicker } from
|
|
461
|
-
import { InputField } from
|
|
468
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
469
|
+
import { InputField } from "@/components/InputField";
|
|
462
470
|
import { useState } from 'react'
|
|
463
471
|
|
|
464
472
|
function ExpirationPicker() {
|
|
@@ -490,7 +498,7 @@ function ExpirationPicker() {
|
|
|
490
498
|
### Historical Date Picker
|
|
491
499
|
|
|
492
500
|
```typescript
|
|
493
|
-
import { SlideDatePicker } from
|
|
501
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
494
502
|
import { useState } from 'react'
|
|
495
503
|
|
|
496
504
|
function HistoricalDatePicker() {
|
|
@@ -522,7 +530,7 @@ function HistoricalDatePicker() {
|
|
|
522
530
|
|
|
523
531
|
```typescript
|
|
524
532
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
525
|
-
import { SlideDatePicker } from
|
|
533
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
526
534
|
import userEvent from '@testing-library/user-event'
|
|
527
535
|
|
|
528
536
|
describe('SlideDatePicker', () => {
|
|
@@ -647,7 +655,7 @@ describe('SlideDatePicker', () => {
|
|
|
647
655
|
```typescript
|
|
648
656
|
import { render, screen, waitFor } from '@testing-library/react'
|
|
649
657
|
import userEvent from '@testing-library/user-event'
|
|
650
|
-
import { SlideDatePicker } from
|
|
658
|
+
import { SlideDatePicker } from "@/components/SlideDatePicker";
|
|
651
659
|
|
|
652
660
|
describe('SlideDatePicker Integration', () => {
|
|
653
661
|
it('updates form value on date selection', async () => {
|
|
@@ -11,13 +11,22 @@ keywords: [loading, spinner, loader, animation, spin, progress]
|
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx torch-glare@latest init
|
|
19
|
+
npx torch-glare@latest add SpinLoading
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`add` also copies any components, hooks, and utilities that `SpinLoading` depends on.
|
|
15
23
|
|
|
16
24
|
## Import
|
|
17
25
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
21
30
|
```
|
|
22
31
|
|
|
23
32
|
## Quick Examples
|
|
@@ -25,7 +34,7 @@ import type { SpinLoadingProps } from '@torch-ui/components'
|
|
|
25
34
|
### Basic Usage
|
|
26
35
|
|
|
27
36
|
```typescript
|
|
28
|
-
import { SpinLoading } from
|
|
37
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
29
38
|
|
|
30
39
|
function Example() {
|
|
31
40
|
return <SpinLoading />
|
|
@@ -35,7 +44,7 @@ function Example() {
|
|
|
35
44
|
### With Different Sizes
|
|
36
45
|
|
|
37
46
|
```typescript
|
|
38
|
-
import { SpinLoading } from
|
|
47
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
39
48
|
|
|
40
49
|
function SizesExample() {
|
|
41
50
|
return (
|
|
@@ -51,7 +60,7 @@ function SizesExample() {
|
|
|
51
60
|
### Dark Theme
|
|
52
61
|
|
|
53
62
|
```typescript
|
|
54
|
-
import { SpinLoading } from
|
|
63
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
55
64
|
|
|
56
65
|
function DarkTheme() {
|
|
57
66
|
return (
|
|
@@ -65,7 +74,7 @@ function DarkTheme() {
|
|
|
65
74
|
### Light Theme
|
|
66
75
|
|
|
67
76
|
```typescript
|
|
68
|
-
import { SpinLoading } from
|
|
77
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
69
78
|
|
|
70
79
|
function LightTheme() {
|
|
71
80
|
return (
|
|
@@ -79,7 +88,7 @@ function LightTheme() {
|
|
|
79
88
|
### With Center Content
|
|
80
89
|
|
|
81
90
|
```typescript
|
|
82
|
-
import { SpinLoading } from
|
|
91
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
83
92
|
|
|
84
93
|
function WithContent() {
|
|
85
94
|
return (
|
|
@@ -96,7 +105,7 @@ function WithContent() {
|
|
|
96
105
|
### With Percentage
|
|
97
106
|
|
|
98
107
|
```typescript
|
|
99
|
-
import { SpinLoading } from
|
|
108
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
100
109
|
import { useState, useEffect } from 'react'
|
|
101
110
|
|
|
102
111
|
function PercentageLoader() {
|
|
@@ -123,7 +132,7 @@ function PercentageLoader() {
|
|
|
123
132
|
### Loading Overlay
|
|
124
133
|
|
|
125
134
|
```typescript
|
|
126
|
-
import { SpinLoading } from
|
|
135
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
127
136
|
|
|
128
137
|
function LoadingOverlay({ loading, children }: { loading: boolean; children: React.ReactNode }) {
|
|
129
138
|
return (
|
|
@@ -159,7 +168,7 @@ function App() {
|
|
|
159
168
|
### Full Page Loading
|
|
160
169
|
|
|
161
170
|
```typescript
|
|
162
|
-
import { SpinLoading } from
|
|
171
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
163
172
|
|
|
164
173
|
function FullPageLoading() {
|
|
165
174
|
return (
|
|
@@ -177,7 +186,7 @@ function FullPageLoading() {
|
|
|
177
186
|
### Data Loading State
|
|
178
187
|
|
|
179
188
|
```typescript
|
|
180
|
-
import { SpinLoading } from
|
|
189
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
181
190
|
import { useEffect, useState } from 'react'
|
|
182
191
|
|
|
183
192
|
function DataLoader() {
|
|
@@ -207,8 +216,8 @@ function DataLoader() {
|
|
|
207
216
|
### Card Loading
|
|
208
217
|
|
|
209
218
|
```typescript
|
|
210
|
-
import { SpinLoading } from
|
|
211
|
-
import { Card } from
|
|
219
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
220
|
+
import { Card } from "@/components/Card";
|
|
212
221
|
|
|
213
222
|
function CardWithLoading({ loading }: { loading: boolean }) {
|
|
214
223
|
return (
|
|
@@ -233,8 +242,8 @@ function CardWithLoading({ loading }: { loading: boolean }) {
|
|
|
233
242
|
### Button Loading State
|
|
234
243
|
|
|
235
244
|
```typescript
|
|
236
|
-
import { SpinLoading } from
|
|
237
|
-
import { Button } from
|
|
245
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
246
|
+
import { Button } from "@/components/Button";
|
|
238
247
|
import { useState } from 'react'
|
|
239
248
|
|
|
240
249
|
function LoadingButton() {
|
|
@@ -306,7 +315,7 @@ export const SpinLoading: React.FC<SpinLoadingProps>
|
|
|
306
315
|
### Usage with Types
|
|
307
316
|
|
|
308
317
|
```typescript
|
|
309
|
-
import { SpinLoading } from
|
|
318
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
310
319
|
import { useState } from 'react'
|
|
311
320
|
|
|
312
321
|
function TypedExample() {
|
|
@@ -338,7 +347,7 @@ function TypedExample() {
|
|
|
338
347
|
### Async Operation Wrapper
|
|
339
348
|
|
|
340
349
|
```typescript
|
|
341
|
-
import { SpinLoading } from
|
|
350
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
342
351
|
import { ReactNode, useState } from 'react'
|
|
343
352
|
|
|
344
353
|
function AsyncWrapper({
|
|
@@ -377,7 +386,7 @@ function AsyncWrapper({
|
|
|
377
386
|
### Suspense-Like Fallback
|
|
378
387
|
|
|
379
388
|
```typescript
|
|
380
|
-
import { SpinLoading } from
|
|
389
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
381
390
|
import { Suspense } from 'react'
|
|
382
391
|
|
|
383
392
|
function SuspenseWithLoading({ children }: { children: React.ReactNode }) {
|
|
@@ -400,7 +409,7 @@ function SuspenseWithLoading({ children }: { children: React.ReactNode }) {
|
|
|
400
409
|
### Loading State Manager
|
|
401
410
|
|
|
402
411
|
```typescript
|
|
403
|
-
import { SpinLoading } from
|
|
412
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
404
413
|
import { createContext, useContext, useState, ReactNode } from 'react'
|
|
405
414
|
|
|
406
415
|
const LoadingContext = createContext({
|
|
@@ -448,7 +457,7 @@ function MyComponent() {
|
|
|
448
457
|
|
|
449
458
|
```typescript
|
|
450
459
|
import { render, screen } from '@testing-library/react'
|
|
451
|
-
import { SpinLoading } from
|
|
460
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
452
461
|
|
|
453
462
|
describe('SpinLoading', () => {
|
|
454
463
|
it('renders spinner', () => {
|
|
@@ -513,7 +522,7 @@ describe('SpinLoading', () => {
|
|
|
513
522
|
|
|
514
523
|
```typescript
|
|
515
524
|
import { render, screen, waitFor } from '@testing-library/react'
|
|
516
|
-
import { SpinLoading } from
|
|
525
|
+
import { SpinLoading } from "@/components/SpinLoading";
|
|
517
526
|
|
|
518
527
|
describe('SpinLoading Integration', () => {
|
|
519
528
|
it('shows loading state during async operation', async () => {
|
|
@@ -14,10 +14,16 @@ The component is composed of `Stepper`, `Step`, `StepIndicator`, `StepConnector`
|
|
|
14
14
|
|
|
15
15
|
## Installation
|
|
16
16
|
|
|
17
|
+
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
18
|
+
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
19
|
+
|
|
17
20
|
```bash
|
|
21
|
+
npx torch-glare@latest init
|
|
18
22
|
npx torch-glare@latest add Stepper
|
|
19
23
|
```
|
|
20
24
|
|
|
25
|
+
`add` also copies any components, hooks, and utilities that `Stepper` depends on.
|
|
26
|
+
|
|
21
27
|
## Imports
|
|
22
28
|
|
|
23
29
|
```typescript
|