@mks2508/mks-ui 0.8.1 → 0.9.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/dist/index.css +1594 -0
- package/dist/react-ui/blocks/Sidebar/animations/tooltip.css +330 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/TerminalPanel.js +1 -1
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges/LogLineBadges.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge/TerminalLogBadge.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge/TerminalLogBadge.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalActionBar/TerminalActionBar.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalActionBar/TerminalActionBar.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalConnectionStatus/TerminalConnectionStatus.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalConnectionStatus/TerminalConnectionStatus.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalFontControls/TerminalFontControls.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalFontControls/TerminalFontControls.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalSplitButton/TerminalSplitButton.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalSplitButton/TerminalSplitButton.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalStatusBar/TerminalStatusBar.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/controls/TerminalStatusBar/TerminalStatusBar.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/display.js +4 -4
- package/dist/react-ui/blocks/Terminal/index.d.ts +16 -28
- package/dist/react-ui/blocks/Terminal/index.d.ts.map +1 -1
- package/dist/react-ui/blocks/Terminal/index.js +2 -23
- package/dist/react-ui/blocks/Terminal/interactive.d.ts +18 -0
- package/dist/react-ui/blocks/Terminal/interactive.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/interactive.js +3 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel/TerminalDebugPanel.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel/TerminalDebugPanel.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown/TerminalFilterDropdown.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown/TerminalFilterDropdown.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown/terminal-filter-dropdown.module.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs/TerminalFilterTabs.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs/TerminalFilterTabs.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.js +2 -2
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelWterm.d.ts.map +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.js +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel/TerminalLogsPanel.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel/TerminalLogsPanel.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel/index.js +2 -2
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter/TerminalPanelFooter.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter/TerminalPanelFooter.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader/TerminalPanelHeader.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader/TerminalPanelHeader.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar/TerminalPanelToolbar.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar/TerminalPanelToolbar.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl/TerminalSessionControl.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl/TerminalSessionControl.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs/TerminalSessionTabs.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs/TerminalSessionTabs.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs/terminal-session-tabs.module.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover/TerminalSettingsPopover.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover/TerminalSettingsPopover.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector/TerminalThemeSelector.styles.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector/TerminalThemeSelector.types.d.ts +1 -1
- package/dist/react-ui/blocks/Terminal/restty/ResttyTerminal.js +1 -1
- package/dist/react-ui/blocks/Terminal/restty.d.ts +27 -0
- package/dist/react-ui/blocks/Terminal/restty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/restty.js +12 -0
- package/dist/react-ui/blocks/Terminal/wterm.d.ts +20 -0
- package/dist/react-ui/blocks/Terminal/wterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/wterm.js +4 -0
- package/dist/react-ui/blocks/Terminal/xterm.d.ts +26 -0
- package/dist/react-ui/blocks/Terminal/xterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/xterm.js +9 -0
- package/dist/react-ui/components/MorphingPopover/morphing-popover.module.css +154 -0
- package/dist/react-ui/index.d.ts +2 -2
- package/dist/react-ui/index.d.ts.map +1 -1
- package/dist/react-ui/index.js +2 -6
- package/dist/react-ui/primitives/AutoHeight/index.d.ts +1 -1
- package/dist/react-ui/primitives/CountingNumber/index.d.ts +1 -1
- package/dist/react-ui/primitives/DotMatrix/DotMatrix.types.d.ts +1 -1
- package/dist/react-ui/primitives/DotMatrix/dot.css +364 -0
- package/dist/react-ui/primitives/GooeyMorphingSurface/gooey-morphing.css +112 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.module.css +20 -0
- package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.d.ts +1 -1
- package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.styles.d.ts +1 -1
- package/dist/react-ui/ui/Accordion/Accordion.styles.d.ts +1 -1
- package/dist/react-ui/ui/Accordion/Accordion.types.d.ts +1 -1
- package/dist/react-ui/ui/AlertDialog/AlertDialog.styles.d.ts +1 -1
- package/dist/react-ui/ui/AlertDialog/AlertDialog.types.d.ts +1 -1
- package/dist/react-ui/ui/Badge/Badge.styles.d.ts +1 -1
- package/dist/react-ui/ui/Badge/Badge.types.d.ts +1 -1
- package/dist/react-ui/ui/Button/Button.styles.d.ts +1 -1
- package/dist/react-ui/ui/Button/Button.types.d.ts +1 -1
- package/dist/react-ui/ui/Card/Card.styles.d.ts +1 -1
- package/dist/react-ui/ui/Card/Card.types.d.ts +1 -1
- package/dist/react-ui/ui/Checkbox/Checkbox.styles.d.ts +1 -1
- package/dist/react-ui/ui/Checkbox/Checkbox.types.d.ts +1 -1
- package/dist/react-ui/ui/Combobox/Combobox.styles.d.ts +1 -1
- package/dist/react-ui/ui/Combobox/Combobox.types.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.types.d.ts +1 -1
- package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts +1 -1
- package/dist/react-ui/ui/DataCard/DataCard.types.d.ts +1 -1
- package/dist/react-ui/ui/DataCard/index.d.ts +1 -1
- package/dist/react-ui/ui/Dialog/Dialog.styles.d.ts +1 -1
- package/dist/react-ui/ui/Dialog/Dialog.types.d.ts +1 -1
- package/dist/react-ui/ui/DropdownMenu/DropdownMenu.styles.d.ts +1 -1
- package/dist/react-ui/ui/DropdownMenu/DropdownMenu.types.d.ts +1 -1
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +369 -0
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -1
- package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +1 -1
- package/dist/react-ui/ui/Field/Field.styles.d.ts +1 -1
- package/dist/react-ui/ui/Field/Field.types.d.ts +1 -1
- package/dist/react-ui/ui/FileIcon/FileIcon.styles.d.ts +1 -1
- package/dist/react-ui/ui/FileIcon/FileIcon.types.d.ts +1 -1
- package/dist/react-ui/ui/FileItem/FileItem.styles.d.ts +1 -1
- package/dist/react-ui/ui/FileItem/FileItem.types.d.ts +1 -1
- package/dist/react-ui/ui/FilePanel/FilePanel.styles.d.ts +1 -1
- package/dist/react-ui/ui/FilePanel/FilePanel.types.d.ts +1 -1
- package/dist/react-ui/ui/FileTree/FileTree.styles.d.ts +1 -1
- package/dist/react-ui/ui/FileTree/FileTree.types.d.ts +1 -1
- package/dist/react-ui/ui/GooeyButton/GooeyButton.types.d.ts +1 -1
- package/dist/react-ui/ui/GooeyButton/gooey.css +47 -0
- package/dist/react-ui/ui/Input/Input.styles.d.ts +1 -1
- package/dist/react-ui/ui/Input/Input.types.d.ts +1 -1
- package/dist/react-ui/ui/InputGroup/InputGroup.styles.d.ts +1 -1
- package/dist/react-ui/ui/InputGroup/InputGroup.types.d.ts +1 -1
- package/dist/react-ui/ui/Label/Label.styles.d.ts +1 -1
- package/dist/react-ui/ui/Label/Label.types.d.ts +1 -1
- package/dist/react-ui/ui/Menu/Menu.styles.d.ts +1 -1
- package/dist/react-ui/ui/Menu/Menu.types.d.ts +2 -2
- package/dist/react-ui/ui/MiddleTruncatePath/MiddleTruncatePath.styles.d.ts +1 -1
- package/dist/react-ui/ui/MiddleTruncatePath/MiddleTruncatePath.types.d.ts +1 -1
- package/dist/react-ui/ui/OperationCard/OperationCard.styles.d.ts +1 -1
- package/dist/react-ui/ui/OperationCard/OperationCard.types.d.ts +2 -2
- package/dist/react-ui/ui/Popover/Popover.styles.d.ts +1 -1
- package/dist/react-ui/ui/Popover/Popover.types.d.ts +1 -1
- package/dist/react-ui/ui/Progress/Progress.styles.d.ts +1 -1
- package/dist/react-ui/ui/Progress/Progress.types.d.ts +2 -2
- package/dist/react-ui/ui/Select/Select.styles.d.ts +1 -1
- package/dist/react-ui/ui/Select/Select.types.d.ts +1 -1
- package/dist/react-ui/ui/Separator/Separator.styles.d.ts +1 -1
- package/dist/react-ui/ui/Separator/Separator.types.d.ts +1 -1
- package/dist/react-ui/ui/Switch/Switch.styles.d.ts +1 -1
- package/dist/react-ui/ui/Switch/Switch.types.d.ts +1 -1
- package/dist/react-ui/ui/Tabs/Tabs.css +38 -0
- package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts +1 -1
- package/dist/react-ui/ui/Tabs/Tabs.types.d.ts +3 -3
- package/dist/react-ui/ui/TextFlow/TextFlow.styles.d.ts +1 -1
- package/dist/react-ui/ui/Textarea/Textarea.styles.d.ts +1 -1
- package/dist/react-ui/ui/Textarea/Textarea.types.d.ts +1 -1
- package/dist/react-ui/ui/Tooltip/Tooltip.styles.d.ts +1 -1
- package/dist/react-ui/ui/Tooltip/Tooltip.types.d.ts +1 -1
- package/package.json +21 -1
- /package/dist/{react-ui/blocks/Sidebar/animations/tooltip-keyframes-DRT9W6Xj.css → css/blocks-Sidebar-animations-tooltip.css} +0 -0
- /package/dist/{react-ui/blocks/Terminal/panel/TerminalFilterDropdown/terminal-filter-dropdown.module-G5zpw08N.css → css/blocks-Terminal-panel-TerminalFilterDropdown-terminal-filter-dropdown.module.css} +0 -0
- /package/dist/{react-ui/blocks/Terminal/panel/TerminalSessionTabs/terminal-session-tabs.module-BAOuAeiX.css → css/blocks-Terminal-panel-TerminalSessionTabs-terminal-session-tabs.module.css} +0 -0
- /package/dist/{react-ui/components/MorphingPopover/morphing-popover.module-T3s-wJN-.css → css/components-MorphingPopover-morphing-popover.module.css} +0 -0
- /package/dist/{react-ui/primitives/DotMatrix/dot-matrix-B8DHjPGb.css → css/primitives-DotMatrix-dot.css} +0 -0
- /package/dist/{react-ui/primitives/GooeyMorphingSurface/gooey-morphing-surface-DfdjAg5U.css → css/primitives-GooeyMorphingSurface-gooey.css} +0 -0
- /package/dist/{react-ui/primitives/waapi/Morph/techniques/useViewTransitions.module-DNDWYN8q.css → css/primitives-waapi-Morph-techniques-useViewTransitions.module.css} +0 -0
- /package/dist/{react-ui/ui/DynamicToggle/DynamicToggle-DY2Hle7P.css → css/ui-DynamicToggle-DynamicToggle.css} +0 -0
- /package/dist/{react-ui/ui/GooeyButton/gooey-button-8rHWiw0w.css → css/ui-GooeyButton-gooey.css} +0 -0
- /package/dist/{react-ui/ui/Tabs/Tabs-DqzZRGB3.css → css/ui-Tabs-Tabs.css} +0 -0
package/dist/index.css
ADDED
|
@@ -0,0 +1,1594 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
/* react-ui/blocks/Sidebar/animations/tooltip.css */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Tooltip Transition Keyframes
|
|
7
|
+
*
|
|
8
|
+
* Sistema de animaciones CSS para transiciones de tooltip con:
|
|
9
|
+
* - Items staggered enter/exit
|
|
10
|
+
* - Grid-based height transitions
|
|
11
|
+
* - 3D title rotations
|
|
12
|
+
*
|
|
13
|
+
* Performance: GPU-accelerated (transform + opacity only)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/* ============================================================================
|
|
17
|
+
ITEMS ANIMATIONS - Staggered Enter/Exit
|
|
18
|
+
============================================================================ */
|
|
19
|
+
|
|
20
|
+
@keyframes tooltip-item-enter {
|
|
21
|
+
from {
|
|
22
|
+
opacity: 0;
|
|
23
|
+
transform: translateX(-8px);
|
|
24
|
+
}
|
|
25
|
+
to {
|
|
26
|
+
opacity: 1;
|
|
27
|
+
transform: translateX(0);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@keyframes tooltip-item-exit {
|
|
32
|
+
from {
|
|
33
|
+
opacity: 1;
|
|
34
|
+
transform: translateX(0);
|
|
35
|
+
}
|
|
36
|
+
to {
|
|
37
|
+
opacity: 0;
|
|
38
|
+
transform: translateX(-4px);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Item States con CSS Custom Properties
|
|
44
|
+
*
|
|
45
|
+
* Uso: <div style="--animation-order: 0" data-state="entering">
|
|
46
|
+
*/
|
|
47
|
+
.sidebar-sublink[data-state="entering"] {
|
|
48
|
+
animation: tooltip-item-enter 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
49
|
+
animation-delay: calc(var(--animation-order, 0) * 30ms + 150ms);
|
|
50
|
+
animation-fill-mode: both;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.sidebar-sublink[data-state="leaving"] {
|
|
54
|
+
animation: tooltip-item-exit 100ms cubic-bezier(0.4, 0, 0.6, 1);
|
|
55
|
+
animation-delay: calc(var(--animation-order, 0) * 20ms);
|
|
56
|
+
animation-fill-mode: both;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ============================================================================
|
|
60
|
+
TITLE 3D ROTATIONS
|
|
61
|
+
============================================================================ */
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Title Rotate Up (direction-aware)
|
|
65
|
+
* Usado cuando navegamos hacia arriba en el sidebar
|
|
66
|
+
*/
|
|
67
|
+
@keyframes tooltip-title-rotate-up {
|
|
68
|
+
from {
|
|
69
|
+
transform: rotateX(0deg);
|
|
70
|
+
opacity: 1;
|
|
71
|
+
}
|
|
72
|
+
to {
|
|
73
|
+
transform: rotateX(-90deg);
|
|
74
|
+
opacity: 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@keyframes tooltip-title-enter-from-below {
|
|
79
|
+
from {
|
|
80
|
+
transform: rotateX(90deg);
|
|
81
|
+
opacity: 0;
|
|
82
|
+
}
|
|
83
|
+
to {
|
|
84
|
+
transform: rotateX(0deg);
|
|
85
|
+
opacity: 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Title Rotate Down (direction-aware)
|
|
91
|
+
* Usado cuando navegamos hacia abajo en el sidebar
|
|
92
|
+
*/
|
|
93
|
+
@keyframes tooltip-title-rotate-down {
|
|
94
|
+
from {
|
|
95
|
+
transform: rotateX(0deg);
|
|
96
|
+
opacity: 1;
|
|
97
|
+
}
|
|
98
|
+
to {
|
|
99
|
+
transform: rotateX(90deg);
|
|
100
|
+
opacity: 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@keyframes tooltip-title-enter-from-above {
|
|
105
|
+
from {
|
|
106
|
+
transform: rotateX(-90deg);
|
|
107
|
+
opacity: 0;
|
|
108
|
+
}
|
|
109
|
+
to {
|
|
110
|
+
transform: rotateX(0deg);
|
|
111
|
+
opacity: 1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Title States
|
|
117
|
+
*/
|
|
118
|
+
.tooltip-title[data-direction="up"][data-state="leaving"] {
|
|
119
|
+
animation: tooltip-title-rotate-up 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.tooltip-title[data-direction="up"][data-state="entering"] {
|
|
123
|
+
animation: tooltip-title-enter-from-below 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.tooltip-title[data-direction="down"][data-state="leaving"] {
|
|
127
|
+
animation: tooltip-title-rotate-down 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.tooltip-title[data-direction="down"][data-state="entering"] {
|
|
131
|
+
animation: tooltip-title-enter-from-above 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* ============================================================================
|
|
135
|
+
3D CUBE FACES (Enfoque A: Multi-cara)
|
|
136
|
+
============================================================================ */
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cubo 3D con 6 caras para títulos
|
|
140
|
+
*
|
|
141
|
+
* Estructura:
|
|
142
|
+
* .title-scene (perspective)
|
|
143
|
+
* └─ .title-cube (preserve-3d)
|
|
144
|
+
* ├─ .title-face--front
|
|
145
|
+
* ├─ .title-face--back
|
|
146
|
+
* ├─ .title-face--top
|
|
147
|
+
* ├─ .title-face--bottom
|
|
148
|
+
* ├─ .title-face--left
|
|
149
|
+
* └─ .title-face--right
|
|
150
|
+
*/
|
|
151
|
+
|
|
152
|
+
.title-scene {
|
|
153
|
+
perspective: 600px;
|
|
154
|
+
position: relative;
|
|
155
|
+
width: 100%;
|
|
156
|
+
height: 2rem;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.title-cube {
|
|
160
|
+
width: 100%;
|
|
161
|
+
height: 100%;
|
|
162
|
+
position: relative;
|
|
163
|
+
transform-style: preserve-3d;
|
|
164
|
+
transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
165
|
+
/* Empujar hacia atrás para evitar blur en texto */
|
|
166
|
+
transform: translateZ(-1rem);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.title-face {
|
|
170
|
+
position: absolute;
|
|
171
|
+
width: 100%;
|
|
172
|
+
height: 100%;
|
|
173
|
+
backface-visibility: hidden;
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
justify-content: flex-start;
|
|
177
|
+
padding: 0 1rem;
|
|
178
|
+
font-weight: 500;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* Posicionamiento de caras - Vertical rotation (rotateX) */
|
|
182
|
+
.title-face--front {
|
|
183
|
+
transform: rotateX(0deg) translateZ(1rem);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.title-face--top {
|
|
187
|
+
transform: rotateX(90deg) translateZ(1rem);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.title-face--bottom {
|
|
191
|
+
transform: rotateX(-90deg) translateZ(1rem);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.title-face--back {
|
|
195
|
+
transform: rotateX(180deg) translateZ(1rem);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* Estados del cubo - Direction-aware */
|
|
199
|
+
.title-cube[data-face="front"] {
|
|
200
|
+
transform: translateZ(-1rem) rotateX(0deg);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.title-cube[data-face="top"] {
|
|
204
|
+
transform: translateZ(-1rem) rotateX(-90deg);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.title-cube[data-face="bottom"] {
|
|
208
|
+
transform: translateZ(-1rem) rotateX(90deg);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.title-cube[data-face="back"] {
|
|
212
|
+
transform: translateZ(-1rem) rotateX(180deg);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* ============================================================================
|
|
216
|
+
GRID HEIGHT TRANSITION (Grid Trick)
|
|
217
|
+
============================================================================ */
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Grid trick para height: auto transitions
|
|
221
|
+
*
|
|
222
|
+
* Técnica: grid-template-rows: 0fr → 1fr
|
|
223
|
+
* Browser support: Chrome 107+, Firefox 117+, Safari 16.4+
|
|
224
|
+
*/
|
|
225
|
+
|
|
226
|
+
.tooltip-content-grid {
|
|
227
|
+
display: grid;
|
|
228
|
+
grid-template-rows: 0fr;
|
|
229
|
+
transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
230
|
+
transition-delay: 50ms; /* Empieza después del fade-out de items */
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.tooltip-content-grid[data-state="open"] {
|
|
234
|
+
grid-template-rows: 1fr;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.tooltip-content-inner {
|
|
238
|
+
overflow: hidden;
|
|
239
|
+
min-height: 0; /* Crítico para que grid trick funcione */
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* ============================================================================
|
|
243
|
+
UTILITY CLASSES
|
|
244
|
+
============================================================================ */
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Contenedor con perspective para títulos crossfade
|
|
248
|
+
*/
|
|
249
|
+
.tooltip-title-perspective {
|
|
250
|
+
perspective: 600px;
|
|
251
|
+
position: relative;
|
|
252
|
+
width: 100%;
|
|
253
|
+
height: 2rem;
|
|
254
|
+
overflow: hidden;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Disable animations durante hover rápido (opcional)
|
|
259
|
+
* Usar con cuidado: puede causar flickering
|
|
260
|
+
*/
|
|
261
|
+
.tooltip-no-animations * {
|
|
262
|
+
animation: none !important;
|
|
263
|
+
transition: none !important;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* ============================================================================
|
|
267
|
+
DEBUG HELPERS
|
|
268
|
+
============================================================================ */
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Visualización de estados en debug mode
|
|
272
|
+
*/
|
|
273
|
+
[data-tooltip-debug="true"] .sidebar-sublink[data-state]::before {
|
|
274
|
+
content: attr(data-state);
|
|
275
|
+
position: absolute;
|
|
276
|
+
top: 0;
|
|
277
|
+
right: 0;
|
|
278
|
+
font-size: 8px;
|
|
279
|
+
background: rgba(255, 0, 0, 0.8);
|
|
280
|
+
color: white;
|
|
281
|
+
padding: 2px 4px;
|
|
282
|
+
border-radius: 2px;
|
|
283
|
+
pointer-events: none;
|
|
284
|
+
z-index: 1000;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
[data-tooltip-debug="true"] .tooltip-title[data-direction]::after {
|
|
288
|
+
content: "dir:" attr(data-direction);
|
|
289
|
+
position: absolute;
|
|
290
|
+
bottom: 0;
|
|
291
|
+
left: 0;
|
|
292
|
+
font-size: 8px;
|
|
293
|
+
background: rgba(0, 0, 255, 0.8);
|
|
294
|
+
color: white;
|
|
295
|
+
padding: 2px 4px;
|
|
296
|
+
border-radius: 2px;
|
|
297
|
+
pointer-events: none;
|
|
298
|
+
z-index: 1000;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* ============================================================================
|
|
302
|
+
PERFORMANCE OPTIMIZATIONS
|
|
303
|
+
============================================================================ */
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* GPU acceleration hints
|
|
307
|
+
*/
|
|
308
|
+
.sidebar-sublink[data-state],
|
|
309
|
+
.tooltip-title[data-state],
|
|
310
|
+
.title-cube {
|
|
311
|
+
will-change: transform, opacity;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Contain layout/paint/style para mejor performance
|
|
316
|
+
*/
|
|
317
|
+
.tooltip-content-grid {
|
|
318
|
+
contain: layout style paint;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Reduce motion para accesibilidad
|
|
323
|
+
*/
|
|
324
|
+
@media (prefers-reduced-motion: reduce) {
|
|
325
|
+
.sidebar-sublink[data-state],
|
|
326
|
+
.tooltip-title[data-state],
|
|
327
|
+
.title-cube,
|
|
328
|
+
.tooltip-content-grid {
|
|
329
|
+
animation-duration: 0.01ms !important;
|
|
330
|
+
animation-iteration-count: 1 !important;
|
|
331
|
+
transition-duration: 0.01ms !important;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
/* react-ui/blocks/Terminal/panel/TerminalFilterDropdown/terminal-filter-dropdown.module.css */
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* TerminalFilterDropdown Styles.
|
|
341
|
+
*
|
|
342
|
+
* Uses CSS Anchor Positioning API for dropdown placement.
|
|
343
|
+
* Button acts as anchor, dropdown is positioned relative to it
|
|
344
|
+
* with automatic flip behavior at viewport edges.
|
|
345
|
+
*
|
|
346
|
+
* @module components/devenv/terminal/panel/terminal-filter-dropdown/styles
|
|
347
|
+
*/
|
|
348
|
+
|
|
349
|
+
/* Trigger button - acts as CSS anchor */
|
|
350
|
+
.triggerButton {
|
|
351
|
+
anchor-name: --filter-dropdown-anchor;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* Dropdown menu - anchored to trigger button */
|
|
355
|
+
.dropdownMenu {
|
|
356
|
+
position-anchor: --filter-dropdown-anchor;
|
|
357
|
+
position: fixed;
|
|
358
|
+
|
|
359
|
+
/* Position below and left-aligned */
|
|
360
|
+
left: anchor(left);
|
|
361
|
+
top: anchor(bottom);
|
|
362
|
+
margin-top: 4px;
|
|
363
|
+
|
|
364
|
+
/* Flip to above if no room below */
|
|
365
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
366
|
+
|
|
367
|
+
min-width: 180px;
|
|
368
|
+
z-index: 50;
|
|
369
|
+
|
|
370
|
+
/* Hidden by default */
|
|
371
|
+
display: none;
|
|
372
|
+
opacity: 0;
|
|
373
|
+
transform: translateY(-4px);
|
|
374
|
+
transition: opacity 0.15s ease-out, transform 0.15s ease-out;
|
|
375
|
+
pointer-events: none;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.dropdownMenu[data-open="true"] {
|
|
379
|
+
display: block;
|
|
380
|
+
opacity: 1;
|
|
381
|
+
transform: translateY(0);
|
|
382
|
+
pointer-events: auto;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* Fallback for browsers without CSS Anchor Positioning */
|
|
386
|
+
@supports not (anchor-name: none) {
|
|
387
|
+
.dropdownMenu {
|
|
388
|
+
position: absolute;
|
|
389
|
+
left: 0;
|
|
390
|
+
top: calc(100% + 4px);
|
|
391
|
+
z-index: 50;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.dropdownMenu[data-open="true"] {
|
|
395
|
+
display: block;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
/* react-ui/blocks/Terminal/panel/TerminalSessionTabs/terminal-session-tabs.module.css */
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* TerminalSessionTabs Dropdown Styles.
|
|
405
|
+
*
|
|
406
|
+
* Uses CSS Anchor Positioning API for the "add container" dropdown.
|
|
407
|
+
* The + button acts as anchor, dropdown is positioned below it
|
|
408
|
+
* with automatic flip behavior at viewport edges.
|
|
409
|
+
*
|
|
410
|
+
* @module components/devenv/terminal/panel/terminal-session-tabs/styles
|
|
411
|
+
*/
|
|
412
|
+
|
|
413
|
+
/* + button - acts as CSS anchor */
|
|
414
|
+
.addButton {
|
|
415
|
+
anchor-name: --session-tabs-add-anchor;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/* Container dropdown - anchored to + button */
|
|
419
|
+
.containerDropdown {
|
|
420
|
+
position-anchor: --session-tabs-add-anchor;
|
|
421
|
+
position: fixed;
|
|
422
|
+
|
|
423
|
+
/* Position below and left-aligned */
|
|
424
|
+
left: anchor(left);
|
|
425
|
+
top: anchor(bottom);
|
|
426
|
+
margin-top: 4px;
|
|
427
|
+
|
|
428
|
+
/* Flip to above if no room below */
|
|
429
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
430
|
+
|
|
431
|
+
min-width: 200px;
|
|
432
|
+
z-index: 50;
|
|
433
|
+
|
|
434
|
+
/* Hidden by default */
|
|
435
|
+
display: none;
|
|
436
|
+
opacity: 0;
|
|
437
|
+
transform: translateY(-4px);
|
|
438
|
+
transition: opacity 0.15s ease-out, transform 0.15s ease-out;
|
|
439
|
+
pointer-events: none;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.containerDropdown[data-open="true"] {
|
|
443
|
+
display: block;
|
|
444
|
+
opacity: 1;
|
|
445
|
+
transform: translateY(0);
|
|
446
|
+
pointer-events: auto;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/* Fallback for browsers without CSS Anchor Positioning */
|
|
450
|
+
@supports not (anchor-name: none) {
|
|
451
|
+
.containerDropdown {
|
|
452
|
+
position: absolute;
|
|
453
|
+
left: 0;
|
|
454
|
+
top: calc(100% + 4px);
|
|
455
|
+
z-index: 50;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.containerDropdown[data-open="true"] {
|
|
459
|
+
display: block;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
/* react-ui/components/MorphingPopover/morphing-popover.module.css */
|
|
466
|
+
|
|
467
|
+
/* CSS Variables for anchor positioning */
|
|
468
|
+
.morphingPopoverContainer {
|
|
469
|
+
position: relative;
|
|
470
|
+
display: inline-block;
|
|
471
|
+
--anchor-name: morphing-trigger;
|
|
472
|
+
--target-width: 220px;
|
|
473
|
+
--target-height: 120px;
|
|
474
|
+
--transition-duration: 0.2s;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* Trigger button styles */
|
|
478
|
+
.morphingTrigger {
|
|
479
|
+
anchor-name: var(--anchor-name);
|
|
480
|
+
width: 44px;
|
|
481
|
+
aspect-ratio: 1;
|
|
482
|
+
border-radius: 50%;
|
|
483
|
+
display: grid;
|
|
484
|
+
place-items: center;
|
|
485
|
+
font-size: 24px;
|
|
486
|
+
cursor: pointer;
|
|
487
|
+
border: none;
|
|
488
|
+
background: transparent;
|
|
489
|
+
transition: background-color 0.2s;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.morphingTrigger:hover {
|
|
493
|
+
background-color: hsl(var(--muted) / 0.5);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/* Popover styles - anchored to trigger by default */
|
|
497
|
+
.morphingPopover {
|
|
498
|
+
position-anchor: var(--anchor-name);
|
|
499
|
+
left: anchor(left);
|
|
500
|
+
top: anchor(top);
|
|
501
|
+
width: anchor-size(width);
|
|
502
|
+
min-height: 0;
|
|
503
|
+
border-radius: 50%;
|
|
504
|
+
overflow: hidden;
|
|
505
|
+
padding: 0;
|
|
506
|
+
height: anchor-size(height);
|
|
507
|
+
transition-behavior: allow-discrete;
|
|
508
|
+
transition-property: display, overlay, width, height, top,
|
|
509
|
+
border-radius, left, position-anchor, transform, opacity;
|
|
510
|
+
transition-duration: var(--transition-duration);
|
|
511
|
+
transition-timing-function: ease-out;
|
|
512
|
+
transform-origin: center center;
|
|
513
|
+
opacity: 0;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/* When popover is open - expand to target size */
|
|
517
|
+
.morphingPopover:popover-open {
|
|
518
|
+
position-anchor: fixed;
|
|
519
|
+
left: 50%;
|
|
520
|
+
top: 50%;
|
|
521
|
+
transform: translate(-50%, -50%);
|
|
522
|
+
width: var(--target-width);
|
|
523
|
+
height: var(--target-height);
|
|
524
|
+
border-radius: 12px;
|
|
525
|
+
opacity: 1;
|
|
526
|
+
border: 1px solid hsl(var(--border));
|
|
527
|
+
background: hsl(var(--background));
|
|
528
|
+
box-shadow: 0 10px 40px -10px hsl(var(--foreground) / 0.3);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/* Starting style for animation - browser support required */
|
|
532
|
+
@starting-style {
|
|
533
|
+
.morphingPopover:popover-open {
|
|
534
|
+
position-anchor: var(--anchor-name);
|
|
535
|
+
left: anchor(left);
|
|
536
|
+
top: anchor(top);
|
|
537
|
+
transform: none;
|
|
538
|
+
border-radius: 50%;
|
|
539
|
+
width: anchor-size(width);
|
|
540
|
+
height: anchor-size(height);
|
|
541
|
+
opacity: 0;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/* Fallback for browsers without anchor positioning */
|
|
546
|
+
@supports not (anchor-name: none) {
|
|
547
|
+
.morphingPopover {
|
|
548
|
+
position: fixed;
|
|
549
|
+
left: 50%;
|
|
550
|
+
top: 50%;
|
|
551
|
+
transform: translate(-50%, -50%) scale(0.8);
|
|
552
|
+
opacity: 0;
|
|
553
|
+
pointer-events: none;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
.morphingPopover:popover-open {
|
|
557
|
+
transform: translate(-50%, -50%) scale(1);
|
|
558
|
+
opacity: 1;
|
|
559
|
+
pointer-events: auto;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
@starting-style {
|
|
563
|
+
.morphingPopover:popover-open {
|
|
564
|
+
transform: translate(-50%, -50%) scale(0.8);
|
|
565
|
+
opacity: 0;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/* Variant: Morphing to a specific target element */
|
|
571
|
+
.morphingPopoverTargetContainer {
|
|
572
|
+
position: relative;
|
|
573
|
+
display: inline-block;
|
|
574
|
+
--anchor-name: morphing-trigger;
|
|
575
|
+
--target-anchor-name: morphing-target;
|
|
576
|
+
--transition-duration: 0.2s;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
.morphingPopoverTarget {
|
|
580
|
+
position-anchor: var(--anchor-name);
|
|
581
|
+
left: anchor(left);
|
|
582
|
+
top: anchor(top);
|
|
583
|
+
width: anchor-size(width);
|
|
584
|
+
min-height: 0;
|
|
585
|
+
border-radius: 50%;
|
|
586
|
+
overflow: hidden;
|
|
587
|
+
padding: 0;
|
|
588
|
+
height: anchor-size(height);
|
|
589
|
+
transition-behavior: allow-discrete;
|
|
590
|
+
transition-property: display, overlay, width, height, top,
|
|
591
|
+
border-radius, left, position-anchor, transform, opacity;
|
|
592
|
+
transition-duration: var(--transition-duration);
|
|
593
|
+
transition-timing-function: ease-out;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
.morphingPopoverTarget:popover-open {
|
|
597
|
+
position-anchor: var(--target-anchor-name);
|
|
598
|
+
left: anchor(left);
|
|
599
|
+
top: anchor(top);
|
|
600
|
+
border-radius: 12px;
|
|
601
|
+
min-width: 200px;
|
|
602
|
+
min-height: 120px;
|
|
603
|
+
border: 1px solid hsl(var(--border));
|
|
604
|
+
background: hsl(var(--background));
|
|
605
|
+
box-shadow: 0 10px 40px -10px hsl(var(--foreground) / 0.3);
|
|
606
|
+
opacity: 1;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
@starting-style {
|
|
610
|
+
.morphingPopoverTarget:popover-open {
|
|
611
|
+
position-anchor: var(--anchor-name);
|
|
612
|
+
left: anchor(left);
|
|
613
|
+
top: anchor(top);
|
|
614
|
+
border-radius: 50%;
|
|
615
|
+
width: anchor-size(width);
|
|
616
|
+
height: anchor-size(height);
|
|
617
|
+
opacity: 0;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
/* react-ui/primitives/DotMatrix/dot.css */
|
|
624
|
+
|
|
625
|
+
/* =============================================================================
|
|
626
|
+
* DotMatrix — progressive fill model.
|
|
627
|
+
*
|
|
628
|
+
* Cells light up one at a time in `pattern` order, stay lit until the
|
|
629
|
+
* cycle resets, then repeat. Implementation uses ONE CSS animation per
|
|
630
|
+
* matrix that drives a registered custom property `--dm-phase` from
|
|
631
|
+
* 0 → 1 (fill), holds it at 1 (hold), then snaps back to 0 (reset)
|
|
632
|
+
* for a rest period.
|
|
633
|
+
*
|
|
634
|
+
* Each cell carries a `--dm-threshold` (its position in the fill
|
|
635
|
+
* sequence, 0..1) and computes its own `::before` opacity as a step
|
|
636
|
+
* across `phase - threshold`, multiplied by `--dm-edge-sharpness` so
|
|
637
|
+
* the edge can range from "instant snap" to "warm fade".
|
|
638
|
+
*
|
|
639
|
+
* Perf shape: N matrices = N animations total (not N × cells). Cell
|
|
640
|
+
* opacity is computed at paint time by calc(); the compositor batches
|
|
641
|
+
* updates via the shared phase var. With `contain: layout style paint`
|
|
642
|
+
* each cell is isolated so work doesn't cascade.
|
|
643
|
+
* ============================================================================= */
|
|
644
|
+
|
|
645
|
+
@property --dm-phase {
|
|
646
|
+
syntax: '<number>';
|
|
647
|
+
initial-value: 0;
|
|
648
|
+
inherits: true;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
.dm-root {
|
|
652
|
+
display: grid;
|
|
653
|
+
width: 100%;
|
|
654
|
+
gap: var(--dm-gap, 5px);
|
|
655
|
+
padding: var(--dm-pad, 0.25rem);
|
|
656
|
+
border-radius: 0.5rem;
|
|
657
|
+
background-color: transparent;
|
|
658
|
+
|
|
659
|
+
/* Skip render work when the matrix is offscreen. */
|
|
660
|
+
content-visibility: auto;
|
|
661
|
+
contain-intrinsic-size: auto 200px;
|
|
662
|
+
transform: translateZ(0);
|
|
663
|
+
|
|
664
|
+
--dm-on: var(--foreground);
|
|
665
|
+
--dm-off: color-mix(in oklch, var(--foreground) 12%, transparent);
|
|
666
|
+
--dm-glow: color-mix(in oklch, var(--foreground) 50%, transparent);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/* ─── Cell: base OFF layer — neutral dim ──────────────────────────────── */
|
|
670
|
+
|
|
671
|
+
.dm-cell {
|
|
672
|
+
position: relative;
|
|
673
|
+
aspect-ratio: 1 / 1;
|
|
674
|
+
min-width: 4px;
|
|
675
|
+
min-height: 4px;
|
|
676
|
+
border-radius: var(--dm-radius, 32%);
|
|
677
|
+
background-color: color-mix(in oklch, var(--foreground) 10%, transparent);
|
|
678
|
+
opacity: var(--dm-off-opacity, 0.45);
|
|
679
|
+
transform: scale(var(--dm-off-scale, 0.9));
|
|
680
|
+
contain: layout style paint;
|
|
681
|
+
|
|
682
|
+
--dm-threshold: 0;
|
|
683
|
+
--dm-stagger-delay: 0ms;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/* ─── Pseudo: ON layer — LED look, fades in as phase crosses threshold ─ */
|
|
687
|
+
|
|
688
|
+
.dm-cell::before {
|
|
689
|
+
content: '';
|
|
690
|
+
position: absolute;
|
|
691
|
+
inset: 0;
|
|
692
|
+
border-radius: inherit;
|
|
693
|
+
background-color: var(--dm-on);
|
|
694
|
+
background-image:
|
|
695
|
+
radial-gradient(
|
|
696
|
+
circle at 32% 26%,
|
|
697
|
+
rgb(255 255 255 / 0.35) 0%,
|
|
698
|
+
rgb(255 255 255 / 0.12) 18%,
|
|
699
|
+
transparent 48%
|
|
700
|
+
),
|
|
701
|
+
radial-gradient(
|
|
702
|
+
circle at 70% 78%,
|
|
703
|
+
rgb(0 0 0 / 0.22) 0%,
|
|
704
|
+
transparent 60%
|
|
705
|
+
);
|
|
706
|
+
box-shadow:
|
|
707
|
+
inset 0 0 1px rgb(255 255 255 / 0.55),
|
|
708
|
+
inset 0 0 0 1px color-mix(in oklch, var(--dm-on) 65%, transparent),
|
|
709
|
+
inset 0 -1px 2px color-mix(in oklch, var(--dm-on) 40%, black 20%);
|
|
710
|
+
opacity: 0;
|
|
711
|
+
pointer-events: none;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
.dm-root[data-variant='glow'] .dm-cell::before {
|
|
715
|
+
box-shadow:
|
|
716
|
+
inset 0 0 1px rgb(255 255 255 / 0.55),
|
|
717
|
+
inset 0 0 0 1px color-mix(in oklch, var(--dm-on) 65%, transparent),
|
|
718
|
+
inset 0 -1px 2px color-mix(in oklch, var(--dm-on) 40%, black 20%),
|
|
719
|
+
0 0 2px var(--dm-glow),
|
|
720
|
+
0 0 6px var(--dm-glow),
|
|
721
|
+
0 0 12px color-mix(in oklch, var(--dm-glow) 55%, transparent);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/* ─── Running: phase animates on root, cells derive state from it ────── */
|
|
725
|
+
|
|
726
|
+
.dm-root[data-status='running'] {
|
|
727
|
+
animation-name: var(--dm-anim-phase);
|
|
728
|
+
animation-duration: var(--dm-cycle-total, 2600ms);
|
|
729
|
+
animation-iteration-count: infinite;
|
|
730
|
+
animation-timing-function: linear;
|
|
731
|
+
animation-fill-mode: both;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/* Lit fraction for THIS cell — 0 when off, 1 when fully filled, ramped
|
|
735
|
+
* near the threshold by `--dm-edge-sharpness`. Reused by both the pseudo
|
|
736
|
+
* opacity (the LED glow) and the cell's scale (grows when lit). */
|
|
737
|
+
.dm-root[data-status='running'] .dm-cell {
|
|
738
|
+
opacity: 1;
|
|
739
|
+
transform: scale(
|
|
740
|
+
calc(
|
|
741
|
+
var(--dm-off-scale, 0.88) +
|
|
742
|
+
(var(--dm-on-scale, 1) - var(--dm-off-scale, 0.88)) *
|
|
743
|
+
clamp(
|
|
744
|
+
0,
|
|
745
|
+
(var(--dm-phase) - var(--dm-threshold)) *
|
|
746
|
+
var(--dm-edge-sharpness, 50),
|
|
747
|
+
1
|
|
748
|
+
)
|
|
749
|
+
)
|
|
750
|
+
);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.dm-root[data-status='running'] .dm-cell::before {
|
|
754
|
+
opacity: clamp(
|
|
755
|
+
0,
|
|
756
|
+
calc(
|
|
757
|
+
(var(--dm-phase) - var(--dm-threshold)) *
|
|
758
|
+
var(--dm-edge-sharpness, 50)
|
|
759
|
+
),
|
|
760
|
+
1
|
|
761
|
+
);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
/* ─── Accent cells ────────────────────────────────────────────────────── */
|
|
765
|
+
|
|
766
|
+
.dm-cell[data-accent='true'] {
|
|
767
|
+
opacity: 1;
|
|
768
|
+
transform: scale(1);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.dm-cell[data-accent='true']::before {
|
|
772
|
+
background-color: var(--primary);
|
|
773
|
+
background-image: none;
|
|
774
|
+
box-shadow:
|
|
775
|
+
inset 0 0 1px rgb(255 255 255 / 0.5),
|
|
776
|
+
0 0 3px color-mix(in oklch, var(--primary) 70%, transparent),
|
|
777
|
+
0 0 7px color-mix(in oklch, var(--primary) 50%, transparent);
|
|
778
|
+
opacity: 1 !important;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/* ─── Lifecycle FINAL animations ──────────────────────────────────────── */
|
|
782
|
+
|
|
783
|
+
@keyframes dm-success-pop {
|
|
784
|
+
0% {
|
|
785
|
+
transform: scale(0.94);
|
|
786
|
+
filter: brightness(0.7);
|
|
787
|
+
}
|
|
788
|
+
45% {
|
|
789
|
+
transform: scale(1.18);
|
|
790
|
+
filter: brightness(1.4);
|
|
791
|
+
}
|
|
792
|
+
100% {
|
|
793
|
+
transform: scale(1);
|
|
794
|
+
filter: brightness(1);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
@keyframes dm-fail-strobe {
|
|
799
|
+
0% {
|
|
800
|
+
transform: scale(1);
|
|
801
|
+
filter: brightness(1);
|
|
802
|
+
}
|
|
803
|
+
22% {
|
|
804
|
+
transform: scale(1.22);
|
|
805
|
+
filter: brightness(1.55) saturate(1.4);
|
|
806
|
+
}
|
|
807
|
+
55% {
|
|
808
|
+
transform: scale(0.92);
|
|
809
|
+
filter: brightness(0.75);
|
|
810
|
+
}
|
|
811
|
+
100% {
|
|
812
|
+
transform: scale(0.97);
|
|
813
|
+
filter: brightness(1);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
@keyframes dm-cancelled-dim {
|
|
818
|
+
0% {
|
|
819
|
+
transform: scale(1);
|
|
820
|
+
opacity: 1;
|
|
821
|
+
}
|
|
822
|
+
100% {
|
|
823
|
+
transform: scale(0.9);
|
|
824
|
+
opacity: 0.55;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
.dm-root[data-status='success'] {
|
|
829
|
+
animation: none;
|
|
830
|
+
}
|
|
831
|
+
.dm-root[data-status='success'] .dm-cell {
|
|
832
|
+
opacity: 1;
|
|
833
|
+
transform: scale(1);
|
|
834
|
+
animation: dm-success-pop 520ms cubic-bezier(0.2, 0, 0.2, 1) both;
|
|
835
|
+
animation-delay: var(--dm-stagger-delay, 0ms);
|
|
836
|
+
}
|
|
837
|
+
.dm-root[data-status='success'] .dm-cell::before {
|
|
838
|
+
opacity: 1;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
.dm-root[data-status='failed'] {
|
|
842
|
+
animation: none;
|
|
843
|
+
}
|
|
844
|
+
.dm-root[data-status='failed'] .dm-cell {
|
|
845
|
+
opacity: 1;
|
|
846
|
+
animation: dm-fail-strobe 560ms cubic-bezier(0.2, 0, 0.2, 1) both;
|
|
847
|
+
animation-delay: var(--dm-stagger-delay, 0ms);
|
|
848
|
+
}
|
|
849
|
+
.dm-root[data-status='failed'] .dm-cell::before {
|
|
850
|
+
background-color: var(--destructive);
|
|
851
|
+
box-shadow:
|
|
852
|
+
inset 0 0 1px rgb(255 255 255 / 0.5),
|
|
853
|
+
inset 0 0 0 1px color-mix(in oklch, var(--destructive) 55%, transparent),
|
|
854
|
+
inset 0 -1px 2px color-mix(in oklch, var(--destructive) 40%, black 20%);
|
|
855
|
+
opacity: 1;
|
|
856
|
+
}
|
|
857
|
+
.dm-root[data-status='failed'][data-variant='glow'] .dm-cell::before {
|
|
858
|
+
box-shadow:
|
|
859
|
+
inset 0 0 1px rgb(255 255 255 / 0.55),
|
|
860
|
+
inset 0 0 0 1px color-mix(in oklch, var(--destructive) 55%, transparent),
|
|
861
|
+
inset 0 -1px 2px color-mix(in oklch, var(--destructive) 40%, black 20%),
|
|
862
|
+
0 0 3px color-mix(in oklch, var(--destructive) 70%, transparent),
|
|
863
|
+
0 0 9px color-mix(in oklch, var(--destructive) 55%, transparent);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
.dm-root[data-status='cancelled'] {
|
|
867
|
+
animation: none;
|
|
868
|
+
}
|
|
869
|
+
.dm-root[data-status='cancelled'] .dm-cell {
|
|
870
|
+
background-color: color-mix(in oklch, var(--foreground) 22%, transparent);
|
|
871
|
+
opacity: 0.65;
|
|
872
|
+
animation: dm-cancelled-dim 380ms cubic-bezier(0.4, 0, 0.8, 0.6) both;
|
|
873
|
+
animation-delay: var(--dm-stagger-delay, 0ms);
|
|
874
|
+
}
|
|
875
|
+
.dm-root[data-status='cancelled'] .dm-cell::before {
|
|
876
|
+
opacity: 0;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
.dm-root[data-status='idle'] {
|
|
880
|
+
animation: none;
|
|
881
|
+
}
|
|
882
|
+
.dm-root[data-status='idle'] .dm-cell::before {
|
|
883
|
+
opacity: 0;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/* ─── Theme-token palettes ────────────────────────────────────────────── */
|
|
887
|
+
|
|
888
|
+
.dm--foreground {
|
|
889
|
+
--dm-on: var(--foreground);
|
|
890
|
+
--dm-off: color-mix(in oklch, var(--foreground) 12%, transparent);
|
|
891
|
+
--dm-glow: color-mix(in oklch, var(--foreground) 55%, transparent);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
.dm--primary {
|
|
895
|
+
--dm-on: var(--primary);
|
|
896
|
+
--dm-off: color-mix(in oklch, var(--primary) 14%, transparent);
|
|
897
|
+
--dm-glow: color-mix(in oklch, var(--primary) 65%, transparent);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
.dm--destructive {
|
|
901
|
+
--dm-on: var(--destructive);
|
|
902
|
+
--dm-off: color-mix(in oklch, var(--destructive) 14%, transparent);
|
|
903
|
+
--dm-glow: color-mix(in oklch, var(--destructive) 65%, transparent);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
.dm--warning {
|
|
907
|
+
--dm-on: var(--warning);
|
|
908
|
+
--dm-off: color-mix(in oklch, var(--warning) 14%, transparent);
|
|
909
|
+
--dm-glow: color-mix(in oklch, var(--warning) 65%, transparent);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
/* ─── Named palettes (OKLCH for stability) ────────────────────────────── */
|
|
913
|
+
|
|
914
|
+
.dm--cyan {
|
|
915
|
+
--dm-on: oklch(90% 0.2 195);
|
|
916
|
+
--dm-off: oklch(40% 0.08 195 / 0.4);
|
|
917
|
+
--dm-glow: oklch(80% 0.25 195 / 0.95);
|
|
918
|
+
}
|
|
919
|
+
.dm--magenta {
|
|
920
|
+
--dm-on: oklch(85% 0.25 330);
|
|
921
|
+
--dm-off: oklch(40% 0.08 330 / 0.4);
|
|
922
|
+
--dm-glow: oklch(75% 0.3 330 / 0.95);
|
|
923
|
+
}
|
|
924
|
+
.dm--yellow {
|
|
925
|
+
--dm-on: oklch(95% 0.2 90);
|
|
926
|
+
--dm-off: oklch(50% 0.08 90 / 0.4);
|
|
927
|
+
--dm-glow: oklch(90% 0.25 90 / 0.95);
|
|
928
|
+
}
|
|
929
|
+
.dm--green {
|
|
930
|
+
--dm-on: oklch(90% 0.25 145);
|
|
931
|
+
--dm-off: oklch(40% 0.08 145 / 0.4);
|
|
932
|
+
--dm-glow: oklch(80% 0.3 145 / 0.95);
|
|
933
|
+
}
|
|
934
|
+
.dm--orange {
|
|
935
|
+
--dm-on: oklch(85% 0.22 50);
|
|
936
|
+
--dm-off: oklch(45% 0.08 50 / 0.4);
|
|
937
|
+
--dm-glow: oklch(75% 0.28 50 / 0.95);
|
|
938
|
+
}
|
|
939
|
+
.dm--blue {
|
|
940
|
+
--dm-on: oklch(80% 0.22 260);
|
|
941
|
+
--dm-off: oklch(40% 0.08 260 / 0.4);
|
|
942
|
+
--dm-glow: oklch(70% 0.28 260 / 0.95);
|
|
943
|
+
}
|
|
944
|
+
.dm--red {
|
|
945
|
+
--dm-on: oklch(70% 0.25 25);
|
|
946
|
+
--dm-off: oklch(40% 0.08 25 / 0.4);
|
|
947
|
+
--dm-glow: oklch(60% 0.3 25 / 0.95);
|
|
948
|
+
}
|
|
949
|
+
.dm--purple {
|
|
950
|
+
--dm-on: oklch(75% 0.22 300);
|
|
951
|
+
--dm-off: oklch(40% 0.08 300 / 0.4);
|
|
952
|
+
--dm-glow: oklch(65% 0.28 300 / 0.95);
|
|
953
|
+
}
|
|
954
|
+
.dm--teal {
|
|
955
|
+
--dm-on: oklch(82% 0.18 175);
|
|
956
|
+
--dm-off: oklch(40% 0.08 175 / 0.4);
|
|
957
|
+
--dm-glow: oklch(72% 0.24 175 / 0.95);
|
|
958
|
+
}
|
|
959
|
+
.dm--pink {
|
|
960
|
+
--dm-on: oklch(80% 0.2 350);
|
|
961
|
+
--dm-off: oklch(45% 0.08 350 / 0.4);
|
|
962
|
+
--dm-glow: oklch(70% 0.26 350 / 0.95);
|
|
963
|
+
}
|
|
964
|
+
.dm--lime {
|
|
965
|
+
--dm-on: oklch(88% 0.22 120);
|
|
966
|
+
--dm-off: oklch(45% 0.08 120 / 0.4);
|
|
967
|
+
--dm-glow: oklch(80% 0.28 120 / 0.95);
|
|
968
|
+
}
|
|
969
|
+
.dm--white {
|
|
970
|
+
--dm-on: oklch(98% 0 0);
|
|
971
|
+
--dm-off: oklch(50% 0 0 / 0.3);
|
|
972
|
+
--dm-glow: oklch(95% 0 0 / 0.85);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/* ─── Reduced motion — freeze animations ─────────────────────────────── */
|
|
976
|
+
|
|
977
|
+
@media (prefers-reduced-motion: reduce) {
|
|
978
|
+
.dm-root[data-status='running'],
|
|
979
|
+
.dm-root[data-status='success'] .dm-cell,
|
|
980
|
+
.dm-root[data-status='failed'] .dm-cell,
|
|
981
|
+
.dm-root[data-status='cancelled'] .dm-cell {
|
|
982
|
+
animation: none !important;
|
|
983
|
+
}
|
|
984
|
+
.dm-cell {
|
|
985
|
+
transform: none;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
/* react-ui/primitives/GooeyMorphingSurface/gooey-morphing.css */
|
|
992
|
+
|
|
993
|
+
/* =============================================================================
|
|
994
|
+
* GooeyMorphingSurface — CSS layer for the SVG rect morph + HTML overlays.
|
|
995
|
+
*
|
|
996
|
+
* Classes are prefixed `.gms-*` so they act as a manual scope (mks-ui's
|
|
997
|
+
* rolldown build produces empty default-exports for CSS modules, so we use
|
|
998
|
+
* plain CSS with explicit classnames referenced as string literals from
|
|
999
|
+
* the component).
|
|
1000
|
+
*
|
|
1001
|
+
* Every tunable value comes from inline CSS custom props set by the React
|
|
1002
|
+
* component at the root element. No hard-coded dimensions or timings here.
|
|
1003
|
+
*
|
|
1004
|
+
* Technique recap: two <rect>s inside a <g filter="url(#gooey)">. Body rect
|
|
1005
|
+
* is a geometric CLONE of the pill when closed, and morphs into the card
|
|
1006
|
+
* geometry (x, y, width, height, rx, ry all interpolate) when open. The
|
|
1007
|
+
* gaussian-blur + alpha-threshold filter bends the overlapping silhouettes
|
|
1008
|
+
* into a single shape with a soft metaball throat.
|
|
1009
|
+
* ============================================================================= */
|
|
1010
|
+
|
|
1011
|
+
.gms-root {
|
|
1012
|
+
position: relative;
|
|
1013
|
+
display: inline-block;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
.gms-shell {
|
|
1017
|
+
position: relative;
|
|
1018
|
+
width: var(--gms-card-w);
|
|
1019
|
+
height: var(--gms-pill-h);
|
|
1020
|
+
color: var(--gms-fill);
|
|
1021
|
+
transition: height var(--gms-duration) var(--gms-ease);
|
|
1022
|
+
/* Drop-shadow follows the fused silhouette. Chained filters = additive
|
|
1023
|
+
* shadow layers for depth without a hard box-shadow. */
|
|
1024
|
+
filter: drop-shadow(0 16px 38px rgb(0 0 0 / 0.35))
|
|
1025
|
+
drop-shadow(0 4px 10px rgb(0 0 0 / 0.18));
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
.gms-shell[data-open='true'] {
|
|
1029
|
+
height: calc(var(--gms-pill-h) + var(--gms-card-h));
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
.gms-svg {
|
|
1033
|
+
position: absolute;
|
|
1034
|
+
top: 0;
|
|
1035
|
+
left: 50%;
|
|
1036
|
+
transform: translateX(-50%);
|
|
1037
|
+
display: block;
|
|
1038
|
+
overflow: visible;
|
|
1039
|
+
pointer-events: none;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
.gms-body-rect {
|
|
1043
|
+
will-change: x, y, width, height;
|
|
1044
|
+
transition:
|
|
1045
|
+
x var(--gms-duration) var(--gms-ease),
|
|
1046
|
+
y var(--gms-duration) var(--gms-ease),
|
|
1047
|
+
width var(--gms-duration) var(--gms-ease),
|
|
1048
|
+
height var(--gms-duration) var(--gms-ease),
|
|
1049
|
+
rx var(--gms-duration) var(--gms-ease),
|
|
1050
|
+
ry var(--gms-duration) var(--gms-ease);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
.gms-pill {
|
|
1054
|
+
position: absolute;
|
|
1055
|
+
top: 0;
|
|
1056
|
+
left: var(--gms-pill-x);
|
|
1057
|
+
width: var(--gms-pill-w);
|
|
1058
|
+
height: var(--gms-pill-h);
|
|
1059
|
+
display: inline-flex;
|
|
1060
|
+
align-items: center;
|
|
1061
|
+
justify-content: center;
|
|
1062
|
+
gap: 0.5rem;
|
|
1063
|
+
color: var(--card-foreground);
|
|
1064
|
+
pointer-events: none;
|
|
1065
|
+
z-index: 2;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
.gms-card {
|
|
1069
|
+
position: absolute;
|
|
1070
|
+
top: calc(var(--gms-pill-h) - var(--gms-overlap));
|
|
1071
|
+
left: 0;
|
|
1072
|
+
width: var(--gms-card-w);
|
|
1073
|
+
height: var(--gms-card-h);
|
|
1074
|
+
color: var(--card-foreground);
|
|
1075
|
+
opacity: 0;
|
|
1076
|
+
transform: translateY(4px);
|
|
1077
|
+
pointer-events: none;
|
|
1078
|
+
z-index: 2;
|
|
1079
|
+
overflow: hidden;
|
|
1080
|
+
border-radius: var(--gms-card-r);
|
|
1081
|
+
transition:
|
|
1082
|
+
opacity calc(var(--gms-duration) * 0.35) var(--gms-ease),
|
|
1083
|
+
transform calc(var(--gms-duration) * 0.35) var(--gms-ease);
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
.gms-shell[data-open='true'] .gms-card {
|
|
1087
|
+
opacity: 1;
|
|
1088
|
+
transform: translateY(0);
|
|
1089
|
+
pointer-events: auto;
|
|
1090
|
+
transition:
|
|
1091
|
+
opacity calc(var(--gms-duration) * 0.55) var(--gms-ease)
|
|
1092
|
+
calc(var(--gms-duration) * 0.45),
|
|
1093
|
+
transform calc(var(--gms-duration) * 0.55) var(--gms-ease)
|
|
1094
|
+
calc(var(--gms-duration) * 0.45);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1098
|
+
.gms-shell,
|
|
1099
|
+
.gms-body-rect,
|
|
1100
|
+
.gms-card {
|
|
1101
|
+
transition-duration: 0.01ms !important;
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
/* react-ui/primitives/waapi/Morph/techniques/useViewTransitions.module.css */
|
|
1108
|
+
|
|
1109
|
+
/**
|
|
1110
|
+
* View Transitions API - Default transition styles.
|
|
1111
|
+
*
|
|
1112
|
+
* These styles apply to all view-transition pseudo-elements by default,
|
|
1113
|
+
* eliminating the need for dynamic style injection based on transition names.
|
|
1114
|
+
*
|
|
1115
|
+
* Usage: Apply `view-transition-name` via inline style or CSS variable:
|
|
1116
|
+
* <div style={{ viewTransitionName: 'hero' }}>...</div>
|
|
1117
|
+
*
|
|
1118
|
+
* Or via CSS:
|
|
1119
|
+
* .my-element { view-transition-name: hero; }
|
|
1120
|
+
*/
|
|
1121
|
+
|
|
1122
|
+
/* Default animation for all view transitions */
|
|
1123
|
+
::view-transition-old(*),
|
|
1124
|
+
::view-transition-new(*) {
|
|
1125
|
+
animation-duration: 300ms;
|
|
1126
|
+
animation-timing-function: ease-out;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
/* react-ui/ui/DynamicToggle/DynamicToggle.css */
|
|
1132
|
+
|
|
1133
|
+
/**
|
|
1134
|
+
* DynamicToggle v2 — CSS state transitions.
|
|
1135
|
+
*
|
|
1136
|
+
* Rules requiring :has(), container queries, clip-path, or pseudo-elements.
|
|
1137
|
+
* Layout, colors, sizing in Tailwind (DynamicToggle.styles.ts).
|
|
1138
|
+
*
|
|
1139
|
+
* @import '@mks2508/mks-ui/react/ui/DynamicToggle/DynamicToggle.module.css';
|
|
1140
|
+
*/
|
|
1141
|
+
|
|
1142
|
+
/* ── Variables ── */
|
|
1143
|
+
[data-slot="dt-root"] {
|
|
1144
|
+
--dt-dur: 0.22s;
|
|
1145
|
+
--dt-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
1146
|
+
--dt-fade: 0.45;
|
|
1147
|
+
--dt-indicator-dur: 0.3s;
|
|
1148
|
+
--dt-indicator-ease: cubic-bezier(0.4, 0, 0.2, 1);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
/* ── Track: explicit row prevents h-full items from overflowing container ── */
|
|
1152
|
+
[data-slot="dt-root"] [data-slot="dt-track"] {
|
|
1153
|
+
grid-template-rows: minmax(0, 1fr);
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
/* ── Top-level option spans 2 grid cols ── */
|
|
1157
|
+
[data-slot="dt-root"] [data-slot="dt-track"] > label {
|
|
1158
|
+
grid-column: span 2;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
/* ── Primary option text ── */
|
|
1162
|
+
[data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) > label {
|
|
1163
|
+
color: var(--accent-foreground);
|
|
1164
|
+
z-index: 2;
|
|
1165
|
+
}
|
|
1166
|
+
[data-slot="dt-root"] [data-slot="dt-track"]:not(:has(> input:checked)) > label {
|
|
1167
|
+
color: var(--foreground);
|
|
1168
|
+
opacity: var(--dt-fade);
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
/* ── Group: container queries ── */
|
|
1172
|
+
[data-slot="dt-root"] [data-slot="dt-group"] {
|
|
1173
|
+
container-type: size;
|
|
1174
|
+
overflow: hidden;
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
/* ══════════════════════════════════════════════════════════
|
|
1178
|
+
* INDICATOR POSITIONING
|
|
1179
|
+
*
|
|
1180
|
+
* Modern: CSS Anchor Positioning — indicator follows active option
|
|
1181
|
+
* Fallback: translate-based positioning for older browsers
|
|
1182
|
+
* ══════════════════════════════════════════════════════════ */
|
|
1183
|
+
|
|
1184
|
+
/* ── Anchor-based indicator (requires full anchor API) ── */
|
|
1185
|
+
@supports (anchor-scope: all) {
|
|
1186
|
+
/* Scope anchors per toggle instance */
|
|
1187
|
+
[data-slot="dt-root"]:not([data-indicator="translate"]) {
|
|
1188
|
+
anchor-scope: --dt-active;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
/* Active option becomes the anchor via native :checked */
|
|
1192
|
+
[data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-track"] > label:has(+ input:checked) {
|
|
1193
|
+
anchor-name: --dt-active;
|
|
1194
|
+
}
|
|
1195
|
+
[data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-group"] > label:has(+ input:checked) {
|
|
1196
|
+
anchor-name: --dt-active;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
/* Single unified indicator: morphs from full-width to half-width */
|
|
1200
|
+
[data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-indicator"] {
|
|
1201
|
+
position-anchor: --dt-active;
|
|
1202
|
+
top: anchor(top);
|
|
1203
|
+
right: anchor(right);
|
|
1204
|
+
bottom: anchor(bottom);
|
|
1205
|
+
left: anchor(left);
|
|
1206
|
+
translate: none;
|
|
1207
|
+
width: auto;
|
|
1208
|
+
transition:
|
|
1209
|
+
top var(--dt-indicator-dur) var(--dt-indicator-ease),
|
|
1210
|
+
right var(--dt-indicator-dur) var(--dt-indicator-ease),
|
|
1211
|
+
bottom var(--dt-indicator-dur) var(--dt-indicator-ease),
|
|
1212
|
+
left var(--dt-indicator-dur) var(--dt-indicator-ease);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
/* Hide the group indicator — unified indicator handles everything */
|
|
1216
|
+
[data-slot="dt-root"]:not([data-indicator="translate"]) [data-slot="dt-group-indicator"] {
|
|
1217
|
+
display: none;
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
/* ── Inset-based fallback (older browsers) — same morph as anchor but hardcoded ── */
|
|
1222
|
+
@supports not (anchor-scope: all) {
|
|
1223
|
+
/* Unified indicator: left/right transition morphs width + position */
|
|
1224
|
+
[data-slot="dt-root"] [data-slot="dt-indicator"] {
|
|
1225
|
+
left: 50%;
|
|
1226
|
+
right: 0;
|
|
1227
|
+
width: auto;
|
|
1228
|
+
translate: none;
|
|
1229
|
+
transition:
|
|
1230
|
+
left var(--dt-indicator-dur) var(--dt-indicator-ease),
|
|
1231
|
+
right var(--dt-indicator-dur) var(--dt-indicator-ease);
|
|
1232
|
+
}
|
|
1233
|
+
/* Top-level checked: indicator covers left half */
|
|
1234
|
+
[data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
|
|
1235
|
+
left: 0;
|
|
1236
|
+
right: 50%;
|
|
1237
|
+
}
|
|
1238
|
+
/* Group option 1 checked: indicator at 3rd quarter */
|
|
1239
|
+
[data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(1):checked) ~ [data-slot="dt-indicator"],
|
|
1240
|
+
[data-slot="dt-root"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(1):checked) [data-slot="dt-indicator"] {
|
|
1241
|
+
left: 50%;
|
|
1242
|
+
right: 25%;
|
|
1243
|
+
}
|
|
1244
|
+
/* Group option 2 checked: indicator at 4th quarter */
|
|
1245
|
+
[data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(2):checked) ~ [data-slot="dt-indicator"],
|
|
1246
|
+
[data-slot="dt-root"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(2):checked) [data-slot="dt-indicator"] {
|
|
1247
|
+
left: 75%;
|
|
1248
|
+
right: 0;
|
|
1249
|
+
}
|
|
1250
|
+
/* Hide group indicator — unified indicator handles everything */
|
|
1251
|
+
[data-slot="dt-root"] [data-slot="dt-group-indicator"] {
|
|
1252
|
+
display: none;
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
/* ── Force inset mode via data-indicator="translate" (works regardless of @supports) ── */
|
|
1257
|
+
[data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-indicator"] {
|
|
1258
|
+
left: 50%;
|
|
1259
|
+
right: 0;
|
|
1260
|
+
width: auto;
|
|
1261
|
+
translate: none;
|
|
1262
|
+
transition:
|
|
1263
|
+
left var(--dt-indicator-dur) var(--dt-indicator-ease),
|
|
1264
|
+
right var(--dt-indicator-dur) var(--dt-indicator-ease);
|
|
1265
|
+
}
|
|
1266
|
+
[data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
|
|
1267
|
+
left: 0;
|
|
1268
|
+
right: 50%;
|
|
1269
|
+
}
|
|
1270
|
+
[data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(1):checked) [data-slot="dt-indicator"] {
|
|
1271
|
+
left: 50%;
|
|
1272
|
+
right: 25%;
|
|
1273
|
+
}
|
|
1274
|
+
[data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-track"]:has([data-slot="dt-group"] input:nth-of-type(2):checked) [data-slot="dt-indicator"] {
|
|
1275
|
+
left: 75%;
|
|
1276
|
+
right: 0;
|
|
1277
|
+
}
|
|
1278
|
+
[data-slot="dt-root"][data-indicator="translate"] [data-slot="dt-group-indicator"] {
|
|
1279
|
+
display: none;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
/* ══════════════════════════════════════════════════════════
|
|
1283
|
+
* GROUP COLLAPSED STATE
|
|
1284
|
+
*
|
|
1285
|
+
* ::before = title text (via data-label attr)
|
|
1286
|
+
* ::after = combined opts text (via data-opts attr)
|
|
1287
|
+
* <label>s = controlled by data-collapsed mode
|
|
1288
|
+
*
|
|
1289
|
+
* 3 modes: title | opts | title-opts (default)
|
|
1290
|
+
* ══════════════════════════════════════════════════════════ */
|
|
1291
|
+
|
|
1292
|
+
/* ── ::before — group title ── */
|
|
1293
|
+
[data-slot="dt-group"]::before {
|
|
1294
|
+
content: attr(data-label);
|
|
1295
|
+
position: absolute;
|
|
1296
|
+
left: 50%;
|
|
1297
|
+
top: 50%;
|
|
1298
|
+
translate: -50% -80%;
|
|
1299
|
+
color: var(--foreground);
|
|
1300
|
+
font-size: inherit;
|
|
1301
|
+
font-weight: 500;
|
|
1302
|
+
z-index: 2;
|
|
1303
|
+
white-space: nowrap;
|
|
1304
|
+
pointer-events: none;
|
|
1305
|
+
transition:
|
|
1306
|
+
scale var(--dt-dur) var(--dt-ease),
|
|
1307
|
+
translate var(--dt-dur) var(--dt-ease),
|
|
1308
|
+
opacity var(--dt-dur) var(--dt-ease);
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
/* ── ::after — combined opts text ── */
|
|
1312
|
+
[data-slot="dt-group"]::after {
|
|
1313
|
+
content: attr(data-opts);
|
|
1314
|
+
position: absolute;
|
|
1315
|
+
left: 50%;
|
|
1316
|
+
top: 50%;
|
|
1317
|
+
translate: -50% 20%;
|
|
1318
|
+
color: var(--muted-foreground);
|
|
1319
|
+
font-size: 0.85em;
|
|
1320
|
+
opacity: 0.6;
|
|
1321
|
+
z-index: 2;
|
|
1322
|
+
white-space: nowrap;
|
|
1323
|
+
pointer-events: none;
|
|
1324
|
+
transition: opacity var(--dt-dur) var(--dt-ease);
|
|
1325
|
+
}
|
|
1326
|
+
[data-slot="dt-group"]:not([data-opts])::after {
|
|
1327
|
+
content: none;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
/* ── Group labels — transition props ── */
|
|
1331
|
+
[data-slot="dt-root"] [data-slot="dt-group"] label {
|
|
1332
|
+
color: var(--muted-foreground);
|
|
1333
|
+
cursor: pointer;
|
|
1334
|
+
z-index: 2;
|
|
1335
|
+
transition:
|
|
1336
|
+
color var(--dt-dur) var(--dt-ease),
|
|
1337
|
+
opacity var(--dt-dur) var(--dt-ease),
|
|
1338
|
+
translate var(--dt-dur) var(--dt-ease);
|
|
1339
|
+
}
|
|
1340
|
+
[data-slot="dt-root"] [data-slot="dt-group"] label span {
|
|
1341
|
+
display: grid;
|
|
1342
|
+
place-items: center;
|
|
1343
|
+
height: 100%;
|
|
1344
|
+
width: 100%;
|
|
1345
|
+
border-radius: var(--dt-radius, 9999px);
|
|
1346
|
+
transition: scale var(--dt-dur) var(--dt-ease);
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
/* ── Collapsed mode: "title" — only ::before, labels slide+scale out ── */
|
|
1350
|
+
[data-slot="dt-group"][data-collapsed="title"]::before {
|
|
1351
|
+
translate: -50% -50%;
|
|
1352
|
+
}
|
|
1353
|
+
[data-slot="dt-group"][data-collapsed="title"]::after {
|
|
1354
|
+
display: none;
|
|
1355
|
+
}
|
|
1356
|
+
[data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label {
|
|
1357
|
+
opacity: 0;
|
|
1358
|
+
translate: 0 30%;
|
|
1359
|
+
}
|
|
1360
|
+
[data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label span {
|
|
1361
|
+
scale: 0.5;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
/* ── Collapsed mode: "opts" — only ::after, labels slide+scale out ── */
|
|
1365
|
+
[data-slot="dt-group"][data-collapsed="opts"]::before {
|
|
1366
|
+
display: none;
|
|
1367
|
+
}
|
|
1368
|
+
[data-slot="dt-group"][data-collapsed="opts"]::after {
|
|
1369
|
+
translate: -50% -50%;
|
|
1370
|
+
font-size: inherit;
|
|
1371
|
+
opacity: 0.7;
|
|
1372
|
+
}
|
|
1373
|
+
[data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label {
|
|
1374
|
+
opacity: 0;
|
|
1375
|
+
translate: 0 30%;
|
|
1376
|
+
}
|
|
1377
|
+
[data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label span {
|
|
1378
|
+
scale: 0.5;
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
/* ── Collapsed mode: "title-opts" — WIP: disabled, falls back to "title" behavior ── */
|
|
1382
|
+
/* TODO: title-opts needs a redesign — title (::before) and scaled labels overlap
|
|
1383
|
+
at all container sizes. The codepen original morph relied on specific dimensions
|
|
1384
|
+
that don't translate to the component's size variants. Needs a different approach
|
|
1385
|
+
(e.g., crossfade, flex layout, or JS-measured positions). */
|
|
1386
|
+
[data-slot="dt-group"][data-collapsed="title-opts"]::after {
|
|
1387
|
+
content: none;
|
|
1388
|
+
}
|
|
1389
|
+
[data-slot="dt-group"][data-collapsed="title-opts"]::before {
|
|
1390
|
+
translate: -50% -50%;
|
|
1391
|
+
}
|
|
1392
|
+
[data-slot="dt-group"][data-collapsed="title-opts"]:not(:has(input:checked)) label {
|
|
1393
|
+
opacity: 0;
|
|
1394
|
+
translate: 0 30%;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
/* ── When group expanded ── */
|
|
1398
|
+
[data-slot="dt-group"]:has(input:checked)::before {
|
|
1399
|
+
translate: -50% -250%;
|
|
1400
|
+
scale: 0.85;
|
|
1401
|
+
}
|
|
1402
|
+
[data-slot="dt-group"]:has(input:checked)::after {
|
|
1403
|
+
opacity: 0;
|
|
1404
|
+
}
|
|
1405
|
+
[data-slot="dt-group"]:has(input:checked) label {
|
|
1406
|
+
opacity: 0.75;
|
|
1407
|
+
color: var(--muted-foreground);
|
|
1408
|
+
translate: 0 0;
|
|
1409
|
+
}
|
|
1410
|
+
[data-slot="dt-group"]:has(input:checked) label span {
|
|
1411
|
+
scale: 1;
|
|
1412
|
+
}
|
|
1413
|
+
[data-slot="dt-group"]:has(input:nth-of-type(1):checked) label:nth-of-type(1),
|
|
1414
|
+
[data-slot="dt-group"]:has(input:nth-of-type(2):checked) label:nth-of-type(2) {
|
|
1415
|
+
color: var(--foreground);
|
|
1416
|
+
opacity: 1;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
/* ══════════════════════════════════════════════════════════
|
|
1420
|
+
* GROUP LABEL / BUBBLE (above or below the pill)
|
|
1421
|
+
*
|
|
1422
|
+
* Positioned via CSS. In filter/path morph modes, rendered with GooeyCanvas.
|
|
1423
|
+
* In none mode, simple CSS-driven show/hide.
|
|
1424
|
+
* bubblePosition: top | bottom (no left/right in v2)
|
|
1425
|
+
* ══════════════════════════════════════════════════════════ */
|
|
1426
|
+
|
|
1427
|
+
[data-slot="dt-group-label"] {
|
|
1428
|
+
display: grid;
|
|
1429
|
+
grid-template-rows: 0fr;
|
|
1430
|
+
left: 20%;
|
|
1431
|
+
right: 20%;
|
|
1432
|
+
transition:
|
|
1433
|
+
grid-template-rows calc(var(--dt-dur) * 1.5) var(--dt-ease),
|
|
1434
|
+
opacity var(--dt-dur) var(--dt-ease);
|
|
1435
|
+
opacity: 0;
|
|
1436
|
+
background: var(--card);
|
|
1437
|
+
border: 1px solid var(--border);
|
|
1438
|
+
z-index: 3;
|
|
1439
|
+
transform: translateZ(0);
|
|
1440
|
+
-webkit-transform: translateZ(0);
|
|
1441
|
+
}
|
|
1442
|
+
[data-slot="dt-group-label"] > span {
|
|
1443
|
+
overflow: hidden;
|
|
1444
|
+
min-height: 0;
|
|
1445
|
+
display: flex;
|
|
1446
|
+
align-items: center;
|
|
1447
|
+
justify-content: center;
|
|
1448
|
+
padding: 0 0.75em;
|
|
1449
|
+
height: calc(var(--dt-h, 38px) * 0.4);
|
|
1450
|
+
box-sizing: border-box;
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
/* Top position */
|
|
1454
|
+
[data-slot="dt-group-label"][data-bubble-position="top"] {
|
|
1455
|
+
bottom: 100%;
|
|
1456
|
+
border-radius: calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2) 0 0;
|
|
1457
|
+
border-bottom: none;
|
|
1458
|
+
margin-bottom: -1px;
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
/* Bottom position */
|
|
1462
|
+
[data-slot="dt-group-label"][data-bubble-position="bottom"] {
|
|
1463
|
+
top: 100%;
|
|
1464
|
+
border-radius: 0 0 calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2);
|
|
1465
|
+
border-top: none;
|
|
1466
|
+
margin-top: -1px;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
/* When group active → group label grows (vertical: top/bottom) */
|
|
1470
|
+
[data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="top"],
|
|
1471
|
+
[data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="bottom"] {
|
|
1472
|
+
grid-template-rows: 1fr;
|
|
1473
|
+
opacity: 1;
|
|
1474
|
+
}
|
|
1475
|
+
[data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="top"] > span,
|
|
1476
|
+
[data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"][data-bubble-position="bottom"] > span {
|
|
1477
|
+
padding: 0.35em 0.75em;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
/* ── Filter morph mode ── */
|
|
1481
|
+
[data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group-label"] {
|
|
1482
|
+
border: none;
|
|
1483
|
+
}
|
|
1484
|
+
[data-slot="dt-root"][data-morph="filter"] [data-slot="dt-track"] {
|
|
1485
|
+
position: relative;
|
|
1486
|
+
z-index: 1;
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1489
|
+
/* ── Filter morph: ::before hides on expand, gooey canvas handles junction ── */
|
|
1490
|
+
[data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group"]:has(input:checked)::before {
|
|
1491
|
+
opacity: 0;
|
|
1492
|
+
translate: -50% -80%;
|
|
1493
|
+
scale: 1;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
/* ── Path morph mode ── */
|
|
1497
|
+
[data-slot="dt-root"][data-morph="path"] [data-slot="dt-track"] {
|
|
1498
|
+
position: relative;
|
|
1499
|
+
z-index: 1;
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
/* react-ui/ui/GooeyButton/gooey.css */
|
|
1505
|
+
|
|
1506
|
+
/* =============================================================================
|
|
1507
|
+
* GooeyButton — transparent hit area over the pill region.
|
|
1508
|
+
*
|
|
1509
|
+
* The visual pill is drawn by the <GooeyMorphingSurface> primitive; this
|
|
1510
|
+
* layer is a single button that captures clicks in both open and closed
|
|
1511
|
+
* states without painting anything. All layout math comes from the
|
|
1512
|
+
* primitive's CSS custom props (--gms-pill-w, --gms-pill-h).
|
|
1513
|
+
* ============================================================================= */
|
|
1514
|
+
|
|
1515
|
+
.gbtn-host {
|
|
1516
|
+
position: relative;
|
|
1517
|
+
display: inline-block;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
.gbtn-trigger {
|
|
1521
|
+
position: absolute;
|
|
1522
|
+
top: 0;
|
|
1523
|
+
/* Follow the pill's computed X (which honours `pillOffsetX`) instead of
|
|
1524
|
+
* centring the hit-area in the host. Centring worked only while
|
|
1525
|
+
* `pillOffsetX === 0`; any non-zero offset drifted the visual pill away
|
|
1526
|
+
* from the invisible trigger. See `GooeyButton/index.tsx` — the host
|
|
1527
|
+
* exposes `--gms-pill-x` identical to the primitive's internal value. */
|
|
1528
|
+
left: var(--gms-pill-x);
|
|
1529
|
+
z-index: 3;
|
|
1530
|
+
width: var(--gms-pill-w);
|
|
1531
|
+
height: var(--gms-pill-h);
|
|
1532
|
+
padding: 0;
|
|
1533
|
+
margin: 0;
|
|
1534
|
+
border: 0;
|
|
1535
|
+
background: transparent;
|
|
1536
|
+
cursor: pointer;
|
|
1537
|
+
font: inherit;
|
|
1538
|
+
color: inherit;
|
|
1539
|
+
/* Pill-shaped focus ring. */
|
|
1540
|
+
border-radius: 9999px;
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
.gbtn-trigger:focus-visible {
|
|
1544
|
+
outline: 2px solid var(--ring, currentColor);
|
|
1545
|
+
outline-offset: 2px;
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
.gbtn-trigger:disabled {
|
|
1549
|
+
cursor: not-allowed;
|
|
1550
|
+
pointer-events: none;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
/* react-ui/ui/Tabs/Tabs.css */
|
|
1556
|
+
|
|
1557
|
+
/**
|
|
1558
|
+
* Tabs CSS Anchor Positioning.
|
|
1559
|
+
*
|
|
1560
|
+
* Zero-JS position tracking for the sliding indicator using CSS Anchor API.
|
|
1561
|
+
* The indicator automatically follows the active tab via anchor positioning.
|
|
1562
|
+
*/
|
|
1563
|
+
|
|
1564
|
+
/* Scope anchors per Tabs instance */
|
|
1565
|
+
[data-slot="tabs-list"] {
|
|
1566
|
+
anchor-scope: --tabs-active;
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
/* Active tab becomes the anchor */
|
|
1570
|
+
[data-slot="tabs-tab"][data-active] {
|
|
1571
|
+
anchor-name: --tabs-active;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
/* Indicator follows the active anchor */
|
|
1575
|
+
[data-slot="tabs-indicator"] {
|
|
1576
|
+
position-anchor: --tabs-active;
|
|
1577
|
+
left: anchor(left);
|
|
1578
|
+
right: anchor(right);
|
|
1579
|
+
transition:
|
|
1580
|
+
top 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
|
1581
|
+
left 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
|
1582
|
+
right 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
|
1583
|
+
bottom 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
|
1584
|
+
width 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
|
1585
|
+
height 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
/* Respect reduced motion preference */
|
|
1589
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1590
|
+
[data-slot="tabs-indicator"] {
|
|
1591
|
+
transition-duration: 0ms;
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1594
|
+
|