@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,113 @@
1
+ /* ==========================================================================
2
+ Turbo Themes - Progress
3
+ ========================================================================== */
4
+
5
+ .progress {
6
+ width: 100%;
7
+ height: 0.75rem;
8
+ appearance: none;
9
+ border: none;
10
+ border-radius: var(--radius-full);
11
+ background: var(--turbo-bg-overlay);
12
+ overflow: hidden;
13
+ }
14
+
15
+ .progress::-webkit-progress-bar {
16
+ background: var(--turbo-bg-overlay);
17
+ border-radius: var(--radius-full);
18
+ }
19
+
20
+ .progress::-webkit-progress-value {
21
+ background: var(--gradient-primary, var(--turbo-brand-primary));
22
+ border-radius: var(--radius-full);
23
+ transition: width var(--transition-normal);
24
+ }
25
+
26
+ .progress::-moz-progress-bar {
27
+ background: var(--gradient-primary, var(--turbo-brand-primary));
28
+ border-radius: var(--radius-full);
29
+ }
30
+
31
+ /* Progress wrapper with label */
32
+ .progress-wrapper {
33
+ margin-bottom: var(--space-lg);
34
+ }
35
+
36
+ .progress-wrapper label {
37
+ display: block;
38
+ margin-bottom: var(--space-sm);
39
+ }
40
+
41
+ /* Size variants */
42
+ .progress-sm {
43
+ height: 0.5rem;
44
+ }
45
+
46
+ .progress-lg {
47
+ height: 1rem;
48
+ }
49
+
50
+ /* Color variants */
51
+ .progress-success::-webkit-progress-value {
52
+ background: linear-gradient(
53
+ 90deg,
54
+ var(--turbo-state-success),
55
+ color-mix(in srgb, var(--turbo-state-success) 70%, var(--turbo-state-info))
56
+ );
57
+ }
58
+
59
+ .progress-success::-moz-progress-bar {
60
+ background: linear-gradient(
61
+ 90deg,
62
+ var(--turbo-state-success),
63
+ color-mix(in srgb, var(--turbo-state-success) 70%, var(--turbo-state-info))
64
+ );
65
+ }
66
+
67
+ .progress-warning::-webkit-progress-value {
68
+ background: linear-gradient(
69
+ 90deg,
70
+ var(--turbo-state-warning),
71
+ color-mix(in srgb, var(--turbo-state-warning) 70%, var(--turbo-state-danger))
72
+ );
73
+ }
74
+
75
+ .progress-warning::-moz-progress-bar {
76
+ background: linear-gradient(
77
+ 90deg,
78
+ var(--turbo-state-warning),
79
+ color-mix(in srgb, var(--turbo-state-warning) 70%, var(--turbo-state-danger))
80
+ );
81
+ }
82
+
83
+ .progress-danger::-webkit-progress-value {
84
+ background: linear-gradient(
85
+ 90deg,
86
+ var(--turbo-state-danger),
87
+ color-mix(in srgb, var(--turbo-state-danger) 70%, var(--turbo-state-warning))
88
+ );
89
+ }
90
+
91
+ .progress-danger::-moz-progress-bar {
92
+ background: linear-gradient(
93
+ 90deg,
94
+ var(--turbo-state-danger),
95
+ color-mix(in srgb, var(--turbo-state-danger) 70%, var(--turbo-state-warning))
96
+ );
97
+ }
98
+
99
+ .progress-info::-webkit-progress-value {
100
+ background: linear-gradient(
101
+ 90deg,
102
+ var(--turbo-state-info),
103
+ color-mix(in srgb, var(--turbo-state-info) 70%, var(--turbo-brand-primary))
104
+ );
105
+ }
106
+
107
+ .progress-info::-moz-progress-bar {
108
+ background: linear-gradient(
109
+ 90deg,
110
+ var(--turbo-state-info),
111
+ color-mix(in srgb, var(--turbo-state-info) 70%, var(--turbo-brand-primary))
112
+ );
113
+ }
@@ -0,0 +1,537 @@
1
+ /* ==========================================================================
2
+ Turbo Themes - Sidebar (shadcn-inspired)
3
+ A composable, collapsible sidebar component.
4
+ ========================================================================== */
5
+
6
+ /* CSS Variables for sidebar customization */
7
+ :root {
8
+ --sidebar-width: 280px;
9
+ --sidebar-width-collapsed: 60px;
10
+ --sidebar-width-mobile: 280px;
11
+ --sidebar-background: var(--turbo-bg-surface);
12
+ --sidebar-foreground: var(--turbo-text-primary);
13
+ --sidebar-border: var(--turbo-border-default);
14
+ --sidebar-accent: var(--turbo-brand-primary);
15
+ --sidebar-accent-foreground: var(--turbo-text-inverse);
16
+ --sidebar-muted: var(--turbo-bg-overlay);
17
+ --sidebar-muted-foreground: var(--turbo-text-secondary);
18
+ }
19
+
20
+ /* ==========================================================================
21
+ Sidebar Container
22
+ ========================================================================== */
23
+
24
+ .sidebar {
25
+ display: flex;
26
+ flex-direction: column;
27
+ width: var(--sidebar-width);
28
+ height: 100%;
29
+ background: var(--sidebar-background);
30
+ border-right: 1px solid var(--sidebar-border);
31
+ transition:
32
+ width var(--transition-normal),
33
+ transform var(--transition-normal);
34
+ overflow: hidden;
35
+ }
36
+
37
+ .sidebar[data-state='collapsed'] {
38
+ width: var(--sidebar-width-collapsed);
39
+ }
40
+
41
+ /* Inset variant - with margin/padding for floating effect */
42
+ .sidebar-inset {
43
+ margin: var(--space-md);
44
+ border-radius: var(--radius-lg);
45
+ border: 1px solid var(--sidebar-border);
46
+ height: calc(100% - var(--space-md) * 2);
47
+ }
48
+
49
+ /* ==========================================================================
50
+ Sidebar Header
51
+ ========================================================================== */
52
+
53
+ .sidebar-header {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: var(--space-sm);
57
+ padding: var(--space-md) var(--space-lg);
58
+ border-bottom: 1px solid var(--sidebar-border);
59
+ flex-shrink: 0;
60
+ min-height: 56px;
61
+ }
62
+
63
+ .sidebar[data-state='collapsed'] .sidebar-header {
64
+ padding: var(--space-md);
65
+ justify-content: center;
66
+ }
67
+
68
+ .sidebar-logo {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--space-sm);
72
+ text-decoration: none;
73
+ color: var(--sidebar-foreground);
74
+ font-weight: 700;
75
+ font-size: 1rem;
76
+ white-space: nowrap;
77
+ overflow: hidden;
78
+ }
79
+
80
+ .sidebar-logo-icon {
81
+ flex-shrink: 0;
82
+ width: 24px;
83
+ height: 24px;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ font-size: 1.25rem;
88
+ color: var(--sidebar-accent);
89
+ }
90
+
91
+ .sidebar-logo-text {
92
+ transition: opacity var(--transition-fast);
93
+ }
94
+
95
+ .sidebar[data-state='collapsed'] .sidebar-logo-text {
96
+ opacity: 0;
97
+ width: 0;
98
+ }
99
+
100
+ /* ==========================================================================
101
+ Sidebar Content (scrollable area)
102
+ ========================================================================== */
103
+
104
+ .sidebar-content {
105
+ flex: 1;
106
+ overflow-y: auto;
107
+ overflow-x: hidden;
108
+ padding: var(--space-sm) 0;
109
+ }
110
+
111
+ /* Custom scrollbar for sidebar */
112
+ .sidebar-content::-webkit-scrollbar {
113
+ width: 6px;
114
+ }
115
+
116
+ .sidebar-content::-webkit-scrollbar-track {
117
+ background: transparent;
118
+ }
119
+
120
+ .sidebar-content::-webkit-scrollbar-thumb {
121
+ background: var(--sidebar-border);
122
+ border-radius: var(--radius-full);
123
+ }
124
+
125
+ .sidebar-content::-webkit-scrollbar-thumb:hover {
126
+ background: var(--sidebar-muted-foreground);
127
+ }
128
+
129
+ /* ==========================================================================
130
+ Sidebar Footer
131
+ ========================================================================== */
132
+
133
+ .sidebar-footer {
134
+ padding: var(--space-md) var(--space-lg);
135
+ border-top: 1px solid var(--sidebar-border);
136
+ flex-shrink: 0;
137
+ }
138
+
139
+ .sidebar[data-state='collapsed'] .sidebar-footer {
140
+ padding: var(--space-md);
141
+ }
142
+
143
+ /* ==========================================================================
144
+ Sidebar Groups
145
+ ========================================================================== */
146
+
147
+ .sidebar-group {
148
+ padding: var(--space-xs) 0;
149
+ }
150
+
151
+ .sidebar-group-label {
152
+ display: flex;
153
+ align-items: center;
154
+ padding: var(--space-sm) var(--space-lg);
155
+ font-size: 0.75rem;
156
+ font-weight: 600;
157
+ text-transform: uppercase;
158
+ letter-spacing: 0.05em;
159
+ color: var(--sidebar-muted-foreground);
160
+ white-space: nowrap;
161
+ overflow: hidden;
162
+ }
163
+
164
+ .sidebar[data-state='collapsed'] .sidebar-group-label {
165
+ padding: var(--space-sm);
166
+ justify-content: center;
167
+ }
168
+
169
+ .sidebar[data-state='collapsed'] .sidebar-group-label span {
170
+ display: none;
171
+ }
172
+
173
+ .sidebar-group-content {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: 1px;
177
+ }
178
+
179
+ /* ==========================================================================
180
+ Sidebar Menu (collapsible sections)
181
+ ========================================================================== */
182
+
183
+ .sidebar-menu {
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 1px;
187
+ padding: 0 var(--space-sm);
188
+ }
189
+
190
+ .sidebar-menu-item {
191
+ list-style: none;
192
+ }
193
+
194
+ .sidebar-menu-button {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: var(--space-sm);
198
+ width: 100%;
199
+ padding: var(--space-sm) var(--space-md);
200
+ background: transparent;
201
+ border: none;
202
+ border-radius: var(--radius-md);
203
+ color: var(--sidebar-muted-foreground);
204
+ font-size: 0.875rem;
205
+ font-weight: 500;
206
+ text-align: left;
207
+ text-decoration: none;
208
+ cursor: pointer;
209
+ transition: all var(--transition-fast);
210
+ white-space: nowrap;
211
+ overflow: hidden;
212
+ }
213
+
214
+ .sidebar-menu-button:hover {
215
+ background: var(--sidebar-muted);
216
+ color: var(--sidebar-foreground);
217
+ }
218
+
219
+ .sidebar-menu-button[data-active='true'],
220
+ .sidebar-menu-button.active {
221
+ background: color-mix(in srgb, var(--sidebar-accent) 15%, transparent);
222
+ color: var(--sidebar-accent);
223
+ }
224
+
225
+ .sidebar-menu-button:focus-visible {
226
+ outline: 2px solid var(--sidebar-accent);
227
+ outline-offset: -2px;
228
+ }
229
+
230
+ .sidebar[data-state='collapsed'] .sidebar-menu-button {
231
+ padding: var(--space-sm);
232
+ justify-content: center;
233
+ }
234
+
235
+ /* Menu button icon */
236
+ .sidebar-menu-icon {
237
+ flex-shrink: 0;
238
+ width: 18px;
239
+ height: 18px;
240
+ opacity: 0.7;
241
+ }
242
+
243
+ .sidebar-menu-button:hover .sidebar-menu-icon,
244
+ .sidebar-menu-button[data-active='true'] .sidebar-menu-icon {
245
+ opacity: 1;
246
+ }
247
+
248
+ /* Menu button text */
249
+ .sidebar-menu-text {
250
+ flex: 1;
251
+ overflow: hidden;
252
+ text-overflow: ellipsis;
253
+ transition: opacity var(--transition-fast);
254
+ }
255
+
256
+ .sidebar[data-state='collapsed'] .sidebar-menu-text {
257
+ opacity: 0;
258
+ width: 0;
259
+ }
260
+
261
+ /* Menu button badge */
262
+ .sidebar-menu-badge {
263
+ flex-shrink: 0;
264
+ padding: 0.125rem 0.5rem;
265
+ font-size: 0.75rem;
266
+ font-weight: 600;
267
+ background: var(--sidebar-muted);
268
+ color: var(--sidebar-muted-foreground);
269
+ border-radius: var(--radius-full);
270
+ }
271
+
272
+ .sidebar[data-state='collapsed'] .sidebar-menu-badge {
273
+ display: none;
274
+ }
275
+
276
+ /* Menu button chevron (for expandable items) */
277
+ .sidebar-menu-chevron {
278
+ flex-shrink: 0;
279
+ width: 16px;
280
+ height: 16px;
281
+ color: var(--sidebar-muted-foreground);
282
+ transition: transform var(--transition-fast);
283
+ }
284
+
285
+ .sidebar-menu-button[aria-expanded='true'] .sidebar-menu-chevron {
286
+ transform: rotate(180deg);
287
+ }
288
+
289
+ .sidebar[data-state='collapsed'] .sidebar-menu-chevron {
290
+ display: none;
291
+ }
292
+
293
+ /* ==========================================================================
294
+ Sidebar Sub-menu (nested items)
295
+ ========================================================================== */
296
+
297
+ .sidebar-menu-sub {
298
+ display: none;
299
+ flex-direction: column;
300
+ gap: 1px;
301
+ padding-left: calc(var(--space-md) + 18px + var(--space-sm));
302
+ margin-top: 1px;
303
+ }
304
+
305
+ .sidebar-menu-item[data-open='true'] > .sidebar-menu-sub {
306
+ display: flex;
307
+ }
308
+
309
+ .sidebar[data-state='collapsed'] .sidebar-menu-sub {
310
+ display: none;
311
+ }
312
+
313
+ .sidebar-menu-sub-button {
314
+ display: flex;
315
+ align-items: center;
316
+ gap: var(--space-sm);
317
+ width: 100%;
318
+ padding: var(--space-xs) var(--space-md);
319
+ background: transparent;
320
+ border: none;
321
+ border-left: 2px solid transparent;
322
+ color: var(--sidebar-muted-foreground);
323
+ font-size: 0.8125rem;
324
+ text-align: left;
325
+ text-decoration: none;
326
+ cursor: pointer;
327
+ transition: all var(--transition-fast);
328
+ }
329
+
330
+ .sidebar-menu-sub-button:hover {
331
+ color: var(--sidebar-foreground);
332
+ border-left-color: var(--sidebar-border);
333
+ }
334
+
335
+ .sidebar-menu-sub-button:focus-visible {
336
+ outline: 2px solid var(--sidebar-accent);
337
+ outline-offset: -2px;
338
+ }
339
+
340
+ .sidebar-menu-sub-button[data-active='true'],
341
+ .sidebar-menu-sub-button.active {
342
+ color: var(--sidebar-accent);
343
+ border-left-color: var(--sidebar-accent);
344
+ font-weight: 500;
345
+ }
346
+
347
+ /* ==========================================================================
348
+ Sidebar Trigger (collapse/expand button)
349
+ ========================================================================== */
350
+
351
+ .sidebar-trigger {
352
+ display: flex;
353
+ align-items: center;
354
+ justify-content: center;
355
+ width: 32px;
356
+ height: 32px;
357
+ padding: 0;
358
+ background: transparent;
359
+ border: 1px solid var(--sidebar-border);
360
+ border-radius: var(--radius-md);
361
+ color: var(--sidebar-muted-foreground);
362
+ cursor: pointer;
363
+ transition: all var(--transition-fast);
364
+ }
365
+
366
+ .sidebar-trigger:hover {
367
+ background: var(--sidebar-muted);
368
+ color: var(--sidebar-foreground);
369
+ }
370
+
371
+ .sidebar-trigger-icon {
372
+ width: 16px;
373
+ height: 16px;
374
+ transition: transform var(--transition-normal);
375
+ }
376
+
377
+ .sidebar[data-state='collapsed'] .sidebar-trigger-icon {
378
+ transform: rotate(180deg);
379
+ }
380
+
381
+ /* ==========================================================================
382
+ Sidebar Rail (thin collapsed indicator)
383
+ ========================================================================== */
384
+
385
+ .sidebar-rail {
386
+ position: absolute;
387
+ top: 0;
388
+ right: -4px;
389
+ width: 8px;
390
+ height: 100%;
391
+ cursor: ew-resize;
392
+ opacity: 0;
393
+ transition: opacity var(--transition-fast);
394
+ }
395
+
396
+ .sidebar:hover .sidebar-rail {
397
+ opacity: 1;
398
+ }
399
+
400
+ .sidebar-rail::after {
401
+ content: '';
402
+ position: absolute;
403
+ top: 50%;
404
+ left: 50%;
405
+ transform: translate(-50%, -50%);
406
+ width: 2px;
407
+ height: 40px;
408
+ background: var(--sidebar-border);
409
+ border-radius: var(--radius-full);
410
+ }
411
+
412
+ /* ==========================================================================
413
+ Sidebar Separator
414
+ ========================================================================== */
415
+
416
+ .sidebar-separator {
417
+ height: 1px;
418
+ margin: var(--space-sm) var(--space-lg);
419
+ background: var(--sidebar-border);
420
+ }
421
+
422
+ .sidebar[data-state='collapsed'] .sidebar-separator {
423
+ margin: var(--space-sm);
424
+ }
425
+
426
+ /* ==========================================================================
427
+ Mobile Sidebar
428
+ ========================================================================== */
429
+
430
+ .sidebar-mobile-trigger {
431
+ display: none;
432
+ position: fixed;
433
+ bottom: var(--space-lg);
434
+ right: var(--space-lg);
435
+ z-index: 200;
436
+ width: 48px;
437
+ height: 48px;
438
+ padding: 0;
439
+ background: var(--sidebar-accent);
440
+ color: var(--sidebar-accent-foreground);
441
+ border: none;
442
+ border-radius: var(--radius-full);
443
+ box-shadow: var(--shadow-lg);
444
+ cursor: pointer;
445
+ transition:
446
+ transform var(--transition-fast),
447
+ box-shadow var(--transition-fast);
448
+ }
449
+
450
+ .sidebar-mobile-trigger:hover {
451
+ transform: scale(1.05);
452
+ box-shadow: var(--shadow-xl);
453
+ }
454
+
455
+ .sidebar-mobile-trigger:active {
456
+ transform: scale(0.95);
457
+ }
458
+
459
+ .sidebar-backdrop {
460
+ display: none;
461
+ position: fixed;
462
+ inset: 0;
463
+ background: rgba(0, 0, 0, 0.5);
464
+ z-index: 99;
465
+ opacity: 0;
466
+ transition: opacity var(--transition-normal);
467
+ }
468
+
469
+ .sidebar-backdrop[data-state='open'] {
470
+ opacity: 1;
471
+ }
472
+
473
+ /* Mobile responsive */
474
+ @media (max-width: 1024px) {
475
+ .sidebar {
476
+ position: fixed;
477
+ top: 0;
478
+ left: 0;
479
+ z-index: 100;
480
+ height: 100vh;
481
+ width: var(--sidebar-width-mobile);
482
+ transform: translateX(-100%);
483
+ }
484
+
485
+ .sidebar[data-state='open'] {
486
+ transform: translateX(0);
487
+ }
488
+
489
+ .sidebar[data-state='collapsed'] {
490
+ width: var(--sidebar-width-mobile);
491
+ transform: translateX(-100%);
492
+ }
493
+
494
+ .sidebar-mobile-trigger {
495
+ display: flex;
496
+ align-items: center;
497
+ justify-content: center;
498
+ }
499
+
500
+ .sidebar-backdrop {
501
+ display: block;
502
+ }
503
+
504
+ /* Reset collapsed state for mobile */
505
+ .sidebar[data-state='collapsed'] .sidebar-menu-text,
506
+ .sidebar[data-state='collapsed'] .sidebar-logo-text,
507
+ .sidebar[data-state='collapsed'] .sidebar-group-label span {
508
+ opacity: 1;
509
+ width: auto;
510
+ }
511
+
512
+ .sidebar[data-state='collapsed'] .sidebar-menu-button,
513
+ .sidebar[data-state='collapsed'] .sidebar-header {
514
+ justify-content: flex-start;
515
+ padding: var(--space-sm) var(--space-md);
516
+ }
517
+ }
518
+
519
+ /* ==========================================================================
520
+ Layout Integration
521
+ ========================================================================== */
522
+
523
+ .sidebar-layout {
524
+ display: grid;
525
+ grid-template-columns: auto 1fr;
526
+ min-height: 100vh;
527
+ }
528
+
529
+ .sidebar-layout[data-sidebar-collapsed='true'] {
530
+ grid-template-columns: var(--sidebar-width-collapsed) 1fr;
531
+ }
532
+
533
+ @media (max-width: 1024px) {
534
+ .sidebar-layout {
535
+ grid-template-columns: 1fr;
536
+ }
537
+ }