@mks2508/mks-ui 0.5.7 → 0.5.8
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/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +2 -0
- package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +173 -43
- package/dist/react-ui/ui/DynamicToggle/{DynamicToggle-DOR3Ld-k.css → DynamicToggle-DJLwEkHr.css} +12 -19
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +12 -20
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -0
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +7 -1
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +55 -31
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/index.d.ts +9 -3
- package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
- package/dist/react-ui/ui/DynamicToggle/index.js +47 -34
- package/package.json +52 -13
- package/src/assets/react.svg +0 -1
- package/src/core/index.ts +0 -7
- package/src/core/types.ts +0 -82
- package/src/css.d.ts +0 -7
- package/src/index.css +0 -129
- package/src/index.ts +0 -29
- package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +0 -278
- package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +0 -97
- package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +0 -155
- package/src/react-ui/blocks/Terminal/Terminal.theme.ts +0 -80
- package/src/react-ui/blocks/Terminal/Terminal.types.ts +0 -438
- package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +0 -38
- package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +0 -254
- package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +0 -73
- package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +0 -269
- package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +0 -326
- package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +0 -230
- package/src/react-ui/blocks/Terminal/XTermAdapter.ts +0 -163
- package/src/react-ui/blocks/Terminal/chrome.ts +0 -25
- package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +0 -316
- package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +0 -218
- package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +0 -386
- package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +0 -67
- package/src/react-ui/blocks/Terminal/components/index.ts +0 -10
- package/src/react-ui/blocks/Terminal/display.ts +0 -46
- package/src/react-ui/blocks/Terminal/hooks/index.ts +0 -22
- package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +0 -229
- package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +0 -292
- package/src/react-ui/blocks/Terminal/index.ts +0 -111
- package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +0 -330
- package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +0 -242
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +0 -202
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +0 -140
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +0 -68
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +0 -85
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +0 -383
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +0 -439
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +0 -550
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +0 -259
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +0 -75
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +0 -266
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +0 -82
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +0 -112
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +0 -178
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +0 -203
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +0 -252
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +0 -334
- package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +0 -261
- package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +0 -248
- package/src/react-ui/blocks/Terminal/panel/index.ts +0 -72
- package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +0 -59
- package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +0 -59
- package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +0 -180
- package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +0 -248
- package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +0 -283
- package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +0 -686
- package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +0 -466
- package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +0 -343
- package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +0 -167
- package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +0 -348
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +0 -251
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +0 -390
- package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +0 -320
- package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +0 -20
- package/src/react-ui/blocks/Terminal/parsing/index.ts +0 -69
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +0 -68
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +0 -436
- package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +0 -14
- package/src/react-ui/blocks/index.ts +0 -11
- package/src/react-ui/components/MorphingPopover/MorphingPopover.types.ts +0 -49
- package/src/react-ui/components/MorphingPopover/index.tsx +0 -186
- package/src/react-ui/components/MorphingPopover/morphing-popover.module.css +0 -153
- package/src/react-ui/components/index.ts +0 -9
- package/src/react-ui/hooks/Animation/UseAutoHeight.tsx +0 -123
- package/src/react-ui/hooks/DOM/UseIsInView.tsx +0 -44
- package/src/react-ui/hooks/Formatting/UseListFormat.ts +0 -134
- package/src/react-ui/hooks/State/UseControlledState.tsx +0 -57
- package/src/react-ui/hooks/State/UseDataState.tsx +0 -76
- package/src/react-ui/hooks/index.ts +0 -20
- package/src/react-ui/icons/index.ts +0 -12
- package/src/react-ui/icons/lucide-animated/activity.tsx +0 -109
- package/src/react-ui/icons/lucide-animated/arrow-down-to-line.tsx +0 -51
- package/src/react-ui/icons/lucide-animated/arrow-up.tsx +0 -50
- package/src/react-ui/icons/lucide-animated/bell-electric.tsx +0 -124
- package/src/react-ui/icons/lucide-animated/bell.tsx +0 -93
- package/src/react-ui/icons/lucide-animated/bot.tsx +0 -122
- package/src/react-ui/icons/lucide-animated/box.tsx +0 -117
- package/src/react-ui/icons/lucide-animated/check.tsx +0 -21
- package/src/react-ui/icons/lucide-animated/circle-check.tsx +0 -107
- package/src/react-ui/icons/lucide-animated/delete.tsx +0 -133
- package/src/react-ui/icons/lucide-animated/download.tsx +0 -99
- package/src/react-ui/icons/lucide-animated/edit-2.tsx +0 -21
- package/src/react-ui/icons/lucide-animated/globe.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/home.tsx +0 -103
- package/src/react-ui/icons/lucide-animated/index.ts +0 -38
- package/src/react-ui/icons/lucide-animated/layers.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +0 -143
- package/src/react-ui/icons/lucide-animated/list.tsx +0 -54
- package/src/react-ui/icons/lucide-animated/package.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/palette.tsx +0 -25
- package/src/react-ui/icons/lucide-animated/plus.tsx +0 -92
- package/src/react-ui/icons/lucide-animated/refresh-cw.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/rocket.tsx +0 -24
- package/src/react-ui/icons/lucide-animated/save.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/search.tsx +0 -94
- package/src/react-ui/icons/lucide-animated/settings.tsx +0 -92
- package/src/react-ui/icons/lucide-animated/terminal.tsx +0 -46
- package/src/react-ui/icons/lucide-animated/trash-2.tsx +0 -25
- package/src/react-ui/icons/lucide-animated/trending-down.tsx +0 -151
- package/src/react-ui/icons/lucide-animated/trending-up.tsx +0 -150
- package/src/react-ui/icons/lucide-animated/type.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/upload.tsx +0 -23
- package/src/react-ui/icons/lucide-animated/x.tsx +0 -102
- package/src/react-ui/index.ts +0 -30
- package/src/react-ui/lib/get-strict-context.tsx +0 -56
- package/src/react-ui/lib/icon-wrapper.tsx +0 -70
- package/src/react-ui/lib/index.ts +0 -9
- package/src/react-ui/lib/utils.ts +0 -24
- package/src/react-ui/primitives/AutoHeight/index.tsx +0 -74
- package/src/react-ui/primitives/CountingNumber/index.tsx +0 -147
- package/src/react-ui/primitives/Highlight/Highlight.types.ts +0 -136
- package/src/react-ui/primitives/Highlight/index.tsx +0 -577
- package/src/react-ui/primitives/Slot/index.tsx +0 -128
- package/src/react-ui/primitives/index.ts +0 -16
- package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +0 -141
- package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +0 -217
- package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +0 -77
- package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +0 -58
- package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +0 -253
- package/src/react-ui/primitives/waapi/Gooey/index.ts +0 -50
- package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +0 -48
- package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +0 -106
- package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +0 -21
- package/src/react-ui/primitives/waapi/Morph/index.tsx +0 -56
- package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +0 -12
- package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +0 -89
- package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +0 -176
- package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +0 -87
- package/src/react-ui/primitives/waapi/Morph/useMorph.ts +0 -101
- package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +0 -177
- package/src/react-ui/primitives/waapi/Reorder/index.tsx +0 -260
- package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +0 -47
- package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +0 -209
- package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +0 -104
- package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +0 -14
- package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +0 -84
- package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +0 -474
- package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +0 -32
- package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +0 -69
- package/src/react-ui/primitives/waapi/SlidingText/index.tsx +0 -140
- package/src/react-ui/primitives/waapi/core/animationConstants.ts +0 -215
- package/src/react-ui/primitives/waapi/core/index.ts +0 -53
- package/src/react-ui/primitives/waapi/core/types.ts +0 -200
- package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +0 -430
- package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +0 -81
- package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +0 -138
- package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +0 -106
- package/src/react-ui/primitives/waapi/index.ts +0 -139
- package/src/react-ui/styles/animations.css +0 -369
- package/src/react-ui/ui/Accordion/Accordion.styles.ts +0 -72
- package/src/react-ui/ui/Accordion/Accordion.types.ts +0 -199
- package/src/react-ui/ui/Accordion/index.tsx +0 -362
- package/src/react-ui/ui/AlertDialog/AlertDialog.styles.ts +0 -38
- package/src/react-ui/ui/AlertDialog/AlertDialog.types.ts +0 -296
- package/src/react-ui/ui/AlertDialog/index.tsx +0 -540
- package/src/react-ui/ui/Badge/Badge.styles.ts +0 -43
- package/src/react-ui/ui/Badge/Badge.types.ts +0 -26
- package/src/react-ui/ui/Badge/index.tsx +0 -34
- package/src/react-ui/ui/Button/Button.styles.ts +0 -57
- package/src/react-ui/ui/Button/Button.types.ts +0 -63
- package/src/react-ui/ui/Button/index.tsx +0 -155
- package/src/react-ui/ui/Card/Card.styles.ts +0 -32
- package/src/react-ui/ui/Card/Card.types.ts +0 -39
- package/src/react-ui/ui/Card/index.tsx +0 -130
- package/src/react-ui/ui/Checkbox/Checkbox.styles.ts +0 -40
- package/src/react-ui/ui/Checkbox/Checkbox.types.ts +0 -98
- package/src/react-ui/ui/Checkbox/index.tsx +0 -233
- package/src/react-ui/ui/Combobox/Combobox.styles.ts +0 -34
- package/src/react-ui/ui/Combobox/Combobox.types.ts +0 -89
- package/src/react-ui/ui/Combobox/index.tsx +0 -331
- package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +0 -38
- package/src/react-ui/ui/CornerBracket/CornerBracket.types.ts +0 -15
- package/src/react-ui/ui/CornerBracket/index.tsx +0 -49
- package/src/react-ui/ui/DataCard/DataCard.styles.ts +0 -94
- package/src/react-ui/ui/DataCard/DataCard.types.ts +0 -125
- package/src/react-ui/ui/DataCard/index.tsx +0 -340
- package/src/react-ui/ui/Dialog/Dialog.styles.ts +0 -59
- package/src/react-ui/ui/Dialog/Dialog.types.ts +0 -284
- package/src/react-ui/ui/Dialog/index.tsx +0 -452
- package/src/react-ui/ui/DropdownMenu/DropdownMenu.styles.ts +0 -35
- package/src/react-ui/ui/DropdownMenu/DropdownMenu.types.ts +0 -81
- package/src/react-ui/ui/DropdownMenu/index.tsx +0 -300
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +0 -376
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +0 -85
- package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +0 -180
- package/src/react-ui/ui/DynamicToggle/index.tsx +0 -316
- package/src/react-ui/ui/DynamicToggle/prototype-v7-ios.html +0 -413
- package/src/react-ui/ui/DynamicToggle/prototype-v7.html +0 -615
- package/src/react-ui/ui/DynamicToggle/prototype-v8-gooey-safari.html +0 -560
- package/src/react-ui/ui/DynamicToggle/prototype-v8b-react-structure.html +0 -227
- package/src/react-ui/ui/DynamicToggle/prototype.html +0 -419
- package/src/react-ui/ui/Field/Field.styles.ts +0 -47
- package/src/react-ui/ui/Field/Field.types.ts +0 -60
- package/src/react-ui/ui/Field/index.tsx +0 -254
- package/src/react-ui/ui/Input/Input.styles.ts +0 -11
- package/src/react-ui/ui/Input/Input.types.ts +0 -10
- package/src/react-ui/ui/Input/index.tsx +0 -32
- package/src/react-ui/ui/InputGroup/InputGroup.styles.ts +0 -53
- package/src/react-ui/ui/InputGroup/InputGroup.types.ts +0 -44
- package/src/react-ui/ui/InputGroup/index.tsx +0 -149
- package/src/react-ui/ui/Label/Label.styles.ts +0 -10
- package/src/react-ui/ui/Label/Label.types.ts +0 -9
- package/src/react-ui/ui/Label/index.tsx +0 -27
- package/src/react-ui/ui/Menu/Menu.styles.ts +0 -71
- package/src/react-ui/ui/Menu/Menu.types.ts +0 -425
- package/src/react-ui/ui/Menu/index.tsx +0 -900
- package/src/react-ui/ui/Popover/Popover.styles.ts +0 -55
- package/src/react-ui/ui/Popover/Popover.types.ts +0 -261
- package/src/react-ui/ui/Popover/index.tsx +0 -422
- package/src/react-ui/ui/Progress/Progress.styles.ts +0 -36
- package/src/react-ui/ui/Progress/Progress.types.ts +0 -162
- package/src/react-ui/ui/Progress/index.tsx +0 -254
- package/src/react-ui/ui/Select/Select.styles.ts +0 -30
- package/src/react-ui/ui/Select/Select.types.ts +0 -51
- package/src/react-ui/ui/Select/index.tsx +0 -225
- package/src/react-ui/ui/Separator/Separator.styles.ts +0 -10
- package/src/react-ui/ui/Separator/Separator.types.ts +0 -10
- package/src/react-ui/ui/Separator/index.tsx +0 -37
- package/src/react-ui/ui/Switch/Switch.styles.ts +0 -50
- package/src/react-ui/ui/Switch/Switch.types.ts +0 -155
- package/src/react-ui/ui/Switch/index.tsx +0 -253
- package/src/react-ui/ui/Tabs/Tabs.css +0 -39
- package/src/react-ui/ui/Tabs/Tabs.styles.ts +0 -148
- package/src/react-ui/ui/Tabs/Tabs.types.ts +0 -255
- package/src/react-ui/ui/Tabs/index.tsx +0 -529
- package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +0 -36
- package/src/react-ui/ui/TextFlow/TextFlow.types.ts +0 -118
- package/src/react-ui/ui/TextFlow/index.tsx +0 -276
- package/src/react-ui/ui/Textarea/Textarea.styles.ts +0 -10
- package/src/react-ui/ui/Textarea/Textarea.types.ts +0 -9
- package/src/react-ui/ui/Textarea/index.tsx +0 -27
- package/src/react-ui/ui/Tooltip/Tooltip.styles.ts +0 -43
- package/src/react-ui/ui/Tooltip/Tooltip.types.ts +0 -253
- package/src/react-ui/ui/Tooltip/index.tsx +0 -394
- package/src/react-ui/ui/index.ts +0 -41
- package/src/types/css-modules.d.ts +0 -18
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DynamicToggle style slots + CVA variants.
|
|
3
|
-
*
|
|
4
|
-
* Layout via Tailwind. State animations via CSS file (`:has()`, `clip-path`).
|
|
5
|
-
* Shape propagated to indicators via `--dt-radius` CSS variable.
|
|
6
|
-
*
|
|
7
|
-
* @module @mks2508/mks-ui/react/ui/DynamicToggle
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { cva, type VariantProps } from 'class-variance-authority';
|
|
11
|
-
import type { StyleSlots } from '@/core/types';
|
|
12
|
-
|
|
13
|
-
/** Slot names for DynamicToggle */
|
|
14
|
-
export type DynamicToggleSlot =
|
|
15
|
-
| 'root'
|
|
16
|
-
| 'track'
|
|
17
|
-
| 'option'
|
|
18
|
-
| 'indicator'
|
|
19
|
-
| 'group'
|
|
20
|
-
| 'groupIndicator'
|
|
21
|
-
| 'groupLabel';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Default styles for each DynamicToggle slot.
|
|
25
|
-
*
|
|
26
|
-
* Width is set by size variants — required because indicator uses `width: 50%`
|
|
27
|
-
* and clip-path uses container query units. Override: `slots={{ root: 'w-80' }}`.
|
|
28
|
-
*/
|
|
29
|
-
export const dynamicToggleStyles: StyleSlots<DynamicToggleSlot> = {
|
|
30
|
-
root: 'relative border p-[2px] select-none',
|
|
31
|
-
track: 'relative grid grid-cols-[repeat(4,1fr)] place-items-center w-full h-full',
|
|
32
|
-
option: 'inline-grid place-items-center cursor-pointer font-medium z-[2] h-full w-full whitespace-nowrap',
|
|
33
|
-
indicator: 'absolute w-1/2 left-0 top-0 bottom-0 bg-accent rounded-[var(--dt-radius,9999px)] pointer-events-none z-0',
|
|
34
|
-
group: 'col-span-2 relative w-full h-full grid grid-cols-2',
|
|
35
|
-
groupIndicator: 'absolute left-1/2 top-0 bottom-0 w-1/2 bg-accent rounded-[var(--dt-radius,9999px)] pointer-events-none z-0',
|
|
36
|
-
groupLabel: [
|
|
37
|
-
'absolute',
|
|
38
|
-
'flex items-center justify-center',
|
|
39
|
-
'text-muted-foreground font-medium whitespace-nowrap',
|
|
40
|
-
'pointer-events-none',
|
|
41
|
-
].join(' '),
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* CVA variants for DynamicToggle root.
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```tsx
|
|
49
|
-
* <DynamicToggle size="sm" variant="outline" shape="rounded">
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export const dynamicToggleVariants = cva(dynamicToggleStyles.root, {
|
|
53
|
-
variants: {
|
|
54
|
-
/** Visual variant — background and border */
|
|
55
|
-
variant: {
|
|
56
|
-
default: 'bg-card border-border shadow-sm',
|
|
57
|
-
ghost: 'bg-transparent border-transparent',
|
|
58
|
-
muted: 'bg-muted border-muted',
|
|
59
|
-
outline: 'bg-transparent border-border',
|
|
60
|
-
},
|
|
61
|
-
/**
|
|
62
|
-
* Size — height, width, and font size.
|
|
63
|
-
* Width is required for the 50% indicator and cqh clip-path.
|
|
64
|
-
*/
|
|
65
|
-
size: {
|
|
66
|
-
sm: 'h-[30px] w-[210px] text-[10px] [--dt-h:30px]',
|
|
67
|
-
default: 'h-[38px] w-[260px] text-xs [--dt-h:38px]',
|
|
68
|
-
lg: 'h-[44px] w-80 text-sm [--dt-h:44px]',
|
|
69
|
-
},
|
|
70
|
-
/** Shape — border radius propagated to indicators via --dt-radius */
|
|
71
|
-
shape: {
|
|
72
|
-
pill: 'rounded-full [--dt-radius:9999px]',
|
|
73
|
-
rounded: 'rounded-xl [--dt-radius:0.75rem]',
|
|
74
|
-
square: 'rounded-md [--dt-radius:0.375rem]',
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
defaultVariants: {
|
|
78
|
-
variant: 'default',
|
|
79
|
-
size: 'default',
|
|
80
|
-
shape: 'pill',
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
/** Variant props extracted from CVA */
|
|
85
|
-
export type DynamicToggleVariantProps = VariantProps<typeof dynamicToggleVariants>;
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DynamicToggle type definitions.
|
|
3
|
-
*
|
|
4
|
-
* CSS-animated toggle where one option expands into sub-options.
|
|
5
|
-
* Uses hidden radios + `:has(:checked)` for zero-JS animation.
|
|
6
|
-
* Optional gooey morph via `GooeyCanvas` or `MorphPath` primitives.
|
|
7
|
-
*
|
|
8
|
-
* @module @mks2508/mks-ui/react/ui/DynamicToggle
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { SlotOverrides, IBaseConfig } from '@/core/types';
|
|
12
|
-
import type { DynamicToggleSlot, DynamicToggleVariantProps } from './DynamicToggle.styles';
|
|
13
|
-
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
// Shared types
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
|
|
18
|
-
/** How the group appears when collapsed (standalone option active). */
|
|
19
|
-
export type DynamicToggleCollapsedMode = 'title' | 'opts' | 'title-opts';
|
|
20
|
-
|
|
21
|
-
/** Morph technique for the pill↔groupLabel junction. */
|
|
22
|
-
export type DynamicToggleMorphMode = 'none' | 'filter' | 'path';
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// Config
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Configuration for DynamicToggle animation behavior.
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```tsx
|
|
33
|
-
* <DynamicToggle config={{ morphMode: 'filter', duration: 0.3 }}>
|
|
34
|
-
* ...
|
|
35
|
-
* </DynamicToggle>
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export interface IDynamicToggleConfig extends IBaseConfig {
|
|
39
|
-
/** CSS transition duration in seconds (default: 0.22) */
|
|
40
|
-
duration?: number;
|
|
41
|
-
/** Label animation style (default: 'morph') */
|
|
42
|
-
labelAnimation?: 'morph' | 'float' | 'none';
|
|
43
|
-
/** Gooey morph mode for the pill↔groupLabel junction (default: 'none') */
|
|
44
|
-
morphMode?: DynamicToggleMorphMode;
|
|
45
|
-
/** Indicator slide duration in seconds (default: 0.3) */
|
|
46
|
-
indicatorDuration?: number;
|
|
47
|
-
/** Indicator slide easing (default: material standard cubic-bezier) */
|
|
48
|
-
indicatorEasing?: string;
|
|
49
|
-
/** Force translate-based indicator instead of CSS Anchor (debug/compat) */
|
|
50
|
-
forceTranslateIndicator?: boolean;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Context
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Context shared between DynamicToggle root and its children.
|
|
59
|
-
*/
|
|
60
|
-
export type DynamicToggleContextType = {
|
|
61
|
-
/** Current selected value */
|
|
62
|
-
value: string;
|
|
63
|
-
/** Update selected value */
|
|
64
|
-
setValue: (value: string) => void;
|
|
65
|
-
/** Auto-generated radio group name */
|
|
66
|
-
groupName: string;
|
|
67
|
-
/** Whether a group child is active */
|
|
68
|
-
groupActive: boolean;
|
|
69
|
-
/** Whether the toggle is disabled */
|
|
70
|
-
disabled: boolean;
|
|
71
|
-
/** Register group info (called by DynamicToggleGroup on mount) */
|
|
72
|
-
registerGroup: (
|
|
73
|
-
label: string,
|
|
74
|
-
values: string[],
|
|
75
|
-
position: 'top' | 'bottom' | 'hidden',
|
|
76
|
-
collapsedMode: DynamicToggleCollapsedMode,
|
|
77
|
-
) => void;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
// Root
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Props for the DynamicToggle root container.
|
|
86
|
-
*
|
|
87
|
-
* Supports exactly one `DynamicToggleOption` + one `DynamicToggleGroup`.
|
|
88
|
-
* The group expands into sub-options when one of its children is active.
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```tsx
|
|
92
|
-
* <DynamicToggle
|
|
93
|
-
* value="tree" onValueChange={setVal}
|
|
94
|
-
* size="sm" config={{ morphMode: 'filter' }}
|
|
95
|
-
* >
|
|
96
|
-
* <DynamicToggleOption value="tree">Tree</DynamicToggleOption>
|
|
97
|
-
* <DynamicToggleGroup label="Changes" collapsedMode="title">
|
|
98
|
-
* <DynamicToggleOption value="flat">Flat</DynamicToggleOption>
|
|
99
|
-
* <DynamicToggleOption value="grouped">Grouped</DynamicToggleOption>
|
|
100
|
-
* </DynamicToggleGroup>
|
|
101
|
-
* </DynamicToggle>
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
export interface IDynamicToggleProps extends DynamicToggleVariantProps {
|
|
105
|
-
/** Controlled value */
|
|
106
|
-
value?: string;
|
|
107
|
-
/** Uncontrolled default value */
|
|
108
|
-
defaultValue?: string;
|
|
109
|
-
/** Change callback */
|
|
110
|
-
onValueChange?: (value: string) => void;
|
|
111
|
-
/** Disable the entire toggle */
|
|
112
|
-
disabled?: boolean;
|
|
113
|
-
/** Slot class overrides */
|
|
114
|
-
slots?: SlotOverrides<DynamicToggleSlot>;
|
|
115
|
-
/** Animation/behavior configuration */
|
|
116
|
-
config?: IDynamicToggleConfig;
|
|
117
|
-
/** Accessible label for the radio group */
|
|
118
|
-
'aria-label'?: string;
|
|
119
|
-
/** Additional class for the root */
|
|
120
|
-
className?: string;
|
|
121
|
-
/** DynamicToggleOption and DynamicToggleGroup children */
|
|
122
|
-
children: React.ReactNode;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ---------------------------------------------------------------------------
|
|
126
|
-
// Option
|
|
127
|
-
// ---------------------------------------------------------------------------
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Props for a single toggle option (top-level or inside a group).
|
|
131
|
-
*
|
|
132
|
-
* @example
|
|
133
|
-
* ```tsx
|
|
134
|
-
* <DynamicToggleOption value="tree">Tree</DynamicToggleOption>
|
|
135
|
-
* ```
|
|
136
|
-
*/
|
|
137
|
-
export interface IDynamicToggleOptionProps {
|
|
138
|
-
/** Value this option represents */
|
|
139
|
-
value: string;
|
|
140
|
-
/** Label content */
|
|
141
|
-
children: React.ReactNode;
|
|
142
|
-
/** Additional class */
|
|
143
|
-
className?: string;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
|
-
// Group
|
|
148
|
-
// ---------------------------------------------------------------------------
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Props for an expandable group of options.
|
|
152
|
-
*
|
|
153
|
-
* When none of the group's options are active, shows collapsed content
|
|
154
|
-
* based on `collapsedMode`:
|
|
155
|
-
* - `'title'` — only the group label
|
|
156
|
-
* - `'opts'` — only the combined sub-option text ("Solo · Team")
|
|
157
|
-
* - `'title-opts'` — WIP: currently falls back to 'title' behavior
|
|
158
|
-
*
|
|
159
|
-
* When one is active, expands with a clip-path reveal animation.
|
|
160
|
-
*
|
|
161
|
-
* @example
|
|
162
|
-
* ```tsx
|
|
163
|
-
* <DynamicToggleGroup label="Premium" collapsedMode="title">
|
|
164
|
-
* <DynamicToggleOption value="solo">Solo</DynamicToggleOption>
|
|
165
|
-
* <DynamicToggleOption value="team">Team</DynamicToggleOption>
|
|
166
|
-
* </DynamicToggleGroup>
|
|
167
|
-
* ```
|
|
168
|
-
*/
|
|
169
|
-
export interface IDynamicToggleGroupProps {
|
|
170
|
-
/** Label shown as group title / group label text */
|
|
171
|
-
label: string;
|
|
172
|
-
/** Group label position relative to the pill (default: 'top') */
|
|
173
|
-
labelPosition?: 'top' | 'bottom' | 'hidden';
|
|
174
|
-
/** How the group appears when collapsed (default: 'title') */
|
|
175
|
-
collapsedMode?: DynamicToggleCollapsedMode;
|
|
176
|
-
/** Exactly 2 DynamicToggleOption children */
|
|
177
|
-
children: React.ReactNode;
|
|
178
|
-
/** Additional class */
|
|
179
|
-
className?: string;
|
|
180
|
-
}
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* DynamicToggle — CSS-animated toggle with expanding sub-options and group label.
|
|
5
|
-
*
|
|
6
|
-
* Pure CSS animation via `:has(:checked)` on hidden radio inputs.
|
|
7
|
-
* When the group is active, a group label grows out of the pill.
|
|
8
|
-
* Optional gooey morph via `config.morphMode` for organic junction.
|
|
9
|
-
*
|
|
10
|
-
* Supports exactly 1 `DynamicToggleOption` + 1 `DynamicToggleGroup` (with 2 sub-options).
|
|
11
|
-
*
|
|
12
|
-
* @module @mks2508/mks-ui/react/ui/DynamicToggle
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* <DynamicToggle value="tree" onValueChange={setVal} size="sm" shape="pill">
|
|
17
|
-
* <DynamicToggleOption value="tree">Tree</DynamicToggleOption>
|
|
18
|
-
* <DynamicToggleGroup label="Changes" collapsedMode="title" labelPosition="top">
|
|
19
|
-
* <DynamicToggleOption value="flat">Flat</DynamicToggleOption>
|
|
20
|
-
* <DynamicToggleOption value="grouped">Grouped</DynamicToggleOption>
|
|
21
|
-
* </DynamicToggleGroup>
|
|
22
|
-
* </DynamicToggle>
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import * as React from 'react';
|
|
27
|
-
import { useControlledState } from '@/react-ui/hooks/State/UseControlledState';
|
|
28
|
-
import { getStrictContext } from '@/react-ui/lib/get-strict-context';
|
|
29
|
-
import { cn } from '@/react-ui/lib/utils';
|
|
30
|
-
import { GooeyCanvas } from '@/react-ui/primitives/waapi/Gooey/GooeyCanvas';
|
|
31
|
-
import './DynamicToggle.css';
|
|
32
|
-
import { dynamicToggleStyles, dynamicToggleVariants } from './DynamicToggle.styles';
|
|
33
|
-
import type {
|
|
34
|
-
DynamicToggleContextType,
|
|
35
|
-
DynamicToggleCollapsedMode,
|
|
36
|
-
IDynamicToggleProps,
|
|
37
|
-
IDynamicToggleOptionProps,
|
|
38
|
-
IDynamicToggleGroupProps,
|
|
39
|
-
} from './DynamicToggle.types';
|
|
40
|
-
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
// Context
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
|
|
45
|
-
const [DynamicToggleProvider, useDynamicToggle] =
|
|
46
|
-
getStrictContext<DynamicToggleContextType>('DynamicToggleContext');
|
|
47
|
-
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// SSR-safe layout effect — useLayoutEffect on client, useEffect on server
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
const useIsomorphicLayoutEffect =
|
|
53
|
-
typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
54
|
-
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
// Size height map (for auto-blur calculation)
|
|
57
|
-
// ---------------------------------------------------------------------------
|
|
58
|
-
|
|
59
|
-
const SIZE_HEIGHT_PX: Record<string, number> = {
|
|
60
|
-
sm: 30,
|
|
61
|
-
default: 38,
|
|
62
|
-
lg: 44,
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const SIZE_WIDTH_PX: Record<string, number> = {
|
|
66
|
-
sm: 210,
|
|
67
|
-
default: 260,
|
|
68
|
-
lg: 320,
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const SHAPE_RADIUS: Record<string, number> = {
|
|
72
|
-
pill: 9999,
|
|
73
|
-
rounded: 12,
|
|
74
|
-
square: 6,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// DynamicToggle (Root)
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Root container — pill-shaped toggle with expanding sub-options and group label.
|
|
83
|
-
*/
|
|
84
|
-
function DynamicToggle({
|
|
85
|
-
variant,
|
|
86
|
-
size,
|
|
87
|
-
shape,
|
|
88
|
-
slots,
|
|
89
|
-
config,
|
|
90
|
-
disabled = false,
|
|
91
|
-
className,
|
|
92
|
-
children,
|
|
93
|
-
'aria-label': ariaLabel,
|
|
94
|
-
...props
|
|
95
|
-
}: IDynamicToggleProps) {
|
|
96
|
-
const [value, setValue] = useControlledState({
|
|
97
|
-
value: props.value,
|
|
98
|
-
defaultValue: props.defaultValue ?? '',
|
|
99
|
-
onChange: props.onValueChange,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const groupName = React.useId();
|
|
103
|
-
|
|
104
|
-
// Group info — registered by DynamicToggleGroup child via context + useLayoutEffect
|
|
105
|
-
const [groupLabel, setGroupLabel] = React.useState('');
|
|
106
|
-
const [groupValues, setGroupValues] = React.useState<string[]>([]);
|
|
107
|
-
const [groupPosition, setGroupPosition] = React.useState<'top' | 'bottom' | 'hidden'>('top');
|
|
108
|
-
const [groupCollapsedMode, setGroupCollapsedMode] = React.useState<DynamicToggleCollapsedMode>('title');
|
|
109
|
-
|
|
110
|
-
const registerGroup = React.useCallback(
|
|
111
|
-
(label: string, values: string[], position: 'top' | 'bottom' | 'hidden', collapsedMode: DynamicToggleCollapsedMode) => {
|
|
112
|
-
setGroupLabel(label);
|
|
113
|
-
setGroupValues(values);
|
|
114
|
-
setGroupPosition(position);
|
|
115
|
-
setGroupCollapsedMode(collapsedMode);
|
|
116
|
-
},
|
|
117
|
-
[],
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
const groupActive = groupValues.includes(value);
|
|
121
|
-
|
|
122
|
-
// Config
|
|
123
|
-
const morphMode = config?.morphMode ?? 'none';
|
|
124
|
-
const resolvedVariant = variant ?? 'default';
|
|
125
|
-
const effectiveMorphMode = (resolvedVariant === 'ghost' || resolvedVariant === 'outline') ? 'none' : morphMode;
|
|
126
|
-
const labelAnimation = config?.labelAnimation ?? 'morph';
|
|
127
|
-
const showGroupLabel = labelAnimation !== 'none' && groupPosition !== 'hidden' && groupLabel;
|
|
128
|
-
const heightPx = SIZE_HEIGHT_PX[size ?? 'default'] ?? 32;
|
|
129
|
-
|
|
130
|
-
const style = {
|
|
131
|
-
...(config?.duration && { '--dt-dur': `${config.duration}s` }),
|
|
132
|
-
...(config?.indicatorDuration && { '--dt-indicator-dur': `${config.indicatorDuration}s` }),
|
|
133
|
-
...(config?.indicatorEasing && { '--dt-indicator-ease': config.indicatorEasing }),
|
|
134
|
-
} as React.CSSProperties;
|
|
135
|
-
const hasStyle = Object.keys(style).length > 0;
|
|
136
|
-
|
|
137
|
-
// Group label element (shared between modes)
|
|
138
|
-
const groupLabelElement = showGroupLabel ? (
|
|
139
|
-
<div
|
|
140
|
-
data-slot="dt-group-label"
|
|
141
|
-
data-position={groupPosition}
|
|
142
|
-
className={cn(dynamicToggleStyles.groupLabel, slots?.groupLabel)}
|
|
143
|
-
>
|
|
144
|
-
<span>{groupLabel || '\u00A0'}</span>
|
|
145
|
-
</div>
|
|
146
|
-
) : null;
|
|
147
|
-
|
|
148
|
-
return (
|
|
149
|
-
<DynamicToggleProvider value={{ value, setValue, groupName, groupActive, disabled, registerGroup }}>
|
|
150
|
-
<div
|
|
151
|
-
data-slot="dt-root"
|
|
152
|
-
data-morph={effectiveMorphMode !== 'none' ? effectiveMorphMode : undefined}
|
|
153
|
-
data-indicator={config?.forceTranslateIndicator ? 'translate' : undefined}
|
|
154
|
-
data-group-active={groupActive || undefined}
|
|
155
|
-
data-disabled={disabled || undefined}
|
|
156
|
-
role="radiogroup"
|
|
157
|
-
aria-label={ariaLabel}
|
|
158
|
-
style={hasStyle ? style : undefined}
|
|
159
|
-
className={cn(dynamicToggleVariants({ variant, size, shape }), slots?.root, className)}
|
|
160
|
-
>
|
|
161
|
-
{/* Filter morph: GooeyCanvas with SVG rects (Safari-safe) */}
|
|
162
|
-
{effectiveMorphMode === 'filter' && (
|
|
163
|
-
<>
|
|
164
|
-
<GooeyCanvas
|
|
165
|
-
height={heightPx}
|
|
166
|
-
width={SIZE_WIDTH_PX[size ?? 'default'] ?? 260}
|
|
167
|
-
radius={SHAPE_RADIUS[shape ?? 'pill'] ?? 9999}
|
|
168
|
-
expanded={groupActive}
|
|
169
|
-
/>
|
|
170
|
-
{/* Group label text — outside the filtered canvas */}
|
|
171
|
-
{groupLabelElement}
|
|
172
|
-
</>
|
|
173
|
-
)}
|
|
174
|
-
|
|
175
|
-
{/* Path morph: group label rendered directly (no gooey filter) */}
|
|
176
|
-
{effectiveMorphMode === 'path' && groupLabelElement}
|
|
177
|
-
|
|
178
|
-
{/* Track — always rendered, z-indexed above gooey layer */}
|
|
179
|
-
<div
|
|
180
|
-
data-slot="dt-track"
|
|
181
|
-
className={cn(dynamicToggleStyles.track, slots?.track)}
|
|
182
|
-
>
|
|
183
|
-
<div
|
|
184
|
-
data-slot="dt-indicator"
|
|
185
|
-
className={cn(dynamicToggleStyles.indicator, slots?.indicator)}
|
|
186
|
-
/>
|
|
187
|
-
{children}
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
</DynamicToggleProvider>
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// ---------------------------------------------------------------------------
|
|
195
|
-
// DynamicToggleOption
|
|
196
|
-
// ---------------------------------------------------------------------------
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* A single toggle option — hidden radio + visible label.
|
|
200
|
-
*/
|
|
201
|
-
function DynamicToggleOption({ value, children, className }: IDynamicToggleOptionProps) {
|
|
202
|
-
const ctx = useDynamicToggle();
|
|
203
|
-
const id = React.useId();
|
|
204
|
-
const isActive = ctx.value === value;
|
|
205
|
-
|
|
206
|
-
return (
|
|
207
|
-
<>
|
|
208
|
-
<label
|
|
209
|
-
htmlFor={id}
|
|
210
|
-
data-slot="dt-option"
|
|
211
|
-
data-active={isActive || undefined}
|
|
212
|
-
className={cn(dynamicToggleStyles.option, className)}
|
|
213
|
-
>
|
|
214
|
-
<span>{children}</span>
|
|
215
|
-
</label>
|
|
216
|
-
<input
|
|
217
|
-
className="sr-only"
|
|
218
|
-
type="radio"
|
|
219
|
-
name={ctx.groupName}
|
|
220
|
-
id={id}
|
|
221
|
-
value={value}
|
|
222
|
-
checked={isActive}
|
|
223
|
-
disabled={ctx.disabled}
|
|
224
|
-
onChange={() => ctx.setValue(value)}
|
|
225
|
-
/>
|
|
226
|
-
</>
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// ---------------------------------------------------------------------------
|
|
231
|
-
// DynamicToggleGroup
|
|
232
|
-
// ---------------------------------------------------------------------------
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Expandable group — registers with root on mount, renders sub-options.
|
|
236
|
-
* The group label is rendered by the root based on registered info.
|
|
237
|
-
*/
|
|
238
|
-
function DynamicToggleGroup({
|
|
239
|
-
label,
|
|
240
|
-
labelPosition = 'top',
|
|
241
|
-
collapsedMode = 'title',
|
|
242
|
-
children,
|
|
243
|
-
className,
|
|
244
|
-
}: IDynamicToggleGroupProps) {
|
|
245
|
-
const ctx = useDynamicToggle();
|
|
246
|
-
|
|
247
|
-
// Build combined opts text from children
|
|
248
|
-
const optsText = React.useMemo(() => {
|
|
249
|
-
const labels: string[] = [];
|
|
250
|
-
React.Children.forEach(children, (child) => {
|
|
251
|
-
if (React.isValidElement(child)) {
|
|
252
|
-
const p = child.props as { children?: React.ReactNode };
|
|
253
|
-
if (p.children) labels.push(String(p.children));
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
return labels.join(' · ');
|
|
257
|
-
}, [children]);
|
|
258
|
-
|
|
259
|
-
// Register group info with root — useLayoutEffect prevents visual flash
|
|
260
|
-
useIsomorphicLayoutEffect(() => {
|
|
261
|
-
const values: string[] = [];
|
|
262
|
-
React.Children.forEach(children, (child) => {
|
|
263
|
-
if (React.isValidElement(child)) {
|
|
264
|
-
const p = child.props as { value?: string };
|
|
265
|
-
if (p.value) values.push(p.value);
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
ctx.registerGroup(label, values, labelPosition, collapsedMode);
|
|
269
|
-
}, [label, labelPosition, collapsedMode, children, ctx.registerGroup]);
|
|
270
|
-
|
|
271
|
-
return (
|
|
272
|
-
<div
|
|
273
|
-
data-slot="dt-group"
|
|
274
|
-
data-collapsed={collapsedMode}
|
|
275
|
-
data-label={label}
|
|
276
|
-
data-opts={collapsedMode !== 'title' ? optsText : undefined}
|
|
277
|
-
className={cn(dynamicToggleStyles.group, className)}
|
|
278
|
-
>
|
|
279
|
-
<div
|
|
280
|
-
data-slot="dt-group-indicator"
|
|
281
|
-
className={dynamicToggleStyles.groupIndicator}
|
|
282
|
-
/>
|
|
283
|
-
{children}
|
|
284
|
-
</div>
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Display names
|
|
289
|
-
DynamicToggle.displayName = 'DynamicToggle';
|
|
290
|
-
DynamicToggleOption.displayName = 'DynamicToggleOption';
|
|
291
|
-
DynamicToggleGroup.displayName = 'DynamicToggleGroup';
|
|
292
|
-
|
|
293
|
-
// ---------------------------------------------------------------------------
|
|
294
|
-
// Exports
|
|
295
|
-
// ---------------------------------------------------------------------------
|
|
296
|
-
|
|
297
|
-
export {
|
|
298
|
-
DynamicToggle,
|
|
299
|
-
DynamicToggleOption,
|
|
300
|
-
DynamicToggleGroup,
|
|
301
|
-
useDynamicToggle,
|
|
302
|
-
dynamicToggleVariants,
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
export type {
|
|
306
|
-
IDynamicToggleProps,
|
|
307
|
-
IDynamicToggleOptionProps,
|
|
308
|
-
IDynamicToggleGroupProps,
|
|
309
|
-
IDynamicToggleConfig,
|
|
310
|
-
DynamicToggleContextType,
|
|
311
|
-
DynamicToggleCollapsedMode,
|
|
312
|
-
DynamicToggleMorphMode,
|
|
313
|
-
} from './DynamicToggle.types';
|
|
314
|
-
|
|
315
|
-
export type { DynamicToggleSlot, DynamicToggleVariantProps } from './DynamicToggle.styles';
|
|
316
|
-
export { dynamicToggleStyles } from './DynamicToggle.styles';
|