@rokkit/themes 1.0.0-next.124 → 1.0.0-next.127

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 (130) hide show
  1. package/README.md +118 -9
  2. package/package.json +31 -27
  3. package/src/base/breadcrumbs.css +46 -0
  4. package/src/base/button.css +243 -0
  5. package/src/base/card.css +36 -0
  6. package/src/base/carousel.css +122 -12
  7. package/src/base/connector.css +106 -0
  8. package/src/base/display.css +91 -0
  9. package/src/base/floating-action.css +388 -0
  10. package/src/base/floating-navigation.css +381 -0
  11. package/src/base/index.css +36 -0
  12. package/src/base/input.css +194 -39
  13. package/src/base/item.css +52 -0
  14. package/src/base/list.css +258 -0
  15. package/src/base/menu.css +322 -0
  16. package/src/base/pill.css +57 -0
  17. package/src/base/progress.css +28 -15
  18. package/src/base/range.css +121 -0
  19. package/src/base/rating.css +40 -0
  20. package/src/base/reveal.css +37 -0
  21. package/src/base/search-filter.css +132 -0
  22. package/src/base/select.css +411 -0
  23. package/src/base/shine.css +14 -0
  24. package/src/base/stepper.css +140 -0
  25. package/src/base/switch.css +152 -0
  26. package/src/base/table.css +143 -33
  27. package/src/base/tabs.css +171 -0
  28. package/src/base/tilt.css +14 -0
  29. package/src/base/timeline.css +84 -0
  30. package/src/base/toggle.css +134 -0
  31. package/src/base/toolbar.css +337 -0
  32. package/src/base/tree.css +156 -11
  33. package/src/glass/button.css +152 -0
  34. package/src/glass/floating-action.css +61 -0
  35. package/src/glass/floating-navigation.css +74 -0
  36. package/src/glass/index.css +23 -0
  37. package/src/glass/input.css +124 -0
  38. package/src/glass/list.css +122 -0
  39. package/src/glass/menu.css +92 -0
  40. package/src/glass/range.css +61 -0
  41. package/src/glass/search-filter.css +49 -0
  42. package/src/glass/select.css +178 -0
  43. package/src/glass/switch.css +28 -0
  44. package/src/glass/table.css +87 -0
  45. package/src/glass/tabs.css +58 -0
  46. package/src/glass/timeline.css +46 -0
  47. package/src/glass/toggle.css +48 -0
  48. package/src/glass/toolbar.css +84 -0
  49. package/src/glass/tree.css +104 -0
  50. package/src/index.css +18 -0
  51. package/src/index.js +25 -2
  52. package/src/material/button.css +153 -0
  53. package/src/material/floating-action.css +60 -0
  54. package/src/material/floating-navigation.css +74 -0
  55. package/src/material/index.css +23 -0
  56. package/src/material/input.css +118 -40
  57. package/src/material/list.css +90 -64
  58. package/src/material/menu.css +92 -0
  59. package/src/material/range.css +62 -0
  60. package/src/material/search-filter.css +49 -0
  61. package/src/material/select.css +170 -0
  62. package/src/material/switch.css +28 -0
  63. package/src/material/table.css +87 -0
  64. package/src/material/tabs.css +62 -0
  65. package/src/material/timeline.css +46 -0
  66. package/src/material/toggle.css +48 -0
  67. package/src/material/toolbar.css +84 -0
  68. package/src/material/tree.css +100 -0
  69. package/src/minimal/button.css +152 -0
  70. package/src/minimal/floating-action.css +59 -0
  71. package/src/minimal/floating-navigation.css +70 -0
  72. package/src/minimal/index.css +23 -0
  73. package/src/minimal/input.css +81 -120
  74. package/src/minimal/list.css +90 -104
  75. package/src/minimal/menu.css +88 -0
  76. package/src/minimal/range.css +61 -0
  77. package/src/minimal/search-filter.css +49 -0
  78. package/src/minimal/select.css +168 -0
  79. package/src/minimal/switch.css +28 -0
  80. package/src/minimal/table.css +87 -0
  81. package/src/minimal/tabs.css +53 -31
  82. package/src/minimal/timeline.css +45 -0
  83. package/src/minimal/toggle.css +48 -0
  84. package/src/minimal/toolbar.css +84 -0
  85. package/src/minimal/tree.css +100 -0
  86. package/src/rokkit/button.css +225 -0
  87. package/src/rokkit/connector.css +11 -0
  88. package/src/rokkit/floating-action.css +65 -0
  89. package/src/rokkit/floating-navigation.css +83 -0
  90. package/src/rokkit/index.css +24 -0
  91. package/src/rokkit/input.css +130 -0
  92. package/src/rokkit/list.css +141 -0
  93. package/src/rokkit/menu.css +123 -0
  94. package/src/rokkit/range.css +62 -0
  95. package/src/rokkit/search-filter.css +49 -0
  96. package/src/rokkit/select.css +185 -0
  97. package/src/rokkit/switch.css +28 -0
  98. package/src/rokkit/table.css +68 -38
  99. package/src/rokkit/tabs.css +82 -0
  100. package/src/rokkit/timeline.css +46 -0
  101. package/src/rokkit/toggle.css +36 -52
  102. package/src/rokkit/toolbar.css +84 -0
  103. package/src/rokkit/tree.css +123 -0
  104. package/src/base/alert.css +0 -30
  105. package/src/base/animation.css +0 -37
  106. package/src/base/atoms.css +0 -58
  107. package/src/base/core.css +0 -107
  108. package/src/base/layout.css +0 -65
  109. package/src/base/molecules.css +0 -109
  110. package/src/base/organisms.css +0 -66
  111. package/src/base/scrollbar.css +0 -16
  112. package/src/base/toggles.css +0 -17
  113. package/src/base.css +0 -13
  114. package/src/markdown.css +0 -955
  115. package/src/material/base.css +0 -12
  116. package/src/material/form.css +0 -30
  117. package/src/material.css +0 -9
  118. package/src/minimal/base.css +0 -8
  119. package/src/minimal/form.css +0 -87
  120. package/src/minimal.css +0 -11
  121. package/src/mixins/mixins.scss +0 -66
  122. package/src/mixins/palette.scss +0 -48
  123. package/src/prism.css +0 -102
  124. package/src/rokkit/alert.css +0 -4
  125. package/src/rokkit/atoms.css +0 -52
  126. package/src/rokkit/carousel.css +0 -19
  127. package/src/rokkit/layout.css +0 -17
  128. package/src/rokkit/molecules.css +0 -124
  129. package/src/rokkit/organisms.css +0 -307
  130. package/src/rokkit.css +0 -11
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Connector - Base Structural Styles
3
+ *
4
+ * Tree line connector component based on @rokkit/ui Connector.
5
+ * Supports LTR and RTL layouts.
6
+ */
7
+
8
+ /* =============================================================================
9
+ Connector Container
10
+ ============================================================================= */
11
+
12
+ [data-connector] {
13
+ display: grid;
14
+ grid-template-columns: 1fr 1fr;
15
+ grid-template-rows: 1fr 1fr;
16
+ flex-shrink: 0;
17
+ align-self: stretch;
18
+ width: 1rem;
19
+ min-height: 1.5rem;
20
+ }
21
+
22
+ /* Size variants (inherited from parent tree) */
23
+ [data-tree][data-size='sm'] [data-connector] {
24
+ width: 1rem;
25
+ min-height: 1.5rem;
26
+ }
27
+
28
+ [data-tree][data-size='md'] [data-connector],
29
+ [data-tree]:not([data-size]) [data-connector] {
30
+ width: 1.25rem;
31
+ min-height: 1.75rem;
32
+ }
33
+
34
+ [data-tree][data-size='lg'] [data-connector] {
35
+ width: 1.5rem;
36
+ min-height: 2rem;
37
+ }
38
+
39
+ /* =============================================================================
40
+ Line Elements
41
+ ============================================================================= */
42
+
43
+ [data-connector] > i {
44
+ display: block;
45
+ }
46
+
47
+ /* Vertical line - half height (for 'last' connector) */
48
+ [data-connector-v] {
49
+ grid-column: 1;
50
+ grid-row: 1;
51
+ border-right-width: 1px;
52
+ border-right-style: solid;
53
+ }
54
+
55
+ /* Vertical line - full height (for 'child' and 'sibling' connectors) */
56
+ [data-connector-v][data-connector-full] {
57
+ grid-row: 1 / -1;
58
+ }
59
+
60
+ /* Horizontal line (connects to node content) - positioned in row 1 with border-bottom */
61
+ [data-connector-h] {
62
+ grid-column: 2;
63
+ grid-row: 1;
64
+ border-bottom-width: 1px;
65
+ border-bottom-style: solid;
66
+ }
67
+
68
+ /* Corner connector for RTL - combines vertical and horizontal */
69
+ [data-connector-corner] {
70
+ grid-column: 1;
71
+ grid-row: 1;
72
+ border-bottom-width: 1px;
73
+ border-bottom-style: solid;
74
+ border-right-width: 1px;
75
+ border-right-style: solid;
76
+ }
77
+
78
+ /* =============================================================================
79
+ RTL Support
80
+ ============================================================================= */
81
+
82
+ [data-connector][data-connector-rtl] [data-connector-v] {
83
+ grid-column: 2;
84
+ border-right-width: 0;
85
+ border-left-width: 1px;
86
+ border-left-style: solid;
87
+ }
88
+
89
+ [data-connector][data-connector-rtl] [data-connector-h] {
90
+ grid-column: 1;
91
+ }
92
+
93
+ [data-connector][data-connector-rtl] [data-connector-corner] {
94
+ grid-column: 2;
95
+ border-right-width: 0;
96
+ border-left-width: 1px;
97
+ border-left-style: solid;
98
+ }
99
+
100
+ /* =============================================================================
101
+ Empty Connector (spacer)
102
+ ============================================================================= */
103
+
104
+ [data-connector][data-connector-type='empty'] {
105
+ /* Just takes up space, no visible lines */
106
+ }
@@ -0,0 +1,91 @@
1
+ /* Base structural styles for display components */
2
+
3
+ /* Display section: key-value pairs */
4
+ [data-display-section] {
5
+ @apply flex flex-col gap-2;
6
+ }
7
+
8
+ [data-display-title] {
9
+ @apply font-semibold text-sm text-on-surface;
10
+ }
11
+
12
+ [data-display-field] {
13
+ @apply flex justify-between items-baseline gap-4;
14
+ }
15
+
16
+ [data-display-label] {
17
+ @apply text-sm text-on-surface/70 shrink-0;
18
+ }
19
+
20
+ [data-display-value] {
21
+ @apply text-sm text-on-surface text-right;
22
+ }
23
+
24
+ /* Badge format: pill style */
25
+ [data-display-value][data-format='badge'] {
26
+ @apply px-2 py-0.5 rounded-full text-xs font-medium bg-surface-z2;
27
+ }
28
+
29
+ /* Boolean format */
30
+ [data-display-value][data-format='boolean'] {
31
+ @apply font-mono;
32
+ }
33
+
34
+ /* Display table wrapper */
35
+ [data-display-table] {
36
+ @apply flex flex-col gap-2;
37
+ }
38
+
39
+ /* Display card grid */
40
+ [data-display-cards] {
41
+ @apply flex flex-col gap-2;
42
+ }
43
+
44
+ [data-display-grid] {
45
+ @apply grid grid-cols-1 gap-3;
46
+ }
47
+
48
+ @media (min-width: 640px) {
49
+ [data-display-grid] {
50
+ @apply grid-cols-2;
51
+ }
52
+ }
53
+
54
+ @media (min-width: 1024px) {
55
+ [data-display-grid] {
56
+ @apply grid-cols-3;
57
+ }
58
+ }
59
+
60
+ [data-display-card] {
61
+ @apply flex flex-col gap-1 p-3 rounded border border-surface-z2 bg-surface;
62
+ }
63
+
64
+ [data-display-card][data-selected] {
65
+ @apply border-primary ring-1 ring-primary;
66
+ }
67
+
68
+ [data-selectable] [data-display-card] {
69
+ @apply cursor-pointer transition-colors;
70
+ }
71
+
72
+ [data-selectable] [data-display-card]:hover {
73
+ @apply bg-surface-z1;
74
+ }
75
+
76
+ /* Display list */
77
+ [data-display-list] {
78
+ @apply flex flex-col gap-2;
79
+ }
80
+
81
+ [data-display-list] ul {
82
+ @apply flex flex-col gap-1;
83
+ }
84
+
85
+ [data-display-list-item] {
86
+ @apply flex gap-4 items-baseline py-1 border-b border-surface-z2 last:border-0;
87
+ }
88
+
89
+ [data-display-list-item] [data-display-field] {
90
+ @apply flex gap-1;
91
+ }
@@ -0,0 +1,388 @@
1
+ /**
2
+ * FloatingAction - Base Structural Styles
3
+ *
4
+ * These styles provide layout, positioning, and basic structure.
5
+ * No colors, shadows, or visual theming - those belong in theme styles.
6
+ */
7
+
8
+ /* =============================================================================
9
+ FAB Container
10
+ ============================================================================= */
11
+
12
+ [data-fab] {
13
+ position: fixed;
14
+ z-index: 50;
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ background: transparent;
19
+ /* Ensure the container only sizes to the trigger button */
20
+ width: fit-content;
21
+ height: fit-content;
22
+ }
23
+
24
+ /* Contained mode - position relative to parent instead of viewport */
25
+ [data-fab][data-contained] {
26
+ position: absolute;
27
+ }
28
+
29
+ [data-fab][data-contained] [data-fab-backdrop] {
30
+ position: absolute;
31
+ }
32
+
33
+ /* Position variants */
34
+ [data-fab][data-position='bottom-right'] {
35
+ bottom: 1.5rem;
36
+ right: 1.5rem;
37
+ }
38
+
39
+ [data-fab][data-position='bottom-left'] {
40
+ bottom: 1.5rem;
41
+ left: 1.5rem;
42
+ }
43
+
44
+ [data-fab][data-position='top-right'] {
45
+ top: 1.5rem;
46
+ right: 1.5rem;
47
+ }
48
+
49
+ [data-fab][data-position='top-left'] {
50
+ top: 1.5rem;
51
+ left: 1.5rem;
52
+ }
53
+
54
+ [data-fab][data-disabled='true'] {
55
+ pointer-events: none;
56
+ opacity: 0.5;
57
+ }
58
+
59
+ /* =============================================================================
60
+ FAB Trigger Button
61
+ ============================================================================= */
62
+
63
+ [data-fab-trigger] {
64
+ position: relative;
65
+ z-index: 1;
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ border-radius: 9999px;
70
+ border: none;
71
+ cursor: pointer;
72
+ transition:
73
+ transform 150ms ease,
74
+ background-color 150ms ease,
75
+ box-shadow 150ms ease;
76
+ }
77
+
78
+ [data-fab-trigger]:disabled {
79
+ cursor: not-allowed;
80
+ }
81
+
82
+ [data-fab-trigger]:focus-visible {
83
+ outline: 2px solid currentColor;
84
+ outline-offset: 2px;
85
+ }
86
+
87
+ /* Size variants for trigger */
88
+ [data-fab][data-size='sm'] [data-fab-trigger] {
89
+ width: 3rem;
90
+ height: 3rem;
91
+ font-size: 1.25rem;
92
+ }
93
+
94
+ [data-fab][data-size='md'] [data-fab-trigger],
95
+ [data-fab]:not([data-size]) [data-fab-trigger] {
96
+ width: 3.5rem;
97
+ height: 3.5rem;
98
+ font-size: 1.5rem;
99
+ }
100
+
101
+ [data-fab][data-size='lg'] [data-fab-trigger] {
102
+ width: 4rem;
103
+ height: 4rem;
104
+ font-size: 1.75rem;
105
+ }
106
+
107
+ /* Trigger rotation when open */
108
+ [data-fab][data-open='true'] [data-fab-trigger] {
109
+ transform: rotate(45deg);
110
+ }
111
+
112
+ /* Icon inside trigger */
113
+ [data-fab-icon] {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ transition: transform 150ms ease;
118
+ }
119
+
120
+ /* Counter-rotate icon when trigger rotates (if using plus icon) */
121
+ [data-fab][data-open='true'] [data-fab-icon] {
122
+ transform: rotate(-45deg);
123
+ }
124
+
125
+ /* =============================================================================
126
+ FAB Menu (Action Items Container)
127
+ ============================================================================= */
128
+
129
+ [data-fab-menu] {
130
+ position: absolute;
131
+ display: flex;
132
+ gap: 0.75rem;
133
+ pointer-events: none;
134
+ }
135
+
136
+ [data-fab][data-open='true'] [data-fab-menu] {
137
+ pointer-events: auto;
138
+ }
139
+
140
+ /* Vertical expansion (default) */
141
+ [data-fab][data-expand='vertical'] [data-fab-menu],
142
+ [data-fab]:not([data-expand]) [data-fab-menu] {
143
+ flex-direction: column-reverse;
144
+ align-items: center;
145
+ }
146
+
147
+ /* Item alignment for vertical expansion - align relative to trigger button */
148
+ [data-fab][data-expand='vertical'][data-item-align='start'] [data-fab-menu],
149
+ [data-fab]:not([data-expand])[data-item-align='start'] [data-fab-menu] {
150
+ align-items: flex-start;
151
+ left: 0;
152
+ }
153
+
154
+ [data-fab][data-expand='vertical'][data-item-align='center'] [data-fab-menu],
155
+ [data-fab]:not([data-expand])[data-item-align='center'] [data-fab-menu],
156
+ [data-fab][data-expand='vertical']:not([data-item-align]) [data-fab-menu],
157
+ [data-fab]:not([data-expand]):not([data-item-align]) [data-fab-menu] {
158
+ left: 50%;
159
+ transform: translateX(-50%);
160
+ }
161
+
162
+ [data-fab][data-expand='vertical'][data-item-align='end'] [data-fab-menu],
163
+ [data-fab]:not([data-expand])[data-item-align='end'] [data-fab-menu] {
164
+ align-items: flex-end;
165
+ right: 0;
166
+ }
167
+
168
+ /* Position menu based on FAB position */
169
+ [data-fab][data-position='bottom-right'][data-expand='vertical'] [data-fab-menu],
170
+ [data-fab][data-position='bottom-right']:not([data-expand]) [data-fab-menu],
171
+ [data-fab][data-position='bottom-left'][data-expand='vertical'] [data-fab-menu],
172
+ [data-fab][data-position='bottom-left']:not([data-expand]) [data-fab-menu] {
173
+ bottom: calc(100% + 0.75rem);
174
+ }
175
+
176
+ [data-fab][data-position='top-right'][data-expand='vertical'] [data-fab-menu],
177
+ [data-fab][data-position='top-right']:not([data-expand]) [data-fab-menu],
178
+ [data-fab][data-position='top-left'][data-expand='vertical'] [data-fab-menu],
179
+ [data-fab][data-position='top-left']:not([data-expand]) [data-fab-menu] {
180
+ top: calc(100% + 0.75rem);
181
+ flex-direction: column;
182
+ }
183
+
184
+ /* Horizontal expansion */
185
+ [data-fab][data-expand='horizontal'] [data-fab-menu] {
186
+ flex-direction: row;
187
+ align-items: center;
188
+ }
189
+
190
+ /* Item alignment for horizontal expansion */
191
+ [data-fab][data-expand='horizontal'][data-item-align='start'] [data-fab-menu] {
192
+ align-items: flex-start;
193
+ }
194
+
195
+ [data-fab][data-expand='horizontal'][data-item-align='end'] [data-fab-menu] {
196
+ align-items: flex-end;
197
+ }
198
+
199
+ [data-fab][data-position='bottom-right'][data-expand='horizontal'] [data-fab-menu],
200
+ [data-fab][data-position='top-right'][data-expand='horizontal'] [data-fab-menu] {
201
+ right: calc(100% + 0.75rem);
202
+ flex-direction: row-reverse;
203
+ }
204
+
205
+ [data-fab][data-position='bottom-left'][data-expand='horizontal'] [data-fab-menu],
206
+ [data-fab][data-position='top-left'][data-expand='horizontal'] [data-fab-menu] {
207
+ left: calc(100% + 0.75rem);
208
+ }
209
+
210
+ /* Radial expansion */
211
+ [data-fab][data-expand='radial'] [data-fab-menu] {
212
+ position: absolute;
213
+ top: 50%;
214
+ left: 50%;
215
+ transform: translate(-50%, -50%);
216
+ width: 0;
217
+ height: 0;
218
+ }
219
+
220
+ /* =============================================================================
221
+ FAB Items
222
+ ============================================================================= */
223
+
224
+ [data-fab-item] {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 0.5rem;
228
+ border-radius: 9999px;
229
+ border: none;
230
+ cursor: pointer;
231
+ white-space: nowrap;
232
+ transition:
233
+ transform 200ms ease,
234
+ opacity 200ms ease,
235
+ background-color 150ms ease;
236
+ transition-delay: var(--fab-delay, 0ms);
237
+ }
238
+
239
+ /* Hidden state (before animation) */
240
+ [data-fab]:not([data-open='true']) [data-fab-item] {
241
+ opacity: 0;
242
+ transform: scale(0.5);
243
+ pointer-events: none;
244
+ }
245
+
246
+ /* Visible state (after animation) */
247
+ [data-fab][data-open='true'] [data-fab-item] {
248
+ opacity: 1;
249
+ transform: scale(1);
250
+ }
251
+
252
+ [data-fab-item][data-disabled='true'],
253
+ [data-fab-item]:disabled {
254
+ pointer-events: none;
255
+ opacity: 0.5;
256
+ cursor: not-allowed;
257
+ }
258
+
259
+ [data-fab-item]:focus-visible {
260
+ outline: 2px solid currentColor;
261
+ outline-offset: 2px;
262
+ }
263
+
264
+ /* Size variants for items */
265
+ [data-fab][data-size='sm'] [data-fab-item] {
266
+ min-width: 2.5rem;
267
+ height: 2.5rem;
268
+ padding: 0 0.75rem;
269
+ font-size: 0.875rem;
270
+ }
271
+
272
+ [data-fab][data-size='md'] [data-fab-item],
273
+ [data-fab]:not([data-size]) [data-fab-item] {
274
+ min-width: 3rem;
275
+ height: 3rem;
276
+ padding: 0 1rem;
277
+ font-size: 0.875rem;
278
+ }
279
+
280
+ [data-fab][data-size='lg'] [data-fab-item] {
281
+ min-width: 3.5rem;
282
+ height: 3.5rem;
283
+ padding: 0 1.25rem;
284
+ font-size: 1rem;
285
+ }
286
+
287
+ /* Icon-only items (no label) */
288
+ [data-fab-item]:not(:has([data-fab-item-label])) {
289
+ padding: 0;
290
+ aspect-ratio: 1;
291
+ justify-content: center;
292
+ }
293
+
294
+ [data-fab-item-icon] {
295
+ display: flex;
296
+ align-items: center;
297
+ justify-content: center;
298
+ flex-shrink: 0;
299
+ }
300
+
301
+ [data-fab-item-label] {
302
+ flex: 1;
303
+ }
304
+
305
+ /* =============================================================================
306
+ Radial Expansion Positioning
307
+ ============================================================================= */
308
+
309
+ [data-fab][data-expand='radial'][data-open='true'] [data-fab-item] {
310
+ position: absolute;
311
+ }
312
+
313
+ /* Radial positions for bottom-right (expanding up-left arc) */
314
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
315
+ [data-fab-item]:nth-child(1) {
316
+ transform: translate(-120%, -20%);
317
+ }
318
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
319
+ [data-fab-item]:nth-child(2) {
320
+ transform: translate(-85%, -85%);
321
+ }
322
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
323
+ [data-fab-item]:nth-child(3) {
324
+ transform: translate(-20%, -120%);
325
+ }
326
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
327
+ [data-fab-item]:nth-child(4) {
328
+ transform: translate(45%, -120%);
329
+ }
330
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
331
+ [data-fab-item]:nth-child(5) {
332
+ transform: translate(-120%, 45%);
333
+ }
334
+
335
+ /* Radial positions for bottom-left (expanding up-right arc) */
336
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
337
+ [data-fab-item]:nth-child(1) {
338
+ transform: translate(20%, -120%);
339
+ }
340
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
341
+ [data-fab-item]:nth-child(2) {
342
+ transform: translate(85%, -85%);
343
+ }
344
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
345
+ [data-fab-item]:nth-child(3) {
346
+ transform: translate(120%, -20%);
347
+ }
348
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
349
+ [data-fab-item]:nth-child(4) {
350
+ transform: translate(-45%, -120%);
351
+ }
352
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
353
+ [data-fab-item]:nth-child(5) {
354
+ transform: translate(120%, 45%);
355
+ }
356
+
357
+ /* =============================================================================
358
+ Backdrop
359
+ ============================================================================= */
360
+
361
+ [data-fab-backdrop] {
362
+ position: fixed;
363
+ inset: 0;
364
+ z-index: -1;
365
+ background: transparent;
366
+ }
367
+
368
+ /* =============================================================================
369
+ Custom Snippet Wrapper
370
+ ============================================================================= */
371
+
372
+ [data-fab-item-custom] {
373
+ display: contents;
374
+ }
375
+
376
+ [data-fab-item-custom] > button {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 0.5rem;
380
+ border-radius: 9999px;
381
+ border: none;
382
+ cursor: pointer;
383
+ white-space: nowrap;
384
+ transition:
385
+ transform 200ms ease,
386
+ opacity 200ms ease,
387
+ background-color 150ms ease;
388
+ }