@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,529 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Tabs component -- styled tab navigation built on base-ui Tabs
|
|
5
|
-
* with CVA variants, CSS Anchor Positioning indicator, motion panel
|
|
6
|
-
* transitions, and the slot override system.
|
|
7
|
-
*
|
|
8
|
-
* Out-of-the-box styled with 5 variants (default, outline, ghost,
|
|
9
|
-
* underline, pill) and 3 sizes (sm, default, lg). The sliding indicator
|
|
10
|
-
* uses CSS Anchor Positioning API for zero-JS position tracking.
|
|
11
|
-
*
|
|
12
|
-
* @module @mks2508/mks-ui/react/ui/Tabs
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* // Simplest usage -- styled out of the box
|
|
17
|
-
* <Tabs defaultValue="general">
|
|
18
|
-
* <TabsList>
|
|
19
|
-
* <TabsTab value="general">General</TabsTab>
|
|
20
|
-
* <TabsTab value="advanced">Advanced</TabsTab>
|
|
21
|
-
* </TabsList>
|
|
22
|
-
* <TabsPanels>
|
|
23
|
-
* <TabsPanel value="general">General content</TabsPanel>
|
|
24
|
-
* <TabsPanel value="advanced">Advanced content</TabsPanel>
|
|
25
|
-
* </TabsPanels>
|
|
26
|
-
* </Tabs>
|
|
27
|
-
*
|
|
28
|
-
* // With variant + size
|
|
29
|
-
* <Tabs defaultValue="a">
|
|
30
|
-
* <TabsList variant="underline" size="lg">
|
|
31
|
-
* <TabsTab value="a">Alpha</TabsTab>
|
|
32
|
-
* <TabsTab value="b">Beta</TabsTab>
|
|
33
|
-
* </TabsList>
|
|
34
|
-
* <TabsPanel value="a">...</TabsPanel>
|
|
35
|
-
* </Tabs>
|
|
36
|
-
*
|
|
37
|
-
* // With Highlight primitive (advanced)
|
|
38
|
-
* <Tabs defaultValue="general">
|
|
39
|
-
* <TabsList indicator={false}>
|
|
40
|
-
* <TabsHighlight className="rounded-md bg-white/10">
|
|
41
|
-
* <TabsHighlightItem value="general">
|
|
42
|
-
* <TabsTab value="general">General</TabsTab>
|
|
43
|
-
* </TabsHighlightItem>
|
|
44
|
-
* </TabsHighlight>
|
|
45
|
-
* </TabsList>
|
|
46
|
-
* <TabsPanels>
|
|
47
|
-
* <TabsPanel value="general">Content</TabsPanel>
|
|
48
|
-
* </TabsPanels>
|
|
49
|
-
* </Tabs>
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
|
|
53
|
-
import * as React from 'react';
|
|
54
|
-
import { Tabs as TabsPrimitive } from '@base-ui/react/tabs';
|
|
55
|
-
import {
|
|
56
|
-
motion,
|
|
57
|
-
AnimatePresence,
|
|
58
|
-
type Transition,
|
|
59
|
-
} from 'motion/react';
|
|
60
|
-
|
|
61
|
-
import {
|
|
62
|
-
Highlight,
|
|
63
|
-
HighlightItem,
|
|
64
|
-
} from '@/react-ui/primitives/Highlight';
|
|
65
|
-
import { AutoHeight } from '@/react-ui/primitives/AutoHeight';
|
|
66
|
-
import { getStrictContext } from '@/react-ui/lib/get-strict-context';
|
|
67
|
-
import { useControlledState } from '@/react-ui/hooks/State/UseControlledState';
|
|
68
|
-
import { cn } from '@/react-ui/lib/utils';
|
|
69
|
-
import {
|
|
70
|
-
tabsStyles,
|
|
71
|
-
tabsListVariants,
|
|
72
|
-
tabsTabVariants,
|
|
73
|
-
tabsIndicatorVariants,
|
|
74
|
-
} from './Tabs.styles';
|
|
75
|
-
|
|
76
|
-
import type {
|
|
77
|
-
TabsContextType,
|
|
78
|
-
ITabsProps,
|
|
79
|
-
ITabsHighlightProps,
|
|
80
|
-
ITabsHighlightItemProps,
|
|
81
|
-
ITabsListProps,
|
|
82
|
-
ITabsTabProps,
|
|
83
|
-
ITabsPanelProps,
|
|
84
|
-
ITabsPanelsProps,
|
|
85
|
-
ITabsPanelsAutoProps,
|
|
86
|
-
} from './Tabs.types';
|
|
87
|
-
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
// CSS Anchor Positioning (injected once via <style>)
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
|
|
92
|
-
const TABS_CSS_ID = 'mks-tabs-anchor-css';
|
|
93
|
-
const TABS_ANCHOR_CSS = `
|
|
94
|
-
[data-slot="tabs-list"]{anchor-scope:--tabs-active}
|
|
95
|
-
[data-slot="tabs-tab"][data-active]{anchor-name:--tabs-active}
|
|
96
|
-
[data-slot="tabs-indicator"]{position-anchor:--tabs-active;left:anchor(left);right:anchor(right);transition:top 200ms cubic-bezier(.25,.46,.45,.94),left 200ms cubic-bezier(.25,.46,.45,.94),right 200ms cubic-bezier(.25,.46,.45,.94),bottom 200ms cubic-bezier(.25,.46,.45,.94),width 200ms cubic-bezier(.25,.46,.45,.94),height 200ms cubic-bezier(.25,.46,.45,.94)}
|
|
97
|
-
@media(prefers-reduced-motion:reduce){[data-slot="tabs-indicator"]{transition-duration:0ms}}
|
|
98
|
-
`;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Injects the CSS Anchor Positioning rules into the document head once.
|
|
102
|
-
* Safe for SSR -- no-ops on the server.
|
|
103
|
-
*/
|
|
104
|
-
function useTabsAnchorCSS() {
|
|
105
|
-
React.useEffect(() => {
|
|
106
|
-
if (typeof document === 'undefined') return;
|
|
107
|
-
if (document.getElementById(TABS_CSS_ID)) return;
|
|
108
|
-
const style = document.createElement('style');
|
|
109
|
-
style.id = TABS_CSS_ID;
|
|
110
|
-
style.textContent = TABS_ANCHOR_CSS;
|
|
111
|
-
document.head.appendChild(style);
|
|
112
|
-
}, []);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// ---------------------------------------------------------------------------
|
|
116
|
-
// Context
|
|
117
|
-
// ---------------------------------------------------------------------------
|
|
118
|
-
|
|
119
|
-
/** Variant context so children (TabsTab) inherit the parent variant/size. */
|
|
120
|
-
type TabsVariantContext = {
|
|
121
|
-
variant?: ITabsListProps['variant'];
|
|
122
|
-
size?: ITabsListProps['size'];
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const [TabsProvider, useTabs] =
|
|
126
|
-
getStrictContext<TabsContextType>('TabsContext');
|
|
127
|
-
|
|
128
|
-
const TabsVariantCtx = React.createContext<TabsVariantContext>({});
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// Tabs (Root)
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Root Tabs component -- provides active tab value context and
|
|
136
|
-
* controlled/uncontrolled state management.
|
|
137
|
-
*
|
|
138
|
-
* @param value - Controlled active tab value
|
|
139
|
-
* @param defaultValue - Uncontrolled initial active tab value
|
|
140
|
-
* @param onValueChange - Callback when active tab changes
|
|
141
|
-
* @param slots - Partial class overrides per slot
|
|
142
|
-
* @param config - Tabs behavior / animation configuration
|
|
143
|
-
*
|
|
144
|
-
* @example
|
|
145
|
-
* ```tsx
|
|
146
|
-
* <Tabs defaultValue="general" slots={{ root: 'w-full' }}>
|
|
147
|
-
* <TabsList>...</TabsList>
|
|
148
|
-
* <TabsPanels>...</TabsPanels>
|
|
149
|
-
* </Tabs>
|
|
150
|
-
* ```
|
|
151
|
-
*/
|
|
152
|
-
function Tabs({ slots, config, className, ...props }: ITabsProps) {
|
|
153
|
-
const [value, setValue] = useControlledState({
|
|
154
|
-
value: props.value,
|
|
155
|
-
defaultValue: props.defaultValue,
|
|
156
|
-
onChange: props.onValueChange,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
return (
|
|
160
|
-
<TabsProvider value={{ value, setValue }}>
|
|
161
|
-
<TabsPrimitive.Root
|
|
162
|
-
data-slot="tabs"
|
|
163
|
-
className={cn(tabsStyles.root, slots?.root, className)}
|
|
164
|
-
{...props}
|
|
165
|
-
onValueChange={setValue}
|
|
166
|
-
/>
|
|
167
|
-
</TabsProvider>
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// ---------------------------------------------------------------------------
|
|
172
|
-
// TabsHighlight
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* TabsHighlight -- animated background indicator that follows the active tab.
|
|
177
|
-
* Wraps the Highlight primitive with tab-specific defaults (spring transition,
|
|
178
|
-
* no click activation since tabs manage their own active state).
|
|
179
|
-
*
|
|
180
|
-
* @param transition - Motion transition config (default: spring 200/25)
|
|
181
|
-
* @param slots - Partial class overrides per slot
|
|
182
|
-
* @param className - Additional class names
|
|
183
|
-
*
|
|
184
|
-
* @example
|
|
185
|
-
* ```tsx
|
|
186
|
-
* <TabsHighlight className="rounded-md bg-white/10">
|
|
187
|
-
* <TabsHighlightItem value="tab1">
|
|
188
|
-
* <TabsTab value="tab1">Tab 1</TabsTab>
|
|
189
|
-
* </TabsHighlightItem>
|
|
190
|
-
* </TabsHighlight>
|
|
191
|
-
* ```
|
|
192
|
-
*/
|
|
193
|
-
function TabsHighlight({
|
|
194
|
-
transition = { type: 'spring', stiffness: 200, damping: 25 },
|
|
195
|
-
slots,
|
|
196
|
-
className,
|
|
197
|
-
...props
|
|
198
|
-
}: ITabsHighlightProps) {
|
|
199
|
-
const { value } = useTabs();
|
|
200
|
-
|
|
201
|
-
return (
|
|
202
|
-
<Highlight
|
|
203
|
-
data-slot="tabs-highlight"
|
|
204
|
-
controlledItems
|
|
205
|
-
value={value}
|
|
206
|
-
transition={transition}
|
|
207
|
-
click={false}
|
|
208
|
-
className={cn(tabsStyles.highlight, slots?.highlight, className)}
|
|
209
|
-
{...props}
|
|
210
|
-
/>
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// ---------------------------------------------------------------------------
|
|
215
|
-
// TabsList
|
|
216
|
-
// ---------------------------------------------------------------------------
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* TabsList -- the container holding tab trigger buttons.
|
|
220
|
-
* Renders a base-ui Tabs.List with CVA variant/size styling and
|
|
221
|
-
* an optional CSS Anchor-based sliding indicator.
|
|
222
|
-
*
|
|
223
|
-
* @param variant - Visual variant: 'default' | 'outline' | 'ghost' | 'underline' | 'pill'
|
|
224
|
-
* @param size - Size: 'sm' | 'default' | 'lg'
|
|
225
|
-
* @param indicator - Show sliding indicator (default: true for default/outline/pill)
|
|
226
|
-
* @param slots - Partial class overrides per slot
|
|
227
|
-
* @param className - Additional class names
|
|
228
|
-
*
|
|
229
|
-
* @example
|
|
230
|
-
* ```tsx
|
|
231
|
-
* <TabsList variant="pill" size="sm">
|
|
232
|
-
* <TabsTab value="a">Alpha</TabsTab>
|
|
233
|
-
* <TabsTab value="b">Beta</TabsTab>
|
|
234
|
-
* </TabsList>
|
|
235
|
-
* ```
|
|
236
|
-
*/
|
|
237
|
-
function TabsList({
|
|
238
|
-
variant,
|
|
239
|
-
size,
|
|
240
|
-
indicator,
|
|
241
|
-
slots,
|
|
242
|
-
className,
|
|
243
|
-
children,
|
|
244
|
-
...props
|
|
245
|
-
}: ITabsListProps) {
|
|
246
|
-
useTabsAnchorCSS();
|
|
247
|
-
const resolvedVariant = variant ?? 'default';
|
|
248
|
-
const showIndicator = indicator ?? !['ghost', 'underline'].includes(resolvedVariant);
|
|
249
|
-
|
|
250
|
-
return (
|
|
251
|
-
<TabsVariantCtx.Provider value={{ variant: resolvedVariant, size }}>
|
|
252
|
-
<TabsPrimitive.List
|
|
253
|
-
data-slot="tabs-list"
|
|
254
|
-
data-variant={resolvedVariant}
|
|
255
|
-
className={cn(
|
|
256
|
-
tabsListVariants({ variant: resolvedVariant, size }),
|
|
257
|
-
slots?.list,
|
|
258
|
-
className,
|
|
259
|
-
)}
|
|
260
|
-
{...props}
|
|
261
|
-
>
|
|
262
|
-
{children}
|
|
263
|
-
{showIndicator && (
|
|
264
|
-
<span
|
|
265
|
-
data-slot="tabs-indicator"
|
|
266
|
-
aria-hidden="true"
|
|
267
|
-
className={cn(
|
|
268
|
-
tabsIndicatorVariants({ variant: resolvedVariant }),
|
|
269
|
-
slots?.indicator,
|
|
270
|
-
)}
|
|
271
|
-
/>
|
|
272
|
-
)}
|
|
273
|
-
</TabsPrimitive.List>
|
|
274
|
-
</TabsVariantCtx.Provider>
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// ---------------------------------------------------------------------------
|
|
279
|
-
// TabsHighlightItem
|
|
280
|
-
// ---------------------------------------------------------------------------
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* TabsHighlightItem -- wraps a TabsTab for highlight position tracking.
|
|
284
|
-
* Must be placed inside a TabsHighlight context. The `value` prop should
|
|
285
|
-
* match the corresponding TabsTab value.
|
|
286
|
-
*
|
|
287
|
-
* @param value - Tab value this highlight item corresponds to
|
|
288
|
-
* @param slots - Partial class overrides per slot
|
|
289
|
-
*
|
|
290
|
-
* @example
|
|
291
|
-
* ```tsx
|
|
292
|
-
* <TabsHighlightItem value="general">
|
|
293
|
-
* <TabsTab value="general">General</TabsTab>
|
|
294
|
-
* </TabsHighlightItem>
|
|
295
|
-
* ```
|
|
296
|
-
*/
|
|
297
|
-
function TabsHighlightItem({ slots, ...props }: ITabsHighlightItemProps) {
|
|
298
|
-
return <HighlightItem data-slot="tabs-highlight-item" {...props} />;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// ---------------------------------------------------------------------------
|
|
302
|
-
// TabsTab
|
|
303
|
-
// ---------------------------------------------------------------------------
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* TabsTab -- a single tab trigger button that activates its panel.
|
|
307
|
-
* Inherits variant/size from the parent TabsList context, or can be
|
|
308
|
-
* overridden per-tab.
|
|
309
|
-
*
|
|
310
|
-
* @param value - The value this tab represents
|
|
311
|
-
* @param variant - Override parent variant
|
|
312
|
-
* @param size - Override parent size
|
|
313
|
-
* @param slots - Partial class overrides per slot
|
|
314
|
-
* @param className - Additional class names
|
|
315
|
-
*
|
|
316
|
-
* @example
|
|
317
|
-
* ```tsx
|
|
318
|
-
* <TabsTab value="general">
|
|
319
|
-
* <Search className="size-4" />
|
|
320
|
-
* General
|
|
321
|
-
* </TabsTab>
|
|
322
|
-
* ```
|
|
323
|
-
*/
|
|
324
|
-
function TabsTab({ variant, size, slots, className, ...props }: ITabsTabProps) {
|
|
325
|
-
const ctx = React.useContext(TabsVariantCtx);
|
|
326
|
-
const resolvedVariant = variant ?? ctx.variant;
|
|
327
|
-
const resolvedSize = size ?? ctx.size;
|
|
328
|
-
|
|
329
|
-
return (
|
|
330
|
-
<TabsPrimitive.Tab
|
|
331
|
-
data-slot="tabs-tab"
|
|
332
|
-
className={cn(
|
|
333
|
-
tabsTabVariants({ variant: resolvedVariant, size: resolvedSize }),
|
|
334
|
-
slots?.tab,
|
|
335
|
-
className,
|
|
336
|
-
)}
|
|
337
|
-
{...props}
|
|
338
|
-
/>
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// ---------------------------------------------------------------------------
|
|
343
|
-
// TabsPanel
|
|
344
|
-
// ---------------------------------------------------------------------------
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* TabsPanel -- an animated content panel associated with a tab.
|
|
348
|
-
* Uses Motion for blur + opacity enter/exit transitions wrapped in
|
|
349
|
-
* AnimatePresence for smooth unmount animations.
|
|
350
|
-
*
|
|
351
|
-
* @param value - The tab value this panel corresponds to
|
|
352
|
-
* @param keepMounted - Keep the panel in DOM when inactive
|
|
353
|
-
* @param transition - Motion transition config (default: 0.5s easeInOut)
|
|
354
|
-
* @param slots - Partial class overrides per slot
|
|
355
|
-
* @param className - Additional class names
|
|
356
|
-
*
|
|
357
|
-
* @example
|
|
358
|
-
* ```tsx
|
|
359
|
-
* <TabsPanel value="general" className="p-4">
|
|
360
|
-
* <h2>General Settings</h2>
|
|
361
|
-
* <p>Configure your preferences here.</p>
|
|
362
|
-
* </TabsPanel>
|
|
363
|
-
* ```
|
|
364
|
-
*/
|
|
365
|
-
function TabsPanel({
|
|
366
|
-
value,
|
|
367
|
-
keepMounted,
|
|
368
|
-
transition = { duration: 0.5, ease: 'easeInOut' },
|
|
369
|
-
slots,
|
|
370
|
-
className,
|
|
371
|
-
...props
|
|
372
|
-
}: ITabsPanelProps) {
|
|
373
|
-
return (
|
|
374
|
-
<AnimatePresence mode="wait">
|
|
375
|
-
<TabsPrimitive.Panel
|
|
376
|
-
render={
|
|
377
|
-
<motion.div
|
|
378
|
-
data-slot="tabs-panel"
|
|
379
|
-
layout
|
|
380
|
-
layoutDependency={value}
|
|
381
|
-
initial={{ opacity: 0, filter: 'blur(4px)' }}
|
|
382
|
-
animate={{ opacity: 1, filter: 'blur(0px)' }}
|
|
383
|
-
exit={{ opacity: 0, filter: 'blur(4px)' }}
|
|
384
|
-
transition={transition}
|
|
385
|
-
className={cn(tabsStyles.panel, slots?.panel, className)}
|
|
386
|
-
{...(props as any)}
|
|
387
|
-
/>
|
|
388
|
-
}
|
|
389
|
-
keepMounted={keepMounted}
|
|
390
|
-
value={value}
|
|
391
|
-
/>
|
|
392
|
-
</AnimatePresence>
|
|
393
|
-
);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// ---------------------------------------------------------------------------
|
|
397
|
-
// TabsPanels
|
|
398
|
-
// ---------------------------------------------------------------------------
|
|
399
|
-
|
|
400
|
-
/** Default spring transition for the panels container. */
|
|
401
|
-
const defaultPanelsTransition: Transition = {
|
|
402
|
-
type: 'spring',
|
|
403
|
-
stiffness: 200,
|
|
404
|
-
damping: 30,
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Type guard to distinguish auto-height mode from layout mode.
|
|
409
|
-
*
|
|
410
|
-
* @param props - TabsPanels props union
|
|
411
|
-
* @returns True if auto-height mode (default)
|
|
412
|
-
*/
|
|
413
|
-
function isAutoMode(props: ITabsPanelsProps): props is ITabsPanelsAutoProps {
|
|
414
|
-
return !props.mode || props.mode === 'auto-height';
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* TabsPanels -- container for tab panels with animated height transitions.
|
|
419
|
-
* Supports two modes:
|
|
420
|
-
*
|
|
421
|
-
* - **auto-height** (default): Uses ResizeObserver to animate container
|
|
422
|
-
* height when panels have different content sizes.
|
|
423
|
-
* - **layout**: Uses Motion layout animation for size transitions,
|
|
424
|
-
* with overflow hidden.
|
|
425
|
-
*
|
|
426
|
-
* @param mode - Animation mode: 'auto-height' (default) or 'layout'
|
|
427
|
-
* @param transition - Motion transition config
|
|
428
|
-
* @param slots - Partial class overrides per slot
|
|
429
|
-
* @param className - Additional class names
|
|
430
|
-
*
|
|
431
|
-
* @example
|
|
432
|
-
* ```tsx
|
|
433
|
-
* // Auto-height mode (default)
|
|
434
|
-
* <TabsPanels>
|
|
435
|
-
* <TabsPanel value="short">Short content</TabsPanel>
|
|
436
|
-
* <TabsPanel value="long">Much longer content with many paragraphs...</TabsPanel>
|
|
437
|
-
* </TabsPanels>
|
|
438
|
-
*
|
|
439
|
-
* // Layout mode
|
|
440
|
-
* <TabsPanels mode="layout" className="rounded-lg">
|
|
441
|
-
* <TabsPanel value="a">Content A</TabsPanel>
|
|
442
|
-
* <TabsPanel value="b">Content B</TabsPanel>
|
|
443
|
-
* </TabsPanels>
|
|
444
|
-
* ```
|
|
445
|
-
*/
|
|
446
|
-
function TabsPanels(props: ITabsPanelsProps) {
|
|
447
|
-
const { value } = useTabs();
|
|
448
|
-
|
|
449
|
-
if (isAutoMode(props)) {
|
|
450
|
-
const {
|
|
451
|
-
children,
|
|
452
|
-
transition = defaultPanelsTransition,
|
|
453
|
-
slots,
|
|
454
|
-
className,
|
|
455
|
-
mode: _mode,
|
|
456
|
-
...autoProps
|
|
457
|
-
} = props;
|
|
458
|
-
|
|
459
|
-
return (
|
|
460
|
-
<AutoHeight
|
|
461
|
-
data-slot="tabs-panels"
|
|
462
|
-
deps={[value]}
|
|
463
|
-
transition={transition}
|
|
464
|
-
className={cn(tabsStyles.panels, slots?.panels, className)}
|
|
465
|
-
{...autoProps}
|
|
466
|
-
>
|
|
467
|
-
<React.Fragment key={value}>{children}</React.Fragment>
|
|
468
|
-
</AutoHeight>
|
|
469
|
-
);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
const {
|
|
473
|
-
children,
|
|
474
|
-
style,
|
|
475
|
-
transition = defaultPanelsTransition,
|
|
476
|
-
slots,
|
|
477
|
-
className,
|
|
478
|
-
mode: _mode,
|
|
479
|
-
...layoutProps
|
|
480
|
-
} = props;
|
|
481
|
-
|
|
482
|
-
return (
|
|
483
|
-
<motion.div
|
|
484
|
-
data-slot="tabs-panels"
|
|
485
|
-
layout="size"
|
|
486
|
-
layoutDependency={value}
|
|
487
|
-
transition={{ layout: transition }}
|
|
488
|
-
style={{ overflow: 'hidden', ...style }}
|
|
489
|
-
className={cn(tabsStyles.panels, slots?.panels, className)}
|
|
490
|
-
{...layoutProps}
|
|
491
|
-
>
|
|
492
|
-
<React.Fragment key={value}>{children}</React.Fragment>
|
|
493
|
-
</motion.div>
|
|
494
|
-
);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// ---------------------------------------------------------------------------
|
|
498
|
-
// Exports
|
|
499
|
-
// ---------------------------------------------------------------------------
|
|
500
|
-
|
|
501
|
-
export {
|
|
502
|
-
Tabs,
|
|
503
|
-
TabsHighlight,
|
|
504
|
-
TabsHighlightItem,
|
|
505
|
-
TabsList,
|
|
506
|
-
TabsTab,
|
|
507
|
-
TabsPanel,
|
|
508
|
-
TabsPanels,
|
|
509
|
-
tabsListVariants,
|
|
510
|
-
tabsTabVariants,
|
|
511
|
-
tabsIndicatorVariants,
|
|
512
|
-
};
|
|
513
|
-
|
|
514
|
-
// Re-export all types
|
|
515
|
-
export type {
|
|
516
|
-
ITabsProps,
|
|
517
|
-
ITabsHighlightProps,
|
|
518
|
-
ITabsHighlightItemProps,
|
|
519
|
-
ITabsListProps,
|
|
520
|
-
ITabsTabProps,
|
|
521
|
-
ITabsPanelProps,
|
|
522
|
-
ITabsPanelsProps,
|
|
523
|
-
ITabsPanelsAutoProps,
|
|
524
|
-
ITabsPanelsLayoutProps,
|
|
525
|
-
ITabsConfig,
|
|
526
|
-
TabsContextType,
|
|
527
|
-
} from './Tabs.types';
|
|
528
|
-
|
|
529
|
-
export type { TabsSlot } from './Tabs.styles';
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { cva, type VariantProps } from 'class-variance-authority';
|
|
2
|
-
import type { StyleSlots } from '@/core/types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Style slots for TextFlow component
|
|
6
|
-
*/
|
|
7
|
-
export type TextFlowSlot = 'root' | 'token' | 'separator' | 'overflow' | 'placeholder';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Base styles for TextFlow component
|
|
11
|
-
*/
|
|
12
|
-
export const textFlowBaseStyles: StyleSlots<TextFlowSlot> = {
|
|
13
|
-
root: 'waapi-animated-tokens-container',
|
|
14
|
-
token: 'waapi-token-wrapper',
|
|
15
|
-
separator: 'waapi-token-separator',
|
|
16
|
-
overflow: 'waapi-token-overflow',
|
|
17
|
-
placeholder: 'waapi-token-placeholder',
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* CVA variants for TextFlow root container
|
|
22
|
-
*/
|
|
23
|
-
export const textFlowVariants = cva({
|
|
24
|
-
base: 'waapi-animated-tokens-container',
|
|
25
|
-
variants: {
|
|
26
|
-
inline: {
|
|
27
|
-
true: 'waapi-animated-tokens-container--inline',
|
|
28
|
-
false: '',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
defaultVariants: {
|
|
32
|
-
inline: false,
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
export type TextFlowVariants = VariantProps<typeof textFlowVariants>;
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Token individual para TextFlow
|
|
5
|
-
*/
|
|
6
|
-
export interface IToken {
|
|
7
|
-
/** Identificador único del token */
|
|
8
|
-
id: string;
|
|
9
|
-
/** Texto a mostrar */
|
|
10
|
-
text: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Modo de transición para cambios de texto en separadores
|
|
15
|
-
*/
|
|
16
|
-
export type SeparatorTransitionMode = 'none' | 'fade' | 'slide';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Tipos de lista para Intl.ListFormat
|
|
20
|
-
*/
|
|
21
|
-
export type ListFormatType = 'conjunction' | 'disjunction' | 'unit';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Estilos de lista para Intl.ListFormat
|
|
25
|
-
*/
|
|
26
|
-
export type ListFormatStyle = 'long' | 'short' | 'narrow';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Configuración de separadores entre tokens
|
|
30
|
-
*/
|
|
31
|
-
export interface ISeparatorConfig {
|
|
32
|
-
/** Texto del separador. Si se omite, usa Intl.ListFormat */
|
|
33
|
-
value?: string;
|
|
34
|
-
/** Locale para Intl.ListFormat */
|
|
35
|
-
locale?: string;
|
|
36
|
-
/** Tipo de lista para Intl.ListFormat */
|
|
37
|
-
listType?: ListFormatType;
|
|
38
|
-
/** Estilo de lista para Intl.ListFormat */
|
|
39
|
-
listStyle?: ListFormatStyle;
|
|
40
|
-
/** Modo de transición cuando el texto del separador cambia */
|
|
41
|
-
transition?: SeparatorTransitionMode;
|
|
42
|
-
/** Duración de la transición en ms */
|
|
43
|
-
duration?: number;
|
|
44
|
-
/** Clase CSS adicional para separadores */
|
|
45
|
-
className?: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Configuración del indicador de overflow (+N more)
|
|
50
|
-
*/
|
|
51
|
-
export interface IOverflowConfig {
|
|
52
|
-
/** Prefijo antes del número */
|
|
53
|
-
prefix?: string;
|
|
54
|
-
/** Texto después del número */
|
|
55
|
-
label?: string;
|
|
56
|
-
/** Separador mostrado antes del overflow */
|
|
57
|
-
separator?: string;
|
|
58
|
-
/** Mostrar separador antes del overflow */
|
|
59
|
-
showSeparator?: boolean;
|
|
60
|
-
/** Clase CSS adicional para el overflow */
|
|
61
|
-
className?: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Configuración de animación de texto
|
|
66
|
-
*/
|
|
67
|
-
export interface ITextAnimationConfig {
|
|
68
|
-
/** Modo de animación del texto */
|
|
69
|
-
mode?: 'character' | 'word';
|
|
70
|
-
/** Dirección de entrada del texto */
|
|
71
|
-
direction?: 'vertical' | 'horizontal';
|
|
72
|
-
/** Delay entre caracteres/palabras en ms */
|
|
73
|
-
stagger?: number;
|
|
74
|
-
/** Duración de animación en ms */
|
|
75
|
-
duration?: number;
|
|
76
|
-
/** Habilitar efecto blur durante animación */
|
|
77
|
-
blur?: boolean;
|
|
78
|
-
/** Animar cambios de ancho del contenedor */
|
|
79
|
-
widthAnimation?: boolean;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Props for TextFlow component
|
|
84
|
-
*
|
|
85
|
-
* TextFlow renders an animated list of tokens with locale-aware separators,
|
|
86
|
-
* smooth FLIP animations, and overflow handling.
|
|
87
|
-
*/
|
|
88
|
-
export interface ITextFlowProps {
|
|
89
|
-
/** Array de tokens a mostrar */
|
|
90
|
-
tokens: IToken[];
|
|
91
|
-
|
|
92
|
-
/** Texto placeholder cuando no hay tokens */
|
|
93
|
-
placeholder?: string;
|
|
94
|
-
|
|
95
|
-
/** Máximo de tokens visibles. El resto se muestra como "+N" */
|
|
96
|
-
maxVisible?: number;
|
|
97
|
-
|
|
98
|
-
/** Configuración de separadores */
|
|
99
|
-
separator?: ISeparatorConfig;
|
|
100
|
-
|
|
101
|
-
/** Configuración del indicador de overflow */
|
|
102
|
-
overflow?: IOverflowConfig;
|
|
103
|
-
|
|
104
|
-
/** Configuración de animación de texto */
|
|
105
|
-
animation?: ITextAnimationConfig;
|
|
106
|
-
|
|
107
|
-
/** Modo inline para uso en botones/selects */
|
|
108
|
-
inline?: boolean;
|
|
109
|
-
|
|
110
|
-
/** Clase CSS para el contenedor principal */
|
|
111
|
-
className?: string;
|
|
112
|
-
|
|
113
|
-
/** Clase CSS para cada token */
|
|
114
|
-
tokenClassName?: string;
|
|
115
|
-
|
|
116
|
-
/** Clase CSS para el placeholder */
|
|
117
|
-
placeholderClassName?: string;
|
|
118
|
-
}
|