torch-glare 2.5.6 → 2.6.0
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 +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- package/docs/tutorials/theming-basics.md +0 -785
|
@@ -1,480 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React, { forwardRef, HTMLAttributes, ReactNode, createContext, useContext } from "react";
|
|
4
|
-
import { cva } from "class-variance-authority";
|
|
5
|
-
import { cn } from "../utils/cn";
|
|
6
|
-
import { Themes } from "../utils/types";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Stepper — the pill-shaped multi-step indicator from Figma `FormStepper-1.0`.
|
|
10
|
-
*
|
|
11
|
-
* This is the single stepper in the library: it merges the Figma pill (three semantic types with
|
|
12
|
-
* resting/hover/selected states and a corner badge) with the orientation, sizes and connector that
|
|
13
|
-
* used to live in a separate generic component.
|
|
14
|
-
*
|
|
15
|
-
* `type` + `selected` express the four states the generic one had:
|
|
16
|
-
* pending → type="default" unselected · active → type="default" selected
|
|
17
|
-
* completed → type="success" · error → type="negative"
|
|
18
|
-
*
|
|
19
|
-
* Not to be confused with `FormRenderer.Stepper`, which is the wizard *behaviour* (step state,
|
|
20
|
-
* validation, Back/Next) and renders this component as its rail.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
type StepperType = "default" | "success" | "negative";
|
|
26
|
-
type StepperOrientation = "horizontal" | "vertical";
|
|
27
|
-
type StepperSize = "S" | "M" | "L";
|
|
28
|
-
|
|
29
|
-
// ─── Context ─────────────────────────────────────────────────────────────────
|
|
30
|
-
|
|
31
|
-
interface StepperContextValue {
|
|
32
|
-
activeStep: number;
|
|
33
|
-
orientation: StepperOrientation;
|
|
34
|
-
size: StepperSize;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const StepperContext = createContext<StepperContextValue>({
|
|
38
|
-
activeStep: 0,
|
|
39
|
-
orientation: "horizontal",
|
|
40
|
-
size: "M",
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const useStepperContext = () => useContext(StepperContext);
|
|
44
|
-
|
|
45
|
-
// ─── Stepper Root ────────────────────────────────────────────────────────────
|
|
46
|
-
|
|
47
|
-
interface StepperProps extends HTMLAttributes<HTMLDivElement> {
|
|
48
|
-
theme?: Themes;
|
|
49
|
-
activeStep?: number;
|
|
50
|
-
/** Direction the step pills flow. Vertical is the FormRenderer rail. */
|
|
51
|
-
orientation?: StepperOrientation;
|
|
52
|
-
/** Scales the pill, indicator and label. Figma defines M; S and L scale from it. */
|
|
53
|
-
size?: StepperSize;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const stepperStyles = cva(["flex"], {
|
|
57
|
-
variants: {
|
|
58
|
-
orientation: {
|
|
59
|
-
horizontal: "flex-row items-center gap-3",
|
|
60
|
-
vertical: "flex-col items-start gap-[4px]",
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
defaultVariants: {
|
|
64
|
-
orientation: "horizontal",
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const Stepper = forwardRef<HTMLDivElement, StepperProps>(
|
|
69
|
-
({ className, theme, activeStep = 0, orientation = "horizontal", size = "M", ...props }, ref) => (
|
|
70
|
-
<StepperContext.Provider value={{ activeStep, orientation, size }}>
|
|
71
|
-
<div
|
|
72
|
-
ref={ref}
|
|
73
|
-
data-theme={theme}
|
|
74
|
-
data-orientation={orientation}
|
|
75
|
-
className={cn(stepperStyles({ orientation }), className)}
|
|
76
|
-
{...props}
|
|
77
|
-
/>
|
|
78
|
-
</StepperContext.Provider>
|
|
79
|
-
),
|
|
80
|
-
);
|
|
81
|
-
Stepper.displayName = "Stepper";
|
|
82
|
-
|
|
83
|
-
// ─── Step (the pill wrapper) ─────────────────────────────────────────────────
|
|
84
|
-
|
|
85
|
-
const stepStyles = cva(
|
|
86
|
-
[
|
|
87
|
-
"group/step inline-flex items-center shrink-0",
|
|
88
|
-
"rounded-full p-[2px] max-w-[144px]",
|
|
89
|
-
"transition-all duration-200 ease-in-out",
|
|
90
|
-
"cursor-pointer select-none outline-none",
|
|
91
|
-
],
|
|
92
|
-
{
|
|
93
|
-
variants: {
|
|
94
|
-
// M is the size Figma draws (28px pill / 24px indicator); S and L scale from it.
|
|
95
|
-
size: {
|
|
96
|
-
S: "h-[24px]",
|
|
97
|
-
M: "h-[28px]",
|
|
98
|
-
L: "h-[34px]",
|
|
99
|
-
},
|
|
100
|
-
// Selection drives the pill background; a raised surface appears on hover for unselected
|
|
101
|
-
// pills. `drop-shadow` rather than `shadow`: Figma draws a filter that follows the pill's
|
|
102
|
-
// rounded silhouette, where a box-shadow would ring the layout box.
|
|
103
|
-
selected: {
|
|
104
|
-
true: [
|
|
105
|
-
"bg-background-presentation-button-hover",
|
|
106
|
-
// Figma's onSelect and onSelect-Hoverd carry the same shadow — a selected pill does not
|
|
107
|
-
// deepen when you hover it.
|
|
108
|
-
"drop-shadow-[0_0_16px_rgba(0,0,0,0.2)]",
|
|
109
|
-
],
|
|
110
|
-
false: [
|
|
111
|
-
"bg-transparent",
|
|
112
|
-
// Figma binds this to the raw palette colour `White/00`, which would stay solid white in
|
|
113
|
-
// dark theme. `form-base` is the themable equivalent — identical in light, and a raised
|
|
114
|
-
// surface rather than a white slab in dark.
|
|
115
|
-
"hover:bg-background-presentation-form-base",
|
|
116
|
-
"hover:drop-shadow-[0_0_16px_rgba(0,0,0,0.05)]",
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
defaultVariants: {
|
|
121
|
-
selected: false,
|
|
122
|
-
size: "M",
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
interface StepProps extends Omit<HTMLAttributes<HTMLDivElement>, "type"> {
|
|
128
|
-
index?: number;
|
|
129
|
-
type?: StepperType;
|
|
130
|
-
selected?: boolean;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const Step = forwardRef<HTMLDivElement, StepProps>(
|
|
134
|
-
({ className, index = 0, type = "default", selected, children, ...props }, ref) => {
|
|
135
|
-
const { activeStep, size } = useStepperContext();
|
|
136
|
-
const isSelected = selected ?? index === activeStep;
|
|
137
|
-
|
|
138
|
-
return (
|
|
139
|
-
<div
|
|
140
|
-
ref={ref}
|
|
141
|
-
data-selected={isSelected || undefined}
|
|
142
|
-
data-type={type}
|
|
143
|
-
className={cn(stepStyles({ selected: isSelected, size }), className)}
|
|
144
|
-
{...props}
|
|
145
|
-
>
|
|
146
|
-
{React.Children.map(children, (child) => {
|
|
147
|
-
if (!React.isValidElement(child)) return child;
|
|
148
|
-
return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {
|
|
149
|
-
_selected: isSelected,
|
|
150
|
-
_type: type,
|
|
151
|
-
_index: index,
|
|
152
|
-
});
|
|
153
|
-
})}
|
|
154
|
-
</div>
|
|
155
|
-
);
|
|
156
|
-
},
|
|
157
|
-
);
|
|
158
|
-
Step.displayName = "Step";
|
|
159
|
-
|
|
160
|
-
// ─── StepIndicator (circle badge) ────────────────────────────────────────────
|
|
161
|
-
|
|
162
|
-
const stepIndicatorStyles = cva(
|
|
163
|
-
[
|
|
164
|
-
"relative inline-flex items-center justify-center shrink-0",
|
|
165
|
-
"rounded-full",
|
|
166
|
-
"transition-colors duration-200 ease-in-out",
|
|
167
|
-
"typography-body-medium-medium",
|
|
168
|
-
],
|
|
169
|
-
{
|
|
170
|
-
variants: {
|
|
171
|
-
// The pill is `p-[2px]`, so the indicator is always the pill height minus 4. It is a capsule,
|
|
172
|
-
// not a circle: `min-w` + `px` let a two-digit step number widen it, as Figma draws.
|
|
173
|
-
size: {
|
|
174
|
-
S: "h-[20px] min-w-[20px] px-[5px] text-[12px]",
|
|
175
|
-
M: "h-[24px] min-w-[24px] px-[6px] text-[14px]",
|
|
176
|
-
L: "h-[30px] min-w-[30px] px-[7px] text-[16px]",
|
|
177
|
-
},
|
|
178
|
-
type: {
|
|
179
|
-
// `ring` rather than `border`: a ring is a box-shadow and takes no layout space, so the
|
|
180
|
-
// `min-w`/`px` capsule above lands on Figma's exact width. A 3px border would eat the
|
|
181
|
-
// content box under `border-box` and push a single digit past it.
|
|
182
|
-
default: ["ring-[3px] ring-inset"],
|
|
183
|
-
success: [
|
|
184
|
-
"bg-background-presentation-state-success-primary text-content-presentation-global-primary-inverse",
|
|
185
|
-
],
|
|
186
|
-
negative: [
|
|
187
|
-
"bg-background-presentation-state-negative-primary text-content-presentation-global-primary-inverse",
|
|
188
|
-
],
|
|
189
|
-
},
|
|
190
|
-
// Only meaningful for type=default. Selected = filled blue, otherwise
|
|
191
|
-
// ring color comes from the resting/hover compound variants below.
|
|
192
|
-
selected: {
|
|
193
|
-
true: "",
|
|
194
|
-
false: "",
|
|
195
|
-
},
|
|
196
|
-
},
|
|
197
|
-
defaultVariants: {
|
|
198
|
-
type: "default",
|
|
199
|
-
selected: false,
|
|
200
|
-
size: "M",
|
|
201
|
-
},
|
|
202
|
-
compoundVariants: [
|
|
203
|
-
// Default type, not selected: gray ring + gray number at rest;
|
|
204
|
-
// hover (driven by parent .group/step) flips ring blue, number primary.
|
|
205
|
-
{
|
|
206
|
-
type: "default",
|
|
207
|
-
selected: false,
|
|
208
|
-
className: [
|
|
209
|
-
"bg-transparent ring-border-presentation-stepper-default text-content-presentation-global-secondary",
|
|
210
|
-
"group-hover/step:ring-content-presentation-state-information",
|
|
211
|
-
"group-hover/step:text-content-presentation-global-primary",
|
|
212
|
-
],
|
|
213
|
-
},
|
|
214
|
-
// Default type, selected: solid blue fill, inverse number, no ring.
|
|
215
|
-
{
|
|
216
|
-
type: "default",
|
|
217
|
-
selected: true,
|
|
218
|
-
className: [
|
|
219
|
-
"bg-background-presentation-state-information-primary ring-transparent text-content-presentation-global-primary-inverse",
|
|
220
|
-
],
|
|
221
|
-
},
|
|
222
|
-
],
|
|
223
|
-
},
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
const stepIndicatorBadgeStyles = cva(
|
|
227
|
-
[
|
|
228
|
-
"absolute",
|
|
229
|
-
"rounded-full",
|
|
230
|
-
"inline-flex items-center justify-center",
|
|
231
|
-
"border border-background-presentation-body-primary",
|
|
232
|
-
// Figma sits the glyph in a fixed square frame. Without pinning the box, a Remix icon's
|
|
233
|
-
// advance width is wider than its font-size and pushes the badge past its designed 15px.
|
|
234
|
-
"[&_i]:leading-none [&_i]:flex [&_i]:items-center [&_i]:justify-center",
|
|
235
|
-
// LTR: badge top-right; RTL: badge top-left
|
|
236
|
-
"ltr:right-[-4.94px] rtl:left-[-4.94px]",
|
|
237
|
-
],
|
|
238
|
-
{
|
|
239
|
-
variants: {
|
|
240
|
-
size: {
|
|
241
|
-
// Padding absorbs the 1px ring: Figma draws its stroke inside the 15px frame, where
|
|
242
|
-
// `border-box` adds it on top. Its documented 2.667px would render a 16.9px badge.
|
|
243
|
-
S: "h-[13px] min-w-[13px] px-[1.35px] -top-[4px] [&_i]:text-[8.3px] [&_i]:size-[8.3px]",
|
|
244
|
-
M: "h-[15px] min-w-[15px] px-[1.7px] -top-[5px] [&_i]:text-[9.6px] [&_i]:size-[9.6px]",
|
|
245
|
-
L: "h-[18px] min-w-[18px] px-[2.25px] -top-[6px] [&_i]:text-[11.5px] [&_i]:size-[11.5px]",
|
|
246
|
-
},
|
|
247
|
-
type: {
|
|
248
|
-
success:
|
|
249
|
-
"bg-background-presentation-state-success-primary text-content-presentation-global-primary-inverse",
|
|
250
|
-
negative:
|
|
251
|
-
"bg-background-presentation-state-negative-primary text-content-presentation-global-primary-inverse",
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
defaultVariants: {
|
|
255
|
-
size: "M",
|
|
256
|
-
},
|
|
257
|
-
},
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
interface StepIndicatorProps extends HTMLAttributes<HTMLDivElement> {
|
|
261
|
-
/** Icon in the corner badge (success/negative types only). */
|
|
262
|
-
badgeIcon?: ReactNode;
|
|
263
|
-
/** Replaces the step number in the circle. */
|
|
264
|
-
icon?: ReactNode;
|
|
265
|
-
/** Replaces the circle's content when the step is `success`. */
|
|
266
|
-
completedIcon?: ReactNode;
|
|
267
|
-
/** Replaces the circle's content when the step is `negative`. */
|
|
268
|
-
errorIcon?: ReactNode;
|
|
269
|
-
_selected?: boolean;
|
|
270
|
-
_type?: StepperType;
|
|
271
|
-
_index?: number;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const StepIndicator = forwardRef<HTMLDivElement, StepIndicatorProps>(
|
|
275
|
-
(
|
|
276
|
-
{
|
|
277
|
-
className,
|
|
278
|
-
badgeIcon,
|
|
279
|
-
icon,
|
|
280
|
-
completedIcon,
|
|
281
|
-
errorIcon,
|
|
282
|
-
_selected,
|
|
283
|
-
_type = "default",
|
|
284
|
-
_index = 0,
|
|
285
|
-
children,
|
|
286
|
-
...props
|
|
287
|
-
},
|
|
288
|
-
ref,
|
|
289
|
-
) => {
|
|
290
|
-
const { size } = useStepperContext();
|
|
291
|
-
const showBadge = _type === "success" || _type === "negative";
|
|
292
|
-
const defaultBadgeIcon =
|
|
293
|
-
_type === "success" ? <i className="ri-check-line" /> : <i className="ri-information-fill" />;
|
|
294
|
-
|
|
295
|
-
// Most specific first: a per-state icon, then a general one, then children, then the number.
|
|
296
|
-
const content =
|
|
297
|
-
(_type === "negative" && errorIcon) ||
|
|
298
|
-
(_type === "success" && completedIcon) ||
|
|
299
|
-
icon ||
|
|
300
|
-
children ||
|
|
301
|
-
_index + 1;
|
|
302
|
-
|
|
303
|
-
return (
|
|
304
|
-
<div
|
|
305
|
-
ref={ref}
|
|
306
|
-
className={cn(stepIndicatorStyles({ type: _type, selected: !!_selected, size }), className)}
|
|
307
|
-
{...props}
|
|
308
|
-
>
|
|
309
|
-
{content}
|
|
310
|
-
{showBadge && (
|
|
311
|
-
<span
|
|
312
|
-
className={cn(
|
|
313
|
-
stepIndicatorBadgeStyles({
|
|
314
|
-
type: _type as "success" | "negative",
|
|
315
|
-
size,
|
|
316
|
-
}),
|
|
317
|
-
)}
|
|
318
|
-
aria-hidden
|
|
319
|
-
>
|
|
320
|
-
{badgeIcon ?? defaultBadgeIcon}
|
|
321
|
-
</span>
|
|
322
|
-
)}
|
|
323
|
-
</div>
|
|
324
|
-
);
|
|
325
|
-
},
|
|
326
|
-
);
|
|
327
|
-
StepIndicator.displayName = "StepIndicator";
|
|
328
|
-
|
|
329
|
-
// ─── StepLabel ───────────────────────────────────────────────────────────────
|
|
330
|
-
|
|
331
|
-
const stepLabelStyles = cva(
|
|
332
|
-
[
|
|
333
|
-
// Figma caps the label and ellipsizes it, so a long step title clips inside the pill rather
|
|
334
|
-
// than stretching it. Callers that need more room pass their own `max-w`.
|
|
335
|
-
"max-w-[106px] truncate",
|
|
336
|
-
"transition-[padding,color] duration-200 ease-in-out",
|
|
337
|
-
// At rest the label sits 6px from the circle. On hover (parent pill
|
|
338
|
-
// hovered) the gap grows to 9px — matches figma onHover/onSelect-Hoverd.
|
|
339
|
-
// The outer edge keeps a constant 12px.
|
|
340
|
-
"ltr:pl-[6px] ltr:pr-[12px] rtl:pr-[6px] rtl:pl-[12px]",
|
|
341
|
-
"group-hover/step:ltr:pl-[9px] group-hover/step:rtl:pr-[9px]",
|
|
342
|
-
],
|
|
343
|
-
{
|
|
344
|
-
variants: {
|
|
345
|
-
size: {
|
|
346
|
-
S: "typography-body-small-medium",
|
|
347
|
-
M: "typography-body-small-medium",
|
|
348
|
-
L: "typography-body-medium-medium",
|
|
349
|
-
},
|
|
350
|
-
selected: {
|
|
351
|
-
true: "text-content-presentation-global-primary-light",
|
|
352
|
-
false: "",
|
|
353
|
-
},
|
|
354
|
-
// Resting colour depends on the type, which is why this cannot be driven by `selected` alone:
|
|
355
|
-
// a default step reads de-emphasized until you hover it, while a success/negative step is
|
|
356
|
-
// already resolved and reads at full strength.
|
|
357
|
-
type: {
|
|
358
|
-
default: "",
|
|
359
|
-
success: "",
|
|
360
|
-
negative: "",
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
defaultVariants: {
|
|
364
|
-
selected: false,
|
|
365
|
-
type: "default",
|
|
366
|
-
size: "M",
|
|
367
|
-
},
|
|
368
|
-
compoundVariants: [
|
|
369
|
-
{
|
|
370
|
-
selected: false,
|
|
371
|
-
type: "default",
|
|
372
|
-
className: [
|
|
373
|
-
"text-content-presentation-global-secondary",
|
|
374
|
-
"group-hover/step:text-content-presentation-global-primary",
|
|
375
|
-
],
|
|
376
|
-
},
|
|
377
|
-
{
|
|
378
|
-
selected: false,
|
|
379
|
-
type: "success",
|
|
380
|
-
className: "text-content-presentation-global-primary",
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
selected: false,
|
|
384
|
-
type: "negative",
|
|
385
|
-
className: "text-content-presentation-global-primary",
|
|
386
|
-
},
|
|
387
|
-
],
|
|
388
|
-
},
|
|
389
|
-
);
|
|
390
|
-
|
|
391
|
-
interface StepLabelProps extends HTMLAttributes<HTMLDivElement> {
|
|
392
|
-
_selected?: boolean;
|
|
393
|
-
_type?: StepperType;
|
|
394
|
-
_index?: number;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
const StepLabel = forwardRef<HTMLDivElement, StepLabelProps>(
|
|
398
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- excluded from {...props} spread
|
|
399
|
-
({ className, _selected, _type = "default", _index: _i, ...props }, ref) => {
|
|
400
|
-
const { size } = useStepperContext();
|
|
401
|
-
return (
|
|
402
|
-
<div
|
|
403
|
-
ref={ref}
|
|
404
|
-
className={cn(stepLabelStyles({ selected: !!_selected, type: _type, size }), className)}
|
|
405
|
-
{...props}
|
|
406
|
-
/>
|
|
407
|
-
);
|
|
408
|
-
},
|
|
409
|
-
);
|
|
410
|
-
StepLabel.displayName = "StepLabel";
|
|
411
|
-
|
|
412
|
-
// ─── StepConnector (the bar between steps) ───────────────────────────────────
|
|
413
|
-
|
|
414
|
-
const stepConnectorStyles = cva(
|
|
415
|
-
["shrink-0 rounded-full transition-colors duration-200 ease-in-out"],
|
|
416
|
-
{
|
|
417
|
-
variants: {
|
|
418
|
-
orientation: {
|
|
419
|
-
horizontal: "h-[3px] w-[16px] self-center",
|
|
420
|
-
vertical: "w-[3px] h-[16px] mt-[2px]",
|
|
421
|
-
},
|
|
422
|
-
size: {
|
|
423
|
-
S: "",
|
|
424
|
-
M: "",
|
|
425
|
-
L: "",
|
|
426
|
-
},
|
|
427
|
-
completed: {
|
|
428
|
-
true: "bg-border-presentation-state-focus",
|
|
429
|
-
false: "bg-border-presentation-stepper-default",
|
|
430
|
-
},
|
|
431
|
-
},
|
|
432
|
-
defaultVariants: {
|
|
433
|
-
orientation: "horizontal",
|
|
434
|
-
size: "M",
|
|
435
|
-
completed: false,
|
|
436
|
-
},
|
|
437
|
-
compoundVariants: [
|
|
438
|
-
// Vertical: centre the bar under the indicator — the pill's 2px padding, plus half the
|
|
439
|
-
// indicator, minus half the bar. Which is why the inset tracks the size.
|
|
440
|
-
{ orientation: "vertical", size: "S", className: "ms-[10.5px]" },
|
|
441
|
-
{ orientation: "vertical", size: "M", className: "ms-[12.5px]" },
|
|
442
|
-
{ orientation: "vertical", size: "L", className: "ms-[15.5px]" },
|
|
443
|
-
],
|
|
444
|
-
},
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
interface StepConnectorProps extends HTMLAttributes<HTMLDivElement> {
|
|
448
|
-
/** Draws the bar in the focus colour, for the run of steps already passed. */
|
|
449
|
-
completed?: boolean;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
const StepConnector = forwardRef<HTMLDivElement, StepConnectorProps>(
|
|
453
|
-
({ className, completed = false, ...props }, ref) => {
|
|
454
|
-
const { orientation, size } = useStepperContext();
|
|
455
|
-
return (
|
|
456
|
-
<div
|
|
457
|
-
ref={ref}
|
|
458
|
-
aria-hidden
|
|
459
|
-
className={cn(stepConnectorStyles({ orientation, size, completed }), className)}
|
|
460
|
-
{...props}
|
|
461
|
-
/>
|
|
462
|
-
);
|
|
463
|
-
},
|
|
464
|
-
);
|
|
465
|
-
StepConnector.displayName = "StepConnector";
|
|
466
|
-
|
|
467
|
-
// ─── Exports ─────────────────────────────────────────────────────────────────
|
|
468
|
-
|
|
469
|
-
export {
|
|
470
|
-
Stepper,
|
|
471
|
-
Step,
|
|
472
|
-
StepIndicator,
|
|
473
|
-
StepLabel,
|
|
474
|
-
StepConnector,
|
|
475
|
-
stepperStyles,
|
|
476
|
-
stepStyles,
|
|
477
|
-
stepIndicatorStyles,
|
|
478
|
-
stepLabelStyles,
|
|
479
|
-
stepConnectorStyles,
|
|
480
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { cn } from "../utils/cn";
|
|
3
|
-
import * as SwitchPrimitives from "@radix-ui/react-switch";
|
|
4
|
-
import React from "react";
|
|
5
|
-
|
|
6
|
-
const Switch = React.forwardRef<
|
|
7
|
-
React.ElementRef<typeof SwitchPrimitives.Root>,
|
|
8
|
-
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
|
|
9
|
-
>(({ className, ...props }, ref) => (
|
|
10
|
-
<SwitchPrimitives.Root
|
|
11
|
-
className={cn(
|
|
12
|
-
"peer inline-flex w-[48px] h-[27px] shrink-0 cursor-pointer items-center rounded-[20px] border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-background-presentation-switcher-active data-[state=unchecked]:bg-background-presentation-switcher-disabled",
|
|
13
|
-
className,
|
|
14
|
-
)}
|
|
15
|
-
{...props}
|
|
16
|
-
ref={ref}
|
|
17
|
-
>
|
|
18
|
-
<SwitchPrimitives.Thumb
|
|
19
|
-
className={cn(
|
|
20
|
-
"pointer-events-none block w-[24px] h-[24px] rounded-full bg-background-presentation-switcher-knob shadow-lg ring-0 transition-transform",
|
|
21
|
-
"data-[state=checked]:translate-x-[21px] data-[state=unchecked]:translate-x-0",
|
|
22
|
-
"rtl:data-[state=checked]:-translate-x-[21px] rtl:data-[state=unchecked]:translate-x-0",
|
|
23
|
-
)}
|
|
24
|
-
/>
|
|
25
|
-
</SwitchPrimitives.Root>
|
|
26
|
-
));
|
|
27
|
-
Switch.displayName = SwitchPrimitives.Root.displayName;
|
|
28
|
-
|
|
29
|
-
export { Switch };
|
|
30
|
-
|
|
31
|
-
/* interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
32
|
-
active: boolean;
|
|
33
|
-
activeLabel?: string;
|
|
34
|
-
disabledLabel?: string;
|
|
35
|
-
theme?: "dark" | "light" | "default";
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function Switchers({
|
|
39
|
-
active,
|
|
40
|
-
activeLabel,
|
|
41
|
-
disabledLabel,
|
|
42
|
-
theme,
|
|
43
|
-
className,
|
|
44
|
-
...props
|
|
45
|
-
}: Props) {
|
|
46
|
-
return (
|
|
47
|
-
<section data-theme={theme} className={cn("flex justify-center items-center w-fit h-[28px] gap-[6px] overflow-hidden", className)}>
|
|
48
|
-
<button
|
|
49
|
-
{...props}
|
|
50
|
-
className={cn(
|
|
51
|
-
"flex p-[2px] items-center w-[48px] h-[28px] rounded-full bg-background-presentation-switcher-disabled relative transition-all duration-200 overflow-hidden",
|
|
52
|
-
{
|
|
53
|
-
"bg-background-presentation-switcher-active": active,
|
|
54
|
-
}
|
|
55
|
-
)}
|
|
56
|
-
>
|
|
57
|
-
<div
|
|
58
|
-
className={cn(
|
|
59
|
-
"absolute start-[2px] w-[24px] h-[24px] rounded-full bg-background-presentation-switcher-knob shadow-[0px_0px_0px_1px_rgba(0,0,0,0.04),0px_3px_8px_0px_rgba(0,0,0,0.15),0px_3px_1px_0px_rgba(0,0,0,0.06)] transition-all duration-200",
|
|
60
|
-
{
|
|
61
|
-
"start-[22px]": active,
|
|
62
|
-
}
|
|
63
|
-
)}
|
|
64
|
-
/>
|
|
65
|
-
</button>
|
|
66
|
-
|
|
67
|
-
{activeLabel && (
|
|
68
|
-
<section
|
|
69
|
-
className={cn(
|
|
70
|
-
"flex justify-center items-start flex-col gap-[10px] translate-y-[-15px] transition-all duration-300 ease-in-out",
|
|
71
|
-
{
|
|
72
|
-
"translate-y-[15px]": active,
|
|
73
|
-
}
|
|
74
|
-
)}
|
|
75
|
-
>
|
|
76
|
-
<Label className="h-[20px]" size="M" label={activeLabel} />
|
|
77
|
-
<Label className="h-[20px]" size="M" label={disabledLabel} />
|
|
78
|
-
</section>
|
|
79
|
-
)}
|
|
80
|
-
</section>
|
|
81
|
-
);
|
|
82
|
-
} */
|