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,283 @@
1
+ /* Page Layout */
2
+
3
+ /* Header */
4
+ .header {
5
+ position: fixed;
6
+ top: 0;
7
+ left: 0;
8
+ right: 0;
9
+ height: var(--header-height);
10
+ background-color: var(--color-bg);
11
+ backdrop-filter: blur(12px);
12
+ border-bottom: 1px solid var(--color-border);
13
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.02);
14
+ z-index: var(--z-header);
15
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
16
+ }
17
+
18
+ .dark .header {
19
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3);
20
+ }
21
+
22
+ .header.hide-on-scroll {
23
+ transform: translateY(-100%);
24
+ }
25
+
26
+ .header-content {
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: space-between;
30
+ height: 100%;
31
+ padding: var(--space-5) var(--space-6);
32
+ }
33
+
34
+ .header-left {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: var(--space-4);
38
+ }
39
+
40
+ .header-logo {
41
+ display: flex;
42
+ align-items: center;
43
+ text-decoration: none;
44
+ gap: var(--space-3);
45
+ }
46
+
47
+ .header-title {
48
+ font-size: 1.0625rem;
49
+ font-weight: var(--font-weight-semibold);
50
+ color: var(--color-text);
51
+ letter-spacing: -0.02em;
52
+ }
53
+
54
+ .header-logo:hover .header-title {
55
+ color: var(--color-primary);
56
+ }
57
+
58
+ .header-logo:hover {
59
+ text-decoration: none;
60
+ }
61
+
62
+ .header-logo:focus-visible {
63
+ outline: 2px solid var(--color-primary);
64
+ outline-offset: 4px;
65
+ border-radius: var(--radius-sm);
66
+ }
67
+
68
+ /* Secondary Header (Mobile Navigation Bar) */
69
+ .secondary-header {
70
+ display: none;
71
+ }
72
+
73
+ @media (max-width: 1024px) {
74
+ .secondary-header {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: space-between;
78
+ position: fixed;
79
+ top: var(--header-height);
80
+ left: 0;
81
+ right: 0;
82
+ height: 3rem;
83
+ background: var(--color-bg);
84
+ border-bottom: 1px solid var(--color-border);
85
+ padding: 0 var(--space-6);
86
+ z-index: var(--z-secondary-header);
87
+ transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1);
88
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.02);
89
+ }
90
+
91
+ .secondary-header.shift-up {
92
+ top: 0;
93
+ }
94
+
95
+ .secondary-header-menu {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: var(--space-2);
99
+ background: none;
100
+ border: none;
101
+ padding: var(--space-2);
102
+ font-size: var(--font-size-sm);
103
+ font-weight: var(--font-weight-medium);
104
+ color: var(--color-text);
105
+ cursor: pointer;
106
+ border-radius: var(--radius-md);
107
+ transition: background-color 0.2s ease;
108
+ font-family: var(--font-sans);
109
+ margin-left: calc(-1 * var(--space-2));
110
+ }
111
+
112
+ .secondary-header-menu:hover {
113
+ background-color: var(--color-bg-tertiary);
114
+ }
115
+
116
+ .secondary-header-menu:active {
117
+ background-color: var(--color-border);
118
+ }
119
+
120
+ .secondary-header-menu .icon {
121
+ flex-shrink: 0;
122
+ }
123
+ }
124
+
125
+ /* Main layout container */
126
+ .layout {
127
+ display: flex;
128
+ min-height: calc(100vh - var(--header-height));
129
+ padding-top: var(--header-height);
130
+ width: 100%;
131
+ max-width: 100vw;
132
+ overflow-x: hidden;
133
+ }
134
+
135
+ /* Sidebar */
136
+ .sidebar {
137
+ width: var(--sidebar-width);
138
+ height: calc(100vh - var(--header-height));
139
+ position: fixed;
140
+ top: var(--header-height);
141
+ left: 0;
142
+ background-color: var(--color-sidebar-bg);
143
+ border-right: 1px solid var(--color-border);
144
+ overflow-y: auto;
145
+ overflow-x: hidden;
146
+ overflow-anchor: none;
147
+ z-index: var(--z-sidebar);
148
+ display: flex;
149
+ flex-direction: column;
150
+ }
151
+
152
+ .sidebar > nav {
153
+ padding: var(--space-5) var(--space-5);
154
+ overscroll-behavior: contain;
155
+ }
156
+
157
+ /* Sidebar scrollbar styling */
158
+ .sidebar::-webkit-scrollbar {
159
+ width: 0.5rem;
160
+ }
161
+
162
+ .sidebar::-webkit-scrollbar-track {
163
+ background: transparent;
164
+ }
165
+
166
+ .sidebar::-webkit-scrollbar-thumb {
167
+ background: rgba(208, 215, 222, 0.5);
168
+ border-radius: 0.25rem;
169
+ }
170
+
171
+ .sidebar::-webkit-scrollbar-thumb:hover {
172
+ background: rgba(208, 215, 222, 0.7);
173
+ }
174
+
175
+ /* Main content area */
176
+ .layout-main {
177
+ flex: 1;
178
+ margin-left: var(--sidebar-width);
179
+ display: flex;
180
+ flex-direction: column;
181
+ min-width: 0;
182
+ }
183
+
184
+ /* Content wrapper */
185
+ main.content {
186
+ flex: 1;
187
+ max-width: var(--content-max-width);
188
+ width: 100%;
189
+ padding: var(--space-16) var(--space-10);
190
+ margin: 0 auto;
191
+ min-width: 0;
192
+ box-sizing: border-box;
193
+ }
194
+
195
+ /* Mobile Layout */
196
+ @media (max-width: 1024px) {
197
+ .header-content {
198
+ padding: var(--space-4) var(--space-6);
199
+ }
200
+
201
+ .layout {
202
+ padding-top: calc(var(--header-height) + 3rem);
203
+ }
204
+
205
+ .sidebar {
206
+ position: fixed;
207
+ top: 0;
208
+ left: 0;
209
+ bottom: 0;
210
+ right: auto;
211
+ width: 20rem;
212
+ max-width: 85vw;
213
+ height: 100vh;
214
+ transform: translateX(-100%);
215
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
216
+ z-index: var(--z-sidebar);
217
+ background-color: var(--color-sidebar-bg);
218
+ box-shadow: none;
219
+ }
220
+
221
+ .sidebar.is-open {
222
+ transform: translateX(0);
223
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
224
+ }
225
+
226
+ .layout-main {
227
+ margin-left: 0;
228
+ }
229
+
230
+ main.content {
231
+ padding: var(--space-6);
232
+ }
233
+ }
234
+
235
+ /* Mobile menu overlay */
236
+ @media (max-width: 1024px) {
237
+ .mobile-overlay {
238
+ position: fixed;
239
+ top: 0;
240
+ left: 0;
241
+ right: 0;
242
+ bottom: 0;
243
+ background-color: rgba(0, 0, 0, 0.5);
244
+ z-index: var(--z-overlay);
245
+ opacity: 0;
246
+ pointer-events: none;
247
+ transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1);
248
+ }
249
+
250
+ .mobile-overlay.is-visible {
251
+ opacity: 1;
252
+ pointer-events: auto;
253
+ }
254
+ }
255
+
256
+ /* Skip to main content link (accessibility) */
257
+ .skip-link {
258
+ position: absolute;
259
+ top: -40px;
260
+ left: 0;
261
+ background: var(--color-primary);
262
+ color: white;
263
+ padding: var(--space-2) var(--space-4);
264
+ text-decoration: none;
265
+ z-index: 100;
266
+ }
267
+
268
+ .skip-link:focus {
269
+ top: 0;
270
+ }
271
+
272
+ /* Container utilities */
273
+ .container {
274
+ max-width: var(--layout-max-width);
275
+ margin: 0 auto;
276
+ padding: 0 var(--space-6);
277
+ }
278
+
279
+ .container-narrow {
280
+ max-width: var(--content-max-width);
281
+ margin: 0 auto;
282
+ padding: 0 var(--space-6);
283
+ }
@@ -1,4 +1,10 @@
1
- body {
2
- margin: 0;
3
- font-family: system-ui, -apple-system, sans-serif;
4
- }
1
+ /* Docyard Default Theme */
2
+
3
+ /* Import order matters - each layer builds on the previous */
4
+ @import url('reset.css');
5
+ @import url('variables.css');
6
+ @import url('typography.css');
7
+ @import url('layout.css');
8
+ @import url('components.css');
9
+ @import url('markdown.css');
10
+ @import url('code.css');
@@ -0,0 +1,200 @@
1
+ /* Markdown/Prose Styles */
2
+
3
+ /* Content area for markdown-rendered content */
4
+ .content {
5
+ color: var(--color-text);
6
+ }
7
+
8
+ /* Inline code */
9
+ .content code:not(.highlight code) {
10
+ padding: 0.2em 0.4em;
11
+ background-color: var(--color-code-bg);
12
+ color: var(--color-primary);
13
+ border-radius: var(--radius-sm);
14
+ font-size: 0.9em;
15
+ font-weight: var(--font-weight-medium);
16
+ border: 1px solid var(--color-border);
17
+ }
18
+
19
+ /* Lists */
20
+ .content ul,
21
+ .content ol {
22
+ margin: var(--space-4) 0;
23
+ padding-left: var(--space-6);
24
+ }
25
+
26
+ .content li {
27
+ margin: var(--space-2) 0;
28
+ }
29
+
30
+ .content li>ul,
31
+ .content li>ol {
32
+ margin: var(--space-2) 0;
33
+ }
34
+
35
+ /* Task lists (GitHub Flavored Markdown) */
36
+ .content ul.task-list {
37
+ list-style: none;
38
+ padding-left: 0;
39
+ }
40
+
41
+ .content ul.task-list li {
42
+ display: flex;
43
+ align-items: flex-start;
44
+ gap: var(--space-2);
45
+ }
46
+
47
+ .content ul.task-list input[type="checkbox"] {
48
+ margin-top: 0.25em;
49
+ flex-shrink: 0;
50
+ }
51
+
52
+ /* Blockquotes */
53
+ .content blockquote {
54
+ margin: var(--space-6) 0;
55
+ padding: var(--space-4);
56
+ padding-left: var(--space-5);
57
+ border-left: 3px solid var(--color-primary);
58
+ background-color: var(--color-bg-secondary);
59
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
60
+ color: var(--color-text-secondary);
61
+ }
62
+
63
+ .content blockquote p {
64
+ margin: var(--space-2) 0;
65
+ }
66
+
67
+ /* Horizontal rule */
68
+ .content hr {
69
+ margin: var(--space-8) 0;
70
+ border: none;
71
+ border-top: 1px solid var(--color-border);
72
+ }
73
+
74
+ /* Tables */
75
+ .content table {
76
+ width: 100%;
77
+ margin: var(--space-6) 0;
78
+ border-collapse: collapse;
79
+ font-size: var(--font-size-sm);
80
+ display: block;
81
+ overflow-x: auto;
82
+ border-radius: var(--radius-lg);
83
+ border: 1px solid var(--color-border);
84
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.03);
85
+ }
86
+
87
+ .content thead {
88
+ background-color: var(--color-bg-secondary);
89
+ }
90
+
91
+ .content th {
92
+ padding: var(--space-3) var(--space-4);
93
+ text-align: left;
94
+ font-weight: var(--font-weight-semibold);
95
+ border-bottom: 1px solid var(--color-border);
96
+ color: var(--color-text);
97
+ }
98
+
99
+ .content td {
100
+ padding: var(--space-3) var(--space-4);
101
+ border-bottom: 1px solid var(--color-border-secondary);
102
+ }
103
+
104
+ .content tr:last-child td {
105
+ border-bottom: none;
106
+ }
107
+
108
+ .content tbody tr:hover {
109
+ background-color: var(--color-bg-secondary);
110
+ }
111
+
112
+ /* Images */
113
+ .content img {
114
+ max-width: 100%;
115
+ height: auto;
116
+ border-radius: var(--radius-lg);
117
+ margin: var(--space-6) 0;
118
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
119
+ }
120
+
121
+ /* Links in content */
122
+ .content a {
123
+ color: var(--color-link);
124
+ text-decoration: underline;
125
+ text-decoration-color: var(--color-link);
126
+ text-decoration-thickness: 1px;
127
+ text-underline-offset: 2px;
128
+ transition: color var(--transition-fast);
129
+ }
130
+
131
+ .content a:hover {
132
+ color: var(--color-link-hover);
133
+ text-decoration-color: var(--color-link-hover);
134
+ }
135
+
136
+ /* Heading anchors */
137
+ .content h2[id],
138
+ .content h3[id],
139
+ .content h4[id],
140
+ .content h5[id],
141
+ .content h6[id] {
142
+ scroll-margin-top: var(--space-8);
143
+ }
144
+
145
+ /* Improve spacing between prose elements */
146
+ .content h2+h3,
147
+ .content h3+h4,
148
+ .content h4+h5 {
149
+ margin-top: var(--space-4);
150
+ }
151
+
152
+ .content>*:first-child {
153
+ margin-top: 0;
154
+ }
155
+
156
+ .content>*:last-child {
157
+ margin-bottom: 0;
158
+ }
159
+
160
+ /* Definition lists */
161
+ .content dl {
162
+ margin: var(--space-4) 0;
163
+ }
164
+
165
+ .content dt {
166
+ font-weight: var(--font-weight-semibold);
167
+ margin-top: var(--space-4);
168
+ }
169
+
170
+ .content dd {
171
+ margin-left: var(--space-6);
172
+ margin-top: var(--space-2);
173
+ }
174
+
175
+ /* Keyboard */
176
+ .content kbd {
177
+ display: inline-block;
178
+ padding: 0.125em 0.375em;
179
+ font-family: var(--font-mono);
180
+ font-size: 0.875em;
181
+ color: var(--color-text);
182
+ background-color: var(--color-bg-secondary);
183
+ border: 1px solid var(--color-border);
184
+ border-radius: var(--radius-sm);
185
+ box-shadow: 0 1px 0 var(--color-border);
186
+ }
187
+
188
+ /* Mark/Highlight */
189
+ .content mark {
190
+ background-color: var(--color-warning-bg);
191
+ color: var(--color-text);
192
+ padding: 0.125em 0.25em;
193
+ border-radius: var(--radius-sm);
194
+ }
195
+
196
+ /* Abbreviations */
197
+ .content abbr {
198
+ text-decoration: underline dotted;
199
+ cursor: help;
200
+ }
@@ -0,0 +1,63 @@
1
+ /* Modern CSS Reset */
2
+ /* Based on https://piccalil.li/blog/a-more-modern-css-reset/ */
3
+
4
+ *,
5
+ *::before,
6
+ *::after {
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ html {
16
+ -webkit-font-smoothing: antialiased;
17
+ -moz-osx-font-smoothing: grayscale;
18
+ overflow-x: hidden;
19
+ }
20
+
21
+ body {
22
+ min-height: 100vh;
23
+ line-height: 1.5;
24
+ background-color: var(--color-bg);
25
+ color: var(--color-text);
26
+ overflow-x: hidden;
27
+ }
28
+
29
+ img,
30
+ picture,
31
+ video,
32
+ canvas,
33
+ svg {
34
+ display: block;
35
+ max-width: 100%;
36
+ }
37
+
38
+ input,
39
+ button,
40
+ textarea,
41
+ select {
42
+ font: inherit;
43
+ }
44
+
45
+ p,
46
+ h1,
47
+ h2,
48
+ h3,
49
+ h4,
50
+ h5,
51
+ h6 {
52
+ overflow-wrap: break-word;
53
+ }
54
+
55
+ ul[role="list"],
56
+ ol[role="list"] {
57
+ list-style: none;
58
+ }
59
+
60
+ table {
61
+ border-collapse: collapse;
62
+ border-spacing: 0;
63
+ }
@@ -0,0 +1,97 @@
1
+ /* Base Typography */
2
+ body {
3
+ font-family: var(--font-sans);
4
+ font-size: var(--font-size-base);
5
+ line-height: var(--line-height-normal);
6
+ color: var(--color-text);
7
+ background-color: var(--color-bg);
8
+ -webkit-font-smoothing: antialiased;
9
+ -moz-osx-font-smoothing: grayscale;
10
+ }
11
+
12
+ /* Headings */
13
+ h1, h2, h3, h4, h5, h6 {
14
+ font-weight: var(--font-weight-semibold);
15
+ line-height: var(--line-height-tight);
16
+ color: var(--color-text);
17
+ }
18
+
19
+ h1 {
20
+ font-size: var(--font-size-4xl);
21
+ margin-bottom: var(--space-6);
22
+ }
23
+
24
+ h2 {
25
+ font-size: var(--font-size-3xl);
26
+ margin-top: var(--space-12);
27
+ margin-bottom: var(--space-4);
28
+ }
29
+
30
+ h3 {
31
+ font-size: var(--font-size-2xl);
32
+ margin-top: var(--space-10);
33
+ margin-bottom: var(--space-3);
34
+ }
35
+
36
+ h4 {
37
+ font-size: var(--font-size-xl);
38
+ margin-top: var(--space-8);
39
+ margin-bottom: var(--space-3);
40
+ }
41
+
42
+ h5 {
43
+ font-size: var(--font-size-lg);
44
+ margin-top: var(--space-6);
45
+ margin-bottom: var(--space-2);
46
+ }
47
+
48
+ h6 {
49
+ font-size: var(--font-size-base);
50
+ margin-top: var(--space-6);
51
+ margin-bottom: var(--space-2);
52
+ font-weight: var(--font-weight-semibold);
53
+ }
54
+
55
+ /* Paragraphs */
56
+ p {
57
+ margin-bottom: var(--space-4);
58
+ }
59
+
60
+ /* Links */
61
+ a {
62
+ color: var(--color-link);
63
+ text-decoration: none;
64
+ transition: color var(--transition-fast);
65
+ }
66
+
67
+ a:hover {
68
+ color: var(--color-link-hover);
69
+ text-decoration: underline;
70
+ }
71
+
72
+ a:focus-visible {
73
+ outline: 2px solid var(--color-primary);
74
+ outline-offset: 2px;
75
+ border-radius: var(--radius-sm);
76
+ }
77
+
78
+ /* Code */
79
+ code {
80
+ font-family: var(--font-mono);
81
+ font-size: 0.9em;
82
+ }
83
+
84
+ /* Small text */
85
+ small {
86
+ font-size: var(--font-size-sm);
87
+ color: var(--color-text-secondary);
88
+ }
89
+
90
+ /* Strong and emphasis */
91
+ strong, b {
92
+ font-weight: var(--font-weight-semibold);
93
+ }
94
+
95
+ em, i {
96
+ font-style: italic;
97
+ }