@lgtm-hq/turbo-themes 0.12.16

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/assets/css/adapters/bulma.css +26 -0
  4. package/assets/css/themes/bulma-dark.css +90 -0
  5. package/assets/css/themes/bulma-light.css +90 -0
  6. package/assets/css/themes/catppuccin-frappe.css +58 -0
  7. package/assets/css/themes/catppuccin-latte.css +58 -0
  8. package/assets/css/themes/catppuccin-macchiato.css +58 -0
  9. package/assets/css/themes/catppuccin-mocha.css +58 -0
  10. package/assets/css/themes/dracula.css +90 -0
  11. package/assets/css/themes/github-dark.css +58 -0
  12. package/assets/css/themes/github-light.css +58 -0
  13. package/assets/css/turbo-core.css +92 -0
  14. package/dist/adapters/bootstrap/_utilities.scss +178 -0
  15. package/dist/adapters/bootstrap/_variables.scss +99 -0
  16. package/dist/adapters/tailwind/colors.js +133 -0
  17. package/dist/adapters/tailwind/preset.js +136 -0
  18. package/dist/index.d.ts +12 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/themes/bulma.d.ts +31 -0
  23. package/dist/themes/bulma.d.ts.map +1 -0
  24. package/dist/themes/bulma.js +160 -0
  25. package/dist/themes/bulma.js.map +1 -0
  26. package/dist/themes/css.d.ts +4 -0
  27. package/dist/themes/css.d.ts.map +1 -0
  28. package/dist/themes/css.js +617 -0
  29. package/dist/themes/css.js.map +1 -0
  30. package/dist/themes/packs/bulma.d.ts +12 -0
  31. package/dist/themes/packs/bulma.d.ts.map +1 -0
  32. package/dist/themes/packs/bulma.js +285 -0
  33. package/dist/themes/packs/bulma.js.map +1 -0
  34. package/dist/themes/packs/catppuccin.synced.d.ts +3 -0
  35. package/dist/themes/packs/catppuccin.synced.d.ts.map +1 -0
  36. package/dist/themes/packs/catppuccin.synced.js +340 -0
  37. package/dist/themes/packs/catppuccin.synced.js.map +1 -0
  38. package/dist/themes/packs/dracula.d.ts +8 -0
  39. package/dist/themes/packs/dracula.d.ts.map +1 -0
  40. package/dist/themes/packs/dracula.js +145 -0
  41. package/dist/themes/packs/dracula.js.map +1 -0
  42. package/dist/themes/packs/github.synced.d.ts +10 -0
  43. package/dist/themes/packs/github.synced.d.ts.map +1 -0
  44. package/dist/themes/packs/github.synced.js +281 -0
  45. package/dist/themes/packs/github.synced.js.map +1 -0
  46. package/dist/themes/registry.d.ts +3 -0
  47. package/dist/themes/registry.d.ts.map +1 -0
  48. package/dist/themes/registry.js +16 -0
  49. package/dist/themes/registry.js.map +1 -0
  50. package/dist/themes/types.d.ts +172 -0
  51. package/dist/themes/types.d.ts.map +1 -0
  52. package/dist/themes/types.js +4 -0
  53. package/dist/themes/types.js.map +1 -0
  54. package/dist/tokens/index.d.ts +8 -0
  55. package/dist/tokens/index.d.ts.map +1 -0
  56. package/dist/tokens/index.js +9 -0
  57. package/dist/tokens/index.js.map +1 -0
  58. package/dist/tokens/style-dictionary/bulma-dark.json +410 -0
  59. package/dist/tokens/style-dictionary/bulma-light.json +410 -0
  60. package/dist/tokens/style-dictionary/catppuccin-frappe.json +264 -0
  61. package/dist/tokens/style-dictionary/catppuccin-latte.json +264 -0
  62. package/dist/tokens/style-dictionary/catppuccin-macchiato.json +264 -0
  63. package/dist/tokens/style-dictionary/catppuccin-mocha.json +264 -0
  64. package/dist/tokens/style-dictionary/dracula.json +409 -0
  65. package/dist/tokens/style-dictionary/github-dark.json +264 -0
  66. package/dist/tokens/style-dictionary/github-light.json +264 -0
  67. package/dist/tokens/style-dictionary/themes.json +2526 -0
  68. package/dist/tokens/style-dictionary/tokens.json +1050 -0
  69. package/dist/tokens/tokens-typed.json +218 -0
  70. package/package.json +180 -0
  71. package/packages/adapters/bulma/dist/bulma-adapter.css +153 -0
  72. package/packages/adapters/bulma/dist/index.d.ts +60 -0
  73. package/packages/adapters/bulma/dist/index.d.ts.map +1 -0
  74. package/packages/adapters/bulma/dist/index.js +343 -0
  75. package/packages/adapters/bulma/dist/index.js.map +1 -0
  76. package/packages/adapters/tailwind/dist/colors.d.ts +32 -0
  77. package/packages/adapters/tailwind/dist/colors.d.ts.map +1 -0
  78. package/packages/adapters/tailwind/dist/colors.js +133 -0
  79. package/packages/adapters/tailwind/dist/colors.js.map +1 -0
  80. package/packages/adapters/tailwind/dist/preset.d.ts +117 -0
  81. package/packages/adapters/tailwind/dist/preset.d.ts.map +1 -0
  82. package/packages/adapters/tailwind/dist/preset.js +136 -0
  83. package/packages/adapters/tailwind/dist/preset.js.map +1 -0
  84. package/packages/adapters/tailwind/dist/tsconfig.tsbuildinfo +1 -0
  85. package/packages/css/dist/base.d.ts +27 -0
  86. package/packages/css/dist/base.d.ts.map +1 -0
  87. package/packages/css/dist/base.js +277 -0
  88. package/packages/css/dist/base.js.map +1 -0
  89. package/packages/css/dist/components/buttons.css +141 -0
  90. package/packages/css/dist/components/cards.css +157 -0
  91. package/packages/css/dist/components/forms.css +109 -0
  92. package/packages/css/dist/components/navigation.css +175 -0
  93. package/packages/css/dist/components/notifications.css +192 -0
  94. package/packages/css/dist/components/progress.css +113 -0
  95. package/packages/css/dist/components/sidebar.css +537 -0
  96. package/packages/css/dist/components/tables.css +157 -0
  97. package/packages/css/dist/components/tabs.css +106 -0
  98. package/packages/css/dist/components/tags.css +121 -0
  99. package/packages/css/dist/generator.d.ts +60 -0
  100. package/packages/css/dist/generator.d.ts.map +1 -0
  101. package/packages/css/dist/generator.js +267 -0
  102. package/packages/css/dist/generator.js.map +1 -0
  103. package/packages/css/dist/index.d.ts +13 -0
  104. package/packages/css/dist/index.d.ts.map +1 -0
  105. package/packages/css/dist/index.js +16 -0
  106. package/packages/css/dist/index.js.map +1 -0
  107. package/packages/css/dist/syntax.d.ts +29 -0
  108. package/packages/css/dist/syntax.d.ts.map +1 -0
  109. package/packages/css/dist/syntax.js +341 -0
  110. package/packages/css/dist/syntax.js.map +1 -0
  111. package/packages/css/dist/themes/bulma-dark.css +86 -0
  112. package/packages/css/dist/themes/bulma-light.css +86 -0
  113. package/packages/css/dist/themes/catppuccin-frappe.css +61 -0
  114. package/packages/css/dist/themes/catppuccin-latte.css +61 -0
  115. package/packages/css/dist/themes/catppuccin-macchiato.css +61 -0
  116. package/packages/css/dist/themes/catppuccin-mocha.css +61 -0
  117. package/packages/css/dist/themes/dracula.css +85 -0
  118. package/packages/css/dist/themes/github-dark.css +61 -0
  119. package/packages/css/dist/themes/github-light.css +61 -0
  120. package/packages/css/dist/turbo-base.css +246 -0
  121. package/packages/css/dist/turbo-components.css +1833 -0
  122. package/packages/css/dist/turbo-core.css +92 -0
  123. package/packages/css/dist/turbo-syntax.css +242 -0
  124. package/packages/css/dist/turbo.css +727 -0
  125. package/packages/theme-selector/dist/accessibility.d.ts +8 -0
  126. package/packages/theme-selector/dist/accessibility.d.ts.map +1 -0
  127. package/packages/theme-selector/dist/accessibility.js +19 -0
  128. package/packages/theme-selector/dist/accessibility.js.map +1 -0
  129. package/packages/theme-selector/dist/apply-theme.d.ts +12 -0
  130. package/packages/theme-selector/dist/apply-theme.d.ts.map +1 -0
  131. package/packages/theme-selector/dist/apply-theme.js +60 -0
  132. package/packages/theme-selector/dist/apply-theme.js.map +1 -0
  133. package/packages/theme-selector/dist/constants.d.ts +28 -0
  134. package/packages/theme-selector/dist/constants.d.ts.map +1 -0
  135. package/packages/theme-selector/dist/constants.js +29 -0
  136. package/packages/theme-selector/dist/constants.js.map +1 -0
  137. package/packages/theme-selector/dist/dropdown/events.d.ts +9 -0
  138. package/packages/theme-selector/dist/dropdown/events.d.ts.map +1 -0
  139. package/packages/theme-selector/dist/dropdown/events.js +120 -0
  140. package/packages/theme-selector/dist/dropdown/events.js.map +1 -0
  141. package/packages/theme-selector/dist/dropdown/helpers.d.ts +12 -0
  142. package/packages/theme-selector/dist/dropdown/helpers.d.ts.map +1 -0
  143. package/packages/theme-selector/dist/dropdown/helpers.js +25 -0
  144. package/packages/theme-selector/dist/dropdown/helpers.js.map +1 -0
  145. package/packages/theme-selector/dist/dropdown/state.d.ts +26 -0
  146. package/packages/theme-selector/dist/dropdown/state.d.ts.map +1 -0
  147. package/packages/theme-selector/dist/dropdown/state.js +50 -0
  148. package/packages/theme-selector/dist/dropdown/state.js.map +1 -0
  149. package/packages/theme-selector/dist/dropdown/ui.d.ts +46 -0
  150. package/packages/theme-selector/dist/dropdown/ui.d.ts.map +1 -0
  151. package/packages/theme-selector/dist/dropdown/ui.js +179 -0
  152. package/packages/theme-selector/dist/dropdown/ui.js.map +1 -0
  153. package/packages/theme-selector/dist/errors.d.ts +59 -0
  154. package/packages/theme-selector/dist/errors.d.ts.map +1 -0
  155. package/packages/theme-selector/dist/errors.js +127 -0
  156. package/packages/theme-selector/dist/errors.js.map +1 -0
  157. package/packages/theme-selector/dist/index.d.ts +25 -0
  158. package/packages/theme-selector/dist/index.d.ts.map +1 -0
  159. package/packages/theme-selector/dist/index.js +114 -0
  160. package/packages/theme-selector/dist/index.js.map +1 -0
  161. package/packages/theme-selector/dist/navbar.d.ts +13 -0
  162. package/packages/theme-selector/dist/navbar.d.ts.map +1 -0
  163. package/packages/theme-selector/dist/navbar.js +75 -0
  164. package/packages/theme-selector/dist/navbar.js.map +1 -0
  165. package/packages/theme-selector/dist/storage.d.ts +32 -0
  166. package/packages/theme-selector/dist/storage.d.ts.map +1 -0
  167. package/packages/theme-selector/dist/storage.js +100 -0
  168. package/packages/theme-selector/dist/storage.js.map +1 -0
  169. package/packages/theme-selector/dist/theme-loader.d.ts +37 -0
  170. package/packages/theme-selector/dist/theme-loader.d.ts.map +1 -0
  171. package/packages/theme-selector/dist/theme-loader.js +142 -0
  172. package/packages/theme-selector/dist/theme-loader.js.map +1 -0
  173. package/packages/theme-selector/dist/theme-mapper.d.ts +25 -0
  174. package/packages/theme-selector/dist/theme-mapper.d.ts.map +1 -0
  175. package/packages/theme-selector/dist/theme-mapper.js +99 -0
  176. package/packages/theme-selector/dist/theme-mapper.js.map +1 -0
  177. package/packages/theme-selector/dist/theme-resolver.d.ts +50 -0
  178. package/packages/theme-selector/dist/theme-resolver.d.ts.map +1 -0
  179. package/packages/theme-selector/dist/theme-resolver.js +84 -0
  180. package/packages/theme-selector/dist/theme-resolver.js.map +1 -0
  181. package/packages/theme-selector/dist/types.d.ts +7 -0
  182. package/packages/theme-selector/dist/types.d.ts.map +1 -0
  183. package/packages/theme-selector/dist/types.js +6 -0
  184. package/packages/theme-selector/dist/types.js.map +1 -0
@@ -0,0 +1,1833 @@
1
+ /* ==========================================================================
2
+ Turbo Themes - Components Bundle
3
+ Generated from individual component files.
4
+ ========================================================================== */
5
+
6
+ /* ==========================================================================
7
+ Turbo Themes - Buttons
8
+ ========================================================================== */
9
+
10
+ .btn {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ gap: var(--space-sm);
15
+ padding: var(--space-md) var(--space-xl);
16
+ font-size: 1rem;
17
+ font-weight: 600;
18
+ text-decoration: none;
19
+ border: none;
20
+ border-radius: var(--radius-lg);
21
+ cursor: pointer;
22
+ transition: all var(--transition-fast);
23
+ }
24
+
25
+ .btn:hover:not(:disabled) {
26
+ transform: translateY(-2px);
27
+ text-decoration: none;
28
+ }
29
+
30
+ .btn:active:not(:disabled) {
31
+ transform: translateY(0);
32
+ }
33
+
34
+ .btn:focus-visible {
35
+ outline: 2px solid var(--turbo-brand-primary);
36
+ outline-offset: 2px;
37
+ }
38
+
39
+ .btn:disabled {
40
+ opacity: 0.5;
41
+ cursor: not-allowed;
42
+ transform: none;
43
+ }
44
+
45
+ /* Primary */
46
+ .btn-primary {
47
+ color: var(--turbo-text-inverse);
48
+ background: var(--gradient-primary, var(--turbo-brand-primary));
49
+ box-shadow: var(--shadow-md);
50
+ }
51
+
52
+ .btn-primary:hover:not(:disabled) {
53
+ box-shadow: var(--shadow-lg), var(--shadow-glow);
54
+ }
55
+
56
+ /* Secondary */
57
+ .btn-secondary {
58
+ color: var(--turbo-text-primary);
59
+ background: var(--turbo-bg-surface);
60
+ border: 1px solid var(--turbo-border-default);
61
+ }
62
+
63
+ .btn-secondary:hover:not(:disabled) {
64
+ background: var(--turbo-bg-overlay);
65
+ border-color: var(--turbo-brand-primary);
66
+ }
67
+
68
+ /* Ghost */
69
+ .btn-ghost {
70
+ color: var(--turbo-text-secondary);
71
+ background: transparent;
72
+ }
73
+
74
+ .btn-ghost:hover:not(:disabled) {
75
+ color: var(--turbo-text-primary);
76
+ background: color-mix(in srgb, var(--turbo-brand-primary) 10%, transparent);
77
+ }
78
+
79
+ /* Outline */
80
+ .btn-outline {
81
+ color: var(--turbo-brand-primary);
82
+ background: transparent;
83
+ border: 2px solid var(--turbo-brand-primary);
84
+ }
85
+
86
+ .btn-outline:hover:not(:disabled) {
87
+ color: var(--turbo-text-inverse);
88
+ background: var(--turbo-brand-primary);
89
+ }
90
+
91
+ /* State variants */
92
+ .btn-success {
93
+ color: var(--turbo-bg-base);
94
+ background: var(--turbo-state-success);
95
+ }
96
+
97
+ .btn-success:hover:not(:disabled) {
98
+ background: color-mix(in srgb, var(--turbo-state-success) 85%, black);
99
+ }
100
+
101
+ .btn-warning {
102
+ color: var(--turbo-bg-base);
103
+ background: var(--turbo-state-warning);
104
+ }
105
+
106
+ .btn-warning:hover:not(:disabled) {
107
+ background: color-mix(in srgb, var(--turbo-state-warning) 85%, black);
108
+ }
109
+
110
+ .btn-danger {
111
+ color: var(--turbo-bg-base);
112
+ background: var(--turbo-state-danger);
113
+ }
114
+
115
+ .btn-danger:hover:not(:disabled) {
116
+ background: color-mix(in srgb, var(--turbo-state-danger) 85%, black);
117
+ }
118
+
119
+ .btn-info {
120
+ color: var(--turbo-bg-base);
121
+ background: var(--turbo-state-info);
122
+ }
123
+
124
+ .btn-info:hover:not(:disabled) {
125
+ background: color-mix(in srgb, var(--turbo-state-info) 85%, black);
126
+ }
127
+
128
+ /* Sizes */
129
+ .btn-sm {
130
+ padding: var(--space-sm) var(--space-md);
131
+ font-size: 0.875rem;
132
+ border-radius: var(--radius-md);
133
+ }
134
+
135
+ .btn-lg {
136
+ padding: var(--space-lg) var(--space-2xl);
137
+ font-size: 1.125rem;
138
+ border-radius: var(--radius-xl);
139
+ }
140
+
141
+ /* Button group */
142
+ .btn-group {
143
+ display: flex;
144
+ flex-wrap: wrap;
145
+ gap: var(--space-sm);
146
+ }
147
+
148
+
149
+ /* ==========================================================================
150
+ Turbo Themes - Cards
151
+ ========================================================================== */
152
+
153
+ .card {
154
+ background: var(--turbo-bg-surface);
155
+ border: 1px solid var(--turbo-border-default);
156
+ border-radius: var(--radius-xl);
157
+ padding: var(--space-xl);
158
+ transition: all var(--transition-normal);
159
+ }
160
+
161
+ .card:hover {
162
+ transform: translateY(-4px);
163
+ box-shadow: var(--shadow-xl);
164
+ border-color: color-mix(
165
+ in srgb,
166
+ var(--turbo-brand-primary) 30%,
167
+ var(--turbo-border-default)
168
+ );
169
+ }
170
+
171
+ .card-header {
172
+ margin-bottom: var(--space-md);
173
+ padding-bottom: var(--space-md);
174
+ border-bottom: 1px solid var(--turbo-border-default);
175
+ }
176
+
177
+ .card-title {
178
+ font-size: 1.25rem;
179
+ font-weight: 600;
180
+ margin: 0;
181
+ }
182
+
183
+ .card-icon {
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ width: 48px;
188
+ height: 48px;
189
+ margin-bottom: var(--space-md);
190
+ color: var(--turbo-brand-primary);
191
+ background: color-mix(in srgb, var(--turbo-brand-primary) 10%, transparent);
192
+ border-radius: var(--radius-lg);
193
+ }
194
+
195
+ .card-icon svg {
196
+ width: 24px;
197
+ height: 24px;
198
+ }
199
+
200
+ .card-body {
201
+ color: var(--turbo-text-secondary);
202
+ }
203
+
204
+ .card-footer {
205
+ margin-top: var(--space-md);
206
+ padding-top: var(--space-md);
207
+ border-top: 1px solid var(--turbo-border-default);
208
+ }
209
+
210
+ /* Featured card with gradient border */
211
+ .card-featured {
212
+ position: relative;
213
+ background: var(--turbo-bg-surface);
214
+ border: none;
215
+ }
216
+
217
+ .card-featured::before {
218
+ content: '';
219
+ position: absolute;
220
+ inset: 0;
221
+ padding: 2px;
222
+ background: var(--gradient-primary);
223
+ border-radius: var(--radius-xl);
224
+ -webkit-mask:
225
+ linear-gradient(#fff 0 0) content-box,
226
+ linear-gradient(#fff 0 0);
227
+ mask:
228
+ linear-gradient(#fff 0 0) content-box,
229
+ linear-gradient(#fff 0 0);
230
+ -webkit-mask-composite: xor;
231
+ mask-composite: exclude;
232
+ pointer-events: none;
233
+ }
234
+
235
+ /* Colored card variants with gradient borders */
236
+ .card-primary,
237
+ .card-info,
238
+ .card-success,
239
+ .card-warning,
240
+ .card-danger {
241
+ position: relative;
242
+ background: var(--turbo-bg-surface);
243
+ border: none;
244
+ }
245
+
246
+ .card-primary::before,
247
+ .card-info::before,
248
+ .card-success::before,
249
+ .card-warning::before,
250
+ .card-danger::before {
251
+ content: '';
252
+ position: absolute;
253
+ inset: 0;
254
+ padding: 2px;
255
+ border-radius: var(--radius-xl);
256
+ -webkit-mask:
257
+ linear-gradient(#fff 0 0) content-box,
258
+ linear-gradient(#fff 0 0);
259
+ mask:
260
+ linear-gradient(#fff 0 0) content-box,
261
+ linear-gradient(#fff 0 0);
262
+ -webkit-mask-composite: xor;
263
+ mask-composite: exclude;
264
+ pointer-events: none;
265
+ }
266
+
267
+ .card-primary::before {
268
+ background: linear-gradient(
269
+ 135deg,
270
+ var(--turbo-brand-primary),
271
+ color-mix(in srgb, var(--turbo-brand-primary) 60%, var(--turbo-state-info))
272
+ );
273
+ }
274
+
275
+ .card-info::before {
276
+ background: linear-gradient(
277
+ 135deg,
278
+ var(--turbo-state-info),
279
+ color-mix(in srgb, var(--turbo-state-info) 60%, var(--turbo-brand-primary))
280
+ );
281
+ }
282
+
283
+ .card-success::before {
284
+ background: linear-gradient(
285
+ 135deg,
286
+ var(--turbo-state-success),
287
+ color-mix(in srgb, var(--turbo-state-success) 60%, var(--turbo-state-info))
288
+ );
289
+ }
290
+
291
+ .card-warning::before {
292
+ background: linear-gradient(
293
+ 135deg,
294
+ var(--turbo-state-warning),
295
+ color-mix(in srgb, var(--turbo-state-warning) 60%, var(--turbo-state-danger))
296
+ );
297
+ }
298
+
299
+ .card-danger::before {
300
+ background: linear-gradient(
301
+ 135deg,
302
+ var(--turbo-state-danger),
303
+ color-mix(in srgb, var(--turbo-state-danger) 60%, var(--turbo-state-warning))
304
+ );
305
+ }
306
+
307
+
308
+ /* ==========================================================================
309
+ Turbo Themes - Forms
310
+ ========================================================================== */
311
+
312
+ .form-group {
313
+ margin-bottom: var(--space-lg);
314
+ }
315
+
316
+ .form-label {
317
+ display: block;
318
+ margin-bottom: var(--space-sm);
319
+ font-weight: 500;
320
+ color: var(--turbo-text-primary);
321
+ }
322
+
323
+ .form-input,
324
+ .form-textarea,
325
+ .form-select {
326
+ width: 100%;
327
+ padding: var(--space-md) var(--space-lg);
328
+ font-size: 1rem;
329
+ font-family: inherit;
330
+ color: var(--turbo-text-primary);
331
+ background: var(--turbo-bg-surface);
332
+ border: 2px solid var(--turbo-border-default);
333
+ border-radius: var(--radius-lg);
334
+ transition: all var(--transition-fast);
335
+ }
336
+
337
+ .form-input:focus,
338
+ .form-textarea:focus,
339
+ .form-select:focus {
340
+ outline: none;
341
+ border-color: var(--turbo-brand-primary);
342
+ box-shadow: var(--shadow-glow-sm);
343
+ }
344
+
345
+ .form-input::placeholder,
346
+ .form-textarea::placeholder {
347
+ color: var(--turbo-text-secondary);
348
+ opacity: 0.7;
349
+ }
350
+
351
+ .form-input:disabled,
352
+ .form-textarea:disabled,
353
+ .form-select:disabled {
354
+ opacity: 0.5;
355
+ cursor: not-allowed;
356
+ }
357
+
358
+ /* Validation states */
359
+ .form-input.is-success,
360
+ .form-input.is-valid {
361
+ border-color: var(--turbo-state-success);
362
+ }
363
+
364
+ .form-input.is-danger,
365
+ .form-input.is-invalid {
366
+ border-color: var(--turbo-state-danger);
367
+ }
368
+
369
+ .form-help {
370
+ font-size: 0.875rem;
371
+ margin-top: var(--space-sm);
372
+ color: var(--turbo-text-secondary);
373
+ }
374
+
375
+ .form-help.text-success {
376
+ color: var(--turbo-state-success);
377
+ }
378
+
379
+ .form-help.text-danger {
380
+ color: var(--turbo-state-danger);
381
+ }
382
+
383
+ /* Checkbox & Radio */
384
+ .checkbox-label,
385
+ .radio-label {
386
+ display: flex;
387
+ align-items: center;
388
+ gap: var(--space-sm);
389
+ cursor: pointer;
390
+ font-weight: normal;
391
+ }
392
+
393
+ .form-checkbox,
394
+ .form-radio {
395
+ width: 1.25rem;
396
+ height: 1.25rem;
397
+ accent-color: var(--turbo-brand-primary);
398
+ cursor: pointer;
399
+ }
400
+
401
+ /* Form inline */
402
+ .form-inline {
403
+ display: flex;
404
+ gap: var(--space-sm);
405
+ }
406
+
407
+ .form-inline .form-input {
408
+ flex: 1;
409
+ }
410
+
411
+ /* Form row for side-by-side fields */
412
+ .form-row {
413
+ display: grid;
414
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
415
+ gap: var(--space-md);
416
+ }
417
+
418
+
419
+ /* ==========================================================================
420
+ Turbo Themes - Tables
421
+ ========================================================================== */
422
+
423
+ .table {
424
+ width: 100%;
425
+
426
+ /* Use separate + spacing:0 to allow border-radius while removing cell gaps */
427
+ border-collapse: separate;
428
+ border-spacing: 0;
429
+ background: var(--turbo-bg-surface);
430
+ border-radius: var(--radius-lg);
431
+ overflow: hidden;
432
+ box-shadow: var(--shadow-sm);
433
+ }
434
+
435
+ .table thead {
436
+ background: var(--turbo-bg-overlay);
437
+ }
438
+
439
+ .table th {
440
+ padding: var(--space-md) var(--space-lg);
441
+ text-align: left;
442
+ font-weight: 600;
443
+ color: var(--turbo-text-primary);
444
+ border-bottom: 2px solid var(--turbo-border-default);
445
+ }
446
+
447
+ .table td {
448
+ padding: var(--space-md) var(--space-lg);
449
+ border-bottom: 1px solid var(--turbo-border-default);
450
+ color: var(--turbo-text-secondary);
451
+ }
452
+
453
+ .table tr:last-child td {
454
+ border-bottom: none;
455
+ }
456
+
457
+ .table tbody tr {
458
+ transition: background-color var(--transition-fast);
459
+ }
460
+
461
+ .table tbody tr:hover {
462
+ background: color-mix(in srgb, var(--turbo-brand-primary) 5%, transparent);
463
+ }
464
+
465
+ /* Table header color variants */
466
+ .table-header-primary thead {
467
+ background: color-mix(
468
+ in srgb,
469
+ var(--turbo-brand-primary) 15%,
470
+ var(--turbo-bg-surface)
471
+ );
472
+ }
473
+
474
+ .table-header-primary th {
475
+ color: var(--turbo-brand-primary);
476
+ border-bottom-color: var(--turbo-brand-primary);
477
+ }
478
+
479
+ .table-header-info thead {
480
+ background: color-mix(in srgb, var(--turbo-state-info) 15%, var(--turbo-bg-surface));
481
+ }
482
+
483
+ .table-header-info th {
484
+ color: var(--turbo-state-info);
485
+ border-bottom-color: var(--turbo-state-info);
486
+ }
487
+
488
+ .table-header-success thead {
489
+ background: color-mix(
490
+ in srgb,
491
+ var(--turbo-state-success) 15%,
492
+ var(--turbo-bg-surface)
493
+ );
494
+ }
495
+
496
+ .table-header-success th {
497
+ color: var(--turbo-state-success);
498
+ border-bottom-color: var(--turbo-state-success);
499
+ }
500
+
501
+ .table-header-warning thead {
502
+ background: color-mix(
503
+ in srgb,
504
+ var(--turbo-state-warning) 15%,
505
+ var(--turbo-bg-surface)
506
+ );
507
+ }
508
+
509
+ .table-header-warning th {
510
+ color: var(--turbo-state-warning);
511
+ border-bottom-color: var(--turbo-state-warning);
512
+ }
513
+
514
+ .table-header-danger thead {
515
+ background: color-mix(
516
+ in srgb,
517
+ var(--turbo-state-danger) 15%,
518
+ var(--turbo-bg-surface)
519
+ );
520
+ }
521
+
522
+ .table-header-danger th {
523
+ color: var(--turbo-state-danger);
524
+ border-bottom-color: var(--turbo-state-danger);
525
+ }
526
+
527
+ /* Striped table */
528
+ .table-striped tbody tr:nth-child(odd) {
529
+ background: color-mix(in srgb, var(--turbo-bg-overlay) 50%, transparent);
530
+ }
531
+
532
+ .table-striped tbody tr:nth-child(even) {
533
+ background: transparent;
534
+ }
535
+
536
+ /* Accent striped table */
537
+ .table-striped-accent tbody tr:nth-child(odd) {
538
+ background: color-mix(in srgb, var(--turbo-brand-primary) 5%, transparent);
539
+ }
540
+
541
+ .table-striped-accent tbody tr:nth-child(even) {
542
+ background: transparent;
543
+ }
544
+
545
+ .table-striped-accent tbody tr:hover {
546
+ background: color-mix(in srgb, var(--turbo-brand-primary) 10%, transparent);
547
+ }
548
+
549
+ /* Bordered table - use single-direction borders to avoid doubling with border-collapse: separate */
550
+ .table-bordered {
551
+ border: 1px solid var(--turbo-border-default);
552
+ }
553
+
554
+ .table-bordered th,
555
+ .table-bordered td {
556
+ border-bottom: 1px solid var(--turbo-border-default);
557
+ border-right: 1px solid var(--turbo-border-default);
558
+ }
559
+
560
+ /* Remove right border from last column */
561
+ .table-bordered th:last-child,
562
+ .table-bordered td:last-child {
563
+ border-right: none;
564
+ }
565
+
566
+ /* Remove bottom border from last row (already handled by .table tr:last-child td) */
567
+ .table-bordered tr:last-child td {
568
+ border-bottom: none;
569
+ }
570
+
571
+ /* Compact table */
572
+ .table-compact th,
573
+ .table-compact td {
574
+ padding: var(--space-sm) var(--space-md);
575
+ }
576
+
577
+
578
+ /* ==========================================================================
579
+ Turbo Themes - Tabs
580
+ ========================================================================== */
581
+
582
+ .tabs {
583
+ display: flex;
584
+ gap: var(--space-xs);
585
+ border-bottom: 2px solid var(--turbo-border-default);
586
+ margin-bottom: var(--space-lg);
587
+ }
588
+
589
+ .tab {
590
+ padding: var(--space-md) var(--space-lg);
591
+ font-weight: 500;
592
+ color: var(--turbo-text-secondary);
593
+ background: none;
594
+ border: none;
595
+ border-bottom: 2px solid transparent;
596
+ margin-bottom: -2px;
597
+ cursor: pointer;
598
+ transition: all var(--transition-fast);
599
+ }
600
+
601
+ .tab:hover:not(:disabled) {
602
+ color: var(--turbo-text-primary);
603
+ }
604
+
605
+ .tab:focus-visible {
606
+ outline: 2px solid var(--turbo-brand-primary);
607
+ outline-offset: 2px;
608
+ }
609
+
610
+ .tab.active {
611
+ color: var(--turbo-brand-primary);
612
+ border-bottom-color: var(--turbo-brand-primary);
613
+ }
614
+
615
+ .tab:disabled {
616
+ opacity: 0.5;
617
+ cursor: not-allowed;
618
+ }
619
+
620
+ /* Tab content panels */
621
+ .tab-content {
622
+ display: none;
623
+ }
624
+
625
+ .tab-content.active {
626
+ display: block;
627
+ }
628
+
629
+ /* Boxed tabs variant */
630
+ .tabs-boxed {
631
+ border-bottom: none;
632
+ background: var(--turbo-bg-overlay);
633
+ border-radius: var(--radius-lg);
634
+ padding: var(--space-xs);
635
+ }
636
+
637
+ .tabs-boxed .tab {
638
+ border-bottom: none;
639
+ border-radius: var(--radius-md);
640
+ margin-bottom: 0;
641
+ }
642
+
643
+ .tabs-boxed .tab.active {
644
+ background: var(--turbo-bg-surface);
645
+ color: var(--turbo-brand-primary);
646
+ box-shadow: var(--shadow-sm);
647
+ }
648
+
649
+ /* Pills tabs variant */
650
+ .tabs-pills {
651
+ border-bottom: none;
652
+ gap: var(--space-sm);
653
+ }
654
+
655
+ .tabs-pills .tab {
656
+ border-bottom: none;
657
+ border-radius: var(--radius-full);
658
+ margin-bottom: 0;
659
+ }
660
+
661
+ .tabs-pills .tab.active {
662
+ background: var(--turbo-brand-primary);
663
+ color: var(--turbo-text-inverse);
664
+ }
665
+
666
+ /* Vertical tabs */
667
+ .tabs-vertical {
668
+ flex-direction: column;
669
+ border-bottom: none;
670
+ border-right: 2px solid var(--turbo-border-default);
671
+ }
672
+
673
+ .tabs-vertical .tab {
674
+ border-bottom: none;
675
+ border-right: 2px solid transparent;
676
+ margin-bottom: 0;
677
+ margin-right: -2px;
678
+ text-align: left;
679
+ }
680
+
681
+ .tabs-vertical .tab.active {
682
+ border-right-color: var(--turbo-brand-primary);
683
+ }
684
+
685
+
686
+ /* ==========================================================================
687
+ Turbo Themes - Progress
688
+ ========================================================================== */
689
+
690
+ .progress {
691
+ width: 100%;
692
+ height: 0.75rem;
693
+ appearance: none;
694
+ border: none;
695
+ border-radius: var(--radius-full);
696
+ background: var(--turbo-bg-overlay);
697
+ overflow: hidden;
698
+ }
699
+
700
+ .progress::-webkit-progress-bar {
701
+ background: var(--turbo-bg-overlay);
702
+ border-radius: var(--radius-full);
703
+ }
704
+
705
+ .progress::-webkit-progress-value {
706
+ background: var(--gradient-primary, var(--turbo-brand-primary));
707
+ border-radius: var(--radius-full);
708
+ transition: width var(--transition-normal);
709
+ }
710
+
711
+ .progress::-moz-progress-bar {
712
+ background: var(--gradient-primary, var(--turbo-brand-primary));
713
+ border-radius: var(--radius-full);
714
+ }
715
+
716
+ /* Progress wrapper with label */
717
+ .progress-wrapper {
718
+ margin-bottom: var(--space-lg);
719
+ }
720
+
721
+ .progress-wrapper label {
722
+ display: block;
723
+ margin-bottom: var(--space-sm);
724
+ }
725
+
726
+ /* Size variants */
727
+ .progress-sm {
728
+ height: 0.5rem;
729
+ }
730
+
731
+ .progress-lg {
732
+ height: 1rem;
733
+ }
734
+
735
+ /* Color variants */
736
+ .progress-success::-webkit-progress-value {
737
+ background: linear-gradient(
738
+ 90deg,
739
+ var(--turbo-state-success),
740
+ color-mix(in srgb, var(--turbo-state-success) 70%, var(--turbo-state-info))
741
+ );
742
+ }
743
+
744
+ .progress-success::-moz-progress-bar {
745
+ background: linear-gradient(
746
+ 90deg,
747
+ var(--turbo-state-success),
748
+ color-mix(in srgb, var(--turbo-state-success) 70%, var(--turbo-state-info))
749
+ );
750
+ }
751
+
752
+ .progress-warning::-webkit-progress-value {
753
+ background: linear-gradient(
754
+ 90deg,
755
+ var(--turbo-state-warning),
756
+ color-mix(in srgb, var(--turbo-state-warning) 70%, var(--turbo-state-danger))
757
+ );
758
+ }
759
+
760
+ .progress-warning::-moz-progress-bar {
761
+ background: linear-gradient(
762
+ 90deg,
763
+ var(--turbo-state-warning),
764
+ color-mix(in srgb, var(--turbo-state-warning) 70%, var(--turbo-state-danger))
765
+ );
766
+ }
767
+
768
+ .progress-danger::-webkit-progress-value {
769
+ background: linear-gradient(
770
+ 90deg,
771
+ var(--turbo-state-danger),
772
+ color-mix(in srgb, var(--turbo-state-danger) 70%, var(--turbo-state-warning))
773
+ );
774
+ }
775
+
776
+ .progress-danger::-moz-progress-bar {
777
+ background: linear-gradient(
778
+ 90deg,
779
+ var(--turbo-state-danger),
780
+ color-mix(in srgb, var(--turbo-state-danger) 70%, var(--turbo-state-warning))
781
+ );
782
+ }
783
+
784
+ .progress-info::-webkit-progress-value {
785
+ background: linear-gradient(
786
+ 90deg,
787
+ var(--turbo-state-info),
788
+ color-mix(in srgb, var(--turbo-state-info) 70%, var(--turbo-brand-primary))
789
+ );
790
+ }
791
+
792
+ .progress-info::-moz-progress-bar {
793
+ background: linear-gradient(
794
+ 90deg,
795
+ var(--turbo-state-info),
796
+ color-mix(in srgb, var(--turbo-state-info) 70%, var(--turbo-brand-primary))
797
+ );
798
+ }
799
+
800
+
801
+ /* ==========================================================================
802
+ Turbo Themes - Tags / Badges
803
+ ========================================================================== */
804
+
805
+ .tag {
806
+ display: inline-flex;
807
+ align-items: center;
808
+ padding: var(--space-xs) var(--space-md);
809
+ font-size: 0.8125rem;
810
+ font-weight: 500;
811
+ color: var(--turbo-text-primary);
812
+ background: var(--turbo-bg-overlay);
813
+ border-radius: var(--radius-full);
814
+ transition: all var(--transition-fast);
815
+ }
816
+
817
+ /* Color variants */
818
+ .tag-primary {
819
+ color: var(--turbo-text-inverse);
820
+ background: var(--turbo-brand-primary);
821
+ }
822
+
823
+ .tag-secondary {
824
+ color: var(--turbo-text-primary);
825
+ background: var(--turbo-bg-surface);
826
+ border: 1px solid var(--turbo-border-default);
827
+ }
828
+
829
+ .tag-success {
830
+ color: var(--turbo-bg-base);
831
+ background: var(--turbo-state-success);
832
+ }
833
+
834
+ .tag-warning {
835
+ color: var(--turbo-bg-base);
836
+ background: var(--turbo-state-warning);
837
+ }
838
+
839
+ .tag-danger {
840
+ color: var(--turbo-bg-base);
841
+ background: var(--turbo-state-danger);
842
+ }
843
+
844
+ .tag-info {
845
+ color: var(--turbo-bg-base);
846
+ background: var(--turbo-state-info);
847
+ }
848
+
849
+ /* Outline variants */
850
+ .tag-outline {
851
+ background: transparent;
852
+ border: 1px solid var(--turbo-border-default);
853
+ color: var(--turbo-text-primary);
854
+ }
855
+
856
+ .tag-outline-primary {
857
+ background: transparent;
858
+ border: 1px solid var(--turbo-brand-primary);
859
+ color: var(--turbo-brand-primary);
860
+ }
861
+
862
+ .tag-outline-success {
863
+ background: transparent;
864
+ border: 1px solid var(--turbo-state-success);
865
+ color: var(--turbo-state-success);
866
+ }
867
+
868
+ .tag-outline-warning {
869
+ background: transparent;
870
+ border: 1px solid var(--turbo-state-warning);
871
+ color: var(--turbo-state-warning);
872
+ }
873
+
874
+ .tag-outline-danger {
875
+ background: transparent;
876
+ border: 1px solid var(--turbo-state-danger);
877
+ color: var(--turbo-state-danger);
878
+ }
879
+
880
+ .tag-outline-info {
881
+ background: transparent;
882
+ border: 1px solid var(--turbo-state-info);
883
+ color: var(--turbo-state-info);
884
+ }
885
+
886
+ /* Size variants */
887
+ .tag-sm {
888
+ padding: calc(var(--space-xs) / 2) var(--space-sm);
889
+ font-size: 0.75rem;
890
+ }
891
+
892
+ .tag-lg {
893
+ padding: var(--space-sm) var(--space-lg);
894
+ font-size: 0.9375rem;
895
+ }
896
+
897
+ /* Tag group */
898
+ .tag-group {
899
+ display: flex;
900
+ flex-wrap: wrap;
901
+ gap: var(--space-sm);
902
+ }
903
+
904
+ /* Removable tag */
905
+ .tag-remove {
906
+ margin-left: var(--space-xs);
907
+ cursor: pointer;
908
+ opacity: 0.7;
909
+ transition: opacity var(--transition-fast);
910
+ border-radius: var(--radius-sm);
911
+ }
912
+
913
+ .tag-remove:hover {
914
+ opacity: 1;
915
+ }
916
+
917
+ .tag-remove:focus-visible {
918
+ outline: 2px solid var(--turbo-brand-primary);
919
+ outline-offset: 1px;
920
+ opacity: 1;
921
+ }
922
+
923
+
924
+ /* ==========================================================================
925
+ Turbo Themes - Notifications / Alerts
926
+ ========================================================================== */
927
+
928
+ .notification {
929
+ padding: var(--space-lg);
930
+ border-radius: var(--radius-lg);
931
+ border-left: 4px solid var(--turbo-brand-primary);
932
+ background: color-mix(
933
+ in srgb,
934
+ var(--turbo-brand-primary) 10%,
935
+ var(--turbo-bg-surface)
936
+ );
937
+ }
938
+
939
+ .notification-success {
940
+ border-left-color: var(--turbo-state-success);
941
+ background: color-mix(
942
+ in srgb,
943
+ var(--turbo-state-success) 10%,
944
+ var(--turbo-bg-surface)
945
+ );
946
+ }
947
+
948
+ .notification-warning {
949
+ border-left-color: var(--turbo-state-warning);
950
+ background: color-mix(
951
+ in srgb,
952
+ var(--turbo-state-warning) 10%,
953
+ var(--turbo-bg-surface)
954
+ );
955
+ }
956
+
957
+ .notification-danger {
958
+ border-left-color: var(--turbo-state-danger);
959
+ background: color-mix(
960
+ in srgb,
961
+ var(--turbo-state-danger) 10%,
962
+ var(--turbo-bg-surface)
963
+ );
964
+ }
965
+
966
+ .notification-info {
967
+ border-left-color: var(--turbo-state-info);
968
+ background: color-mix(in srgb, var(--turbo-state-info) 10%, var(--turbo-bg-surface));
969
+ }
970
+
971
+ /* ==========================================================================
972
+ Messages (with header/body structure)
973
+ ========================================================================== */
974
+
975
+ .message {
976
+ border-radius: var(--radius-lg);
977
+ overflow: hidden;
978
+ border: 1px solid var(--turbo-border-default);
979
+ background: var(--turbo-bg-surface);
980
+ }
981
+
982
+ .message-header {
983
+ display: flex;
984
+ align-items: center;
985
+ justify-content: space-between;
986
+ padding: var(--space-md) var(--space-lg);
987
+ font-weight: 600;
988
+ background: var(--turbo-bg-overlay);
989
+ }
990
+
991
+ .message-header p {
992
+ margin: 0;
993
+ }
994
+
995
+ .message-body {
996
+ padding: var(--space-lg);
997
+ color: var(--turbo-text-secondary);
998
+ }
999
+
1000
+ /* Color variants */
1001
+ .message-primary .message-header {
1002
+ background: color-mix(
1003
+ in srgb,
1004
+ var(--turbo-brand-primary) 20%,
1005
+ var(--turbo-bg-surface)
1006
+ );
1007
+ color: var(--turbo-brand-primary);
1008
+ }
1009
+
1010
+ .message-info .message-header {
1011
+ background: color-mix(in srgb, var(--turbo-state-info) 20%, var(--turbo-bg-surface));
1012
+ color: var(--turbo-state-info);
1013
+ }
1014
+
1015
+ .message-success .message-header {
1016
+ background: color-mix(
1017
+ in srgb,
1018
+ var(--turbo-state-success) 20%,
1019
+ var(--turbo-bg-surface)
1020
+ );
1021
+ color: var(--turbo-state-success);
1022
+ }
1023
+
1024
+ .message-warning .message-header {
1025
+ background: color-mix(
1026
+ in srgb,
1027
+ var(--turbo-state-warning) 20%,
1028
+ var(--turbo-bg-surface)
1029
+ );
1030
+ color: var(--turbo-state-warning);
1031
+ }
1032
+
1033
+ .message-danger .message-header {
1034
+ background: color-mix(
1035
+ in srgb,
1036
+ var(--turbo-state-danger) 20%,
1037
+ var(--turbo-bg-surface)
1038
+ );
1039
+ color: var(--turbo-state-danger);
1040
+ }
1041
+
1042
+ /* ==========================================================================
1043
+ Alert (inline variant)
1044
+ ========================================================================== */
1045
+
1046
+ .alert {
1047
+ display: flex;
1048
+ align-items: flex-start;
1049
+ gap: var(--space-md);
1050
+ padding: var(--space-md) var(--space-lg);
1051
+ border-radius: var(--radius-lg);
1052
+ background: var(--turbo-bg-overlay);
1053
+ border: 1px solid var(--turbo-border-default);
1054
+ }
1055
+
1056
+ .alert-icon {
1057
+ flex-shrink: 0;
1058
+ width: 1.25rem;
1059
+ height: 1.25rem;
1060
+ }
1061
+
1062
+ .alert-content {
1063
+ flex: 1;
1064
+ }
1065
+
1066
+ .alert-title {
1067
+ font-weight: 600;
1068
+ margin-bottom: var(--space-xs);
1069
+ }
1070
+
1071
+ .alert-description {
1072
+ color: var(--turbo-text-secondary);
1073
+ font-size: 0.875rem;
1074
+ }
1075
+
1076
+ .alert-primary {
1077
+ background: color-mix(
1078
+ in srgb,
1079
+ var(--turbo-brand-primary) 10%,
1080
+ var(--turbo-bg-surface)
1081
+ );
1082
+ border-color: var(--turbo-brand-primary);
1083
+ }
1084
+
1085
+ .alert-success {
1086
+ background: color-mix(
1087
+ in srgb,
1088
+ var(--turbo-state-success) 10%,
1089
+ var(--turbo-bg-surface)
1090
+ );
1091
+ border-color: var(--turbo-state-success);
1092
+ }
1093
+
1094
+ .alert-warning {
1095
+ background: color-mix(
1096
+ in srgb,
1097
+ var(--turbo-state-warning) 10%,
1098
+ var(--turbo-bg-surface)
1099
+ );
1100
+ border-color: var(--turbo-state-warning);
1101
+ }
1102
+
1103
+ .alert-danger {
1104
+ background: color-mix(
1105
+ in srgb,
1106
+ var(--turbo-state-danger) 10%,
1107
+ var(--turbo-bg-surface)
1108
+ );
1109
+ border-color: var(--turbo-state-danger);
1110
+ }
1111
+
1112
+ .alert-info {
1113
+ background: color-mix(in srgb, var(--turbo-state-info) 10%, var(--turbo-bg-surface));
1114
+ border-color: var(--turbo-state-info);
1115
+ }
1116
+
1117
+
1118
+ /* ==========================================================================
1119
+ Turbo Themes - Breadcrumb
1120
+ ========================================================================== */
1121
+
1122
+ .breadcrumb {
1123
+ display: flex;
1124
+ align-items: center;
1125
+ flex-wrap: wrap;
1126
+ gap: var(--space-sm);
1127
+ font-size: 0.875rem;
1128
+ color: var(--turbo-text-secondary);
1129
+ }
1130
+
1131
+ .breadcrumb-item {
1132
+ display: inline-flex;
1133
+ align-items: center;
1134
+ }
1135
+
1136
+ .breadcrumb-item a {
1137
+ color: var(--turbo-text-secondary);
1138
+ text-decoration: none;
1139
+ transition: color var(--transition-fast);
1140
+ }
1141
+
1142
+ .breadcrumb-item a:hover {
1143
+ color: var(--turbo-brand-primary);
1144
+ }
1145
+
1146
+ .breadcrumb-item:not(:last-child)::after {
1147
+ content: '/';
1148
+ margin-left: var(--space-sm);
1149
+ color: var(--turbo-text-secondary);
1150
+ opacity: 0.5;
1151
+ }
1152
+
1153
+ .breadcrumb-item.active {
1154
+ color: var(--turbo-text-primary);
1155
+ }
1156
+
1157
+ /* ==========================================================================
1158
+ Panel (sidebar navigation)
1159
+ ========================================================================== */
1160
+
1161
+ .panel {
1162
+ background: var(--turbo-bg-surface);
1163
+ border: 1px solid var(--turbo-border-default);
1164
+ border-radius: var(--radius-lg);
1165
+ overflow: hidden;
1166
+ }
1167
+
1168
+ .panel-heading {
1169
+ padding: var(--space-md) var(--space-lg);
1170
+ font-weight: 600;
1171
+ background: var(--turbo-bg-overlay);
1172
+ border-bottom: 1px solid var(--turbo-border-default);
1173
+ margin: 0;
1174
+ }
1175
+
1176
+ .panel-item {
1177
+ display: block;
1178
+ padding: var(--space-md) var(--space-lg);
1179
+ color: var(--turbo-text-secondary);
1180
+ text-decoration: none;
1181
+ border-bottom: 1px solid var(--turbo-border-default);
1182
+ transition: all var(--transition-fast);
1183
+ }
1184
+
1185
+ .panel-item:last-child {
1186
+ border-bottom: none;
1187
+ }
1188
+
1189
+ .panel-item:hover {
1190
+ background: color-mix(in srgb, var(--turbo-brand-primary) 10%, transparent);
1191
+ color: var(--turbo-text-primary);
1192
+ }
1193
+
1194
+ .panel-item.active {
1195
+ background: color-mix(in srgb, var(--turbo-brand-primary) 15%, transparent);
1196
+ color: var(--turbo-brand-primary);
1197
+ }
1198
+
1199
+ /* ==========================================================================
1200
+ Navbar
1201
+ ========================================================================== */
1202
+
1203
+ .navbar {
1204
+ display: flex;
1205
+ align-items: center;
1206
+ justify-content: space-between;
1207
+ padding: var(--space-md) var(--space-lg);
1208
+ background: var(--turbo-bg-surface);
1209
+ border-bottom: 1px solid var(--turbo-border-default);
1210
+ }
1211
+
1212
+ .navbar-brand {
1213
+ font-size: 1.25rem;
1214
+ font-weight: 700;
1215
+ color: var(--turbo-text-primary);
1216
+ text-decoration: none;
1217
+ }
1218
+
1219
+ .navbar-menu {
1220
+ display: flex;
1221
+ align-items: center;
1222
+ gap: var(--space-lg);
1223
+ }
1224
+
1225
+ .navbar-item {
1226
+ color: var(--turbo-text-secondary);
1227
+ text-decoration: none;
1228
+ font-weight: 500;
1229
+ transition: color var(--transition-fast);
1230
+ }
1231
+
1232
+ .navbar-item:hover {
1233
+ color: var(--turbo-text-primary);
1234
+ }
1235
+
1236
+ .navbar-item.active {
1237
+ color: var(--turbo-brand-primary);
1238
+ }
1239
+
1240
+ /* ==========================================================================
1241
+ Pagination
1242
+ ========================================================================== */
1243
+
1244
+ .pagination {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ gap: var(--space-xs);
1248
+ }
1249
+
1250
+ .pagination-item {
1251
+ display: inline-flex;
1252
+ align-items: center;
1253
+ justify-content: center;
1254
+ min-width: 2.5rem;
1255
+ height: 2.5rem;
1256
+ padding: 0 var(--space-sm);
1257
+ color: var(--turbo-text-secondary);
1258
+ background: var(--turbo-bg-surface);
1259
+ border: 1px solid var(--turbo-border-default);
1260
+ border-radius: var(--radius-md);
1261
+ text-decoration: none;
1262
+ font-weight: 500;
1263
+ transition: all var(--transition-fast);
1264
+ }
1265
+
1266
+ .pagination-item:hover:not(:disabled):not(.disabled) {
1267
+ background: var(--turbo-bg-overlay);
1268
+ border-color: var(--turbo-brand-primary);
1269
+ color: var(--turbo-text-primary);
1270
+ }
1271
+
1272
+ .pagination-item:focus-visible {
1273
+ outline: 2px solid var(--turbo-brand-primary);
1274
+ outline-offset: 2px;
1275
+ }
1276
+
1277
+ .pagination-item.active {
1278
+ background: var(--turbo-brand-primary);
1279
+ border-color: var(--turbo-brand-primary);
1280
+ color: var(--turbo-text-inverse);
1281
+ }
1282
+
1283
+ .pagination-item:disabled,
1284
+ .pagination-item.disabled {
1285
+ opacity: 0.5;
1286
+ cursor: not-allowed;
1287
+ }
1288
+
1289
+ .pagination-prev,
1290
+ .pagination-next {
1291
+ font-size: 1.25rem;
1292
+ }
1293
+
1294
+
1295
+ /* ==========================================================================
1296
+ Turbo Themes - Sidebar (shadcn-inspired)
1297
+ A composable, collapsible sidebar component.
1298
+ ========================================================================== */
1299
+
1300
+ /* CSS Variables for sidebar customization */
1301
+ :root {
1302
+ --sidebar-width: 280px;
1303
+ --sidebar-width-collapsed: 60px;
1304
+ --sidebar-width-mobile: 280px;
1305
+ --sidebar-background: var(--turbo-bg-surface);
1306
+ --sidebar-foreground: var(--turbo-text-primary);
1307
+ --sidebar-border: var(--turbo-border-default);
1308
+ --sidebar-accent: var(--turbo-brand-primary);
1309
+ --sidebar-accent-foreground: var(--turbo-text-inverse);
1310
+ --sidebar-muted: var(--turbo-bg-overlay);
1311
+ --sidebar-muted-foreground: var(--turbo-text-secondary);
1312
+ }
1313
+
1314
+ /* ==========================================================================
1315
+ Sidebar Container
1316
+ ========================================================================== */
1317
+
1318
+ .sidebar {
1319
+ display: flex;
1320
+ flex-direction: column;
1321
+ width: var(--sidebar-width);
1322
+ height: 100%;
1323
+ background: var(--sidebar-background);
1324
+ border-right: 1px solid var(--sidebar-border);
1325
+ transition:
1326
+ width var(--transition-normal),
1327
+ transform var(--transition-normal);
1328
+ overflow: hidden;
1329
+ }
1330
+
1331
+ .sidebar[data-state='collapsed'] {
1332
+ width: var(--sidebar-width-collapsed);
1333
+ }
1334
+
1335
+ /* Inset variant - with margin/padding for floating effect */
1336
+ .sidebar-inset {
1337
+ margin: var(--space-md);
1338
+ border-radius: var(--radius-lg);
1339
+ border: 1px solid var(--sidebar-border);
1340
+ height: calc(100% - var(--space-md) * 2);
1341
+ }
1342
+
1343
+ /* ==========================================================================
1344
+ Sidebar Header
1345
+ ========================================================================== */
1346
+
1347
+ .sidebar-header {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ gap: var(--space-sm);
1351
+ padding: var(--space-md) var(--space-lg);
1352
+ border-bottom: 1px solid var(--sidebar-border);
1353
+ flex-shrink: 0;
1354
+ min-height: 56px;
1355
+ }
1356
+
1357
+ .sidebar[data-state='collapsed'] .sidebar-header {
1358
+ padding: var(--space-md);
1359
+ justify-content: center;
1360
+ }
1361
+
1362
+ .sidebar-logo {
1363
+ display: flex;
1364
+ align-items: center;
1365
+ gap: var(--space-sm);
1366
+ text-decoration: none;
1367
+ color: var(--sidebar-foreground);
1368
+ font-weight: 700;
1369
+ font-size: 1rem;
1370
+ white-space: nowrap;
1371
+ overflow: hidden;
1372
+ }
1373
+
1374
+ .sidebar-logo-icon {
1375
+ flex-shrink: 0;
1376
+ width: 24px;
1377
+ height: 24px;
1378
+ display: flex;
1379
+ align-items: center;
1380
+ justify-content: center;
1381
+ font-size: 1.25rem;
1382
+ color: var(--sidebar-accent);
1383
+ }
1384
+
1385
+ .sidebar-logo-text {
1386
+ transition: opacity var(--transition-fast);
1387
+ }
1388
+
1389
+ .sidebar[data-state='collapsed'] .sidebar-logo-text {
1390
+ opacity: 0;
1391
+ width: 0;
1392
+ }
1393
+
1394
+ /* ==========================================================================
1395
+ Sidebar Content (scrollable area)
1396
+ ========================================================================== */
1397
+
1398
+ .sidebar-content {
1399
+ flex: 1;
1400
+ overflow-y: auto;
1401
+ overflow-x: hidden;
1402
+ padding: var(--space-sm) 0;
1403
+ }
1404
+
1405
+ /* Custom scrollbar for sidebar */
1406
+ .sidebar-content::-webkit-scrollbar {
1407
+ width: 6px;
1408
+ }
1409
+
1410
+ .sidebar-content::-webkit-scrollbar-track {
1411
+ background: transparent;
1412
+ }
1413
+
1414
+ .sidebar-content::-webkit-scrollbar-thumb {
1415
+ background: var(--sidebar-border);
1416
+ border-radius: var(--radius-full);
1417
+ }
1418
+
1419
+ .sidebar-content::-webkit-scrollbar-thumb:hover {
1420
+ background: var(--sidebar-muted-foreground);
1421
+ }
1422
+
1423
+ /* ==========================================================================
1424
+ Sidebar Footer
1425
+ ========================================================================== */
1426
+
1427
+ .sidebar-footer {
1428
+ padding: var(--space-md) var(--space-lg);
1429
+ border-top: 1px solid var(--sidebar-border);
1430
+ flex-shrink: 0;
1431
+ }
1432
+
1433
+ .sidebar[data-state='collapsed'] .sidebar-footer {
1434
+ padding: var(--space-md);
1435
+ }
1436
+
1437
+ /* ==========================================================================
1438
+ Sidebar Groups
1439
+ ========================================================================== */
1440
+
1441
+ .sidebar-group {
1442
+ padding: var(--space-xs) 0;
1443
+ }
1444
+
1445
+ .sidebar-group-label {
1446
+ display: flex;
1447
+ align-items: center;
1448
+ padding: var(--space-sm) var(--space-lg);
1449
+ font-size: 0.75rem;
1450
+ font-weight: 600;
1451
+ text-transform: uppercase;
1452
+ letter-spacing: 0.05em;
1453
+ color: var(--sidebar-muted-foreground);
1454
+ white-space: nowrap;
1455
+ overflow: hidden;
1456
+ }
1457
+
1458
+ .sidebar[data-state='collapsed'] .sidebar-group-label {
1459
+ padding: var(--space-sm);
1460
+ justify-content: center;
1461
+ }
1462
+
1463
+ .sidebar[data-state='collapsed'] .sidebar-group-label span {
1464
+ display: none;
1465
+ }
1466
+
1467
+ .sidebar-group-content {
1468
+ display: flex;
1469
+ flex-direction: column;
1470
+ gap: 1px;
1471
+ }
1472
+
1473
+ /* ==========================================================================
1474
+ Sidebar Menu (collapsible sections)
1475
+ ========================================================================== */
1476
+
1477
+ .sidebar-menu {
1478
+ display: flex;
1479
+ flex-direction: column;
1480
+ gap: 1px;
1481
+ padding: 0 var(--space-sm);
1482
+ }
1483
+
1484
+ .sidebar-menu-item {
1485
+ list-style: none;
1486
+ }
1487
+
1488
+ .sidebar-menu-button {
1489
+ display: flex;
1490
+ align-items: center;
1491
+ gap: var(--space-sm);
1492
+ width: 100%;
1493
+ padding: var(--space-sm) var(--space-md);
1494
+ background: transparent;
1495
+ border: none;
1496
+ border-radius: var(--radius-md);
1497
+ color: var(--sidebar-muted-foreground);
1498
+ font-size: 0.875rem;
1499
+ font-weight: 500;
1500
+ text-align: left;
1501
+ text-decoration: none;
1502
+ cursor: pointer;
1503
+ transition: all var(--transition-fast);
1504
+ white-space: nowrap;
1505
+ overflow: hidden;
1506
+ }
1507
+
1508
+ .sidebar-menu-button:hover {
1509
+ background: var(--sidebar-muted);
1510
+ color: var(--sidebar-foreground);
1511
+ }
1512
+
1513
+ .sidebar-menu-button[data-active='true'],
1514
+ .sidebar-menu-button.active {
1515
+ background: color-mix(in srgb, var(--sidebar-accent) 15%, transparent);
1516
+ color: var(--sidebar-accent);
1517
+ }
1518
+
1519
+ .sidebar-menu-button:focus-visible {
1520
+ outline: 2px solid var(--sidebar-accent);
1521
+ outline-offset: -2px;
1522
+ }
1523
+
1524
+ .sidebar[data-state='collapsed'] .sidebar-menu-button {
1525
+ padding: var(--space-sm);
1526
+ justify-content: center;
1527
+ }
1528
+
1529
+ /* Menu button icon */
1530
+ .sidebar-menu-icon {
1531
+ flex-shrink: 0;
1532
+ width: 18px;
1533
+ height: 18px;
1534
+ opacity: 0.7;
1535
+ }
1536
+
1537
+ .sidebar-menu-button:hover .sidebar-menu-icon,
1538
+ .sidebar-menu-button[data-active='true'] .sidebar-menu-icon {
1539
+ opacity: 1;
1540
+ }
1541
+
1542
+ /* Menu button text */
1543
+ .sidebar-menu-text {
1544
+ flex: 1;
1545
+ overflow: hidden;
1546
+ text-overflow: ellipsis;
1547
+ transition: opacity var(--transition-fast);
1548
+ }
1549
+
1550
+ .sidebar[data-state='collapsed'] .sidebar-menu-text {
1551
+ opacity: 0;
1552
+ width: 0;
1553
+ }
1554
+
1555
+ /* Menu button badge */
1556
+ .sidebar-menu-badge {
1557
+ flex-shrink: 0;
1558
+ padding: 0.125rem 0.5rem;
1559
+ font-size: 0.75rem;
1560
+ font-weight: 600;
1561
+ background: var(--sidebar-muted);
1562
+ color: var(--sidebar-muted-foreground);
1563
+ border-radius: var(--radius-full);
1564
+ }
1565
+
1566
+ .sidebar[data-state='collapsed'] .sidebar-menu-badge {
1567
+ display: none;
1568
+ }
1569
+
1570
+ /* Menu button chevron (for expandable items) */
1571
+ .sidebar-menu-chevron {
1572
+ flex-shrink: 0;
1573
+ width: 16px;
1574
+ height: 16px;
1575
+ color: var(--sidebar-muted-foreground);
1576
+ transition: transform var(--transition-fast);
1577
+ }
1578
+
1579
+ .sidebar-menu-button[aria-expanded='true'] .sidebar-menu-chevron {
1580
+ transform: rotate(180deg);
1581
+ }
1582
+
1583
+ .sidebar[data-state='collapsed'] .sidebar-menu-chevron {
1584
+ display: none;
1585
+ }
1586
+
1587
+ /* ==========================================================================
1588
+ Sidebar Sub-menu (nested items)
1589
+ ========================================================================== */
1590
+
1591
+ .sidebar-menu-sub {
1592
+ display: none;
1593
+ flex-direction: column;
1594
+ gap: 1px;
1595
+ padding-left: calc(var(--space-md) + 18px + var(--space-sm));
1596
+ margin-top: 1px;
1597
+ }
1598
+
1599
+ .sidebar-menu-item[data-open='true'] > .sidebar-menu-sub {
1600
+ display: flex;
1601
+ }
1602
+
1603
+ .sidebar[data-state='collapsed'] .sidebar-menu-sub {
1604
+ display: none;
1605
+ }
1606
+
1607
+ .sidebar-menu-sub-button {
1608
+ display: flex;
1609
+ align-items: center;
1610
+ gap: var(--space-sm);
1611
+ width: 100%;
1612
+ padding: var(--space-xs) var(--space-md);
1613
+ background: transparent;
1614
+ border: none;
1615
+ border-left: 2px solid transparent;
1616
+ color: var(--sidebar-muted-foreground);
1617
+ font-size: 0.8125rem;
1618
+ text-align: left;
1619
+ text-decoration: none;
1620
+ cursor: pointer;
1621
+ transition: all var(--transition-fast);
1622
+ }
1623
+
1624
+ .sidebar-menu-sub-button:hover {
1625
+ color: var(--sidebar-foreground);
1626
+ border-left-color: var(--sidebar-border);
1627
+ }
1628
+
1629
+ .sidebar-menu-sub-button:focus-visible {
1630
+ outline: 2px solid var(--sidebar-accent);
1631
+ outline-offset: -2px;
1632
+ }
1633
+
1634
+ .sidebar-menu-sub-button[data-active='true'],
1635
+ .sidebar-menu-sub-button.active {
1636
+ color: var(--sidebar-accent);
1637
+ border-left-color: var(--sidebar-accent);
1638
+ font-weight: 500;
1639
+ }
1640
+
1641
+ /* ==========================================================================
1642
+ Sidebar Trigger (collapse/expand button)
1643
+ ========================================================================== */
1644
+
1645
+ .sidebar-trigger {
1646
+ display: flex;
1647
+ align-items: center;
1648
+ justify-content: center;
1649
+ width: 32px;
1650
+ height: 32px;
1651
+ padding: 0;
1652
+ background: transparent;
1653
+ border: 1px solid var(--sidebar-border);
1654
+ border-radius: var(--radius-md);
1655
+ color: var(--sidebar-muted-foreground);
1656
+ cursor: pointer;
1657
+ transition: all var(--transition-fast);
1658
+ }
1659
+
1660
+ .sidebar-trigger:hover {
1661
+ background: var(--sidebar-muted);
1662
+ color: var(--sidebar-foreground);
1663
+ }
1664
+
1665
+ .sidebar-trigger-icon {
1666
+ width: 16px;
1667
+ height: 16px;
1668
+ transition: transform var(--transition-normal);
1669
+ }
1670
+
1671
+ .sidebar[data-state='collapsed'] .sidebar-trigger-icon {
1672
+ transform: rotate(180deg);
1673
+ }
1674
+
1675
+ /* ==========================================================================
1676
+ Sidebar Rail (thin collapsed indicator)
1677
+ ========================================================================== */
1678
+
1679
+ .sidebar-rail {
1680
+ position: absolute;
1681
+ top: 0;
1682
+ right: -4px;
1683
+ width: 8px;
1684
+ height: 100%;
1685
+ cursor: ew-resize;
1686
+ opacity: 0;
1687
+ transition: opacity var(--transition-fast);
1688
+ }
1689
+
1690
+ .sidebar:hover .sidebar-rail {
1691
+ opacity: 1;
1692
+ }
1693
+
1694
+ .sidebar-rail::after {
1695
+ content: '';
1696
+ position: absolute;
1697
+ top: 50%;
1698
+ left: 50%;
1699
+ transform: translate(-50%, -50%);
1700
+ width: 2px;
1701
+ height: 40px;
1702
+ background: var(--sidebar-border);
1703
+ border-radius: var(--radius-full);
1704
+ }
1705
+
1706
+ /* ==========================================================================
1707
+ Sidebar Separator
1708
+ ========================================================================== */
1709
+
1710
+ .sidebar-separator {
1711
+ height: 1px;
1712
+ margin: var(--space-sm) var(--space-lg);
1713
+ background: var(--sidebar-border);
1714
+ }
1715
+
1716
+ .sidebar[data-state='collapsed'] .sidebar-separator {
1717
+ margin: var(--space-sm);
1718
+ }
1719
+
1720
+ /* ==========================================================================
1721
+ Mobile Sidebar
1722
+ ========================================================================== */
1723
+
1724
+ .sidebar-mobile-trigger {
1725
+ display: none;
1726
+ position: fixed;
1727
+ bottom: var(--space-lg);
1728
+ right: var(--space-lg);
1729
+ z-index: 200;
1730
+ width: 48px;
1731
+ height: 48px;
1732
+ padding: 0;
1733
+ background: var(--sidebar-accent);
1734
+ color: var(--sidebar-accent-foreground);
1735
+ border: none;
1736
+ border-radius: var(--radius-full);
1737
+ box-shadow: var(--shadow-lg);
1738
+ cursor: pointer;
1739
+ transition:
1740
+ transform var(--transition-fast),
1741
+ box-shadow var(--transition-fast);
1742
+ }
1743
+
1744
+ .sidebar-mobile-trigger:hover {
1745
+ transform: scale(1.05);
1746
+ box-shadow: var(--shadow-xl);
1747
+ }
1748
+
1749
+ .sidebar-mobile-trigger:active {
1750
+ transform: scale(0.95);
1751
+ }
1752
+
1753
+ .sidebar-backdrop {
1754
+ display: none;
1755
+ position: fixed;
1756
+ inset: 0;
1757
+ background: rgba(0, 0, 0, 0.5);
1758
+ z-index: 99;
1759
+ opacity: 0;
1760
+ transition: opacity var(--transition-normal);
1761
+ }
1762
+
1763
+ .sidebar-backdrop[data-state='open'] {
1764
+ opacity: 1;
1765
+ }
1766
+
1767
+ /* Mobile responsive */
1768
+ @media (max-width: 1024px) {
1769
+ .sidebar {
1770
+ position: fixed;
1771
+ top: 0;
1772
+ left: 0;
1773
+ z-index: 100;
1774
+ height: 100vh;
1775
+ width: var(--sidebar-width-mobile);
1776
+ transform: translateX(-100%);
1777
+ }
1778
+
1779
+ .sidebar[data-state='open'] {
1780
+ transform: translateX(0);
1781
+ }
1782
+
1783
+ .sidebar[data-state='collapsed'] {
1784
+ width: var(--sidebar-width-mobile);
1785
+ transform: translateX(-100%);
1786
+ }
1787
+
1788
+ .sidebar-mobile-trigger {
1789
+ display: flex;
1790
+ align-items: center;
1791
+ justify-content: center;
1792
+ }
1793
+
1794
+ .sidebar-backdrop {
1795
+ display: block;
1796
+ }
1797
+
1798
+ /* Reset collapsed state for mobile */
1799
+ .sidebar[data-state='collapsed'] .sidebar-menu-text,
1800
+ .sidebar[data-state='collapsed'] .sidebar-logo-text,
1801
+ .sidebar[data-state='collapsed'] .sidebar-group-label span {
1802
+ opacity: 1;
1803
+ width: auto;
1804
+ }
1805
+
1806
+ .sidebar[data-state='collapsed'] .sidebar-menu-button,
1807
+ .sidebar[data-state='collapsed'] .sidebar-header {
1808
+ justify-content: flex-start;
1809
+ padding: var(--space-sm) var(--space-md);
1810
+ }
1811
+ }
1812
+
1813
+ /* ==========================================================================
1814
+ Layout Integration
1815
+ ========================================================================== */
1816
+
1817
+ .sidebar-layout {
1818
+ display: grid;
1819
+ grid-template-columns: auto 1fr;
1820
+ min-height: 100vh;
1821
+ }
1822
+
1823
+ .sidebar-layout[data-sidebar-collapsed='true'] {
1824
+ grid-template-columns: var(--sidebar-width-collapsed) 1fr;
1825
+ }
1826
+
1827
+ @media (max-width: 1024px) {
1828
+ .sidebar-layout {
1829
+ grid-template-columns: 1fr;
1830
+ }
1831
+ }
1832
+
1833
+