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

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/src/base/list.css CHANGED
@@ -19,6 +19,11 @@
19
19
  opacity: 0.5;
20
20
  }
21
21
 
22
+ [dir='rtl'] [data-list] [data-list-item] {
23
+ flex-direction: row-reverse;
24
+ text-align: right;
25
+ }
26
+
22
27
  /* =============================================================================
23
28
  List Items (shared for links and buttons)
24
29
  ============================================================================= */
@@ -92,38 +97,16 @@ button[data-list-item] {
92
97
  Item Elements - uses shared [data-item-*] from item.css
93
98
  ============================================================================= */
94
99
 
95
- /* =============================================================================
96
- Custom Snippet Wrapper
97
- ============================================================================= */
98
-
99
- [data-list-item-custom] {
100
- display: contents;
101
- }
102
-
103
- [data-list-item-custom] > a,
104
- [data-list-item-custom] > button {
105
- display: flex;
106
- align-items: center;
107
- width: 100%;
108
- text-align: left;
109
- text-decoration: none;
110
- cursor: pointer;
111
- transition: background-color 150ms ease;
112
- }
113
-
114
100
  /* =============================================================================
115
101
  Groups
116
102
  ============================================================================= */
117
103
 
118
104
  [data-list-group] {
119
- padding-block: 0.25rem;
120
- }
121
-
122
- [data-list-group-label] {
123
105
  display: flex;
124
106
  align-items: center;
125
107
  width: 100%;
126
108
  gap: 0.5rem;
109
+ padding-block: 0.25rem;
127
110
  font-size: 0.75rem;
128
111
  font-weight: 600;
129
112
  text-transform: uppercase;
@@ -133,113 +116,46 @@ button[data-list-item] {
133
116
  }
134
117
 
135
118
  /* Non-collapsible group labels are not interactive */
136
- [data-list]:not([data-collapsible='true']) [data-list-group-label] {
119
+ [data-list]:not([data-collapsible='true']) [data-list-group] {
137
120
  cursor: default;
138
121
  }
139
122
 
140
- [data-list-group-label]:focus {
123
+ [data-list-group]:focus {
141
124
  outline: none;
142
125
  }
143
126
 
144
127
  /* Group label sizes */
145
- [data-list][data-size='sm'] [data-list-group-label] {
128
+ [data-list][data-size='sm'] [data-list-group] {
146
129
  padding: 0.25rem 0.5rem;
147
130
  }
148
- [data-list][data-size='md'] [data-list-group-label],
149
- [data-list]:not([data-size]) [data-list-group-label] {
131
+ [data-list][data-size='md'] [data-list-group],
132
+ [data-list]:not([data-size]) [data-list-group] {
150
133
  padding: 0.375rem 0.75rem;
151
134
  }
152
- [data-list][data-size='lg'] [data-list-group-label] {
135
+ [data-list][data-size='lg'] [data-list-group] {
153
136
  padding: 0.5rem 1rem;
154
137
  }
155
138
 
156
- [data-list-group-label] > [data-list-group-icon] {
157
- flex-shrink: 0;
139
+ /* Group item content — inherits font from [data-list-group], label stays inline */
140
+ [data-list-group] > [data-item-icon] {
158
141
  opacity: 0.7;
159
142
  }
160
143
 
161
- [data-list-group-label] > [data-list-group-text] {
162
- flex: 1;
163
- text-align: left;
164
- }
165
-
166
- [data-list-group-label] > [data-list-group-arrow] {
167
- flex-shrink: 0;
168
- transition: transform 150ms ease;
169
- }
170
-
171
- [data-list-group][data-list-group-collapsed='true'] [data-list-group-arrow] {
172
- transform: rotate(-90deg);
173
- }
174
-
175
- /* Group label with nested button */
176
- [data-list-group-label] > button {
177
- display: flex;
178
- align-items: center;
179
- justify-content: space-between;
180
- width: 100%;
181
- padding: 0.5rem 0.75rem;
182
- font-size: 0.875rem;
183
- font-weight: 500;
184
- cursor: pointer;
185
- transition:
186
- background-color 150ms ease,
187
- color 150ms ease;
188
- }
189
-
190
- [data-list-group-label] > button [data-icon] {
191
- flex-shrink: 0;
192
- }
193
-
194
- [data-list-group-label] > button [data-chevron] {
195
- flex-shrink: 0;
196
- font-size: 0.75rem;
197
- transition: transform 150ms ease;
198
- }
199
-
200
- [data-list-group-label] > button[data-state='open'] [data-chevron] {
201
- transform: rotate(180deg);
202
- }
203
-
204
- /* Group label as button directly */
205
- button[data-list-group-label] {
206
- display: flex;
207
- align-items: center;
208
- justify-content: space-between;
209
- width: 100%;
210
- padding: 0.5rem 0.75rem;
211
- font-size: 0.75rem;
212
- font-weight: 600;
213
- text-transform: uppercase;
214
- letter-spacing: 0.05em;
215
- cursor: pointer;
216
- transition: color 150ms ease;
144
+ [data-list-group] > [data-item-text] {
145
+ display: contents;
217
146
  }
218
147
 
219
- button[data-list-group-label] [data-icon] {
220
- flex-shrink: 0;
148
+ [data-list-group] [data-item-label] {
149
+ font-weight: inherit;
221
150
  }
222
151
 
223
- button[data-list-group-label] [data-chevron] {
152
+ /* Expand/collapse chevron — pushed to the right edge */
153
+ [data-list-expand-icon] {
224
154
  flex-shrink: 0;
225
- font-size: 0.75rem;
155
+ margin-left: auto;
226
156
  transition: transform 150ms ease;
227
157
  }
228
158
 
229
- button[data-list-group-label][data-state='open'] [data-chevron] {
230
- transform: rotate(180deg);
231
- }
232
-
233
- button[data-list-group-label] [data-stats] {
234
- font-weight: 400;
235
- text-transform: none;
236
- }
237
-
238
- [data-list-group-items] {
239
- display: flex;
240
- flex-direction: column;
241
- }
242
-
243
159
  /* =============================================================================
244
160
  Multi-selection
245
161
  ============================================================================= */
@@ -249,10 +165,15 @@ button[data-list-group-label] [data-stats] {
249
165
  }
250
166
 
251
167
  /* =============================================================================
252
- Divider
168
+ Separator / Spacer
253
169
  ============================================================================= */
254
170
 
255
- [data-list-divider] {
171
+ [data-list-separator] {
256
172
  height: 1px;
257
173
  margin-block: 0.25rem;
174
+ border: none;
175
+ }
176
+
177
+ [data-list-spacer] {
178
+ height: 0.5rem;
258
179
  }
package/src/base/menu.css CHANGED
@@ -211,112 +211,64 @@
211
211
  }
212
212
 
213
213
  /* =============================================================================
214
- Item Elements (icon, content, shortcut)
214
+ Item Elements - uses shared [data-item-*] from item.css
215
215
  ============================================================================= */
216
216
 
217
- [data-menu-item] > [data-menu-item-icon] {
218
- flex-shrink: 0;
219
- }
220
-
221
- [data-menu-item] > [data-menu-item-content] {
222
- display: flex;
223
- flex-direction: column;
224
- flex: 1;
225
- min-width: 0;
226
- }
227
-
228
- [data-menu-item] > [data-menu-item-content] > [data-menu-item-label] {
229
- font-weight: 500;
230
- white-space: nowrap;
231
- overflow: hidden;
232
- text-overflow: ellipsis;
233
- }
234
-
235
- [data-menu-item] > [data-menu-item-content] > [data-menu-item-description] {
236
- font-size: 0.75em;
237
- white-space: nowrap;
238
- overflow: hidden;
239
- text-overflow: ellipsis;
240
- }
241
-
242
- [data-menu-item] > [data-menu-item-shortcut] {
243
- flex-shrink: 0;
244
- margin-left: auto;
245
- padding: 0.125rem 0.375rem;
246
- font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
247
- font-size: 0.75em;
248
- font-weight: 500;
249
- border-radius: 0.25rem;
250
- }
251
-
252
- /* =============================================================================
253
- Custom Snippet Wrapper
254
- ============================================================================= */
255
-
256
- [data-menu-item-custom] {
257
- display: contents;
258
- }
259
-
260
- /* Style direct children of custom wrapper */
261
- [data-menu-item-custom] > button,
262
- [data-menu-item-custom] > a {
263
- display: flex;
264
- align-items: center;
265
- width: 100%;
266
- text-align: left;
267
- background: transparent;
268
- border: none;
269
- cursor: pointer;
270
- transition: background-color 150ms ease;
271
- }
272
-
273
- [data-menu-item-custom][data-disabled='true'] > button,
274
- [data-menu-item-custom][data-disabled='true'] > a {
275
- pointer-events: none;
276
- opacity: 0.5;
277
- cursor: not-allowed;
278
- }
279
-
280
217
  /* =============================================================================
281
218
  Groups
282
219
  ============================================================================= */
283
220
 
284
221
  [data-menu-group] {
285
- padding-block: 0.25rem;
286
- }
287
-
288
- [data-menu-group-label] {
289
222
  display: flex;
290
223
  align-items: center;
224
+ width: 100%;
291
225
  gap: 0.5rem;
292
226
  font-size: 0.75rem;
293
227
  font-weight: 600;
294
228
  text-transform: uppercase;
295
229
  letter-spacing: 0.05em;
230
+ cursor: pointer;
231
+ transition: color 150ms ease;
296
232
  }
297
233
 
298
- /* Group label sizes */
299
- [data-menu][data-size='sm'] [data-menu-group-label] {
234
+ /* Group sizes */
235
+ [data-menu][data-size='sm'] [data-menu-group] {
300
236
  padding: 0.25rem 0.5rem;
301
237
  }
302
- [data-menu][data-size='md'] [data-menu-group-label],
303
- [data-menu]:not([data-size]) [data-menu-group-label] {
238
+ [data-menu][data-size='md'] [data-menu-group],
239
+ [data-menu]:not([data-size]) [data-menu-group] {
304
240
  padding: 0.375rem 0.75rem;
305
241
  }
306
- [data-menu][data-size='lg'] [data-menu-group-label] {
242
+ [data-menu][data-size='lg'] [data-menu-group] {
307
243
  padding: 0.5rem 1rem;
308
244
  }
309
245
 
310
- [data-menu-group-label] > [data-menu-group-icon] {
246
+ [data-menu-group]:focus {
247
+ outline: none;
248
+ }
249
+
250
+ [data-menu-group] > [data-menu-group-icon] {
311
251
  flex-shrink: 0;
312
252
  opacity: 0.7;
313
253
  }
314
254
 
255
+ [data-menu-group] > [data-menu-group-text] {
256
+ flex: 1;
257
+ text-align: left;
258
+ }
259
+
260
+ [data-menu-expand-icon] {
261
+ flex-shrink: 0;
262
+ margin-left: auto;
263
+ transition: transform 150ms ease;
264
+ }
265
+
315
266
  /* =============================================================================
316
- Divider
267
+ Separator
317
268
  ============================================================================= */
318
269
 
319
- [data-menu-divider] {
270
+ [data-menu-separator] {
320
271
  height: 1px;
321
272
  margin-block: 0.25rem;
273
+ border: none;
322
274
  }
@@ -22,6 +22,10 @@
22
22
  opacity: 0.5;
23
23
  }
24
24
 
25
+ [dir='rtl'] [data-toggle] {
26
+ flex-direction: row-reverse;
27
+ }
28
+
25
29
  /* =============================================================================
26
30
  Toggle Options
27
31
  ============================================================================= */
package/src/base/tree.css CHANGED
@@ -84,13 +84,52 @@
84
84
  }
85
85
 
86
86
  /* =============================================================================
87
- Tree Indent (when showLines=false)
87
+ Line Style Variants
88
+ Connectors have no borders by default. data-line-style activates them.
89
+ 'none' keeps connectors in DOM for spacing but lines stay invisible.
88
90
  ============================================================================= */
89
91
 
90
- [data-tree-indent] {
91
- flex-shrink: 0;
92
- align-self: stretch;
93
- }
92
+ /* Shared: activate 1px border for all visible line styles (solid/dashed/dotted).
93
+ Uses longhand width+style so theme border-color is not overridden. */
94
+ [data-tree]:not([data-line-style='none']) [data-connector-v] {
95
+ border-right-width: 1px;
96
+ }
97
+ [data-tree]:not([data-line-style='none']) [data-connector-h] {
98
+ border-bottom-width: 1px;
99
+ }
100
+ [data-tree]:not([data-line-style='none']) [data-connector-corner] {
101
+ border-bottom-width: 1px;
102
+ border-right-width: 1px;
103
+ }
104
+ [data-tree]:not([data-line-style='none']) [data-connector-rtl] [data-connector-v] {
105
+ border-right-width: 0;
106
+ border-left-width: 1px;
107
+ }
108
+ [data-tree]:not([data-line-style='none']) [data-connector-rtl] [data-connector-corner] {
109
+ border-right-width: 0;
110
+ border-left-width: 1px;
111
+ }
112
+
113
+ /* Solid (default visible style) */
114
+ [data-tree][data-line-style='solid'] [data-connector-v] { border-right-style: solid; }
115
+ [data-tree][data-line-style='solid'] [data-connector-h] { border-bottom-style: solid; }
116
+ [data-tree][data-line-style='solid'] [data-connector-corner] { border-bottom-style: solid; border-right-style: solid; }
117
+ [data-tree][data-line-style='solid'] [data-connector-rtl] [data-connector-v] { border-left-style: solid; }
118
+ [data-tree][data-line-style='solid'] [data-connector-rtl] [data-connector-corner] { border-left-style: solid; }
119
+
120
+ /* Dashed */
121
+ [data-tree][data-line-style='dashed'] [data-connector-v] { border-right-style: dashed; }
122
+ [data-tree][data-line-style='dashed'] [data-connector-h] { border-bottom-style: dashed; }
123
+ [data-tree][data-line-style='dashed'] [data-connector-corner] { border-bottom-style: dashed; border-right-style: dashed; }
124
+ [data-tree][data-line-style='dashed'] [data-connector-rtl] [data-connector-v] { border-left-style: dashed; }
125
+ [data-tree][data-line-style='dashed'] [data-connector-rtl] [data-connector-corner] { border-left-style: dashed; }
126
+
127
+ /* Dotted */
128
+ [data-tree][data-line-style='dotted'] [data-connector-v] { border-right-style: dotted; }
129
+ [data-tree][data-line-style='dotted'] [data-connector-h] { border-bottom-style: dotted; }
130
+ [data-tree][data-line-style='dotted'] [data-connector-corner] { border-bottom-style: dotted; border-right-style: dotted; }
131
+ [data-tree][data-line-style='dotted'] [data-connector-rtl] [data-connector-v] { border-left-style: dotted; }
132
+ [data-tree][data-line-style='dotted'] [data-connector-rtl] [data-connector-corner] { border-left-style: dotted; }
94
133
 
95
134
  /* =============================================================================
96
135
  Tree Item Content
@@ -0,0 +1,155 @@
1
+ /**
2
+ * UploadProgress - Base Structural Styles
3
+ *
4
+ * Layout: header flex, file row layout, progress bar track, action positioning.
5
+ * No colors or visual theming - those belong in theme styles.
6
+ */
7
+
8
+ /* =============================================================================
9
+ Container
10
+ ============================================================================= */
11
+
12
+ [data-upload-progress] {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 0.25rem;
16
+ }
17
+
18
+ /* =============================================================================
19
+ Header
20
+ ============================================================================= */
21
+
22
+ [data-upload-header] {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ gap: 0.75rem;
27
+ padding: 0.5rem 0.75rem;
28
+ font-size: 0.875rem;
29
+ font-weight: 500;
30
+ }
31
+
32
+ [data-upload-clear] {
33
+ padding: 0.25rem 0.5rem;
34
+ border-radius: 0.25rem;
35
+ font-size: 0.75rem;
36
+ cursor: pointer;
37
+ border: 1px solid currentColor;
38
+ background: transparent;
39
+ transition:
40
+ background-color 150ms ease,
41
+ color 150ms ease;
42
+ }
43
+
44
+ /* =============================================================================
45
+ File Status
46
+ ============================================================================= */
47
+
48
+ [data-upload-file-status] {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 0.75rem;
52
+ padding: 0.375rem 0.75rem;
53
+ font-size: 0.875rem;
54
+ transition: background-color 150ms ease;
55
+ }
56
+
57
+ /* =============================================================================
58
+ File Elements
59
+ ============================================================================= */
60
+
61
+ [data-upload-file-icon] {
62
+ flex-shrink: 0;
63
+ font-size: 1.25rem;
64
+ }
65
+
66
+ [data-upload-file-name] {
67
+ flex: 1;
68
+ min-width: 0;
69
+ overflow: hidden;
70
+ text-overflow: ellipsis;
71
+ white-space: nowrap;
72
+ }
73
+
74
+ [data-upload-file-size] {
75
+ flex-shrink: 0;
76
+ font-size: 0.75rem;
77
+ white-space: nowrap;
78
+ }
79
+
80
+ /* =============================================================================
81
+ Progress Bar
82
+ ============================================================================= */
83
+
84
+ [data-upload-bar] {
85
+ position: relative;
86
+ width: 6rem;
87
+ height: 0.375rem;
88
+ border-radius: 9999px;
89
+ overflow: hidden;
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ [data-upload-fill] {
94
+ height: 100%;
95
+ border-radius: 9999px;
96
+ transition: width 0.3s ease;
97
+ }
98
+
99
+ /* =============================================================================
100
+ Status Badge
101
+ ============================================================================= */
102
+
103
+ [data-upload-status] {
104
+ flex-shrink: 0;
105
+ font-size: 0.75rem;
106
+ font-weight: 500;
107
+ text-transform: capitalize;
108
+ }
109
+
110
+ /* =============================================================================
111
+ Action Buttons
112
+ ============================================================================= */
113
+
114
+ [data-upload-actions] {
115
+ display: flex;
116
+ gap: 0.25rem;
117
+ flex-shrink: 0;
118
+ }
119
+
120
+ [data-upload-actions] button {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ width: 1.5rem;
125
+ height: 1.5rem;
126
+ padding: 0;
127
+ border: none;
128
+ border-radius: 0.25rem;
129
+ cursor: pointer;
130
+ background: transparent;
131
+ font-size: 0.875rem;
132
+ transition:
133
+ background-color 150ms ease,
134
+ color 150ms ease;
135
+ }
136
+
137
+ /* =============================================================================
138
+ Grid View Tiles
139
+ ============================================================================= */
140
+
141
+ [data-grid] [data-upload-file-status] {
142
+ flex-direction: column;
143
+ align-items: center;
144
+ text-align: center;
145
+ padding: 1rem;
146
+ gap: 0.5rem;
147
+ }
148
+
149
+ [data-grid] [data-upload-file-status] [data-upload-file-icon] {
150
+ font-size: 2rem;
151
+ }
152
+
153
+ [data-grid] [data-upload-file-status] [data-upload-bar] {
154
+ width: 100%;
155
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * UploadTarget - Base Structural Styles
3
+ *
4
+ * Layout: flex centering, dashed border, sizing, transitions.
5
+ * No colors or visual theming - those belong in theme styles.
6
+ */
7
+
8
+ /* =============================================================================
9
+ Drop Zone Container
10
+ ============================================================================= */
11
+
12
+ [data-upload-target] {
13
+ display: flex;
14
+ flex-direction: column;
15
+ align-items: center;
16
+ justify-content: center;
17
+ gap: 0.75rem;
18
+ min-height: 10rem;
19
+ padding: 2rem;
20
+ border: 2px dashed currentColor;
21
+ border-radius: 0.5rem;
22
+ cursor: pointer;
23
+ transition:
24
+ border-color 150ms ease,
25
+ background-color 150ms ease;
26
+ user-select: none;
27
+ }
28
+
29
+ [data-upload-target]:focus {
30
+ outline: none;
31
+ }
32
+
33
+ [data-upload-target][data-disabled] {
34
+ pointer-events: none;
35
+ opacity: 0.5;
36
+ cursor: not-allowed;
37
+ }
38
+
39
+ /* =============================================================================
40
+ Upload Icon
41
+ ============================================================================= */
42
+
43
+ [data-upload-target] [data-upload-icon] {
44
+ font-size: 2rem;
45
+ }
46
+
47
+ /* =============================================================================
48
+ Browse Button
49
+ ============================================================================= */
50
+
51
+ [data-upload-target] [data-upload-button] {
52
+ padding: 0.375rem 0.75rem;
53
+ border-radius: 0.375rem;
54
+ font-size: 0.875rem;
55
+ font-weight: 500;
56
+ cursor: pointer;
57
+ border: 1px solid currentColor;
58
+ background: transparent;
59
+ transition:
60
+ background-color 150ms ease,
61
+ color 150ms ease;
62
+ }
63
+
64
+ [data-upload-target] [data-upload-button]:disabled {
65
+ pointer-events: none;
66
+ opacity: 0.5;
67
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Card - Glass Theme Styles
3
+ *
4
+ * Glassmorphism styling with blur and transparency.
5
+ */
6
+
7
+ /* =============================================================================
8
+ Base Card Styles
9
+ ============================================================================= */
10
+
11
+ [data-style='glass'] [data-card] {
12
+ @apply backdrop-blur-md border shadow-lg bg-surface-z2/60 border-surface-z5/20 text-surface-z9;
13
+ }
14
+
15
+ /* Interactive cards (buttons) */
16
+ [data-style='glass'] [data-card][data-card-interactive] {
17
+ cursor: pointer;
18
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
19
+ }
20
+
21
+ [data-style='glass'] [data-card][data-card-interactive]:hover {
22
+ @apply shadow-xl bg-surface-z2/80;
23
+ transform: translateY(-2px);
24
+ }
25
+
26
+ [data-style='glass'] [data-card][data-card-interactive]:active {
27
+ @apply shadow-lg;
28
+ transform: translateY(0);
29
+ }
30
+
31
+ /* =============================================================================
32
+ Card Sections
33
+ ============================================================================= */
34
+
35
+ [data-style='glass'] [data-card-header] {
36
+ @apply border-surface-z5/20 border-b;
37
+ }
38
+
39
+ [data-style='glass'] [data-card-body] {
40
+ @apply text-surface-z8;
41
+ }
42
+
43
+ [data-style='glass'] [data-card-footer] {
44
+ @apply border-surface-z5/20 border-t text-surface-z7;
45
+ }
46
+
47
+ /* =============================================================================
48
+ Focus States
49
+ ============================================================================= */
50
+
51
+ [data-style='glass'] [data-card][data-card-interactive]:focus-visible {
52
+ @apply outline-none ring-2 ring-surface-z5/40;
53
+ }
54
+
55
+ /* =============================================================================
56
+ Disabled State
57
+ ============================================================================= */
58
+
59
+ [data-style='glass'] [data-card][data-card-interactive][data-disabled],
60
+ [data-style='glass'] [data-card][data-card-interactive]:disabled {
61
+ @apply opacity-50 cursor-not-allowed;
62
+ transform: none;
63
+ }