@rokkit/themes 1.0.0-next.13 → 1.0.0-next.131

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 (119) hide show
  1. package/README.md +118 -9
  2. package/build.mjs +237 -0
  3. package/package.json +45 -52
  4. package/src/base/breadcrumbs.css +47 -0
  5. package/src/base/button.css +247 -0
  6. package/src/base/card.css +36 -0
  7. package/src/base/carousel.css +128 -0
  8. package/src/base/connector.css +92 -0
  9. package/src/base/display.css +91 -0
  10. package/src/base/floating-action.css +388 -0
  11. package/src/base/floating-navigation.css +381 -0
  12. package/src/base/graph-paper.css +83 -0
  13. package/src/base/grid.css +93 -0
  14. package/src/base/index.css +40 -0
  15. package/src/base/input.css +238 -0
  16. package/src/base/item.css +78 -0
  17. package/src/base/list.css +179 -0
  18. package/src/base/menu.css +274 -0
  19. package/src/base/pill.css +57 -0
  20. package/src/base/progress.css +34 -0
  21. package/src/base/range.css +121 -0
  22. package/src/base/rating.css +40 -0
  23. package/src/base/reveal.css +37 -0
  24. package/src/base/search-filter.css +132 -0
  25. package/src/base/select.css +411 -0
  26. package/src/base/shine.css +14 -0
  27. package/src/base/stepper.css +140 -0
  28. package/src/base/switch.css +152 -0
  29. package/src/base/table.css +159 -0
  30. package/src/base/tabs.css +171 -0
  31. package/src/base/tilt.css +14 -0
  32. package/src/base/timeline.css +84 -0
  33. package/src/base/toggle.css +138 -0
  34. package/src/base/toolbar.css +337 -0
  35. package/src/base/tree.css +202 -0
  36. package/src/base/upload-progress.css +155 -0
  37. package/src/base/upload-target.css +67 -0
  38. package/src/glass/button.css +152 -0
  39. package/src/glass/card.css +63 -0
  40. package/src/glass/floating-action.css +61 -0
  41. package/src/glass/floating-navigation.css +74 -0
  42. package/src/glass/index.css +23 -0
  43. package/src/glass/input.css +124 -0
  44. package/src/glass/list.css +122 -0
  45. package/src/glass/menu.css +92 -0
  46. package/src/glass/range.css +61 -0
  47. package/src/glass/search-filter.css +49 -0
  48. package/src/glass/select.css +178 -0
  49. package/src/glass/switch.css +28 -0
  50. package/src/glass/table.css +87 -0
  51. package/src/glass/tabs.css +58 -0
  52. package/src/glass/timeline.css +46 -0
  53. package/src/glass/toggle.css +48 -0
  54. package/src/glass/toolbar.css +84 -0
  55. package/src/glass/tree.css +104 -0
  56. package/src/index.css +18 -0
  57. package/src/index.js +25 -2
  58. package/src/material/button.css +153 -0
  59. package/src/material/card.css +61 -0
  60. package/src/material/floating-action.css +60 -0
  61. package/src/material/floating-navigation.css +74 -0
  62. package/src/material/index.css +23 -0
  63. package/src/material/input.css +143 -0
  64. package/src/material/list.css +122 -0
  65. package/src/material/menu.css +92 -0
  66. package/src/material/range.css +62 -0
  67. package/src/material/search-filter.css +49 -0
  68. package/src/material/select.css +170 -0
  69. package/src/material/switch.css +28 -0
  70. package/src/material/table.css +87 -0
  71. package/src/material/tabs.css +62 -0
  72. package/src/material/timeline.css +46 -0
  73. package/src/material/toggle.css +48 -0
  74. package/src/material/toolbar.css +84 -0
  75. package/src/material/tree.css +100 -0
  76. package/src/minimal/button.css +152 -0
  77. package/src/minimal/card.css +59 -0
  78. package/src/minimal/floating-action.css +59 -0
  79. package/src/minimal/floating-navigation.css +70 -0
  80. package/src/minimal/index.css +23 -0
  81. package/src/minimal/input.css +115 -0
  82. package/src/minimal/list.css +122 -0
  83. package/src/minimal/menu.css +88 -0
  84. package/src/minimal/range.css +61 -0
  85. package/src/minimal/search-filter.css +49 -0
  86. package/src/minimal/select.css +168 -0
  87. package/src/minimal/switch.css +28 -0
  88. package/src/minimal/table.css +87 -0
  89. package/src/minimal/tabs.css +66 -0
  90. package/src/minimal/timeline.css +45 -0
  91. package/src/minimal/toggle.css +48 -0
  92. package/src/minimal/toolbar.css +84 -0
  93. package/src/minimal/tree.css +100 -0
  94. package/src/palette.css +7 -0
  95. package/src/rokkit/button.css +225 -0
  96. package/src/rokkit/card.css +62 -0
  97. package/src/rokkit/connector.css +11 -0
  98. package/src/rokkit/floating-action.css +65 -0
  99. package/src/rokkit/floating-navigation.css +83 -0
  100. package/src/rokkit/grid.css +46 -0
  101. package/src/rokkit/index.css +27 -0
  102. package/src/rokkit/input.css +130 -0
  103. package/src/rokkit/list.css +127 -0
  104. package/src/rokkit/menu.css +93 -0
  105. package/src/rokkit/range.css +62 -0
  106. package/src/rokkit/search-filter.css +49 -0
  107. package/src/rokkit/select.css +185 -0
  108. package/src/rokkit/switch.css +28 -0
  109. package/src/rokkit/table.css +87 -0
  110. package/src/rokkit/tabs.css +82 -0
  111. package/src/rokkit/timeline.css +46 -0
  112. package/src/rokkit/toggle.css +48 -0
  113. package/src/rokkit/toolbar.css +84 -0
  114. package/src/rokkit/tree.css +123 -0
  115. package/src/rokkit/upload-progress.css +102 -0
  116. package/src/rokkit/upload-target.css +50 -0
  117. package/LICENSE +0 -21
  118. package/src/constants.js +0 -4
  119. package/src/utils.js +0 -88
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Button - 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
+ Button
10
+ ============================================================================= */
11
+
12
+ [data-button] {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ gap: 0.5rem;
17
+ border-radius: 0.5rem;
18
+ font-weight: 500;
19
+ cursor: pointer;
20
+ border: 1px solid transparent;
21
+ white-space: nowrap;
22
+ user-select: none;
23
+ text-decoration: none;
24
+ transition: all 150ms ease;
25
+ background: transparent;
26
+ color: inherit;
27
+ font-family: inherit;
28
+ line-height: 1;
29
+ }
30
+
31
+ [data-button]:focus {
32
+ outline: none;
33
+ }
34
+
35
+ [data-button]:focus-visible {
36
+ outline: 2px solid currentColor;
37
+ outline-offset: 2px;
38
+ }
39
+
40
+ /* Disabled */
41
+ [data-button][data-disabled],
42
+ [data-button]:disabled {
43
+ pointer-events: none;
44
+ opacity: 0.5;
45
+ cursor: not-allowed;
46
+ }
47
+
48
+ /* Loading */
49
+ [data-button][data-loading] {
50
+ pointer-events: none;
51
+ position: relative;
52
+ }
53
+
54
+ /* Icon-only */
55
+ [data-button][data-icon-only] {
56
+ aspect-ratio: 1;
57
+ padding: 0;
58
+ }
59
+
60
+ [data-button][data-icon-only] [data-item-text] {
61
+ display: none;
62
+ }
63
+
64
+ /* =============================================================================
65
+ Size Variants
66
+ ============================================================================= */
67
+
68
+ /* Small */
69
+ [data-button][data-size='sm'] {
70
+ height: 1.75rem;
71
+ padding-inline: 0.625rem;
72
+ font-size: 0.75rem;
73
+ gap: 0.375rem;
74
+ }
75
+
76
+ [data-button][data-size='sm'][data-icon-only] {
77
+ width: 1.75rem;
78
+ }
79
+
80
+ [data-button][data-size='sm'] [data-item-icon],
81
+ [data-button][data-size='sm'] [data-button-icon-right] {
82
+ font-size: 1.25rem;
83
+ }
84
+
85
+ /* Medium (default) */
86
+ [data-button][data-size='md'],
87
+ [data-button]:not([data-size]) {
88
+ height: 2.25rem;
89
+ padding-inline: 1rem;
90
+ font-size: 0.875rem;
91
+ gap: 0.5rem;
92
+ }
93
+
94
+ [data-button][data-size='md'][data-icon-only],
95
+ [data-button]:not([data-size])[data-icon-only] {
96
+ width: 2.25rem;
97
+ }
98
+
99
+ [data-button][data-size='md'] [data-item-icon],
100
+ [data-button][data-size='md'] [data-button-icon-right],
101
+ [data-button]:not([data-size]) [data-item-icon],
102
+ [data-button]:not([data-size]) [data-button-icon-right] {
103
+ font-size: 1.5rem;
104
+ }
105
+
106
+ /* Large */
107
+ [data-button][data-size='lg'] {
108
+ height: 2.75rem;
109
+ padding-inline: 1.5rem;
110
+ font-size: 1rem;
111
+ gap: 0.625rem;
112
+ }
113
+
114
+ [data-button][data-size='lg'][data-icon-only] {
115
+ width: 2.75rem;
116
+ }
117
+
118
+ [data-button][data-size='lg'] [data-item-icon],
119
+ [data-button][data-size='lg'] [data-button-icon-right] {
120
+ font-size: 1.875rem;
121
+ }
122
+
123
+ /* =============================================================================
124
+ Button Elements
125
+ ============================================================================= */
126
+
127
+ [data-button] [data-item-icon],
128
+ [data-button] [data-button-icon-right] {
129
+ flex-shrink: 0;
130
+ }
131
+
132
+ [data-button] [data-item-text] {
133
+ display: inline-flex;
134
+ align-items: center;
135
+ }
136
+
137
+ /* Hide description and badge inside buttons (ItemContent renders them but we don't need them) */
138
+ [data-button] [data-item-description],
139
+ [data-button] [data-item-badge] {
140
+ display: none;
141
+ }
142
+
143
+ /* =============================================================================
144
+ Gradient Style — Structural
145
+ ============================================================================= */
146
+
147
+ [data-button][data-style='gradient'] {
148
+ border: none;
149
+ }
150
+
151
+ /* =============================================================================
152
+ Link Style — Structural
153
+ ============================================================================= */
154
+
155
+ [data-button][data-style='link'] {
156
+ background: transparent;
157
+ border: none;
158
+ height: auto;
159
+ padding-inline: 0.25rem;
160
+ border-radius: 0;
161
+ font-weight: inherit;
162
+ }
163
+
164
+ [data-button][data-style='link']:hover:not(:disabled):not([data-disabled]) {
165
+ text-decoration: underline;
166
+ text-underline-offset: 2px;
167
+ }
168
+
169
+ /* =============================================================================
170
+ Micro-Animations
171
+ ============================================================================= */
172
+
173
+ /* Hover lift — subtle elevation on hover (not on link or ghost style) */
174
+ [data-button]:not([data-style='link']):not([data-style='ghost']):hover:not(:disabled):not([data-disabled]) {
175
+ transform: translateY(-1px);
176
+ }
177
+
178
+ /* Press feedback — scale down on active */
179
+ [data-button]:active:not(:disabled):not([data-disabled]) {
180
+ transform: scale(0.97) translateY(0);
181
+ }
182
+
183
+ /* Icon shift — trailing icon moves right on hover */
184
+ [data-button]:hover:not(:disabled):not([data-disabled]) [data-button-icon-right] {
185
+ translate: 0.125rem 0;
186
+ }
187
+
188
+ [data-button] [data-button-icon-right] {
189
+ transition: translate 150ms ease;
190
+ }
191
+
192
+ /* Loading pulse */
193
+ [data-button][data-loading] {
194
+ animation: button-loading-pulse 1.5s ease-in-out infinite;
195
+ }
196
+
197
+ @keyframes button-loading-pulse {
198
+ 0%, 100% { opacity: 1; }
199
+ 50% { opacity: 0.7; }
200
+ }
201
+
202
+ /* =============================================================================
203
+ Loading Spinner
204
+ ============================================================================= */
205
+
206
+ [data-button-spinner] {
207
+ width: 1em;
208
+ height: 1em;
209
+ border: 2px solid currentColor;
210
+ border-right-color: transparent;
211
+ border-radius: 50%;
212
+ animation: button-spin 0.6s linear infinite;
213
+ flex-shrink: 0;
214
+ }
215
+
216
+ @keyframes button-spin {
217
+ to {
218
+ transform: rotate(360deg);
219
+ }
220
+ }
221
+
222
+ /* =============================================================================
223
+ Button Group
224
+ ============================================================================= */
225
+
226
+ [data-button-group] {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ }
230
+
231
+ [data-button-group] [data-button] {
232
+ border-radius: 0;
233
+ }
234
+
235
+ [data-button-group] [data-button]:first-child {
236
+ border-top-left-radius: 0.5rem;
237
+ border-bottom-left-radius: 0.5rem;
238
+ }
239
+
240
+ [data-button-group] [data-button]:last-child {
241
+ border-top-right-radius: 0.5rem;
242
+ border-bottom-right-radius: 0.5rem;
243
+ }
244
+
245
+ [data-button-group] [data-button]:not(:first-child) {
246
+ margin-left: -1px;
247
+ }
@@ -0,0 +1,36 @@
1
+ /* Card — base structural styles */
2
+
3
+ [data-card] {
4
+ display: flex;
5
+ flex-direction: column;
6
+ border-radius: 0.5rem;
7
+ overflow: hidden;
8
+ text-decoration: none;
9
+ color: inherit;
10
+ }
11
+
12
+ button[data-card] {
13
+ background: none;
14
+ border: none;
15
+ cursor: pointer;
16
+ text-align: inherit;
17
+ font: inherit;
18
+ padding: 0;
19
+ }
20
+
21
+ a[data-card] {
22
+ cursor: pointer;
23
+ }
24
+
25
+ [data-card-header] {
26
+ padding: 1rem 1rem 0.5rem;
27
+ }
28
+
29
+ [data-card-body] {
30
+ padding: 0.5rem 1rem;
31
+ flex: 1;
32
+ }
33
+
34
+ [data-card-footer] {
35
+ padding: 0.5rem 1rem 1rem;
36
+ }
@@ -0,0 +1,128 @@
1
+ /* Carousel — base structural styles */
2
+
3
+ [data-carousel] {
4
+ position: relative;
5
+ overflow: hidden;
6
+ outline: none;
7
+ }
8
+
9
+ [data-carousel-viewport] {
10
+ overflow: hidden;
11
+ width: 100%;
12
+ }
13
+
14
+ /* ─── Slide transition ─── */
15
+
16
+ [data-carousel-transition="slide"] [data-carousel-track] {
17
+ display: flex;
18
+ transition: transform 0.4s ease;
19
+ transform: translateX(calc(-100% * var(--carousel-current, 0)));
20
+ }
21
+
22
+ [data-carousel-transition="slide"] [data-carousel-slide] {
23
+ flex: 0 0 100%;
24
+ min-width: 0;
25
+ }
26
+
27
+ /* ─── Fade transition ─── */
28
+
29
+ [data-carousel-transition="fade"] [data-carousel-track] {
30
+ position: relative;
31
+ }
32
+
33
+ [data-carousel-transition="fade"] [data-carousel-slide] {
34
+ position: absolute;
35
+ inset: 0;
36
+ opacity: 0;
37
+ transition: opacity 0.4s ease;
38
+ pointer-events: none;
39
+ }
40
+
41
+ [data-carousel-transition="fade"] [data-carousel-slide][data-active] {
42
+ position: relative;
43
+ opacity: 1;
44
+ pointer-events: auto;
45
+ }
46
+
47
+ /* ─── No transition ─── */
48
+
49
+ [data-carousel-transition="none"] [data-carousel-track] {
50
+ display: flex;
51
+ transform: translateX(calc(-100% * var(--carousel-current, 0)));
52
+ }
53
+
54
+ [data-carousel-transition="none"] [data-carousel-slide] {
55
+ flex: 0 0 100%;
56
+ min-width: 0;
57
+ }
58
+
59
+ /* ─── Arrow buttons ─── */
60
+
61
+ [data-carousel-prev],
62
+ [data-carousel-next] {
63
+ position: absolute;
64
+ top: 50%;
65
+ transform: translateY(-50%);
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ width: 2.5rem;
70
+ height: 2.5rem;
71
+ border: none;
72
+ border-radius: 9999px;
73
+ cursor: pointer;
74
+ background: rgba(0, 0, 0, 0.3);
75
+ color: white;
76
+ font-size: 1.25rem;
77
+ z-index: 1;
78
+ opacity: 0.7;
79
+ transition: opacity 0.2s ease;
80
+ }
81
+
82
+ [data-carousel-prev]:hover,
83
+ [data-carousel-next]:hover {
84
+ opacity: 1;
85
+ }
86
+
87
+ [data-carousel-prev]:disabled,
88
+ [data-carousel-next]:disabled {
89
+ opacity: 0.3;
90
+ cursor: default;
91
+ }
92
+
93
+ [data-carousel-prev] {
94
+ left: 0.5rem;
95
+ }
96
+
97
+ [data-carousel-next] {
98
+ right: 0.5rem;
99
+ }
100
+
101
+ /* ─── Dots ─── */
102
+
103
+ [data-carousel-dots] {
104
+ display: flex;
105
+ justify-content: center;
106
+ gap: 0.5rem;
107
+ padding: 0.75rem 0;
108
+ }
109
+
110
+ [data-carousel-dot] {
111
+ width: 0.625rem;
112
+ height: 0.625rem;
113
+ border-radius: 9999px;
114
+ border: none;
115
+ cursor: pointer;
116
+ background: currentColor;
117
+ opacity: 0.3;
118
+ transition: opacity 0.2s ease;
119
+ padding: 0;
120
+ }
121
+
122
+ [data-carousel-dot][data-active] {
123
+ opacity: 1;
124
+ }
125
+
126
+ [data-carousel-dot]:hover {
127
+ opacity: 0.7;
128
+ }
@@ -0,0 +1,92 @@
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
+ }
52
+
53
+ /* Vertical line - full height (for 'child' and 'sibling' connectors) */
54
+ [data-connector-v][data-connector-full] {
55
+ grid-row: 1 / -1;
56
+ }
57
+
58
+ /* Horizontal line (connects to node content) - positioned in row 1 with border-bottom */
59
+ [data-connector-h] {
60
+ grid-column: 2;
61
+ grid-row: 1;
62
+ }
63
+
64
+ /* Corner connector for RTL - combines vertical and horizontal */
65
+ [data-connector-corner] {
66
+ grid-column: 1;
67
+ grid-row: 1;
68
+ }
69
+
70
+ /* =============================================================================
71
+ RTL Support
72
+ ============================================================================= */
73
+
74
+ [data-connector][data-connector-rtl] [data-connector-v] {
75
+ grid-column: 2;
76
+ }
77
+
78
+ [data-connector][data-connector-rtl] [data-connector-h] {
79
+ grid-column: 1;
80
+ }
81
+
82
+ [data-connector][data-connector-rtl] [data-connector-corner] {
83
+ grid-column: 2;
84
+ }
85
+
86
+ /* =============================================================================
87
+ Empty Connector (spacer)
88
+ ============================================================================= */
89
+
90
+ [data-connector][data-connector-type='empty'] {
91
+ /* Just takes up space, no visible lines */
92
+ }
@@ -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
+ }