docyard 0.1.0 → 0.3.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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +41 -1
  4. data/LICENSE.vscode-icons +42 -0
  5. data/README.md +57 -8
  6. data/lib/docyard/asset_handler.rb +33 -0
  7. data/lib/docyard/components/base_processor.rb +24 -0
  8. data/lib/docyard/components/callout_processor.rb +121 -0
  9. data/lib/docyard/components/code_block_processor.rb +55 -0
  10. data/lib/docyard/components/code_detector.rb +59 -0
  11. data/lib/docyard/components/icon_detector.rb +57 -0
  12. data/lib/docyard/components/icon_processor.rb +51 -0
  13. data/lib/docyard/components/registry.rb +34 -0
  14. data/lib/docyard/components/tabs_parser.rb +60 -0
  15. data/lib/docyard/components/tabs_processor.rb +44 -0
  16. data/lib/docyard/config/validator.rb +171 -0
  17. data/lib/docyard/config.rb +133 -0
  18. data/lib/docyard/constants.rb +28 -0
  19. data/lib/docyard/errors.rb +54 -0
  20. data/lib/docyard/file_watcher.rb +2 -2
  21. data/lib/docyard/icons/LICENSE.phosphor +21 -0
  22. data/lib/docyard/icons/file_types.rb +92 -0
  23. data/lib/docyard/icons/phosphor.rb +63 -0
  24. data/lib/docyard/icons.rb +40 -0
  25. data/lib/docyard/initializer.rb +27 -2
  26. data/lib/docyard/language_mapping.rb +52 -0
  27. data/lib/docyard/logging.rb +43 -0
  28. data/lib/docyard/markdown.rb +14 -3
  29. data/lib/docyard/rack_application.rb +100 -13
  30. data/lib/docyard/renderer.rb +40 -5
  31. data/lib/docyard/router.rb +13 -8
  32. data/lib/docyard/routing/resolution_result.rb +31 -0
  33. data/lib/docyard/server.rb +5 -2
  34. data/lib/docyard/sidebar/file_system_scanner.rb +77 -0
  35. data/lib/docyard/sidebar/renderer.rb +110 -0
  36. data/lib/docyard/sidebar/title_extractor.rb +25 -0
  37. data/lib/docyard/sidebar/tree_builder.rb +59 -0
  38. data/lib/docyard/sidebar_builder.rb +58 -0
  39. data/lib/docyard/templates/assets/css/code.css +362 -0
  40. data/lib/docyard/templates/assets/css/components/callout.css +169 -0
  41. data/lib/docyard/templates/assets/css/components/code-block.css +196 -0
  42. data/lib/docyard/templates/assets/css/components/icon.css +16 -0
  43. data/lib/docyard/templates/assets/css/components/logo.css +44 -0
  44. data/lib/docyard/templates/assets/css/components/navigation.css +258 -0
  45. data/lib/docyard/templates/assets/css/components/tabs.css +298 -0
  46. data/lib/docyard/templates/assets/css/components/theme-toggle.css +61 -0
  47. data/lib/docyard/templates/assets/css/layout.css +283 -0
  48. data/lib/docyard/templates/assets/css/main.css +10 -4
  49. data/lib/docyard/templates/assets/css/markdown.css +200 -0
  50. data/lib/docyard/templates/assets/css/reset.css +63 -0
  51. data/lib/docyard/templates/assets/css/typography.css +97 -0
  52. data/lib/docyard/templates/assets/css/variables.css +205 -0
  53. data/lib/docyard/templates/assets/favicon.svg +16 -0
  54. data/lib/docyard/templates/assets/js/components/code-block.js +162 -0
  55. data/lib/docyard/templates/assets/js/components/tabs.js +338 -0
  56. data/lib/docyard/templates/assets/js/theme.js +209 -1
  57. data/lib/docyard/templates/assets/logo-dark.svg +4 -0
  58. data/lib/docyard/templates/assets/logo.svg +12 -0
  59. data/lib/docyard/templates/config/docyard.yml.erb +20 -0
  60. data/lib/docyard/templates/layouts/default.html.erb +69 -19
  61. data/lib/docyard/templates/markdown/components/callouts.md.erb +204 -0
  62. data/lib/docyard/templates/markdown/components/icons.md.erb +125 -0
  63. data/lib/docyard/templates/markdown/components/tabs.md.erb +686 -0
  64. data/lib/docyard/templates/markdown/configuration.md.erb +202 -0
  65. data/lib/docyard/templates/markdown/core-concepts/file-structure.md.erb +61 -0
  66. data/lib/docyard/templates/markdown/core-concepts/markdown.md.erb +90 -0
  67. data/lib/docyard/templates/markdown/getting-started/installation.md.erb +43 -0
  68. data/lib/docyard/templates/markdown/getting-started/introduction.md.erb +30 -0
  69. data/lib/docyard/templates/markdown/getting-started/quick-start.md.erb +56 -0
  70. data/lib/docyard/templates/markdown/index.md.erb +78 -14
  71. data/lib/docyard/templates/partials/_callout.html.erb +11 -0
  72. data/lib/docyard/templates/partials/_code_block.html.erb +6 -0
  73. data/lib/docyard/templates/partials/_icon.html.erb +1 -0
  74. data/lib/docyard/templates/partials/_icon_file_extension.html.erb +1 -0
  75. data/lib/docyard/templates/partials/_icons.html.erb +11 -0
  76. data/lib/docyard/templates/partials/_nav_group.html.erb +7 -0
  77. data/lib/docyard/templates/partials/_nav_item.html.erb +3 -0
  78. data/lib/docyard/templates/partials/_nav_leaf.html.erb +1 -0
  79. data/lib/docyard/templates/partials/_nav_list.html.erb +3 -0
  80. data/lib/docyard/templates/partials/_nav_section.html.erb +6 -0
  81. data/lib/docyard/templates/partials/_sidebar.html.erb +6 -0
  82. data/lib/docyard/templates/partials/_sidebar_footer.html.erb +11 -0
  83. data/lib/docyard/templates/partials/_tabs.html.erb +40 -0
  84. data/lib/docyard/templates/partials/_theme_toggle.html.erb +13 -0
  85. data/lib/docyard/utils/path_resolver.rb +30 -0
  86. data/lib/docyard/utils/text_formatter.rb +22 -0
  87. data/lib/docyard/version.rb +1 -1
  88. data/lib/docyard.rb +16 -4
  89. metadata +71 -3
  90. data/lib/docyard/templates/assets/css/syntax.css +0 -116
  91. data/lib/docyard/templates/markdown/getting-started.md.erb +0 -40
@@ -0,0 +1,16 @@
1
+ /* Icon System */
2
+ .docyard-icon {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ vertical-align: middle;
7
+ width: 1em;
8
+ height: 1em;
9
+ line-height: 1;
10
+ }
11
+
12
+ .docyard-icon svg {
13
+ width: 100%;
14
+ height: 100%;
15
+ display: block;
16
+ }
@@ -0,0 +1,44 @@
1
+ /* Site Logo */
2
+ .site-logo-container {
3
+ display: flex;
4
+ align-items: center;
5
+ flex-shrink: 0;
6
+ position: relative;
7
+ margin-right: 0.1rem;
8
+ }
9
+
10
+ .site-logo {
11
+ height: 2rem;
12
+ width: auto;
13
+ display: block;
14
+ object-fit: contain;
15
+ }
16
+
17
+ .site-logo-light {
18
+ display: block;
19
+ }
20
+
21
+ .site-logo-dark {
22
+ display: none;
23
+ }
24
+
25
+ .dark .site-logo-light {
26
+ display: none;
27
+ }
28
+
29
+ .dark .site-logo-dark {
30
+ display: block;
31
+ }
32
+
33
+
34
+ @media (max-width: 1024px) {
35
+ .site-logo {
36
+ height: 1.75rem;
37
+ }
38
+ }
39
+
40
+ @media (max-width: 640px) {
41
+ .site-logo {
42
+ height: 1.5rem;
43
+ }
44
+ }
@@ -0,0 +1,258 @@
1
+ /* Navigation Components */
2
+
3
+ /* Sidebar navigation */
4
+ .sidebar nav {
5
+ flex: 1;
6
+ overflow-y: auto;
7
+ }
8
+
9
+ /* Section headers */
10
+ .nav-section {
11
+ margin-bottom: 0;
12
+ padding-bottom: var(--space-5);
13
+ }
14
+
15
+ .nav-section:last-child {
16
+ padding-bottom: 0;
17
+ }
18
+
19
+ .nav-section:first-child {
20
+ margin-top: 0;
21
+ }
22
+
23
+ .nav-section-title {
24
+ font-size: 0.6875rem;
25
+ font-weight: var(--font-weight-semibold);
26
+ color: var(--color-text-tertiary);
27
+ text-transform: uppercase;
28
+ letter-spacing: 0.1em;
29
+ padding: 0 var(--space-3);
30
+ margin-bottom: var(--space-3);
31
+ margin-top: 0;
32
+ pointer-events: none;
33
+ user-select: none;
34
+ }
35
+
36
+ .nav-section:not(:first-child) {
37
+ margin-top: var(--space-3);
38
+ padding-top: 0;
39
+ }
40
+
41
+ .nav-section:not(:first-child) .nav-section-title {
42
+ margin-top: 0;
43
+ }
44
+
45
+ .sidebar nav ul {
46
+ list-style: none;
47
+ padding: 0;
48
+ margin: 0;
49
+ }
50
+
51
+ .sidebar nav li {
52
+ margin: 0;
53
+ }
54
+
55
+ .sidebar nav a {
56
+ display: block;
57
+ padding: 0.5rem var(--space-3);
58
+ font-size: 0.875rem;
59
+ color: var(--color-text-secondary);
60
+ text-decoration: none;
61
+ border-radius: var(--radius-md);
62
+ transition: all var(--transition-fast);
63
+ line-height: 1.4;
64
+ font-weight: var(--font-weight-medium);
65
+ }
66
+
67
+ .sidebar nav a:hover {
68
+ color: var(--color-text);
69
+ text-decoration: none;
70
+ }
71
+
72
+ .sidebar nav a.active {
73
+ color: var(--color-primary);
74
+ font-weight: var(--font-weight-semibold);
75
+ }
76
+
77
+ /* Nested navigation */
78
+ .sidebar nav ul ul {
79
+ margin-left: var(--space-3);
80
+ margin-top: 0.125rem;
81
+ margin-bottom: 0.125rem;
82
+ padding-left: var(--space-4);
83
+ position: relative;
84
+ }
85
+
86
+ .sidebar nav ul ul::before {
87
+ content: '';
88
+ position: absolute;
89
+ left: 0;
90
+ top: 0;
91
+ bottom: 0;
92
+ width: 1px;
93
+ background-color: rgba(148, 163, 184, 0.24);
94
+ }
95
+
96
+ .sidebar nav ul ul li {
97
+ position: relative;
98
+ }
99
+
100
+ .sidebar nav ul ul li:has(> a.active)::before {
101
+ content: '';
102
+ position: absolute;
103
+ left: calc(-1 * var(--space-4));
104
+ top: 0;
105
+ bottom: 0;
106
+ width: 2px;
107
+ background-color: var(--color-primary);
108
+ z-index: 1;
109
+ }
110
+
111
+ .sidebar nav ul ul a {
112
+ font-size: 0.8125rem;
113
+ padding: 0.375rem var(--space-3);
114
+ color: var(--color-text-secondary);
115
+ line-height: 1.5;
116
+ font-weight: var(--font-weight-normal);
117
+ position: relative;
118
+ }
119
+
120
+ .sidebar nav ul ul a:hover {
121
+ color: var(--color-text);
122
+ background-color: transparent;
123
+ }
124
+
125
+ .sidebar nav ul ul a.active {
126
+ color: var(--color-primary);
127
+ background-color: transparent;
128
+ font-weight: var(--font-weight-semibold);
129
+ }
130
+
131
+ /* Top level nav items spacing */
132
+ .sidebar nav>ul>li {
133
+ margin-bottom: 0.125rem;
134
+ }
135
+
136
+ .sidebar nav ul li {
137
+ margin-bottom: 0;
138
+ }
139
+
140
+ /* Collapsible/Accordion items */
141
+ .nav-group-toggle {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ width: 100%;
146
+ padding: 0.5rem var(--space-3);
147
+ font-size: 0.875rem;
148
+ color: var(--color-text-secondary);
149
+ text-decoration: none;
150
+ border-radius: var(--radius-md);
151
+ transition: all var(--transition-fast);
152
+ line-height: 1.4;
153
+ font-weight: var(--font-weight-medium);
154
+ background: none;
155
+ border: none;
156
+ text-align: left;
157
+ cursor: pointer;
158
+ }
159
+
160
+ .nav-group-toggle:hover {
161
+ color: var(--color-text);
162
+ }
163
+
164
+ .nav-group-toggle:focus-visible {
165
+ outline: 0.125rem solid var(--color-primary);
166
+ outline-offset: 0.125rem;
167
+ }
168
+
169
+ .nav-group-icon {
170
+ width: 1rem;
171
+ height: 1rem;
172
+ color: var(--color-text-tertiary);
173
+ transition: transform var(--transition-fast);
174
+ flex-shrink: 0;
175
+ }
176
+
177
+ .nav-group-toggle[aria-expanded="true"] .nav-group-icon {
178
+ transform: rotate(90deg);
179
+ }
180
+
181
+ .nav-group-children {
182
+ overflow: hidden;
183
+ transition: max-height var(--transition-base);
184
+ }
185
+
186
+ .nav-group-children.collapsed {
187
+ max-height: 0;
188
+ }
189
+
190
+ /* Mobile menu toggle button */
191
+ .mobile-menu-toggle {
192
+ display: none;
193
+ background: transparent;
194
+ border: none;
195
+ padding: var(--space-2);
196
+ cursor: pointer;
197
+ width: 2.25rem;
198
+ height: 2.25rem;
199
+ align-items: center;
200
+ justify-content: center;
201
+ border-radius: var(--radius-md);
202
+ transition: background-color var(--transition-fast);
203
+ }
204
+
205
+ .mobile-menu-toggle:hover {
206
+ background: var(--color-bg-secondary);
207
+ }
208
+
209
+ @media (max-width: 768px) {
210
+ .mobile-menu-toggle {
211
+ display: flex;
212
+ }
213
+ }
214
+
215
+ /* Sidebar footer */
216
+ .sidebar-footer {
217
+ margin-top: auto;
218
+ padding: var(--space-3) var(--space-5) var(--space-5);
219
+ }
220
+
221
+ .sidebar-footer-link {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: var(--space-2);
225
+ text-decoration: none;
226
+ padding: var(--space-2);
227
+ border-radius: var(--radius-md);
228
+ transition: all var(--transition-fast);
229
+ }
230
+
231
+ .sidebar-footer-link:hover {
232
+ text-decoration: none;
233
+ }
234
+
235
+ .sidebar-footer-link:hover .external-icon {
236
+ opacity: 0.5;
237
+ }
238
+
239
+ .sidebar-footer-text {
240
+ flex: 1;
241
+ }
242
+
243
+ .sidebar-footer-title {
244
+ margin: 0;
245
+ font-size: 0.6875rem;
246
+ color: var(--color-text-tertiary);
247
+ font-weight: var(--font-weight-medium);
248
+ line-height: 1.4;
249
+ }
250
+
251
+ .external-icon {
252
+ width: 0.75rem;
253
+ height: 0.75rem;
254
+ color: var(--color-text-secondary);
255
+ opacity: 0;
256
+ transition: opacity var(--transition-fast);
257
+ flex-shrink: 0;
258
+ }
@@ -0,0 +1,298 @@
1
+ /* Tabs Component - Modern Design */
2
+
3
+ .docyard-tabs {
4
+ margin: var(--space-6) 0;
5
+ border-radius: var(--radius-lg);
6
+ overflow: hidden;
7
+ background: var(--color-bg);
8
+ border: 1px solid var(--color-border);
9
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
10
+ }
11
+
12
+ .dark .docyard-tabs {
13
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
14
+ }
15
+
16
+ /* Tab List Wrapper - Contains scroll indicators */
17
+ .docyard-tabs__list-wrapper {
18
+ position: relative;
19
+ background: var(--color-bg-secondary);
20
+ }
21
+
22
+ /* Tab List Container */
23
+ .docyard-tabs__list {
24
+ display: flex;
25
+ gap: var(--space-2);
26
+ padding: 0 var(--space-4);
27
+ background: transparent;
28
+ position: relative;
29
+ overflow-x: auto;
30
+ -webkit-overflow-scrolling: touch;
31
+ scrollbar-width: none;
32
+ margin: 0;
33
+ }
34
+
35
+ .docyard-tabs__list::-webkit-scrollbar {
36
+ display: none;
37
+ }
38
+
39
+ /* Bottom border line - sits behind tabs */
40
+ .docyard-tabs__list::after {
41
+ content: '';
42
+ position: absolute;
43
+ bottom: 0;
44
+ left: 0;
45
+ right: 0;
46
+ height: 2px;
47
+ background: var(--color-border);
48
+ z-index: 0;
49
+ }
50
+
51
+ /* Individual Tab Button */
52
+ .docyard-tabs__tab {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--space-2);
56
+ padding: var(--space-4) var(--space-4);
57
+ background: transparent;
58
+ border: none;
59
+ border-radius: 0;
60
+ font-size: var(--font-size-sm);
61
+ font-weight: var(--font-weight-semibold);
62
+ font-family: var(--font-sans);
63
+ color: var(--color-text-secondary);
64
+ cursor: pointer;
65
+ transition: all 0.2s ease;
66
+ position: relative;
67
+ white-space: nowrap;
68
+ flex-shrink: 0;
69
+ line-height: 1.5;
70
+ z-index: 1;
71
+ }
72
+
73
+ .docyard-tabs__tab:hover {
74
+ color: var(--color-primary);
75
+ background: rgba(0, 0, 0, 0.02);
76
+ }
77
+
78
+ .dark .docyard-tabs__tab:hover {
79
+ background: rgba(255, 255, 255, 0.04);
80
+ }
81
+
82
+ .docyard-tabs__tab[aria-selected="true"] {
83
+ color: var(--color-primary);
84
+ background: var(--color-bg);
85
+ }
86
+
87
+ /* Cover the border-bottom for active tab */
88
+ .docyard-tabs__tab[aria-selected="true"]::after {
89
+ content: '';
90
+ position: absolute;
91
+ bottom: 0;
92
+ left: 0;
93
+ right: 0;
94
+ height: 2px;
95
+ background: var(--color-bg);
96
+ z-index: 2;
97
+ }
98
+
99
+ /* Focus indicator for keyboard navigation */
100
+ .docyard-tabs__tab:focus-visible {
101
+ outline: 2px solid var(--color-primary);
102
+ outline-offset: 2px;
103
+ z-index: 1;
104
+ }
105
+
106
+ /* Tab Icon Container */
107
+ .docyard-tabs__icon {
108
+ display: inline-flex;
109
+ align-items: center;
110
+ flex-shrink: 0;
111
+ }
112
+
113
+ .docyard-tabs__icon .docyard-icon {
114
+ width: 1rem;
115
+ height: 1rem;
116
+ display: inline-flex;
117
+ }
118
+
119
+ .docyard-tabs__icon .docyard-icon svg {
120
+ width: 100%;
121
+ height: 100%;
122
+ }
123
+
124
+ /* Scroll Indicators - Gradient overlays showing more content */
125
+ .docyard-tabs__scroll-indicator {
126
+ position: absolute;
127
+ top: 0;
128
+ bottom: 0;
129
+ width: 3rem;
130
+ pointer-events: none;
131
+ z-index: 2;
132
+ opacity: 0;
133
+ transition: opacity var(--transition-base);
134
+ }
135
+
136
+ .docyard-tabs__scroll-indicator--left {
137
+ left: 0;
138
+ background: linear-gradient(to right,
139
+ var(--color-bg-secondary),
140
+ transparent);
141
+ }
142
+
143
+ .docyard-tabs__scroll-indicator--right {
144
+ right: 0;
145
+ background: linear-gradient(to left,
146
+ var(--color-bg-secondary),
147
+ transparent);
148
+ }
149
+
150
+ .docyard-tabs__scroll-indicator.is-visible {
151
+ opacity: 1;
152
+ }
153
+
154
+ /* Slide indicator - vibrant accent line */
155
+ .docyard-tabs__indicator {
156
+ position: absolute;
157
+ top: 0;
158
+ left: 0;
159
+ height: 2px;
160
+ background: var(--color-primary);
161
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),
162
+ width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
163
+ will-change: transform, width;
164
+ pointer-events: none;
165
+ z-index: 3;
166
+ }
167
+
168
+ /* Tab Panel Container */
169
+ .docyard-tabs__panel {
170
+ padding: 0;
171
+ display: none;
172
+ outline: none;
173
+ background: var(--color-bg);
174
+ }
175
+
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
+
181
+ .docyard-tabs__panel p {
182
+ margin-bottom: 0;
183
+ }
184
+
185
+ .docyard-tabs__panel[aria-hidden="false"] {
186
+ display: block;
187
+ }
188
+
189
+ /* Ensure proper spacing for content inside panels */
190
+ .docyard-tabs__panel>*:first-child {
191
+ margin-top: 0;
192
+ }
193
+
194
+ .docyard-tabs__panel>*:last-child {
195
+ margin-bottom: 0;
196
+ }
197
+
198
+ /* Code blocks inside tabs - seamless integration */
199
+ .docyard-tabs__panel .highlight,
200
+ .docyard-tabs__panel pre {
201
+ 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
+ }
208
+
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;
212
+ }
213
+
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;
221
+ }
222
+
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;
231
+ }
232
+
233
+ .docyard-tabs__panel pre code .w {
234
+ background-color: var(--color-bg) !important;
235
+ }
236
+
237
+ /* Inline code inside tabs */
238
+ .docyard-tabs__panel :not(pre)>code {
239
+ background-color: var(--color-code-bg);
240
+ padding: 0.125rem 0.375rem;
241
+ border-radius: var(--radius-sm);
242
+ font-size: 0.9em;
243
+ }
244
+
245
+ /* Mobile responsive - preserve design language */
246
+ @media (max-width: 640px) {
247
+ .docyard-tabs {
248
+ margin: var(--space-4) 0;
249
+ }
250
+
251
+ .docyard-tabs__list {
252
+ padding: 0 var(--space-3);
253
+ gap: var(--space-1);
254
+ }
255
+
256
+ .docyard-tabs__tab {
257
+ padding: var(--space-3) var(--space-3);
258
+ font-size: var(--font-size-sm);
259
+ gap: var(--space-1-5);
260
+ }
261
+
262
+ .docyard-tabs__icon .docyard-icon {
263
+ width: 0.875rem;
264
+ height: 0.875rem;
265
+ }
266
+
267
+ .docyard-tabs__panel {
268
+ padding: var(--space-4);
269
+ }
270
+
271
+ .docyard-tabs__panel pre code {
272
+ font-size: var(--font-size-sm);
273
+ }
274
+
275
+ .docyard-tabs__panel .highlighter-rouge:not(:only-child) .highlight pre code {
276
+ padding: var(--space-3) !important;
277
+ font-size: var(--font-size-sm);
278
+ }
279
+ }
280
+
281
+ /* Reduced motion support */
282
+ @media (prefers-reduced-motion: reduce) {
283
+ .docyard-tabs__tab {
284
+ transition: none;
285
+ }
286
+ }
287
+
288
+ /* High contrast mode support */
289
+ @media (prefers-contrast: high) {
290
+ .docyard-tabs {
291
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.2);
292
+ }
293
+
294
+ .docyard-tabs__tab[aria-selected="true"] {
295
+ outline: 2px solid var(--color-primary);
296
+ outline-offset: -2px;
297
+ }
298
+ }
@@ -0,0 +1,61 @@
1
+ /* Theme Toggle */
2
+ .theme-toggle {
3
+ padding: 0;
4
+ margin-left: var(--space-4);
5
+ background: none;
6
+ border: none;
7
+ cursor: pointer;
8
+ position: relative;
9
+ }
10
+
11
+ .theme-toggle-track {
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ position: relative;
16
+ width: 3.25rem;
17
+ height: 1.75rem;
18
+ padding: 0 0.375rem;
19
+ border-radius: 0.875rem;
20
+ background-color: var(--color-border);
21
+ border: 1px solid var(--color-border);
22
+ transition: background-color 0.25s ease;
23
+ }
24
+
25
+ .theme-toggle:hover .theme-toggle-track {
26
+ background-color: var(--color-border-secondary);
27
+ }
28
+
29
+ .theme-toggle-icon {
30
+ position: relative;
31
+ z-index: 1;
32
+ flex-shrink: 0;
33
+ }
34
+
35
+ .theme-toggle-sun-icon {
36
+ color: var(--color-warning);
37
+ }
38
+
39
+ .theme-toggle-moon-icon {
40
+ color: var(--color-text-tertiary);
41
+ }
42
+
43
+ .dark .theme-toggle-moon-icon {
44
+ color: var(--color-primary);
45
+ }
46
+
47
+ .theme-toggle-thumb {
48
+ position: absolute;
49
+ top: 0.125rem;
50
+ left: 0.125rem;
51
+ width: 1.375rem;
52
+ height: 1.375rem;
53
+ background-color: var(--color-bg);
54
+ border-radius: 50%;
55
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
56
+ transition: transform 0.25s ease;
57
+ }
58
+
59
+ .dark .theme-toggle-thumb {
60
+ transform: translateX(1.5rem);
61
+ }