@mks2508/mks-ui 0.5.2 → 0.5.4

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.
Files changed (69) hide show
  1. package/dist/react-ui/index.js +8 -3
  2. package/dist/react-ui/primitives/index.js +5 -0
  3. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +103 -0
  4. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -0
  5. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +10 -0
  6. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -0
  7. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +59 -0
  8. package/dist/react-ui/primitives/waapi/Gooey/GooeyFilter.d.ts +7 -0
  9. package/dist/react-ui/primitives/waapi/Gooey/GooeyFilter.d.ts.map +1 -0
  10. package/dist/react-ui/primitives/waapi/Gooey/GooeyFilter.js +78 -0
  11. package/dist/react-ui/primitives/waapi/Gooey/MorphPath.d.ts +7 -0
  12. package/dist/react-ui/primitives/waapi/Gooey/MorphPath.d.ts.map +1 -0
  13. package/dist/react-ui/primitives/waapi/Gooey/MorphPath.js +51 -0
  14. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts +87 -0
  15. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts.map +1 -0
  16. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.js +177 -0
  17. package/dist/react-ui/primitives/waapi/Gooey/index.d.ts +28 -0
  18. package/dist/react-ui/primitives/waapi/Gooey/index.d.ts.map +1 -0
  19. package/dist/react-ui/primitives/waapi/Gooey/index.js +5 -0
  20. package/dist/react-ui/primitives/waapi/Gooey/useMorphPath.d.ts +7 -0
  21. package/dist/react-ui/primitives/waapi/Gooey/useMorphPath.d.ts.map +1 -0
  22. package/dist/react-ui/primitives/waapi/Gooey/useMorphPath.js +47 -0
  23. package/dist/react-ui/primitives/waapi/index.d.ts +2 -0
  24. package/dist/react-ui/primitives/waapi/index.d.ts.map +1 -1
  25. package/dist/react-ui/primitives/waapi/index.js +6 -0
  26. package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts +26 -16
  27. package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts.map +1 -1
  28. package/dist/react-ui/ui/DataCard/DataCard.styles.js +36 -74
  29. package/dist/react-ui/ui/DataCard/DataCard.types.d.ts +50 -70
  30. package/dist/react-ui/ui/DataCard/DataCard.types.d.ts.map +1 -1
  31. package/dist/react-ui/ui/DataCard/index.d.ts +24 -93
  32. package/dist/react-ui/ui/DataCard/index.d.ts.map +1 -1
  33. package/dist/react-ui/ui/DataCard/index.js +76 -118
  34. package/dist/react-ui/ui/DynamicToggle/DynamicToggle-Cm6-VceQ.css +304 -0
  35. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +303 -0
  36. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.js +0 -0
  37. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +20 -8
  38. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
  39. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +55 -27
  40. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +63 -14
  41. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
  42. package/dist/react-ui/ui/DynamicToggle/index.d.ts +22 -20
  43. package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
  44. package/dist/react-ui/ui/DynamicToggle/index.js +115 -96
  45. package/dist/react-ui/ui/Switch/index.js +1 -1
  46. package/dist/react-ui/ui/index.js +2 -2
  47. package/package.json +2 -2
  48. package/src/css.d.ts +1 -0
  49. package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +123 -0
  50. package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +80 -0
  51. package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +77 -0
  52. package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +58 -0
  53. package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +244 -0
  54. package/src/react-ui/primitives/waapi/Gooey/index.ts +50 -0
  55. package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +48 -0
  56. package/src/react-ui/primitives/waapi/index.ts +23 -0
  57. package/src/react-ui/ui/DataCard/DataCard.styles.ts +45 -101
  58. package/src/react-ui/ui/DataCard/DataCard.types.ts +52 -73
  59. package/src/react-ui/ui/DataCard/index.tsx +118 -184
  60. package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +244 -91
  61. package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +60 -40
  62. package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +95 -14
  63. package/src/react-ui/ui/DynamicToggle/index.tsx +150 -96
  64. package/src/react-ui/ui/DynamicToggle/prototype-v7.html +615 -0
  65. package/src/react-ui/ui/DynamicToggle/prototype.html +419 -0
  66. package/src/react-ui/ui/Switch/index.tsx +1 -1
  67. /package/dist/react-ui/blocks/Terminal/panel/{terminal-filter-dropdown.module-DAcl_XQZ.css → terminal-filter-dropdown.module-C6oDcFBS.css} +0 -0
  68. /package/dist/react-ui/blocks/Terminal/panel/{terminal-session-tabs.module-DNAop5e3.css → terminal-session-tabs.module-D_-sgyza.css} +0 -0
  69. /package/dist/react-ui/components/MorphingPopover/{morphing-popover.module-BJrjXisF.css → morphing-popover.module-B1ftlaYj.css} +0 -0
@@ -0,0 +1,304 @@
1
+ /**
2
+ * DynamicToggle — CSS state transitions.
3
+ *
4
+ * Rules requiring :has(), container queries, clip-path, or pseudo-elements.
5
+ * Layout, colors, sizing in Tailwind (DynamicToggle.styles.ts).
6
+ *
7
+ * @import '@mks2508/mks-ui/dist/react-ui/ui/DynamicToggle/DynamicToggle.css';
8
+ */
9
+
10
+ /* ── Variables ── */
11
+ [data-slot="dt-root"] {
12
+ --dt-dur: 0.22s;
13
+ --dt-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
14
+ --dt-fade: 0.45;
15
+ }
16
+
17
+ /* ── Track: explicit row prevents h-full items from overflowing container ── */
18
+ [data-slot="dt-root"] [data-slot="dt-track"] {
19
+ grid-template-rows: minmax(0, 1fr);
20
+ }
21
+
22
+ /* ── Top-level option spans 2 grid cols ── */
23
+ [data-slot="dt-root"] [data-slot="dt-track"] > label {
24
+ grid-column: span 2;
25
+ }
26
+
27
+ /* ── Main indicator slide ── */
28
+ [data-slot="dt-root"] [data-slot="dt-indicator"] {
29
+ transition: translate var(--dt-dur) var(--dt-ease);
30
+ translate: 100% 0;
31
+ }
32
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
33
+ translate: 0 0;
34
+ }
35
+
36
+ /* ── Primary option text ── */
37
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) > label {
38
+ color: var(--card);
39
+ z-index: 2;
40
+ }
41
+ [data-slot="dt-root"] [data-slot="dt-track"]:not(:has(> input:checked)) > label {
42
+ color: var(--foreground);
43
+ opacity: var(--dt-fade);
44
+ }
45
+
46
+ /* ── Group: container queries ── */
47
+ [data-slot="dt-root"] [data-slot="dt-group"] {
48
+ container-type: size;
49
+ overflow: hidden;
50
+ }
51
+
52
+ /* ── Group indicator: clip-path reveal ── */
53
+ [data-slot="dt-root"] [data-slot="dt-group-indicator"] {
54
+ pointer-events: none;
55
+ transition:
56
+ translate var(--dt-dur) var(--dt-ease),
57
+ clip-path var(--dt-dur) var(--dt-ease),
58
+ background var(--dt-dur) var(--dt-ease);
59
+ clip-path: inset(
60
+ 73cqh calc(50% + 1px) calc(27cqh - 2px) calc(50% - 3px)
61
+ round var(--dt-radius, 9999px)
62
+ );
63
+ translate: -50% 0;
64
+ }
65
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-group-indicator"] {
66
+ background: transparent;
67
+ }
68
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:checked) [data-slot="dt-group-indicator"] {
69
+ background: var(--card);
70
+ clip-path: inset(0 0 0 0 round var(--dt-radius, 9999px));
71
+ }
72
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(1):checked) [data-slot="dt-group-indicator"] {
73
+ translate: -100% 0;
74
+ }
75
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(2):checked) [data-slot="dt-group-indicator"] {
76
+ translate: 0 0;
77
+ }
78
+
79
+ /* ══════════════════════════════════════════════════════════
80
+ * GROUP COLLAPSED STATE
81
+ *
82
+ * ::before = title text (via data-label attr)
83
+ * ::after = combined opts text (via data-opts attr)
84
+ * <label>s = controlled by data-collapsed mode
85
+ *
86
+ * 3 modes: title | opts | title-opts (default)
87
+ * ══════════════════════════════════════════════════════════ */
88
+
89
+ /* ── ::before — group title ── */
90
+ [data-slot="dt-group"]::before {
91
+ content: attr(data-label);
92
+ position: absolute;
93
+ left: 50%;
94
+ top: 50%;
95
+ translate: -50% -80%;
96
+ color: var(--foreground);
97
+ font-size: inherit;
98
+ font-weight: 500;
99
+ z-index: 2;
100
+ white-space: nowrap;
101
+ pointer-events: none;
102
+ transition:
103
+ scale var(--dt-dur) var(--dt-ease),
104
+ translate var(--dt-dur) var(--dt-ease),
105
+ opacity var(--dt-dur) var(--dt-ease);
106
+ }
107
+
108
+ /* ── ::after — combined opts text ── */
109
+ [data-slot="dt-group"]::after {
110
+ content: attr(data-opts);
111
+ position: absolute;
112
+ left: 50%;
113
+ top: 50%;
114
+ translate: -50% 20%;
115
+ color: var(--muted-foreground);
116
+ font-size: 0.85em;
117
+ opacity: 0.6;
118
+ z-index: 2;
119
+ white-space: nowrap;
120
+ pointer-events: none;
121
+ transition: opacity var(--dt-dur) var(--dt-ease);
122
+ }
123
+ [data-slot="dt-group"]:not([data-opts])::after {
124
+ content: none;
125
+ }
126
+
127
+ /* ── Group labels — transition props ── */
128
+ [data-slot="dt-root"] [data-slot="dt-group"] label {
129
+ color: var(--muted-foreground);
130
+ cursor: pointer;
131
+ z-index: 2;
132
+ transition:
133
+ color var(--dt-dur) var(--dt-ease),
134
+ opacity var(--dt-dur) var(--dt-ease),
135
+ translate var(--dt-dur) var(--dt-ease);
136
+ }
137
+ [data-slot="dt-root"] [data-slot="dt-group"] label span {
138
+ display: grid;
139
+ place-items: center;
140
+ height: 100%;
141
+ width: 100%;
142
+ border-radius: var(--dt-radius, 9999px);
143
+ transition: scale var(--dt-dur) var(--dt-ease);
144
+ }
145
+
146
+ /* ── Collapsed mode: "title" — only ::before, labels slide+scale out ── */
147
+ [data-slot="dt-group"][data-collapsed="title"]::before {
148
+ translate: -50% -50%;
149
+ }
150
+ [data-slot="dt-group"][data-collapsed="title"]::after {
151
+ display: none;
152
+ }
153
+ [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label {
154
+ opacity: 0;
155
+ translate: 0 30%;
156
+ }
157
+ [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label span {
158
+ scale: 0.5;
159
+ }
160
+
161
+ /* ── Collapsed mode: "opts" — only ::after, labels slide+scale out ── */
162
+ [data-slot="dt-group"][data-collapsed="opts"]::before {
163
+ display: none;
164
+ }
165
+ [data-slot="dt-group"][data-collapsed="opts"]::after {
166
+ translate: -50% -50%;
167
+ font-size: inherit;
168
+ opacity: 0.7;
169
+ }
170
+ [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label {
171
+ opacity: 0;
172
+ translate: 0 30%;
173
+ }
174
+ [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label span {
175
+ scale: 0.5;
176
+ }
177
+
178
+ /* ── Collapsed mode: "title-opts" — WIP: disabled, falls back to "title" behavior ── */
179
+ /* TODO: title-opts needs a redesign — title (::before) and scaled labels overlap
180
+ at all container sizes. The codepen original morph relied on specific dimensions
181
+ that don't translate to the component's size variants. Needs a different approach
182
+ (e.g., crossfade, flex layout, or JS-measured positions). */
183
+ [data-slot="dt-group"][data-collapsed="title-opts"]::after {
184
+ content: none;
185
+ }
186
+ [data-slot="dt-group"][data-collapsed="title-opts"]::before {
187
+ translate: -50% -50%;
188
+ }
189
+ [data-slot="dt-group"][data-collapsed="title-opts"]:not(:has(input:checked)) label {
190
+ opacity: 0;
191
+ translate: 0 30%;
192
+ }
193
+
194
+ /* ── When group expanded ── */
195
+ [data-slot="dt-group"]:has(input:checked)::before {
196
+ translate: -50% -250%;
197
+ scale: 0.85;
198
+ }
199
+ [data-slot="dt-group"]:has(input:checked)::after {
200
+ opacity: 0;
201
+ }
202
+ [data-slot="dt-group"]:has(input:checked) label {
203
+ opacity: 0.75;
204
+ color: var(--muted-foreground);
205
+ translate: 0 0;
206
+ }
207
+ [data-slot="dt-group"]:has(input:checked) label span {
208
+ scale: 1;
209
+ }
210
+ [data-slot="dt-group"]:has(input:nth-of-type(1):checked) label:nth-of-type(1),
211
+ [data-slot="dt-group"]:has(input:nth-of-type(2):checked) label:nth-of-type(2) {
212
+ color: var(--foreground);
213
+ opacity: 1;
214
+ }
215
+
216
+ /* ══════════════════════════════════════════════════════════
217
+ * GROUP LABEL (above/below the pill)
218
+ *
219
+ * Replaces the old "bubble" element. Positioned via CSS grid.
220
+ * In filter/path morph modes, rendered inside GooeyCanvas.
221
+ * In none mode, simple CSS-driven show/hide.
222
+ * ══════════════════════════════════════════════════════════ */
223
+
224
+ [data-slot="dt-group-label"] {
225
+ display: grid;
226
+ grid-template-rows: 0fr;
227
+ left: 20%;
228
+ right: 20%;
229
+ transition:
230
+ grid-template-rows calc(var(--dt-dur) * 1.5) var(--dt-ease),
231
+ opacity var(--dt-dur) var(--dt-ease);
232
+ opacity: 0;
233
+ background: var(--card);
234
+ border: 1px solid var(--border);
235
+ z-index: 3;
236
+ }
237
+ [data-slot="dt-group-label"] > span {
238
+ overflow: hidden;
239
+ min-height: 0;
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ padding: 0 0.75em;
244
+ height: calc(var(--dt-h, 38px) * 0.4);
245
+ box-sizing: border-box;
246
+ }
247
+
248
+ /* Top position */
249
+ [data-slot="dt-group-label"][data-position="top"] {
250
+ bottom: 100%;
251
+ border-radius: calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2) 0 0;
252
+ border-bottom: none;
253
+ margin-bottom: -1px;
254
+ }
255
+
256
+ /* Bottom position */
257
+ [data-slot="dt-group-label"][data-position="bottom"] {
258
+ top: 100%;
259
+ border-radius: 0 0 calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2);
260
+ border-top: none;
261
+ margin-top: -1px;
262
+ }
263
+
264
+ /* When group active → group label grows */
265
+ [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"] {
266
+ grid-template-rows: 1fr;
267
+ opacity: 1;
268
+ }
269
+ [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"] > span {
270
+ padding: 0.35em 0.75em;
271
+ }
272
+
273
+ /* ── Filter morph mode ── */
274
+ [data-slot="dt-root"][data-morph="filter"] {
275
+ background: transparent;
276
+ border-color: transparent;
277
+ box-shadow: none;
278
+ overflow: visible;
279
+ }
280
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group-label"] {
281
+ border: none;
282
+ }
283
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-track"] {
284
+ position: relative;
285
+ z-index: 1;
286
+ }
287
+
288
+ /* ── Filter morph: ::before hides on expand, gooey canvas handles junction ── */
289
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group"]:has(input:checked)::before {
290
+ opacity: 0;
291
+ translate: -50% -80%;
292
+ scale: 1;
293
+ }
294
+
295
+ /* ── Path morph mode ── */
296
+ [data-slot="dt-root"][data-morph="path"] {
297
+ background: transparent;
298
+ border-color: transparent;
299
+ }
300
+ [data-slot="dt-root"][data-morph="path"] [data-slot="dt-track"] {
301
+ position: relative;
302
+ z-index: 1;
303
+ }
304
+
@@ -0,0 +1,303 @@
1
+ /**
2
+ * DynamicToggle — CSS state transitions.
3
+ *
4
+ * Rules requiring :has(), container queries, clip-path, or pseudo-elements.
5
+ * Layout, colors, sizing in Tailwind (DynamicToggle.styles.ts).
6
+ *
7
+ * @import '@mks2508/mks-ui/dist/react-ui/ui/DynamicToggle/DynamicToggle.css';
8
+ */
9
+
10
+ /* ── Variables ── */
11
+ [data-slot="dt-root"] {
12
+ --dt-dur: 0.22s;
13
+ --dt-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
14
+ --dt-fade: 0.45;
15
+ }
16
+
17
+ /* ── Track: explicit row prevents h-full items from overflowing container ── */
18
+ [data-slot="dt-root"] [data-slot="dt-track"] {
19
+ grid-template-rows: minmax(0, 1fr);
20
+ }
21
+
22
+ /* ── Top-level option spans 2 grid cols ── */
23
+ [data-slot="dt-root"] [data-slot="dt-track"] > label {
24
+ grid-column: span 2;
25
+ }
26
+
27
+ /* ── Main indicator slide ── */
28
+ [data-slot="dt-root"] [data-slot="dt-indicator"] {
29
+ transition: translate var(--dt-dur) var(--dt-ease);
30
+ translate: 100% 0;
31
+ }
32
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-indicator"] {
33
+ translate: 0 0;
34
+ }
35
+
36
+ /* ── Primary option text ── */
37
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) > label {
38
+ color: var(--card);
39
+ z-index: 2;
40
+ }
41
+ [data-slot="dt-root"] [data-slot="dt-track"]:not(:has(> input:checked)) > label {
42
+ color: var(--foreground);
43
+ opacity: var(--dt-fade);
44
+ }
45
+
46
+ /* ── Group: container queries ── */
47
+ [data-slot="dt-root"] [data-slot="dt-group"] {
48
+ container-type: size;
49
+ overflow: hidden;
50
+ }
51
+
52
+ /* ── Group indicator: clip-path reveal ── */
53
+ [data-slot="dt-root"] [data-slot="dt-group-indicator"] {
54
+ pointer-events: none;
55
+ transition:
56
+ translate var(--dt-dur) var(--dt-ease),
57
+ clip-path var(--dt-dur) var(--dt-ease),
58
+ background var(--dt-dur) var(--dt-ease);
59
+ clip-path: inset(
60
+ 73cqh calc(50% + 1px) calc(27cqh - 2px) calc(50% - 3px)
61
+ round var(--dt-radius, 9999px)
62
+ );
63
+ translate: -50% 0;
64
+ }
65
+ [data-slot="dt-root"] [data-slot="dt-track"]:has(> input:checked) [data-slot="dt-group-indicator"] {
66
+ background: transparent;
67
+ }
68
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:checked) [data-slot="dt-group-indicator"] {
69
+ background: var(--card);
70
+ clip-path: inset(0 0 0 0 round var(--dt-radius, 9999px));
71
+ }
72
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(1):checked) [data-slot="dt-group-indicator"] {
73
+ translate: -100% 0;
74
+ }
75
+ [data-slot="dt-root"] [data-slot="dt-group"]:has(input:nth-of-type(2):checked) [data-slot="dt-group-indicator"] {
76
+ translate: 0 0;
77
+ }
78
+
79
+ /* ══════════════════════════════════════════════════════════
80
+ * GROUP COLLAPSED STATE
81
+ *
82
+ * ::before = title text (via data-label attr)
83
+ * ::after = combined opts text (via data-opts attr)
84
+ * <label>s = controlled by data-collapsed mode
85
+ *
86
+ * 3 modes: title | opts | title-opts (default)
87
+ * ══════════════════════════════════════════════════════════ */
88
+
89
+ /* ── ::before — group title ── */
90
+ [data-slot="dt-group"]::before {
91
+ content: attr(data-label);
92
+ position: absolute;
93
+ left: 50%;
94
+ top: 50%;
95
+ translate: -50% -80%;
96
+ color: var(--foreground);
97
+ font-size: inherit;
98
+ font-weight: 500;
99
+ z-index: 2;
100
+ white-space: nowrap;
101
+ pointer-events: none;
102
+ transition:
103
+ scale var(--dt-dur) var(--dt-ease),
104
+ translate var(--dt-dur) var(--dt-ease),
105
+ opacity var(--dt-dur) var(--dt-ease);
106
+ }
107
+
108
+ /* ── ::after — combined opts text ── */
109
+ [data-slot="dt-group"]::after {
110
+ content: attr(data-opts);
111
+ position: absolute;
112
+ left: 50%;
113
+ top: 50%;
114
+ translate: -50% 20%;
115
+ color: var(--muted-foreground);
116
+ font-size: 0.85em;
117
+ opacity: 0.6;
118
+ z-index: 2;
119
+ white-space: nowrap;
120
+ pointer-events: none;
121
+ transition: opacity var(--dt-dur) var(--dt-ease);
122
+ }
123
+ [data-slot="dt-group"]:not([data-opts])::after {
124
+ content: none;
125
+ }
126
+
127
+ /* ── Group labels — transition props ── */
128
+ [data-slot="dt-root"] [data-slot="dt-group"] label {
129
+ color: var(--muted-foreground);
130
+ cursor: pointer;
131
+ z-index: 2;
132
+ transition:
133
+ color var(--dt-dur) var(--dt-ease),
134
+ opacity var(--dt-dur) var(--dt-ease),
135
+ translate var(--dt-dur) var(--dt-ease);
136
+ }
137
+ [data-slot="dt-root"] [data-slot="dt-group"] label span {
138
+ display: grid;
139
+ place-items: center;
140
+ height: 100%;
141
+ width: 100%;
142
+ border-radius: var(--dt-radius, 9999px);
143
+ transition: scale var(--dt-dur) var(--dt-ease);
144
+ }
145
+
146
+ /* ── Collapsed mode: "title" — only ::before, labels slide+scale out ── */
147
+ [data-slot="dt-group"][data-collapsed="title"]::before {
148
+ translate: -50% -50%;
149
+ }
150
+ [data-slot="dt-group"][data-collapsed="title"]::after {
151
+ display: none;
152
+ }
153
+ [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label {
154
+ opacity: 0;
155
+ translate: 0 30%;
156
+ }
157
+ [data-slot="dt-group"][data-collapsed="title"]:not(:has(input:checked)) label span {
158
+ scale: 0.5;
159
+ }
160
+
161
+ /* ── Collapsed mode: "opts" — only ::after, labels slide+scale out ── */
162
+ [data-slot="dt-group"][data-collapsed="opts"]::before {
163
+ display: none;
164
+ }
165
+ [data-slot="dt-group"][data-collapsed="opts"]::after {
166
+ translate: -50% -50%;
167
+ font-size: inherit;
168
+ opacity: 0.7;
169
+ }
170
+ [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label {
171
+ opacity: 0;
172
+ translate: 0 30%;
173
+ }
174
+ [data-slot="dt-group"][data-collapsed="opts"]:not(:has(input:checked)) label span {
175
+ scale: 0.5;
176
+ }
177
+
178
+ /* ── Collapsed mode: "title-opts" — WIP: disabled, falls back to "title" behavior ── */
179
+ /* TODO: title-opts needs a redesign — title (::before) and scaled labels overlap
180
+ at all container sizes. The codepen original morph relied on specific dimensions
181
+ that don't translate to the component's size variants. Needs a different approach
182
+ (e.g., crossfade, flex layout, or JS-measured positions). */
183
+ [data-slot="dt-group"][data-collapsed="title-opts"]::after {
184
+ content: none;
185
+ }
186
+ [data-slot="dt-group"][data-collapsed="title-opts"]::before {
187
+ translate: -50% -50%;
188
+ }
189
+ [data-slot="dt-group"][data-collapsed="title-opts"]:not(:has(input:checked)) label {
190
+ opacity: 0;
191
+ translate: 0 30%;
192
+ }
193
+
194
+ /* ── When group expanded ── */
195
+ [data-slot="dt-group"]:has(input:checked)::before {
196
+ translate: -50% -250%;
197
+ scale: 0.85;
198
+ }
199
+ [data-slot="dt-group"]:has(input:checked)::after {
200
+ opacity: 0;
201
+ }
202
+ [data-slot="dt-group"]:has(input:checked) label {
203
+ opacity: 0.75;
204
+ color: var(--muted-foreground);
205
+ translate: 0 0;
206
+ }
207
+ [data-slot="dt-group"]:has(input:checked) label span {
208
+ scale: 1;
209
+ }
210
+ [data-slot="dt-group"]:has(input:nth-of-type(1):checked) label:nth-of-type(1),
211
+ [data-slot="dt-group"]:has(input:nth-of-type(2):checked) label:nth-of-type(2) {
212
+ color: var(--foreground);
213
+ opacity: 1;
214
+ }
215
+
216
+ /* ══════════════════════════════════════════════════════════
217
+ * GROUP LABEL (above/below the pill)
218
+ *
219
+ * Replaces the old "bubble" element. Positioned via CSS grid.
220
+ * In filter/path morph modes, rendered inside GooeyCanvas.
221
+ * In none mode, simple CSS-driven show/hide.
222
+ * ══════════════════════════════════════════════════════════ */
223
+
224
+ [data-slot="dt-group-label"] {
225
+ display: grid;
226
+ grid-template-rows: 0fr;
227
+ left: 20%;
228
+ right: 20%;
229
+ transition:
230
+ grid-template-rows calc(var(--dt-dur) * 1.5) var(--dt-ease),
231
+ opacity var(--dt-dur) var(--dt-ease);
232
+ opacity: 0;
233
+ background: var(--card);
234
+ border: 1px solid var(--border);
235
+ z-index: 3;
236
+ }
237
+ [data-slot="dt-group-label"] > span {
238
+ overflow: hidden;
239
+ min-height: 0;
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ padding: 0 0.75em;
244
+ height: calc(var(--dt-h, 38px) * 0.4);
245
+ box-sizing: border-box;
246
+ }
247
+
248
+ /* Top position */
249
+ [data-slot="dt-group-label"][data-position="top"] {
250
+ bottom: 100%;
251
+ border-radius: calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2) 0 0;
252
+ border-bottom: none;
253
+ margin-bottom: -1px;
254
+ }
255
+
256
+ /* Bottom position */
257
+ [data-slot="dt-group-label"][data-position="bottom"] {
258
+ top: 100%;
259
+ border-radius: 0 0 calc(var(--dt-h, 38px) * 0.2) calc(var(--dt-h, 38px) * 0.2);
260
+ border-top: none;
261
+ margin-top: -1px;
262
+ }
263
+
264
+ /* When group active → group label grows */
265
+ [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"] {
266
+ grid-template-rows: 1fr;
267
+ opacity: 1;
268
+ }
269
+ [data-slot="dt-root"]:not(:has([data-slot="dt-track"] > input:checked)) [data-slot="dt-group-label"] > span {
270
+ padding: 0.35em 0.75em;
271
+ }
272
+
273
+ /* ── Filter morph mode ── */
274
+ [data-slot="dt-root"][data-morph="filter"] {
275
+ background: transparent;
276
+ border-color: transparent;
277
+ box-shadow: none;
278
+ overflow: visible;
279
+ }
280
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group-label"] {
281
+ border: none;
282
+ }
283
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-track"] {
284
+ position: relative;
285
+ z-index: 1;
286
+ }
287
+
288
+ /* ── Filter morph: ::before hides on expand, gooey canvas handles junction ── */
289
+ [data-slot="dt-root"][data-morph="filter"] [data-slot="dt-group"]:has(input:checked)::before {
290
+ opacity: 0;
291
+ translate: -50% -80%;
292
+ scale: 1;
293
+ }
294
+
295
+ /* ── Path morph mode ── */
296
+ [data-slot="dt-root"][data-morph="path"] {
297
+ background: transparent;
298
+ border-color: transparent;
299
+ }
300
+ [data-slot="dt-root"][data-morph="path"] [data-slot="dt-track"] {
301
+ position: relative;
302
+ z-index: 1;
303
+ }
@@ -1,23 +1,35 @@
1
1
  /**
2
- * DynamicToggle style slots and types.
2
+ * DynamicToggle style slots + CVA variants.
3
3
  *
4
- * Uses semantic CSS variables for all colors.
5
- * Animation handled in DynamicToggle.css (clip-path, transitions).
4
+ * Layout via Tailwind. State animations via CSS file (`:has()`, `clip-path`).
5
+ * Shape propagated to indicators via `--dt-radius` CSS variable.
6
6
  *
7
7
  * @module @mks2508/mks-ui/react/ui/DynamicToggle
8
8
  */
9
+ import { type VariantProps } from 'class-variance-authority';
9
10
  import type { StyleSlots } from '../../../core/types';
10
11
  /** Slot names for DynamicToggle */
11
- export type DynamicToggleSlot = 'root' | 'track' | 'option' | 'indicator' | 'group' | 'groupLabel' | 'groupIndicator';
12
+ export type DynamicToggleSlot = 'root' | 'track' | 'option' | 'indicator' | 'group' | 'groupIndicator' | 'groupLabel';
12
13
  /**
13
14
  * Default styles for each DynamicToggle slot.
14
15
  *
16
+ * Width is set by size variants — required because indicator uses `width: 50%`
17
+ * and clip-path uses container query units. Override: `slots={{ root: 'w-80' }}`.
18
+ */
19
+ export declare const dynamicToggleStyles: StyleSlots<DynamicToggleSlot>;
20
+ /**
21
+ * CVA variants for DynamicToggle root.
22
+ *
15
23
  * @example
16
24
  * ```tsx
17
- * <DynamicToggle slots={{ root: 'w-72', indicator: 'bg-primary' }}>
18
- * ...
19
- * </DynamicToggle>
25
+ * <DynamicToggle size="sm" variant="outline" shape="rounded">
20
26
  * ```
21
27
  */
22
- export declare const dynamicToggleStyles: StyleSlots<DynamicToggleSlot>;
28
+ export declare const dynamicToggleVariants: (props?: ({
29
+ variant?: "muted" | "default" | "outline" | "ghost" | null | undefined;
30
+ size?: "default" | "sm" | "lg" | null | undefined;
31
+ shape?: "square" | "pill" | "rounded" | null | undefined;
32
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
33
+ /** Variant props extracted from CVA */
34
+ export type DynamicToggleVariantProps = VariantProps<typeof dynamicToggleVariants>;
23
35
  //# sourceMappingURL=DynamicToggle.styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicToggle.styles.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,mCAAmC;AACnC,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,OAAO,GACP,YAAY,GACZ,gBAAgB,CAAC;AAErB;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC,iBAAiB,CAiC7D,CAAC"}
1
+ {"version":3,"file":"DynamicToggle.styles.d.ts","sourceRoot":"","sources":["../../../../src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,mCAAmC;AACnC,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,OAAO,GACP,gBAAgB,GAChB,YAAY,CAAC;AAEjB;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC,iBAAiB,CAa7D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;;;8EA8BhC,CAAC;AAEH,uCAAuC;AACvC,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC"}