boltdocs 1.0.4 → 1.3.1

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 (121) hide show
  1. package/dist/{SearchDialog-R36WKAQ7.mjs → SearchDialog-5EDRACEG.mjs} +1 -1
  2. package/dist/{SearchDialog-PYF3QMYG.css → SearchDialog-X57WPTNN.css} +54 -126
  3. package/dist/cache-EHR7SXRU.mjs +12 -0
  4. package/dist/chunk-GSYECEZY.mjs +381 -0
  5. package/dist/{chunk-TWSRXUFF.mjs → chunk-NS7WHDYA.mjs} +229 -418
  6. package/dist/client/index.css +54 -126
  7. package/dist/client/index.d.mts +5 -4
  8. package/dist/client/index.d.ts +5 -4
  9. package/dist/client/index.js +555 -580
  10. package/dist/client/index.mjs +304 -16
  11. package/dist/client/ssr.css +54 -126
  12. package/dist/client/ssr.js +257 -580
  13. package/dist/client/ssr.mjs +1 -1
  14. package/dist/{config-D2XmHJYe.d.mts → config-BD5ZHz15.d.mts} +7 -0
  15. package/dist/{config-D2XmHJYe.d.ts → config-BD5ZHz15.d.ts} +7 -0
  16. package/dist/node/index.d.mts +2 -2
  17. package/dist/node/index.d.ts +2 -2
  18. package/dist/node/index.js +477 -123
  19. package/dist/node/index.mjs +114 -142
  20. package/package.json +2 -2
  21. package/src/client/app/index.tsx +344 -373
  22. package/src/client/app/preload.tsx +56 -56
  23. package/src/client/index.ts +40 -40
  24. package/src/client/ssr.tsx +51 -51
  25. package/src/client/theme/components/CodeBlock/CodeBlock.tsx +76 -76
  26. package/src/client/theme/components/CodeBlock/index.ts +1 -1
  27. package/src/client/theme/components/PackageManagerTabs/PackageManagerTabs.tsx +154 -154
  28. package/src/client/theme/components/PackageManagerTabs/index.ts +1 -1
  29. package/src/client/theme/components/PackageManagerTabs/pkg-tabs.css +64 -64
  30. package/src/client/theme/components/Playground/Playground.tsx +124 -124
  31. package/src/client/theme/components/Playground/index.ts +1 -1
  32. package/src/client/theme/components/Playground/playground.css +168 -168
  33. package/src/client/theme/components/Video/Video.tsx +84 -84
  34. package/src/client/theme/components/Video/index.ts +1 -1
  35. package/src/client/theme/components/Video/video.css +41 -41
  36. package/src/client/theme/components/mdx/Admonition.tsx +80 -80
  37. package/src/client/theme/components/mdx/Badge.tsx +31 -31
  38. package/src/client/theme/components/mdx/Button.tsx +50 -50
  39. package/src/client/theme/components/mdx/Card.tsx +80 -80
  40. package/src/client/theme/components/mdx/List.tsx +57 -57
  41. package/src/client/theme/components/mdx/Tabs.tsx +94 -94
  42. package/src/client/theme/components/mdx/index.ts +18 -18
  43. package/src/client/theme/components/mdx/mdx-components.css +424 -405
  44. package/src/client/theme/icons/bun.tsx +62 -62
  45. package/src/client/theme/icons/deno.tsx +20 -20
  46. package/src/client/theme/icons/discord.tsx +12 -12
  47. package/src/client/theme/icons/github.tsx +15 -15
  48. package/src/client/theme/icons/npm.tsx +13 -13
  49. package/src/client/theme/icons/pnpm.tsx +72 -72
  50. package/src/client/theme/icons/twitter.tsx +12 -12
  51. package/src/client/theme/styles/markdown.css +343 -343
  52. package/src/client/theme/styles/variables.css +162 -162
  53. package/src/client/theme/styles.css +37 -38
  54. package/src/client/theme/ui/BackgroundGradient/BackgroundGradient.tsx +10 -10
  55. package/src/client/theme/ui/BackgroundGradient/index.ts +1 -1
  56. package/src/client/theme/ui/Breadcrumbs/Breadcrumbs.tsx +68 -68
  57. package/src/client/theme/ui/Breadcrumbs/index.ts +1 -1
  58. package/src/client/theme/ui/Footer/footer.css +32 -32
  59. package/src/client/theme/ui/Head/Head.tsx +69 -69
  60. package/src/client/theme/ui/Head/index.ts +1 -1
  61. package/src/client/theme/ui/LanguageSwitcher/LanguageSwitcher.tsx +125 -125
  62. package/src/client/theme/ui/LanguageSwitcher/index.ts +1 -1
  63. package/src/client/theme/ui/LanguageSwitcher/language-switcher.css +98 -98
  64. package/src/client/theme/ui/Layout/Layout.tsx +202 -213
  65. package/src/client/theme/ui/Layout/base.css +76 -76
  66. package/src/client/theme/ui/Layout/index.ts +2 -2
  67. package/src/client/theme/ui/Layout/pagination.css +72 -72
  68. package/src/client/theme/ui/Layout/responsive.css +36 -40
  69. package/src/client/theme/ui/Link/Link.tsx +254 -202
  70. package/src/client/theme/ui/Link/index.ts +2 -2
  71. package/src/client/theme/ui/Loading/Loading.tsx +10 -10
  72. package/src/client/theme/ui/Loading/index.ts +1 -1
  73. package/src/client/theme/ui/Loading/loading.css +30 -30
  74. package/src/client/theme/ui/Navbar/GithubStars.tsx +27 -27
  75. package/src/client/theme/ui/Navbar/Navbar.tsx +145 -145
  76. package/src/client/theme/ui/Navbar/index.ts +2 -2
  77. package/src/client/theme/ui/Navbar/navbar.css +233 -233
  78. package/src/client/theme/ui/NotFound/NotFound.tsx +19 -20
  79. package/src/client/theme/ui/NotFound/index.ts +1 -1
  80. package/src/client/theme/ui/NotFound/not-found.css +64 -64
  81. package/src/client/theme/ui/OnThisPage/OnThisPage.tsx +235 -192
  82. package/src/client/theme/ui/OnThisPage/index.ts +1 -1
  83. package/src/client/theme/ui/OnThisPage/toc.css +132 -132
  84. package/src/client/theme/ui/PoweredBy/PoweredBy.tsx +18 -18
  85. package/src/client/theme/ui/PoweredBy/index.ts +1 -1
  86. package/src/client/theme/ui/PoweredBy/powered-by.css +76 -76
  87. package/src/client/theme/ui/SearchDialog/SearchDialog.tsx +199 -199
  88. package/src/client/theme/ui/SearchDialog/index.ts +1 -1
  89. package/src/client/theme/ui/SearchDialog/search.css +152 -152
  90. package/src/client/theme/ui/Sidebar/Sidebar.tsx +204 -200
  91. package/src/client/theme/ui/Sidebar/index.ts +1 -1
  92. package/src/client/theme/ui/Sidebar/sidebar.css +236 -269
  93. package/src/client/theme/ui/ThemeToggle/ThemeToggle.tsx +69 -69
  94. package/src/client/theme/ui/ThemeToggle/index.ts +1 -1
  95. package/src/client/theme/ui/VersionSwitcher/VersionSwitcher.tsx +136 -136
  96. package/src/client/theme/ui/VersionSwitcher/index.ts +1 -1
  97. package/src/client/types.ts +50 -50
  98. package/src/client/utils.ts +26 -26
  99. package/src/node/cache.ts +408 -94
  100. package/src/node/config.ts +192 -185
  101. package/src/node/index.ts +21 -21
  102. package/src/node/mdx.ts +120 -41
  103. package/src/node/plugin/entry.ts +58 -58
  104. package/src/node/plugin/html.ts +55 -55
  105. package/src/node/plugin/index.ts +193 -190
  106. package/src/node/plugin/types.ts +11 -11
  107. package/src/node/routes/cache.ts +28 -24
  108. package/src/node/routes/index.ts +167 -152
  109. package/src/node/routes/parser.ts +153 -127
  110. package/src/node/routes/sorter.ts +42 -42
  111. package/src/node/routes/types.ts +49 -49
  112. package/src/node/ssg/index.ts +114 -110
  113. package/src/node/ssg/meta.ts +34 -34
  114. package/src/node/ssg/options.ts +13 -13
  115. package/src/node/ssg/sitemap.ts +54 -54
  116. package/src/node/utils.ts +134 -134
  117. package/tsconfig.json +20 -20
  118. package/tsup.config.ts +22 -22
  119. package/dist/Playground-B2FA34BC.mjs +0 -6
  120. package/dist/chunk-WPT4MWTQ.mjs +0 -89
  121. package/src/client/theme/styles/home.css +0 -60
@@ -1,269 +1,236 @@
1
- /* ═══════════════════════════════════════════════════════════
2
- SIDEBAR
3
- ═══════════════════════════════════════════════════════════ */
4
- .boltdocs-sidebar {
5
- width: var(--ld-sidebar-width);
6
- flex-shrink: 0;
7
- background-color: var(--ld-sidebar-bg);
8
- backdrop-filter: blur(var(--ld-sidebar-blur));
9
- -webkit-backdrop-filter: blur(var(--ld-sidebar-blur));
10
- border-right: 1px solid var(--ld-border-subtle);
11
- padding: 1rem 0.6rem;
12
- overflow-y: auto;
13
- position: sticky;
14
- top: var(--ld-navbar-height);
15
- height: calc(100vh - var(--ld-navbar-height));
16
- scrollbar-width: thin;
17
- scrollbar-color: var(--ld-bg-mute) transparent;
18
- display: flex;
19
- flex-direction: column;
20
- transition:
21
- width 0.3s cubic-bezier(0.16, 1, 0.3, 1),
22
- padding 0.3s cubic-bezier(0.16, 1, 0.3, 1),
23
- opacity 0.2s ease;
24
- }
25
-
26
- .boltdocs-sidebar > nav {
27
- flex: 1;
28
- }
29
-
30
- /* ─── Collapsible Sidebar ────────────────────────────────── */
31
- .boltdocs-main-container.sidebar-collapsed .boltdocs-sidebar {
32
- width: 0;
33
- padding-left: 0;
34
- padding-right: 0;
35
- border-right-color: transparent;
36
- opacity: 0;
37
- pointer-events: none;
38
- overflow: hidden;
39
- }
40
-
41
- .sidebar-toggle-floating {
42
- position: fixed;
43
- bottom: 2rem;
44
- left: 2rem;
45
- width: 2.75rem;
46
- height: 2.75rem;
47
- border-radius: 50%;
48
- background-color: var(--ld-surface);
49
- border: 1px solid var(--ld-border-strong);
50
- color: var(--ld-text-muted);
51
- display: flex;
52
- align-items: center;
53
- justify-content: center;
54
- cursor: pointer;
55
- z-index: 100;
56
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
57
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
58
- opacity: 0;
59
- pointer-events: none;
60
- transform: translateY(20px) scale(0.9);
61
- }
62
-
63
- .sidebar-toggle-floating:hover {
64
- background-color: var(--ld-bg-soft);
65
- color: var(--ld-text-main);
66
- transform: translateY(0px) scale(1.05);
67
- border-color: var(--ld-color-primary);
68
- }
69
-
70
- .sidebar-toggle-floating:active {
71
- transform: translateY(0px) scale(0.95);
72
- }
73
-
74
- .boltdocs-main-container.sidebar-collapsed .sidebar-toggle-floating {
75
- opacity: 1;
76
- pointer-events: auto;
77
- transform: translateY(0) scale(1);
78
- }
79
-
80
- .sidebar-footer {
81
- margin-top: 2rem;
82
- padding-top: 1rem;
83
- border-top: 1px solid var(--ld-border-subtle);
84
- }
85
-
86
- .sidebar-collapse-btn {
87
- display: flex;
88
- align-items: center;
89
- gap: 0.5rem;
90
- width: 100%;
91
- padding: 0.5rem 0.75rem;
92
- background: none;
93
- border: none;
94
- border-radius: var(--ld-radius-md);
95
- color: var(--ld-text-muted);
96
- font-family: var(--ld-font-sans);
97
- font-size: 0.8125rem;
98
- font-weight: 500;
99
- cursor: pointer;
100
- transition: all 0.2s ease;
101
- }
102
-
103
- .sidebar-collapse-btn:hover {
104
- background-color: var(--ld-bg-soft);
105
- color: var(--ld-color-primary);
106
- }
107
-
108
- .boltdocs-sidebar::-webkit-scrollbar {
109
- width: 4px;
110
- }
111
-
112
- .boltdocs-sidebar::-webkit-scrollbar-track {
113
- background: transparent;
114
- }
115
-
116
- .boltdocs-sidebar::-webkit-scrollbar-thumb {
117
- background: var(--ld-bg-mute);
118
- border-radius: 4px;
119
- }
120
-
121
- .sidebar-list {
122
- list-style: none;
123
- padding: 0;
124
- margin: 0 0 0.5rem;
125
- }
126
-
127
- .sidebar-list li {
128
- margin-bottom: 1px;
129
- }
130
-
131
- .sidebar-link {
132
- display: flex;
133
- align-items: center;
134
- justify-content: space-between;
135
- padding: 0.45rem 0.75rem;
136
- color: var(--ld-text-muted);
137
- text-decoration: none;
138
- border-radius: var(--ld-radius-md);
139
- font-size: 0.875rem;
140
- font-weight: 500;
141
- transition: all 0.2s ease;
142
- margin: 0.15rem 0;
143
- }
144
-
145
- .sidebar-link-content {
146
- display: flex;
147
- align-items: center;
148
- justify-content: space-between;
149
- width: 100%;
150
- gap: 0.5rem;
151
- }
152
-
153
- .sidebar-link-content > span:first-child {
154
- flex: 1;
155
- word-wrap: break-word;
156
- }
157
-
158
- .sidebar-badge {
159
- font-size: 0.45rem;
160
- font-weight: 500;
161
- padding: 0.1rem 0.3rem;
162
- border-radius: 9999px;
163
- text-transform: uppercase;
164
- letter-spacing: 0.05em;
165
- white-space: nowrap;
166
- line-height: 1;
167
- display: inline-flex;
168
- align-items: center;
169
- flex-shrink: 0;
170
- }
171
-
172
- .sidebar-badge.badge-new {
173
- color: #38bdf8;
174
- background-color: rgba(56, 189, 248, 0.15);
175
- border: 1px solid rgba(56, 189, 248, 0.25);
176
- }
177
-
178
- .sidebar-badge.badge-experimental {
179
- color: #eab308; /* Yellow */
180
- background-color: rgba(234, 179, 8, 0.15);
181
- border: 1px solid rgba(234, 179, 8, 0.25);
182
- }
183
-
184
- .sidebar-badge.badge-updated {
185
- color: #a1a1aa; /* Grey / Zinc 400 */
186
- background-color: rgba(161, 161, 170, 0.15);
187
- border: 1px solid rgba(161, 161, 170, 0.25);
188
- }
189
-
190
- .sidebar-badge.badge-default {
191
- color: var(--ld-text-muted);
192
- background-color: var(--ld-bg-mute);
193
- border: 1px solid var(--ld-border-subtle);
194
- }
195
-
196
- .sidebar-link:hover {
197
- color: var(--ld-color-primary-hover);
198
- }
199
-
200
- .sidebar-link.active {
201
- color: var(--ld-color-primary);
202
- font-weight: 600;
203
- }
204
-
205
- /* ─── Sidebar Groups ─────────────────────────────────────── */
206
- .sidebar-group {
207
- margin-top: 1.25rem;
208
- }
209
-
210
- .sidebar-group:first-child {
211
- margin-top: 0;
212
- }
213
-
214
- .sidebar-group-header {
215
- display: flex;
216
- align-items: center;
217
- justify-content: space-between;
218
- width: 100%;
219
- padding: 0.35rem 0.75rem;
220
- background: none;
221
- border: none;
222
- border-radius: var(--ld-radius-md);
223
- color: var(--ld-text-dim);
224
- font-family: var(--ld-font-sans);
225
- font-size: 0.6875rem;
226
- font-weight: 700;
227
- text-transform: uppercase;
228
- letter-spacing: 0.08em;
229
- cursor: pointer;
230
- transition:
231
- color 0.2s,
232
- background-color 0.2s;
233
- }
234
-
235
- .sidebar-group-header:hover {
236
- color: var(--ld-text-muted);
237
- background-color: rgba(255, 255, 255, 0.03);
238
- }
239
-
240
- .sidebar-group-header.active {
241
- color: var(--ld-color-primary);
242
- }
243
-
244
- .sidebar-group-chevron {
245
- display: inline-flex;
246
- align-items: center;
247
- transition: transform 0.25s ease;
248
- font-size: 0.75rem;
249
- line-height: 1;
250
- }
251
-
252
- .sidebar-group-chevron.open {
253
- transform: rotate(90deg);
254
- }
255
-
256
- .sidebar-group-list {
257
- list-style: none;
258
- padding: 0;
259
- margin: 0.35rem 0 0;
260
- overflow: hidden;
261
- }
262
-
263
- .sidebar-group-list li {
264
- margin-bottom: 1px;
265
- }
266
-
267
- .sidebar-link-nested {
268
- padding-left: 1.25rem;
269
- }
1
+ /* ═══════════════════════════════════════════════════════════
2
+ SIDEBAR
3
+ ═══════════════════════════════════════════════════════════ */
4
+ .boltdocs-sidebar {
5
+ width: var(--ld-sidebar-width);
6
+ flex-shrink: 0;
7
+ background-color: var(--ld-sidebar-bg);
8
+ backdrop-filter: blur(var(--ld-sidebar-blur));
9
+ -webkit-backdrop-filter: blur(var(--ld-sidebar-blur));
10
+ border-right: 1px solid var(--ld-border-subtle);
11
+ padding: 1rem 0.6rem;
12
+ overflow-y: auto;
13
+ position: sticky;
14
+ top: var(--ld-navbar-height);
15
+ height: calc(100vh - var(--ld-navbar-height));
16
+ scrollbar-width: thin;
17
+ scrollbar-color: var(--ld-bg-mute) transparent;
18
+ display: flex;
19
+ flex-direction: column;
20
+ transition:
21
+ width 0.3s cubic-bezier(0.16, 1, 0.3, 1),
22
+ padding 0.3s cubic-bezier(0.16, 1, 0.3, 1),
23
+ opacity 0.2s ease;
24
+ }
25
+
26
+ .boltdocs-sidebar > nav {
27
+ flex: 1;
28
+ }
29
+
30
+ /* ─── Collapsible Sidebar ────────────────────────────────── */
31
+ .boltdocs-main-container.sidebar-collapsed .boltdocs-sidebar {
32
+ width: 54px;
33
+ padding: 1rem 0;
34
+ border-right: 1px solid var(--ld-border-subtle);
35
+ opacity: 1;
36
+ pointer-events: auto;
37
+ overflow: hidden;
38
+ }
39
+
40
+ .sidebar-collapse {
41
+ width: 100%;
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: flex-end;
45
+ padding: 0 0.75rem 1rem;
46
+ transition: justify-content 0.3s ease;
47
+ }
48
+
49
+ .boltdocs-main-container.sidebar-collapsed .sidebar-collapse {
50
+ justify-content: center;
51
+ padding: 0 0 1rem;
52
+ }
53
+
54
+ .sidebar-collapse-btn {
55
+ color: var(--ld-text-muted);
56
+ border: none;
57
+ box-shadow: none;
58
+ background-color: transparent;
59
+ cursor: pointer;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ width: 32px;
64
+ height: 32px;
65
+ border-radius: var(--ld-radius-md);
66
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
67
+ }
68
+
69
+ .sidebar-collapse-btn:hover {
70
+ background-color: var(--ld-bg-mute);
71
+ color: var(--ld-text-main);
72
+ transform: scale(1.05);
73
+ }
74
+
75
+ .boltdocs-sidebar::-webkit-scrollbar {
76
+ width: 4px;
77
+ }
78
+
79
+ .boltdocs-sidebar::-webkit-scrollbar-track {
80
+ background: transparent;
81
+ }
82
+
83
+ .boltdocs-sidebar::-webkit-scrollbar-thumb {
84
+ background: var(--ld-bg-mute);
85
+ border-radius: 4px;
86
+ }
87
+
88
+ .sidebar-list {
89
+ list-style: none;
90
+ padding: 0;
91
+ margin: 0 0 0.5rem;
92
+ }
93
+
94
+ .sidebar-list li {
95
+ margin-bottom: 1px;
96
+ }
97
+
98
+ .sidebar-link {
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: space-between;
102
+ padding: 0.45rem 0.75rem;
103
+ color: var(--ld-text-muted);
104
+ text-decoration: none;
105
+ border-radius: var(--ld-radius-md);
106
+ font-size: 0.875rem;
107
+ font-weight: 500;
108
+ transition: all 0.2s ease;
109
+ margin: 0.15rem 0;
110
+ }
111
+
112
+ .sidebar-link-content {
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: space-between;
116
+ width: 100%;
117
+ gap: 0.5rem;
118
+ }
119
+
120
+ .sidebar-link-content > span:first-child {
121
+ flex: 1;
122
+ word-wrap: break-word;
123
+ }
124
+
125
+ .sidebar-badge {
126
+ font-size: 0.45rem;
127
+ font-weight: 500;
128
+ padding: 0.1rem 0.3rem;
129
+ border-radius: 9999px;
130
+ text-transform: uppercase;
131
+ letter-spacing: 0.05em;
132
+ white-space: nowrap;
133
+ line-height: 1;
134
+ display: inline-flex;
135
+ align-items: center;
136
+ flex-shrink: 0;
137
+ }
138
+
139
+ .sidebar-badge.badge-new {
140
+ color: #38bdf8;
141
+ background-color: rgba(56, 189, 248, 0.15);
142
+ border: 1px solid rgba(56, 189, 248, 0.25);
143
+ }
144
+
145
+ .sidebar-badge.badge-experimental {
146
+ color: #eab308; /* Yellow */
147
+ background-color: rgba(234, 179, 8, 0.15);
148
+ border: 1px solid rgba(234, 179, 8, 0.25);
149
+ }
150
+
151
+ .sidebar-badge.badge-updated {
152
+ color: #a1a1aa; /* Grey / Zinc 400 */
153
+ background-color: rgba(161, 161, 170, 0.15);
154
+ border: 1px solid rgba(161, 161, 170, 0.25);
155
+ }
156
+
157
+ .sidebar-badge.badge-default {
158
+ color: var(--ld-text-muted);
159
+ background-color: var(--ld-bg-mute);
160
+ border: 1px solid var(--ld-border-subtle);
161
+ }
162
+
163
+ .sidebar-link:hover {
164
+ color: var(--ld-color-primary-hover);
165
+ }
166
+
167
+ .sidebar-link.active {
168
+ color: var(--ld-color-primary);
169
+ font-weight: 600;
170
+ }
171
+
172
+ /* ─── Sidebar Groups ─────────────────────────────────────── */
173
+ .sidebar-group {
174
+ margin-top: 1.25rem;
175
+ }
176
+
177
+ .sidebar-group:first-child {
178
+ margin-top: 0;
179
+ }
180
+
181
+ .sidebar-group-header {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: space-between;
185
+ width: 100%;
186
+ padding: 0.35rem 0.75rem;
187
+ background: none;
188
+ border: none;
189
+ border-radius: var(--ld-radius-md);
190
+ color: var(--ld-text-dim);
191
+ font-family: var(--ld-font-sans);
192
+ font-size: 0.6875rem;
193
+ font-weight: 700;
194
+ text-transform: uppercase;
195
+ letter-spacing: 0.08em;
196
+ cursor: pointer;
197
+ transition:
198
+ color 0.2s,
199
+ background-color 0.2s;
200
+ }
201
+
202
+ .sidebar-group-header:hover {
203
+ color: var(--ld-text-muted);
204
+ background-color: rgba(255, 255, 255, 0.03);
205
+ }
206
+
207
+ .sidebar-group-header.active {
208
+ color: var(--ld-color-primary);
209
+ }
210
+
211
+ .sidebar-group-chevron {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ transition: transform 0.25s ease;
215
+ font-size: 0.75rem;
216
+ line-height: 1;
217
+ }
218
+
219
+ .sidebar-group-chevron.open {
220
+ transform: rotate(90deg);
221
+ }
222
+
223
+ .sidebar-group-list {
224
+ list-style: none;
225
+ padding: 0;
226
+ margin: 0.35rem 0 0;
227
+ overflow: hidden;
228
+ }
229
+
230
+ .sidebar-group-list li {
231
+ margin-bottom: 1px;
232
+ }
233
+
234
+ .sidebar-link-nested {
235
+ padding-left: 1.25rem;
236
+ }
@@ -1,69 +1,69 @@
1
- import React, { useEffect, useState } from "react";
2
- import { Sun, Moon } from "lucide-react";
3
-
4
- export function ThemeToggle() {
5
- const [theme, setTheme] = useState("dark");
6
- const [mounted, setMounted] = useState(false);
7
-
8
- useEffect(() => {
9
- setMounted(true);
10
- // On mount, read from localStorage or matchMedia
11
- const stored = localStorage.getItem("boltdocs-theme");
12
- if (stored === "light" || stored === "dark") {
13
- setTheme(stored);
14
- } else {
15
- const prefersDark = window.matchMedia(
16
- "(prefers-color-scheme: dark)",
17
- ).matches;
18
- setTheme(prefersDark ? "dark" : "light");
19
- }
20
-
21
- // Listen to system changes if no localStorage is set
22
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
23
- const handleChange = (e: MediaQueryListEvent) => {
24
- if (!localStorage.getItem("boltdocs-theme")) {
25
- setTheme(e.matches ? "dark" : "light");
26
- }
27
- };
28
- mediaQuery.addEventListener("change", handleChange);
29
- return () => mediaQuery.removeEventListener("change", handleChange);
30
- }, []);
31
-
32
- useEffect(() => {
33
- if (!mounted) return;
34
- const root = document.documentElement;
35
- if (theme === "light") {
36
- root.classList.add("theme-light");
37
- root.dataset.theme = "light";
38
- } else {
39
- root.classList.remove("theme-light");
40
- root.dataset.theme = "dark";
41
- }
42
- }, [theme, mounted]);
43
-
44
- const toggleTheme = () => {
45
- const newTheme = theme === "dark" ? "light" : "dark";
46
- setTheme(newTheme);
47
- localStorage.setItem("boltdocs-theme", newTheme);
48
- };
49
-
50
- // Prevent hydration mismatch by rendering a placeholder with same layout
51
- if (!mounted) {
52
- return (
53
- <button className="navbar-icon-btn" aria-label="Toggle theme" disabled>
54
- <span style={{ width: 20, height: 20, display: "inline-block" }}></span>
55
- </button>
56
- );
57
- }
58
-
59
- return (
60
- <button
61
- className="navbar-icon-btn"
62
- onClick={toggleTheme}
63
- aria-label="Toggle theme"
64
- title={`Switch to ${theme === "dark" ? "light" : "dark"} theme`}
65
- >
66
- {theme === "dark" ? <Sun size={20} /> : <Moon size={20} />}
67
- </button>
68
- );
69
- }
1
+ import React, { useEffect, useState } from "react";
2
+ import { Sun, Moon } from "lucide-react";
3
+
4
+ export function ThemeToggle() {
5
+ const [theme, setTheme] = useState("dark");
6
+ const [mounted, setMounted] = useState(false);
7
+
8
+ useEffect(() => {
9
+ setMounted(true);
10
+ // On mount, read from localStorage or matchMedia
11
+ const stored = localStorage.getItem("boltdocs-theme");
12
+ if (stored === "light" || stored === "dark") {
13
+ setTheme(stored);
14
+ } else {
15
+ const prefersDark = window.matchMedia(
16
+ "(prefers-color-scheme: dark)",
17
+ ).matches;
18
+ setTheme(prefersDark ? "dark" : "light");
19
+ }
20
+
21
+ // Listen to system changes if no localStorage is set
22
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
23
+ const handleChange = (e: MediaQueryListEvent) => {
24
+ if (!localStorage.getItem("boltdocs-theme")) {
25
+ setTheme(e.matches ? "dark" : "light");
26
+ }
27
+ };
28
+ mediaQuery.addEventListener("change", handleChange);
29
+ return () => mediaQuery.removeEventListener("change", handleChange);
30
+ }, []);
31
+
32
+ useEffect(() => {
33
+ if (!mounted) return;
34
+ const root = document.documentElement;
35
+ if (theme === "light") {
36
+ root.classList.add("theme-light");
37
+ root.dataset.theme = "light";
38
+ } else {
39
+ root.classList.remove("theme-light");
40
+ root.dataset.theme = "dark";
41
+ }
42
+ }, [theme, mounted]);
43
+
44
+ const toggleTheme = () => {
45
+ const newTheme = theme === "dark" ? "light" : "dark";
46
+ setTheme(newTheme);
47
+ localStorage.setItem("boltdocs-theme", newTheme);
48
+ };
49
+
50
+ // Prevent hydration mismatch by rendering a placeholder with same layout
51
+ if (!mounted) {
52
+ return (
53
+ <button className="navbar-icon-btn" aria-label="Toggle theme" disabled>
54
+ <span style={{ width: 20, height: 20, display: "inline-block" }}></span>
55
+ </button>
56
+ );
57
+ }
58
+
59
+ return (
60
+ <button
61
+ className="navbar-icon-btn"
62
+ onClick={toggleTheme}
63
+ aria-label="Toggle theme"
64
+ title={`Switch to ${theme === "dark" ? "light" : "dark"} theme`}
65
+ >
66
+ {theme === "dark" ? <Sun size={20} /> : <Moon size={20} />}
67
+ </button>
68
+ );
69
+ }
@@ -1 +1 @@
1
- export { ThemeToggle } from "./ThemeToggle";
1
+ export { ThemeToggle } from "./ThemeToggle";