docyard 0.4.0 → 0.6.0

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +29 -3
  4. data/README.md +37 -12
  5. data/lib/docyard/build/static_generator.rb +1 -1
  6. data/lib/docyard/components/base_processor.rb +6 -0
  7. data/lib/docyard/components/code_block_diff_preprocessor.rb +104 -0
  8. data/lib/docyard/components/code_block_feature_extractor.rb +113 -0
  9. data/lib/docyard/components/code_block_focus_preprocessor.rb +77 -0
  10. data/lib/docyard/components/code_block_icon_detector.rb +40 -0
  11. data/lib/docyard/components/code_block_line_wrapper.rb +46 -0
  12. data/lib/docyard/components/code_block_options_preprocessor.rb +76 -0
  13. data/lib/docyard/components/code_block_patterns.rb +51 -0
  14. data/lib/docyard/components/code_block_processor.rb +135 -14
  15. data/lib/docyard/components/code_line_parser.rb +80 -0
  16. data/lib/docyard/components/code_snippet_import_preprocessor.rb +125 -0
  17. data/lib/docyard/components/heading_anchor_processor.rb +34 -0
  18. data/lib/docyard/components/registry.rb +4 -4
  19. data/lib/docyard/components/table_of_contents_processor.rb +64 -0
  20. data/lib/docyard/components/tabs_parser.rb +135 -4
  21. data/lib/docyard/components/tabs_range_finder.rb +42 -0
  22. data/lib/docyard/config/validator.rb +8 -0
  23. data/lib/docyard/config.rb +18 -0
  24. data/lib/docyard/icons/file_types.rb +0 -13
  25. data/lib/docyard/icons/phosphor.rb +2 -1
  26. data/lib/docyard/markdown.rb +18 -4
  27. data/lib/docyard/prev_next_builder.rb +159 -0
  28. data/lib/docyard/rack_application.rb +25 -3
  29. data/lib/docyard/renderer.rb +20 -8
  30. data/lib/docyard/templates/assets/css/code.css +12 -4
  31. data/lib/docyard/templates/assets/css/components/code-block.css +427 -24
  32. data/lib/docyard/templates/assets/css/components/heading-anchor.css +77 -0
  33. data/lib/docyard/templates/assets/css/components/navigation.css +12 -9
  34. data/lib/docyard/templates/assets/css/components/prev-next.css +114 -0
  35. data/lib/docyard/templates/assets/css/components/table-of-contents.css +269 -0
  36. data/lib/docyard/templates/assets/css/components/tabs.css +50 -44
  37. data/lib/docyard/templates/assets/css/layout.css +58 -1
  38. data/lib/docyard/templates/assets/css/variables.css +45 -0
  39. data/lib/docyard/templates/assets/js/components/heading-anchor.js +90 -0
  40. data/lib/docyard/templates/assets/js/components/navigation.js +6 -2
  41. data/lib/docyard/templates/assets/js/components/table-of-contents.js +301 -0
  42. data/lib/docyard/templates/layouts/default.html.erb +9 -1
  43. data/lib/docyard/templates/partials/_code_block.html.erb +50 -2
  44. data/lib/docyard/templates/partials/_heading_anchor.html.erb +1 -0
  45. data/lib/docyard/templates/partials/_prev_next.html.erb +23 -0
  46. data/lib/docyard/templates/partials/_table_of_contents.html.erb +45 -0
  47. data/lib/docyard/templates/partials/_table_of_contents_toggle.html.erb +8 -0
  48. data/lib/docyard/version.rb +1 -1
  49. metadata +23 -1
@@ -0,0 +1,269 @@
1
+ /* Table of Contents - Desktop & Mobile */
2
+
3
+ .docyard-toc {
4
+ width: var(--toc-width);
5
+ position: fixed;
6
+ top: var(--header-height);
7
+ right: 0;
8
+ height: calc(100vh - var(--header-height));
9
+ padding: var(--space-3) var(--space-6) var(--space-3) var(--space-8);
10
+ overflow-y: auto;
11
+ overflow-x: hidden;
12
+ border-left: 1px solid var(--color-border);
13
+ background-color: var(--color-bg);
14
+ }
15
+
16
+ /* TOC Header */
17
+ .docyard-toc__header {
18
+ margin-bottom: var(--space-4);
19
+ }
20
+
21
+ .docyard-toc__title {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: 0.375rem;
25
+ font-size: 0.6875rem;
26
+ font-weight: var(--font-weight-semibold);
27
+ color: var(--color-text-tertiary);
28
+ text-transform: uppercase;
29
+ letter-spacing: 0.1em;
30
+ margin-bottom: 0;
31
+ }
32
+
33
+ .docyard-toc__title svg {
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ /* Secondary Header TOC Toggle (tablet & mobile) */
38
+ .secondary-header-toc-toggle {
39
+ display: none;
40
+ }
41
+
42
+ /* Tablet & Mobile TOC Toggle */
43
+ @media (max-width: 1280px) {
44
+ .secondary-header-toc-toggle {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: var(--space-2);
48
+ padding: var(--space-2) var(--space-3);
49
+ background: transparent;
50
+ border: none;
51
+ color: var(--color-text);
52
+ font-size: var(--font-size-sm);
53
+ font-weight: var(--font-weight-medium);
54
+ font-family: var(--font-sans);
55
+ cursor: pointer;
56
+ transition: color var(--transition-fast);
57
+ outline: none;
58
+ }
59
+
60
+ .secondary-header-toc-toggle:hover {
61
+ color: var(--color-text-secondary);
62
+ }
63
+
64
+ .secondary-header-toc-toggle:focus-visible {
65
+ outline: 2px solid var(--color-primary);
66
+ outline-offset: 2px;
67
+ border-radius: var(--radius-sm);
68
+ }
69
+
70
+ .secondary-header-toc-toggle svg {
71
+ transform: rotate(-90deg);
72
+ transition: transform var(--transition-base);
73
+ }
74
+
75
+ .secondary-header-toc-toggle[aria-expanded="true"] svg {
76
+ transform: rotate(0deg);
77
+ }
78
+ }
79
+
80
+ /* TOC Navigation */
81
+ .docyard-toc__nav {
82
+ display: block;
83
+ }
84
+
85
+ /* TOC List */
86
+ .docyard-toc__list {
87
+ list-style: none;
88
+ padding: 0;
89
+ margin: 0;
90
+ }
91
+
92
+ .docyard-toc__list .docyard-toc__list {
93
+ margin-top: var(--space-1);
94
+ margin-left: var(--space-4);
95
+ border-left: 1px solid var(--color-border);
96
+ padding-left: var(--space-3);
97
+ }
98
+
99
+ /* TOC Items */
100
+ .docyard-toc__item {
101
+ margin-bottom: 0.375rem;
102
+ }
103
+
104
+ /* TOC Links */
105
+ .docyard-toc__link {
106
+ display: block;
107
+ padding: 0.25rem var(--space-2);
108
+ color: var(--color-text-secondary);
109
+ text-decoration: none;
110
+ font-size: var(--font-size-sm);
111
+ line-height: var(--line-height-tight);
112
+ border-radius: var(--radius-sm);
113
+ transition: color var(--transition-fast);
114
+ font-weight: var(--font-weight-medium);
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ .docyard-toc__link:hover {
121
+ color: var(--color-text);
122
+ text-decoration: none;
123
+ }
124
+
125
+ .docyard-toc__link:focus-visible {
126
+ outline: 2px solid var(--color-primary);
127
+ outline-offset: 2px;
128
+ color: var(--color-text);
129
+ text-decoration: none;
130
+ }
131
+
132
+ /* Active link */
133
+ .docyard-toc__link.is-active {
134
+ color: var(--color-primary);
135
+ font-weight: var(--font-weight-semibold);
136
+ }
137
+
138
+ /* Level-specific styling */
139
+ .docyard-toc__item--level-2>.docyard-toc__link {
140
+ font-weight: var(--font-weight-medium);
141
+ }
142
+
143
+ .docyard-toc__item--level-3>.docyard-toc__link {
144
+ font-size: 0.8125rem;
145
+ }
146
+
147
+ .docyard-toc__item--level-4>.docyard-toc__link {
148
+ font-size: 0.8125rem;
149
+ color: var(--color-text-tertiary);
150
+ }
151
+
152
+ /* TOC Scrollbar */
153
+ .docyard-toc::-webkit-scrollbar {
154
+ width: 0.5rem;
155
+ }
156
+
157
+ .docyard-toc::-webkit-scrollbar-track {
158
+ background: transparent;
159
+ }
160
+
161
+ .docyard-toc::-webkit-scrollbar-thumb {
162
+ background: rgba(208, 215, 222, 0.5);
163
+ border-radius: 0.25rem;
164
+ }
165
+
166
+ .docyard-toc::-webkit-scrollbar-thumb:hover {
167
+ background: rgba(208, 215, 222, 0.7);
168
+ }
169
+
170
+ .dark .docyard-toc::-webkit-scrollbar-thumb {
171
+ background: rgba(110, 118, 129, 0.4);
172
+ }
173
+
174
+ .dark .docyard-toc::-webkit-scrollbar-thumb:hover {
175
+ background: rgba(110, 118, 129, 0.6);
176
+ }
177
+
178
+ /* Tablet & Mobile Layout - TOC in secondary header */
179
+ @media (max-width: 1280px) {
180
+ .docyard-toc {
181
+ display: block;
182
+ position: static;
183
+ width: 0;
184
+ height: 0;
185
+ padding: 0;
186
+ margin: 0;
187
+ border: none;
188
+ overflow: visible;
189
+ }
190
+
191
+ .docyard-toc__header {
192
+ display: none;
193
+ }
194
+
195
+ .docyard-toc__nav {
196
+ display: none;
197
+ position: fixed;
198
+ overflow-y: auto;
199
+ overscroll-behavior: contain;
200
+ padding: var(--space-5);
201
+ background: var(--color-bg);
202
+ border: 1px solid var(--color-border);
203
+ border-radius: var(--radius-lg);
204
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
205
+ 0 2px 4px -1px rgba(0, 0, 0, 0.06),
206
+ 0 0 0 1px rgba(0, 0, 0, 0.05);
207
+ z-index: 9999;
208
+ transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1),
209
+ opacity 0.2s ease,
210
+ transform 0.2s ease;
211
+ transform: translateY(-8px);
212
+ opacity: 0;
213
+ pointer-events: none;
214
+ }
215
+
216
+ .dark .docyard-toc__nav {
217
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3),
218
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2),
219
+ 0 0 0 1px rgba(255, 255, 255, 0.1);
220
+ }
221
+
222
+ .docyard-toc__nav.is-expanded {
223
+ display: block;
224
+ opacity: 1;
225
+ transform: translateY(0);
226
+ pointer-events: auto;
227
+ }
228
+ }
229
+
230
+ /* Tablet-specific: floating dropdown on right */
231
+ @media (max-width: 1280px) and (min-width: 1025px) {
232
+ .docyard-toc__nav {
233
+ top: calc(var(--header-height) + 3rem + var(--space-2));
234
+ right: var(--space-6);
235
+ width: 280px;
236
+ max-height: calc(100vh - var(--header-height) - 3rem - var(--space-8));
237
+ }
238
+ }
239
+
240
+ /* Mobile Layout (< 1024px) */
241
+ @media (max-width: 1024px) {
242
+ .docyard-toc__nav {
243
+ top: calc(var(--header-height) + 3rem - 2px);
244
+ left: var(--space-4);
245
+ right: var(--space-4);
246
+ max-height: calc(100vh - var(--header-height) - 3rem - var(--space-2));
247
+ }
248
+
249
+ .secondary-header.shift-up~.layout .docyard-toc__nav {
250
+ top: calc(3rem - 2px);
251
+ max-height: calc(100vh - 3rem - var(--space-2));
252
+ }
253
+
254
+ .docyard-toc__list .docyard-toc__list {
255
+ margin-left: var(--space-3);
256
+ padding-left: var(--space-2);
257
+ }
258
+ }
259
+
260
+ /* Reduced Motion */
261
+ @media (prefers-reduced-motion: reduce) {
262
+ .docyard-toc__link {
263
+ transition: none;
264
+ }
265
+
266
+ .secondary-header-toc-toggle svg {
267
+ transition: none;
268
+ }
269
+ }
@@ -1,4 +1,4 @@
1
- /* Tabs Component - Modern Design */
1
+ /* Tabs Component */
2
2
 
3
3
  .docyard-tabs {
4
4
  margin: var(--space-6) 0;
@@ -13,12 +13,16 @@
13
13
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
14
14
  }
15
15
 
16
- /* Tab List Wrapper - Contains scroll indicators */
16
+ /* Tab List Wrapper */
17
17
  .docyard-tabs__list-wrapper {
18
18
  position: relative;
19
19
  background: var(--color-bg-secondary);
20
20
  }
21
21
 
22
+ .dark .docyard-tabs__list-wrapper {
23
+ background: rgba(255, 255, 255, 0.03);
24
+ }
25
+
22
26
  /* Tab List Container */
23
27
  .docyard-tabs__list {
24
28
  display: flex;
@@ -36,7 +40,7 @@
36
40
  display: none;
37
41
  }
38
42
 
39
- /* Bottom border line - sits behind tabs */
43
+ /* Bottom border line */
40
44
  .docyard-tabs__list::after {
41
45
  content: '';
42
46
  position: absolute;
@@ -81,7 +85,7 @@
81
85
 
82
86
  .docyard-tabs__tab[aria-selected="true"] {
83
87
  color: var(--color-primary);
84
- background: var(--color-bg);
88
+ background: var(--color-code-bg);
85
89
  }
86
90
 
87
91
  /* Cover the border-bottom for active tab */
@@ -92,11 +96,11 @@
92
96
  left: 0;
93
97
  right: 0;
94
98
  height: 2px;
95
- background: var(--color-bg);
99
+ background: var(--color-code-bg);
96
100
  z-index: 2;
97
101
  }
98
102
 
99
- /* Focus indicator for keyboard navigation */
103
+ /* Focus state */
100
104
  .docyard-tabs__tab:focus-visible {
101
105
  outline: 2px solid var(--color-primary);
102
106
  outline-offset: 2px;
@@ -121,7 +125,7 @@
121
125
  height: 100%;
122
126
  }
123
127
 
124
- /* Scroll Indicators - Gradient overlays showing more content */
128
+ /* Scroll Indicators */
125
129
  .docyard-tabs__scroll-indicator {
126
130
  position: absolute;
127
131
  top: 0;
@@ -151,7 +155,7 @@
151
155
  opacity: 1;
152
156
  }
153
157
 
154
- /* Slide indicator - vibrant accent line */
158
+ /* Slide Indicator */
155
159
  .docyard-tabs__indicator {
156
160
  position: absolute;
157
161
  top: 0;
@@ -173,11 +177,7 @@
173
177
  background: var(--color-bg);
174
178
  }
175
179
 
176
- /* If panel has mixed content (not just code block), add padding to panel */
177
- .docyard-tabs__panel:not(:has(> [class*="language-"]:only-child)) {
178
- padding: var(--space-6);
179
- }
180
-
180
+ /* Panel base styles */
181
181
  .docyard-tabs__panel p {
182
182
  margin-bottom: 0;
183
183
  }
@@ -186,7 +186,7 @@
186
186
  display: block;
187
187
  }
188
188
 
189
- /* Ensure proper spacing for content inside panels */
189
+ /* Panel content spacing */
190
190
  .docyard-tabs__panel>*:first-child {
191
191
  margin-top: 0;
192
192
  }
@@ -195,43 +195,49 @@
195
195
  margin-bottom: 0;
196
196
  }
197
197
 
198
- /* Code blocks inside tabs - seamless integration */
199
- .docyard-tabs__panel .highlight,
200
- .docyard-tabs__panel pre {
198
+ /* Code blocks inside tabs */
199
+ .docyard-tabs__panel .docyard-code-block {
201
200
  margin: 0;
202
- border-radius: 0;
203
- border: none;
204
- padding: 0 !important;
205
- background-color: var(--color-bg) !important;
206
- box-shadow: none !important;
207
201
  }
208
202
 
209
- /* If panel has ONLY code block, add padding to the highlight element */
210
- .docyard-tabs__panel:has(> [class*="language-"]:only-child) pre {
211
- padding: var(--space-6) !important;
203
+ /* Reset code block styling in tabs */
204
+ .docyard-tabs__panel .docyard-code-block .highlight {
205
+ border: none;
206
+ border-radius: 0;
207
+ box-shadow: none;
208
+ background: transparent;
212
209
  }
213
210
 
214
- /* Apply secondary background when highlighter-rouge has siblings */
215
- .docyard-tabs__panel .highlighter-rouge:not(:only-child) .highlight pre code {
216
- padding: var(--space-4) !important;
217
- background-color: var(--color-bg-secondary) !important;
218
- border-radius: var(--radius-lg) !important;
219
- border: 1px solid var(--color-border) !important;
220
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.03) !important;
211
+ /* Panel styles with :has() support */
212
+ @supports selector(:has(*)) {
213
+ .docyard-tabs__panel:not(:has(> [class*="language-"]:only-child)) {
214
+ padding: var(--space-6);
215
+ }
216
+
217
+ .docyard-tabs__panel:has(> [class*="language-"]:only-child) {
218
+ background: var(--color-code-bg);
219
+ }
220
+
221
+ .docyard-tabs__panel:has(> [class*="language-"]:only-child) .highlight pre {
222
+ padding: var(--space-6);
223
+ background: transparent;
224
+ }
221
225
  }
222
226
 
223
- .docyard-tabs__panel pre code {
224
- padding: 0 !important;
225
- display: block;
226
- overflow-x: auto;
227
- background-color: var(--color-bg) !important;
228
- border-radius: 0;
229
- border: none !important;
230
- box-shadow: none !important;
227
+ /* Fallback for browsers without :has() */
228
+ @supports not selector(:has(*)) {
229
+ .docyard-tabs__panel {
230
+ padding: var(--space-6);
231
+ }
231
232
  }
232
233
 
233
- .docyard-tabs__panel pre code .w {
234
- background-color: var(--color-bg) !important;
234
+ /* Code blocks with siblings */
235
+ .docyard-tabs__panel .docyard-code-block:not(:only-child) .highlight {
236
+ border: 1px solid var(--color-border);
237
+ border-radius: var(--radius-lg);
238
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.03);
239
+ margin: var(--space-4) 0;
240
+ background: var(--color-code-bg);
235
241
  }
236
242
 
237
243
  /* Inline code inside tabs */
@@ -242,7 +248,7 @@
242
248
  font-size: 0.9em;
243
249
  }
244
250
 
245
- /* Mobile responsive - preserve design language */
251
+ /* Mobile responsive */
246
252
  @media (max-width: 640px) {
247
253
  .docyard-tabs {
248
254
  margin: var(--space-4) 0;
@@ -256,7 +262,7 @@
256
262
  .docyard-tabs__tab {
257
263
  padding: var(--space-3) var(--space-3);
258
264
  font-size: var(--font-size-sm);
259
- gap: var(--space-1-5);
265
+ gap: var(--space-2);
260
266
  }
261
267
 
262
268
  .docyard-tabs__icon .docyard-icon {
@@ -65,11 +65,45 @@
65
65
  border-radius: var(--radius-sm);
66
66
  }
67
67
 
68
- /* Secondary Header (Mobile Navigation Bar) */
68
+ /* Secondary Header (Tablet & Mobile Navigation Bar) */
69
69
  .secondary-header {
70
70
  display: none;
71
71
  }
72
72
 
73
+ /* Tablet: Show secondary header with TOC toggle only */
74
+ @media (max-width: 1280px) and (min-width: 1025px) {
75
+ .secondary-header {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: flex-end;
79
+ position: fixed;
80
+ top: var(--header-height);
81
+ left: var(--sidebar-width);
82
+ right: 0;
83
+ height: 3rem;
84
+ min-height: 3rem;
85
+ background: var(--color-bg);
86
+ border-bottom: 1px solid var(--color-border);
87
+ padding: 0 var(--space-6);
88
+ z-index: var(--z-secondary-header);
89
+ transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1), left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
90
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.02);
91
+ }
92
+
93
+ .secondary-header.shift-up {
94
+ top: 0;
95
+ }
96
+
97
+ .secondary-header-menu {
98
+ display: none;
99
+ }
100
+
101
+ .layout {
102
+ padding-top: calc(var(--header-height) + 3rem);
103
+ }
104
+ }
105
+
106
+ /* Mobile: Show menu button + TOC toggle */
73
107
  @media (max-width: 1024px) {
74
108
  .secondary-header {
75
109
  display: flex;
@@ -80,6 +114,7 @@
80
114
  left: 0;
81
115
  right: 0;
82
116
  height: 3rem;
117
+ min-height: 3rem;
83
118
  background: var(--color-bg);
84
119
  border-bottom: 1px solid var(--color-border);
85
120
  padding: 0 var(--space-6);
@@ -107,6 +142,7 @@
107
142
  transition: background-color 0.2s ease;
108
143
  font-family: var(--font-sans);
109
144
  margin-left: calc(-1 * var(--space-2));
145
+ outline: none;
110
146
  }
111
147
 
112
148
  .secondary-header-menu:hover {
@@ -117,6 +153,12 @@
117
153
  background-color: var(--color-border);
118
154
  }
119
155
 
156
+ .secondary-header-menu:focus-visible {
157
+ outline: 2px solid var(--color-primary);
158
+ outline-offset: 2px;
159
+ border-radius: var(--radius-sm);
160
+ }
161
+
120
162
  .secondary-header-menu .icon {
121
163
  flex-shrink: 0;
122
164
  }
@@ -176,11 +218,19 @@
176
218
  .layout-main {
177
219
  flex: 1;
178
220
  margin-left: var(--sidebar-width);
221
+ margin-right: var(--toc-width, 0);
179
222
  display: flex;
180
223
  flex-direction: column;
181
224
  min-width: 0;
182
225
  }
183
226
 
227
+ /* Tablet Layout (1024px - 1280px) */
228
+ @media (max-width: 1280px) and (min-width: 1025px) {
229
+ .layout-main {
230
+ margin-right: 0;
231
+ }
232
+ }
233
+
184
234
  /* Content wrapper */
185
235
  main.content {
186
236
  flex: 1;
@@ -200,6 +250,7 @@ main.content {
200
250
 
201
251
  .layout {
202
252
  padding-top: calc(var(--header-height) + 3rem);
253
+ flex-direction: column;
203
254
  }
204
255
 
205
256
  .sidebar {
@@ -223,8 +274,14 @@ main.content {
223
274
  box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
224
275
  }
225
276
 
277
+ .docyard-toc {
278
+ order: 1;
279
+ }
280
+
226
281
  .layout-main {
227
282
  margin-left: 0;
283
+ margin-right: 0;
284
+ order: 2;
228
285
  }
229
286
 
230
287
  main.content {
@@ -12,6 +12,7 @@
12
12
  --color-border: #e4e7eb;
13
13
  --color-border-secondary: #f3f4f6;
14
14
  --color-primary: #2563eb;
15
+ --color-primary-rgb: 37, 99, 235;
15
16
  --color-primary-hover: #1d4ed8;
16
17
  --color-primary-light: #eff6ff;
17
18
  --color-link: #0969da;
@@ -32,6 +33,27 @@
32
33
  --color-info: #0969da;
33
34
  --color-info-bg: #ddf4ff;
34
35
 
36
+ /* Diff colors - Light Theme */
37
+ --color-diff-add-bg: rgba(34, 197, 94, 0.15);
38
+ --color-diff-add-border: #22c55e;
39
+ --color-diff-add-gutter-bg: rgba(34, 197, 94, 0.2);
40
+ --color-diff-add-indicator: #166534;
41
+
42
+ --color-diff-remove-bg: rgba(239, 68, 68, 0.15);
43
+ --color-diff-remove-border: #ef4444;
44
+ --color-diff-remove-gutter-bg: rgba(239, 68, 68, 0.2);
45
+ --color-diff-remove-indicator: #991b1b;
46
+
47
+ /* Code error/warning colors - Light Theme */
48
+ --color-code-error-bg: rgba(239, 68, 68, 0.15);
49
+ --color-code-error-border: #ef4444;
50
+ --color-code-error-gutter-bg: rgba(239, 68, 68, 0.2);
51
+ --color-code-error-indicator: #991b1b;
52
+ --color-code-warning-bg: rgba(245, 158, 11, 0.15);
53
+ --color-code-warning-border: #f59e0b;
54
+ --color-code-warning-gutter-bg: rgba(245, 158, 11, 0.2);
55
+ --color-code-warning-indicator: #78350f;
56
+
35
57
  /* Callout colors - shadcn inspired */
36
58
  --callout-note: #0ea5e9;
37
59
  --callout-note-text: #0c4a6e;
@@ -98,6 +120,7 @@
98
120
 
99
121
  /* Layout */
100
122
  --sidebar-width: 288px;
123
+ --toc-width: 280px;
101
124
  --header-height: 64px;
102
125
  --content-max-width: 800px;
103
126
  --layout-max-width: 1440px;
@@ -142,6 +165,7 @@
142
165
  --color-border: #30363d;
143
166
  --color-border-secondary: #21262d;
144
167
  --color-primary: #3b82f6;
168
+ --color-primary-rgb: 59, 130, 246;
145
169
  --color-primary-hover: #60a5fa;
146
170
  --color-primary-light: #1e3a8a;
147
171
  --color-link: #58a6ff;
@@ -162,6 +186,27 @@
162
186
  --color-info: #58a6ff;
163
187
  --color-info-bg: #1e3a5f;
164
188
 
189
+ /* Diff colors - Dark Theme */
190
+ --color-diff-add-bg: rgba(34, 197, 94, 0.1);
191
+ --color-diff-add-border: #22c55e;
192
+ --color-diff-add-gutter-bg: rgba(34, 197, 94, 0.15);
193
+ --color-diff-add-indicator: #4ade80;
194
+
195
+ --color-diff-remove-bg: rgba(239, 68, 68, 0.1);
196
+ --color-diff-remove-border: #ef4444;
197
+ --color-diff-remove-gutter-bg: rgba(239, 68, 68, 0.15);
198
+ --color-diff-remove-indicator: #f87171;
199
+
200
+ /* Code error/warning colors - Dark Theme */
201
+ --color-code-error-bg: rgba(239, 68, 68, 0.1);
202
+ --color-code-error-border: #ef4444;
203
+ --color-code-error-gutter-bg: rgba(239, 68, 68, 0.15);
204
+ --color-code-error-indicator: #f87171;
205
+ --color-code-warning-bg: rgba(245, 158, 11, 0.1);
206
+ --color-code-warning-border: #f59e0b;
207
+ --color-code-warning-gutter-bg: rgba(245, 158, 11, 0.15);
208
+ --color-code-warning-indicator: #fbbf24;
209
+
165
210
  /* Callout colors - Dark mode shadcn inspired */
166
211
  --callout-note: #38bdf8;
167
212
  --callout-note-text: #7dd3fc;