codealmanac 0.1.0.dev0__py3-none-any.whl

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 (192) hide show
  1. codealmanac/__init__.py +13 -0
  2. codealmanac/app.py +175 -0
  3. codealmanac/cli/__init__.py +1 -0
  4. codealmanac/cli/dispatch/__init__.py +0 -0
  5. codealmanac/cli/dispatch/admin.py +124 -0
  6. codealmanac/cli/dispatch/config.py +50 -0
  7. codealmanac/cli/dispatch/root.py +328 -0
  8. codealmanac/cli/main.py +28 -0
  9. codealmanac/cli/parser/__init__.py +0 -0
  10. codealmanac/cli/parser/admin.py +81 -0
  11. codealmanac/cli/parser/lifecycle.py +57 -0
  12. codealmanac/cli/parser/root.py +19 -0
  13. codealmanac/cli/parser/wiki.py +87 -0
  14. codealmanac/cli/render/__init__.py +0 -0
  15. codealmanac/cli/render/admin.py +191 -0
  16. codealmanac/cli/render/root.py +290 -0
  17. codealmanac/core/__init__.py +1 -0
  18. codealmanac/core/errors.py +45 -0
  19. codealmanac/core/models.py +14 -0
  20. codealmanac/core/paths.py +25 -0
  21. codealmanac/core/slug.py +7 -0
  22. codealmanac/core/text.py +5 -0
  23. codealmanac/database/__init__.py +15 -0
  24. codealmanac/database/sqlite.py +54 -0
  25. codealmanac/integrations/__init__.py +1 -0
  26. codealmanac/integrations/automation/__init__.py +3 -0
  27. codealmanac/integrations/automation/scheduler/__init__.py +5 -0
  28. codealmanac/integrations/automation/scheduler/launchd.py +163 -0
  29. codealmanac/integrations/command.py +56 -0
  30. codealmanac/integrations/harnesses/__init__.py +7 -0
  31. codealmanac/integrations/harnesses/claude/__init__.py +1 -0
  32. codealmanac/integrations/harnesses/claude/adapter.py +217 -0
  33. codealmanac/integrations/harnesses/codex/__init__.py +3 -0
  34. codealmanac/integrations/harnesses/codex/adapter.py +221 -0
  35. codealmanac/integrations/harnesses/git_status.py +49 -0
  36. codealmanac/integrations/sources/__init__.py +29 -0
  37. codealmanac/integrations/sources/filesystem/__init__.py +5 -0
  38. codealmanac/integrations/sources/filesystem/adapter.py +685 -0
  39. codealmanac/integrations/sources/filesystem/selection.py +209 -0
  40. codealmanac/integrations/sources/git/__init__.py +3 -0
  41. codealmanac/integrations/sources/git/adapter.py +132 -0
  42. codealmanac/integrations/sources/github/__init__.py +3 -0
  43. codealmanac/integrations/sources/github/adapter.py +413 -0
  44. codealmanac/integrations/sources/runtime.py +22 -0
  45. codealmanac/integrations/sources/transcripts/__init__.py +33 -0
  46. codealmanac/integrations/sources/transcripts/claude.py +61 -0
  47. codealmanac/integrations/sources/transcripts/codex.py +69 -0
  48. codealmanac/integrations/sources/transcripts/jsonl.py +84 -0
  49. codealmanac/integrations/sources/transcripts/runtime.py +387 -0
  50. codealmanac/integrations/sources/web/__init__.py +3 -0
  51. codealmanac/integrations/sources/web/adapter.py +303 -0
  52. codealmanac/integrations/updates/__init__.py +7 -0
  53. codealmanac/integrations/updates/package.py +85 -0
  54. codealmanac/integrations/workspaces/__init__.py +1 -0
  55. codealmanac/integrations/workspaces/git/__init__.py +3 -0
  56. codealmanac/integrations/workspaces/git/probe.py +128 -0
  57. codealmanac/manual/README.md +24 -0
  58. codealmanac/manual/__init__.py +19 -0
  59. codealmanac/manual/build.md +20 -0
  60. codealmanac/manual/evidence.md +23 -0
  61. codealmanac/manual/garden.md +20 -0
  62. codealmanac/manual/ingest.md +17 -0
  63. codealmanac/manual/library.py +84 -0
  64. codealmanac/manual/models.py +83 -0
  65. codealmanac/manual/pages.md +28 -0
  66. codealmanac/manual/requests.py +6 -0
  67. codealmanac/manual/sources.md +18 -0
  68. codealmanac/manual/style.md +19 -0
  69. codealmanac/prompts/__init__.py +5 -0
  70. codealmanac/prompts/base/notability.md +14 -0
  71. codealmanac/prompts/base/purpose.md +23 -0
  72. codealmanac/prompts/base/syntax.md +19 -0
  73. codealmanac/prompts/models.py +9 -0
  74. codealmanac/prompts/operations/garden.md +26 -0
  75. codealmanac/prompts/operations/ingest.md +18 -0
  76. codealmanac/prompts/renderer.py +24 -0
  77. codealmanac/prompts/requests.py +22 -0
  78. codealmanac/server/__init__.py +1 -0
  79. codealmanac/server/app.py +202 -0
  80. codealmanac/server/assets/__init__.py +1 -0
  81. codealmanac/server/assets/app.css +865 -0
  82. codealmanac/server/assets/app.js +3 -0
  83. codealmanac/server/assets/index.html +80 -0
  84. codealmanac/server/assets/viewer/api.js +30 -0
  85. codealmanac/server/assets/viewer/components.js +197 -0
  86. codealmanac/server/assets/viewer/main.js +126 -0
  87. codealmanac/server/assets/viewer/renderers.js +122 -0
  88. codealmanac/server/assets/viewer/routes.js +36 -0
  89. codealmanac/services/__init__.py +1 -0
  90. codealmanac/services/automation/__init__.py +3 -0
  91. codealmanac/services/automation/models.py +83 -0
  92. codealmanac/services/automation/ports.py +14 -0
  93. codealmanac/services/automation/requests.py +40 -0
  94. codealmanac/services/automation/service.py +294 -0
  95. codealmanac/services/config/__init__.py +17 -0
  96. codealmanac/services/config/models.py +61 -0
  97. codealmanac/services/config/requests.py +21 -0
  98. codealmanac/services/config/service.py +55 -0
  99. codealmanac/services/config/store.py +26 -0
  100. codealmanac/services/diagnostics/__init__.py +1 -0
  101. codealmanac/services/diagnostics/models.py +22 -0
  102. codealmanac/services/diagnostics/requests.py +8 -0
  103. codealmanac/services/diagnostics/service.py +283 -0
  104. codealmanac/services/harnesses/__init__.py +1 -0
  105. codealmanac/services/harnesses/models.py +104 -0
  106. codealmanac/services/harnesses/ports.py +18 -0
  107. codealmanac/services/harnesses/requests.py +19 -0
  108. codealmanac/services/harnesses/service.py +38 -0
  109. codealmanac/services/health/__init__.py +1 -0
  110. codealmanac/services/health/requests.py +8 -0
  111. codealmanac/services/health/service.py +20 -0
  112. codealmanac/services/index/__init__.py +1 -0
  113. codealmanac/services/index/models.py +135 -0
  114. codealmanac/services/index/requests.py +26 -0
  115. codealmanac/services/index/service.py +86 -0
  116. codealmanac/services/index/store.py +411 -0
  117. codealmanac/services/index/views.py +524 -0
  118. codealmanac/services/pages/__init__.py +1 -0
  119. codealmanac/services/pages/requests.py +17 -0
  120. codealmanac/services/pages/service.py +26 -0
  121. codealmanac/services/runs/__init__.py +1 -0
  122. codealmanac/services/runs/models.py +91 -0
  123. codealmanac/services/runs/requests.py +76 -0
  124. codealmanac/services/runs/service.py +86 -0
  125. codealmanac/services/runs/store.py +256 -0
  126. codealmanac/services/search/__init__.py +1 -0
  127. codealmanac/services/search/requests.py +23 -0
  128. codealmanac/services/search/service.py +31 -0
  129. codealmanac/services/sources/__init__.py +1 -0
  130. codealmanac/services/sources/models.py +126 -0
  131. codealmanac/services/sources/ports.py +30 -0
  132. codealmanac/services/sources/requests.py +76 -0
  133. codealmanac/services/sources/service.py +351 -0
  134. codealmanac/services/tagging/__init__.py +1 -0
  135. codealmanac/services/tagging/models.py +9 -0
  136. codealmanac/services/tagging/requests.py +35 -0
  137. codealmanac/services/tagging/service.py +43 -0
  138. codealmanac/services/topics/__init__.py +1 -0
  139. codealmanac/services/topics/models.py +36 -0
  140. codealmanac/services/topics/requests.py +115 -0
  141. codealmanac/services/topics/service.py +297 -0
  142. codealmanac/services/updates/__init__.py +4 -0
  143. codealmanac/services/updates/models.py +83 -0
  144. codealmanac/services/updates/ports.py +17 -0
  145. codealmanac/services/updates/requests.py +10 -0
  146. codealmanac/services/updates/service.py +113 -0
  147. codealmanac/services/viewer/__init__.py +1 -0
  148. codealmanac/services/viewer/models.py +80 -0
  149. codealmanac/services/viewer/renderer.py +89 -0
  150. codealmanac/services/viewer/requests.py +86 -0
  151. codealmanac/services/viewer/service.py +211 -0
  152. codealmanac/services/wiki/__init__.py +1 -0
  153. codealmanac/services/wiki/documents.py +83 -0
  154. codealmanac/services/wiki/frontmatter.py +94 -0
  155. codealmanac/services/wiki/frontmatter_rewrite.py +142 -0
  156. codealmanac/services/wiki/models.py +69 -0
  157. codealmanac/services/wiki/paths.py +42 -0
  158. codealmanac/services/wiki/service.py +57 -0
  159. codealmanac/services/wiki/templates.py +73 -0
  160. codealmanac/services/wiki/topics.py +266 -0
  161. codealmanac/services/wiki/wikilinks.py +58 -0
  162. codealmanac/services/workspaces/__init__.py +1 -0
  163. codealmanac/services/workspaces/models.py +124 -0
  164. codealmanac/services/workspaces/ports.py +9 -0
  165. codealmanac/services/workspaces/requests.py +82 -0
  166. codealmanac/services/workspaces/roots.py +74 -0
  167. codealmanac/services/workspaces/service.py +303 -0
  168. codealmanac/services/workspaces/store.py +127 -0
  169. codealmanac/workflows/__init__.py +1 -0
  170. codealmanac/workflows/build/__init__.py +1 -0
  171. codealmanac/workflows/build/models.py +8 -0
  172. codealmanac/workflows/build/service.py +45 -0
  173. codealmanac/workflows/garden/__init__.py +3 -0
  174. codealmanac/workflows/garden/models.py +30 -0
  175. codealmanac/workflows/garden/requests.py +22 -0
  176. codealmanac/workflows/garden/service.py +239 -0
  177. codealmanac/workflows/ingest/__init__.py +1 -0
  178. codealmanac/workflows/ingest/models.py +26 -0
  179. codealmanac/workflows/ingest/requests.py +39 -0
  180. codealmanac/workflows/ingest/service.py +302 -0
  181. codealmanac/workflows/lifecycle.py +197 -0
  182. codealmanac/workflows/sync/__init__.py +3 -0
  183. codealmanac/workflows/sync/models.py +157 -0
  184. codealmanac/workflows/sync/requests.py +63 -0
  185. codealmanac/workflows/sync/service.py +651 -0
  186. codealmanac/workflows/sync/store.py +51 -0
  187. codealmanac-0.1.0.dev0.dist-info/METADATA +248 -0
  188. codealmanac-0.1.0.dev0.dist-info/RECORD +192 -0
  189. codealmanac-0.1.0.dev0.dist-info/WHEEL +5 -0
  190. codealmanac-0.1.0.dev0.dist-info/entry_points.txt +2 -0
  191. codealmanac-0.1.0.dev0.dist-info/licenses/LICENSE.md +201 -0
  192. codealmanac-0.1.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,865 @@
1
+ /* Adapted from UseAlmanac's alpine dashboard/wiki visual system for the
2
+ local CodeAlmanac serve UI. The information architecture stays local-first:
3
+ sidebar wiki navigation, page graph context, search, topics, and file refs. */
4
+
5
+ :root {
6
+ color-scheme: light;
7
+ --bg: #f0eadb;
8
+ --paper: #fbf7ec;
9
+ --paper-edge: #d8ccb0;
10
+ --border: #cbbb93;
11
+ --text: #2a2e1c;
12
+ --ink: #2a2e1c;
13
+ --muted: #575a3b;
14
+ --faint: #8b855f;
15
+ --accent: #98761a;
16
+ --accent-hover: #7c6014;
17
+ --accent-bright: #c2a64e;
18
+ --cream: #efe7cd;
19
+ --moss: #6c7339;
20
+ --line: rgba(42, 46, 28, 0.14);
21
+ --hair: rgba(42, 46, 28, 0.085);
22
+ --danger: #a04b2e;
23
+ --rail: #f3edde;
24
+ --rail-edge: #ded2b5;
25
+ --surface: #faf7ef;
26
+ --dashboard-rail-width: 16.5rem;
27
+ --dashboard-content-max: 65rem;
28
+ --dashboard-panel-max: 47.5rem;
29
+ --dashboard-readable-max: 42.5rem;
30
+ --dashboard-gutter-sm: 1.25rem;
31
+ --dashboard-gutter-md: 1.75rem;
32
+ --serif: Georgia, "Times New Roman", serif;
33
+ --sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
34
+ --code: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
35
+ }
36
+
37
+ * {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ html {
42
+ margin: 0;
43
+ scroll-behavior: smooth;
44
+ }
45
+
46
+ body {
47
+ margin: 0;
48
+ background: var(--bg);
49
+ color: var(--text);
50
+ font-family: var(--sans);
51
+ -webkit-font-smoothing: antialiased;
52
+ -moz-osx-font-smoothing: grayscale;
53
+ }
54
+
55
+ a {
56
+ color: inherit;
57
+ text-decoration: none;
58
+ }
59
+
60
+ button,
61
+ input {
62
+ font: inherit;
63
+ }
64
+
65
+ button {
66
+ border: 0;
67
+ }
68
+
69
+ ::selection {
70
+ background: var(--accent-bright);
71
+ color: var(--ink);
72
+ }
73
+
74
+ .skip-link,
75
+ .sr-only {
76
+ position: absolute;
77
+ width: 1px;
78
+ height: 1px;
79
+ overflow: hidden;
80
+ clip: rect(0, 0, 0, 0);
81
+ white-space: nowrap;
82
+ }
83
+
84
+ .skip-link:focus {
85
+ z-index: 60;
86
+ width: auto;
87
+ height: auto;
88
+ clip: auto;
89
+ left: 12px;
90
+ top: 12px;
91
+ border-radius: 8px;
92
+ background: var(--ink);
93
+ color: var(--cream);
94
+ padding: 8px 12px;
95
+ }
96
+
97
+ .dashboard-shell {
98
+ min-height: 100dvh;
99
+ background: var(--surface);
100
+ color: var(--ink);
101
+ font-family: var(--sans);
102
+ }
103
+
104
+ .min-w-0 {
105
+ min-width: 0;
106
+ }
107
+
108
+ .dashboard-rail {
109
+ position: sticky;
110
+ top: 0;
111
+ z-index: 20;
112
+ display: flex;
113
+ flex-direction: column;
114
+ gap: 12px;
115
+ padding: 12px;
116
+ border-bottom: 1px solid var(--rail-edge);
117
+ background: rgba(243, 237, 222, 0.96);
118
+ box-shadow: 0 8px 24px rgba(42, 46, 28, 0.06);
119
+ backdrop-filter: blur(10px);
120
+ }
121
+
122
+ .dashboard-rail-top {
123
+ display: flex;
124
+ min-width: 0;
125
+ align-items: center;
126
+ gap: 8px;
127
+ }
128
+
129
+ .dashboard-rail-nav {
130
+ margin-inline: -4px;
131
+ overflow-x: auto;
132
+ padding-inline: 4px;
133
+ }
134
+
135
+ .dashboard-rail-user-desktop {
136
+ display: none;
137
+ }
138
+
139
+ .dashboard-main {
140
+ min-width: 0;
141
+ }
142
+
143
+ .dashboard-rail-picker {
144
+ width: 100%;
145
+ min-width: 0;
146
+ }
147
+
148
+ .dashboard-account-trigger {
149
+ display: flex;
150
+ width: 100%;
151
+ align-items: center;
152
+ gap: 10px;
153
+ border: 1px solid rgba(42, 46, 28, 0.08);
154
+ border-radius: 8px;
155
+ background: rgba(251, 247, 236, 0.72);
156
+ padding: 7px 8px;
157
+ color: var(--ink);
158
+ font-size: 14px;
159
+ font-weight: 650;
160
+ text-align: left;
161
+ transition: background 160ms ease, border-color 160ms ease;
162
+ }
163
+
164
+ .dashboard-account-trigger:hover {
165
+ background: rgba(42, 46, 28, 0.05);
166
+ border-color: rgba(42, 46, 28, 0.14);
167
+ }
168
+
169
+ .dashboard-account-trigger:focus-visible {
170
+ outline: 2px solid rgba(152, 118, 26, 0.35);
171
+ outline-offset: 2px;
172
+ }
173
+
174
+ .dashboard-account-text {
175
+ min-width: 0;
176
+ }
177
+
178
+ .dashboard-account-name,
179
+ .dashboard-account-subtitle {
180
+ display: block;
181
+ min-width: 0;
182
+ overflow: hidden;
183
+ text-overflow: ellipsis;
184
+ white-space: nowrap;
185
+ }
186
+
187
+ .dashboard-account-subtitle {
188
+ color: var(--faint);
189
+ font-size: 11px;
190
+ font-weight: 550;
191
+ }
192
+
193
+ .dashboard-account-caret {
194
+ display: inline-grid;
195
+ width: 18px;
196
+ height: 18px;
197
+ flex-shrink: 0;
198
+ margin-left: auto;
199
+ color: var(--muted);
200
+ font-size: 12px;
201
+ place-items: center;
202
+ }
203
+
204
+ .app-avatar {
205
+ display: inline-flex;
206
+ width: 30px;
207
+ height: 30px;
208
+ flex-shrink: 0;
209
+ overflow: hidden;
210
+ border-radius: 50%;
211
+ background: var(--ink);
212
+ }
213
+
214
+ .app-avatar--account {
215
+ width: 24px;
216
+ height: 24px;
217
+ border-radius: 7px;
218
+ }
219
+
220
+ .app-avatar-fallback {
221
+ display: flex;
222
+ width: 100%;
223
+ height: 100%;
224
+ align-items: center;
225
+ justify-content: center;
226
+ background: var(--ink);
227
+ color: var(--cream);
228
+ font-size: 10px;
229
+ font-weight: 750;
230
+ }
231
+
232
+ .dashboard-nav {
233
+ display: flex;
234
+ min-width: max-content;
235
+ gap: 4px;
236
+ }
237
+
238
+ .dashboard-nav-scope {
239
+ display: none;
240
+ margin: 2px 0 10px;
241
+ color: var(--faint);
242
+ font-size: 11px;
243
+ font-weight: 700;
244
+ text-transform: uppercase;
245
+ }
246
+
247
+ .dashboard-nav-item {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: 9px;
251
+ border-radius: 8px;
252
+ padding: 8px 10px;
253
+ color: var(--muted);
254
+ font-size: 14px;
255
+ font-weight: 550;
256
+ text-align: left;
257
+ transition: background 160ms ease, color 160ms ease;
258
+ }
259
+
260
+ .dashboard-nav-item:hover {
261
+ background: rgba(42, 46, 28, 0.05);
262
+ color: var(--text);
263
+ }
264
+
265
+ .dashboard-nav-item:focus-visible,
266
+ .wiki-rail-list a:focus-visible {
267
+ outline: 2px solid rgba(152, 118, 26, 0.35);
268
+ outline-offset: 2px;
269
+ }
270
+
271
+ .dashboard-nav-item.is-active {
272
+ background: rgba(152, 118, 26, 0.13);
273
+ color: var(--accent);
274
+ font-weight: 650;
275
+ box-shadow: inset 0 0 0 1px rgba(152, 118, 26, 0.08);
276
+ }
277
+
278
+ .nav-glyph {
279
+ display: inline-grid;
280
+ width: 16px;
281
+ height: 16px;
282
+ place-items: center;
283
+ color: var(--faint);
284
+ font-size: 11px;
285
+ font-weight: 800;
286
+ }
287
+
288
+ .dashboard-nav-item.is-active .nav-glyph {
289
+ color: var(--accent);
290
+ }
291
+
292
+ .wiki-rail-section {
293
+ margin-top: 18px;
294
+ }
295
+
296
+ .wiki-rail-section h2 {
297
+ margin: 0 0 8px;
298
+ color: var(--muted);
299
+ font-size: 11px;
300
+ font-weight: 700;
301
+ text-transform: uppercase;
302
+ }
303
+
304
+ .wiki-rail-list {
305
+ display: grid;
306
+ gap: 3px;
307
+ }
308
+
309
+ .wiki-rail-list a,
310
+ .wiki-rail-list span {
311
+ display: block;
312
+ min-width: 0;
313
+ overflow: hidden;
314
+ border-radius: 7px;
315
+ color: var(--muted);
316
+ font-size: 13px;
317
+ line-height: 1.35;
318
+ padding: 6px 8px;
319
+ text-overflow: ellipsis;
320
+ white-space: nowrap;
321
+ }
322
+
323
+ .wiki-rail-list a:hover,
324
+ .wiki-rail-list a.is-active {
325
+ background: rgba(42, 46, 28, 0.05);
326
+ color: var(--ink);
327
+ }
328
+
329
+ .wiki-rail-list a.is-active {
330
+ box-shadow: inset 2px 0 0 var(--accent);
331
+ font-weight: 650;
332
+ }
333
+
334
+ .local-viewer-note {
335
+ display: grid;
336
+ gap: 4px;
337
+ border-top: 1px solid var(--hair);
338
+ padding-top: 12px;
339
+ color: var(--faint);
340
+ font-size: 12px;
341
+ line-height: 1.45;
342
+ }
343
+
344
+ .local-viewer-note strong {
345
+ color: var(--ink);
346
+ font-size: 13px;
347
+ }
348
+
349
+ .dashboard-header {
350
+ border-bottom: 1px solid var(--hair);
351
+ background: rgba(250, 247, 239, 0.88);
352
+ backdrop-filter: blur(10px);
353
+ }
354
+
355
+ .dashboard-header-inner {
356
+ box-sizing: border-box;
357
+ display: flex;
358
+ width: 100%;
359
+ max-width: var(--dashboard-content-max);
360
+ flex-direction: column;
361
+ gap: 12px;
362
+ margin: 0 auto;
363
+ padding: 14px var(--dashboard-gutter-sm);
364
+ }
365
+
366
+ .dashboard-page-eyebrow {
367
+ margin: 0 0 4px;
368
+ color: var(--accent);
369
+ font-size: 12px;
370
+ font-weight: 650;
371
+ }
372
+
373
+ .dashboard-header-title,
374
+ .dashboard-page-title {
375
+ margin: 0;
376
+ color: var(--ink);
377
+ font-size: 28px;
378
+ font-weight: 650;
379
+ line-height: 1.15;
380
+ }
381
+
382
+ .dashboard-page-copy {
383
+ margin-top: 8px;
384
+ color: var(--faint);
385
+ font-size: 15px;
386
+ line-height: 1.6;
387
+ }
388
+
389
+ .dashboard-page-body {
390
+ width: 100%;
391
+ max-width: var(--dashboard-content-max);
392
+ margin: 0 auto;
393
+ padding: 30px var(--dashboard-gutter-sm) 48px;
394
+ }
395
+
396
+ .dashboard-page-body:focus {
397
+ outline: none;
398
+ }
399
+
400
+ .wiki-search-form {
401
+ display: grid;
402
+ grid-template-columns: minmax(0, 1fr) auto;
403
+ gap: 8px;
404
+ width: 100%;
405
+ max-width: 34rem;
406
+ }
407
+
408
+ .wiki-search-form input {
409
+ height: 38px;
410
+ min-width: 0;
411
+ border: 1px solid var(--line);
412
+ border-radius: 8px;
413
+ background: var(--paper);
414
+ padding: 0 10px;
415
+ color: var(--ink);
416
+ font-size: 13px;
417
+ outline: none;
418
+ }
419
+
420
+ .wiki-search-form input:focus {
421
+ border-color: var(--accent);
422
+ box-shadow: 0 0 0 2px rgba(152, 118, 26, 0.16);
423
+ }
424
+
425
+ .wiki-search-button {
426
+ height: 38px;
427
+ border-radius: 8px;
428
+ background: var(--ink);
429
+ color: var(--cream);
430
+ cursor: pointer;
431
+ padding: 0 14px;
432
+ }
433
+
434
+ .wiki-search-button:hover {
435
+ background: #1d2014;
436
+ }
437
+
438
+ .wiki-home-grid {
439
+ display: grid;
440
+ gap: 18px;
441
+ }
442
+
443
+ .wiki-stats {
444
+ display: grid;
445
+ gap: 8px;
446
+ grid-template-columns: repeat(3, minmax(0, 1fr));
447
+ max-width: var(--dashboard-panel-max);
448
+ }
449
+
450
+ .wiki-stat {
451
+ border: 1px solid var(--hair);
452
+ border-radius: 8px;
453
+ background: var(--paper);
454
+ padding: 14px;
455
+ }
456
+
457
+ .wiki-stat strong,
458
+ .wiki-stat span {
459
+ display: block;
460
+ }
461
+
462
+ .wiki-stat strong {
463
+ color: var(--ink);
464
+ font-size: 22px;
465
+ line-height: 1;
466
+ }
467
+
468
+ .wiki-stat span {
469
+ color: var(--faint);
470
+ font-size: 12px;
471
+ margin-top: 6px;
472
+ }
473
+
474
+ .wiki-page-list {
475
+ display: grid;
476
+ max-width: var(--dashboard-panel-max);
477
+ border-top: 1px solid var(--hair);
478
+ }
479
+
480
+ .wiki-page-row {
481
+ display: grid;
482
+ grid-template-columns: minmax(0, 1fr) minmax(180px, 280px);
483
+ gap: 18px;
484
+ min-height: 68px;
485
+ align-items: start;
486
+ border-bottom: 1px solid var(--hair);
487
+ padding: 13px 0;
488
+ }
489
+
490
+ .wiki-page-row:hover .wiki-page-row-title {
491
+ color: var(--accent);
492
+ }
493
+
494
+ .wiki-page-row-main,
495
+ .wiki-page-row-meta {
496
+ display: grid;
497
+ min-width: 0;
498
+ gap: 4px;
499
+ }
500
+
501
+ .wiki-page-row-title {
502
+ overflow: hidden;
503
+ color: var(--ink);
504
+ font-size: 14px;
505
+ font-weight: 680;
506
+ text-overflow: ellipsis;
507
+ white-space: nowrap;
508
+ }
509
+
510
+ .wiki-page-row-summary {
511
+ display: -webkit-box;
512
+ overflow: hidden;
513
+ color: var(--muted);
514
+ font-size: 12.5px;
515
+ line-height: 1.45;
516
+ -webkit-box-orient: vertical;
517
+ -webkit-line-clamp: 2;
518
+ }
519
+
520
+ .wiki-page-row-meta {
521
+ color: var(--faint);
522
+ font-family: var(--code);
523
+ font-size: 11px;
524
+ line-height: 1.4;
525
+ }
526
+
527
+ .wiki-page-row-meta span {
528
+ overflow: hidden;
529
+ text-overflow: ellipsis;
530
+ white-space: nowrap;
531
+ }
532
+
533
+ .wiki-detail-grid {
534
+ display: grid;
535
+ grid-template-columns: minmax(0, 1fr) minmax(220px, 280px);
536
+ gap: 28px;
537
+ align-items: start;
538
+ }
539
+
540
+ .wiki-page-card {
541
+ max-width: 820px;
542
+ }
543
+
544
+ .wiki-page-title-block {
545
+ padding-bottom: 18px;
546
+ }
547
+
548
+ .wiki-page-path {
549
+ overflow: hidden;
550
+ color: var(--faint);
551
+ font-family: var(--code);
552
+ font-size: 11px;
553
+ margin: 0;
554
+ text-overflow: ellipsis;
555
+ white-space: nowrap;
556
+ }
557
+
558
+ .wiki-page-title {
559
+ margin-top: 8px;
560
+ color: var(--ink);
561
+ font-size: 38px;
562
+ line-height: 1.08;
563
+ font-weight: 720;
564
+ letter-spacing: 0;
565
+ }
566
+
567
+ .wiki-page-summary {
568
+ margin-top: 10px;
569
+ max-width: 680px;
570
+ color: var(--muted);
571
+ font-size: 14px;
572
+ line-height: 1.65;
573
+ }
574
+
575
+ .wiki-page-facts {
576
+ display: flex;
577
+ flex-wrap: wrap;
578
+ gap: 7px;
579
+ margin-top: 12px;
580
+ color: var(--faint);
581
+ font-size: 12px;
582
+ font-weight: 650;
583
+ }
584
+
585
+ .wiki-page-facts a,
586
+ .wiki-page-facts span {
587
+ border: 1px solid var(--hair);
588
+ border-radius: 6px;
589
+ padding: 3px 7px;
590
+ }
591
+
592
+ .wiki-page-facts a {
593
+ color: var(--accent);
594
+ }
595
+
596
+ .wiki-markdown {
597
+ border-top: 1px solid var(--hair);
598
+ padding-top: 22px;
599
+ color: var(--text);
600
+ font-family: var(--serif);
601
+ font-size: 17px;
602
+ line-height: 1.75;
603
+ overflow-wrap: anywhere;
604
+ }
605
+
606
+ .wiki-markdown > * + * {
607
+ margin-top: 14px;
608
+ }
609
+
610
+ .wiki-markdown h1,
611
+ .wiki-markdown h2,
612
+ .wiki-markdown h3 {
613
+ color: var(--ink);
614
+ line-height: 1.2;
615
+ font-family: var(--sans);
616
+ font-weight: 700;
617
+ letter-spacing: 0;
618
+ }
619
+
620
+ .wiki-markdown h1 {
621
+ font-size: 26px;
622
+ }
623
+
624
+ .wiki-markdown h2 {
625
+ margin-top: 26px;
626
+ font-size: 20px;
627
+ }
628
+
629
+ .wiki-markdown h3 {
630
+ margin-top: 22px;
631
+ font-size: 16px;
632
+ }
633
+
634
+ .wiki-markdown a {
635
+ color: var(--accent);
636
+ font-weight: 600;
637
+ text-decoration: underline;
638
+ text-decoration-color: rgba(152, 118, 26, 0.28);
639
+ text-underline-offset: 3px;
640
+ }
641
+
642
+ .wiki-markdown code {
643
+ border-radius: 5px;
644
+ background: rgba(42, 46, 28, 0.07);
645
+ padding: 1px 4px;
646
+ font-family: var(--code);
647
+ font-size: 0.92em;
648
+ }
649
+
650
+ .wiki-markdown pre {
651
+ overflow-x: auto;
652
+ border: 1px solid var(--hair);
653
+ border-radius: 8px;
654
+ background: #282b1d;
655
+ padding: 14px;
656
+ color: var(--cream);
657
+ }
658
+
659
+ .wiki-markdown pre code {
660
+ background: transparent;
661
+ padding: 0;
662
+ overflow-wrap: normal;
663
+ }
664
+
665
+ .wiki-markdown ul,
666
+ .wiki-markdown ol {
667
+ padding-left: 1.4rem;
668
+ }
669
+
670
+ .wiki-markdown blockquote {
671
+ border-left: 3px solid rgba(152, 118, 26, 0.35);
672
+ padding-left: 14px;
673
+ color: var(--muted);
674
+ }
675
+
676
+ .wiki-markdown table {
677
+ display: block;
678
+ max-width: 100%;
679
+ overflow-x: auto;
680
+ border-collapse: collapse;
681
+ }
682
+
683
+ .wiki-markdown th,
684
+ .wiki-markdown td {
685
+ border: 1px solid var(--hair);
686
+ padding: 6px 8px;
687
+ text-align: left;
688
+ }
689
+
690
+ .wiki-side-panel {
691
+ display: grid;
692
+ gap: 18px;
693
+ padding-top: 4px;
694
+ }
695
+
696
+ .wiki-side-section {
697
+ border-top: 1px solid var(--hair);
698
+ padding-top: 12px;
699
+ }
700
+
701
+ .wiki-side-section h2 {
702
+ margin: 0 0 10px;
703
+ color: var(--muted);
704
+ font-size: 11px;
705
+ font-weight: 700;
706
+ text-transform: uppercase;
707
+ }
708
+
709
+ .wiki-link-list {
710
+ display: grid;
711
+ gap: 7px;
712
+ font-size: 12.5px;
713
+ }
714
+
715
+ .wiki-link-list a,
716
+ .wiki-link-list span {
717
+ min-width: 0;
718
+ overflow: hidden;
719
+ color: var(--ink);
720
+ text-overflow: ellipsis;
721
+ white-space: nowrap;
722
+ }
723
+
724
+ .wiki-link-list a:hover {
725
+ color: var(--accent);
726
+ }
727
+
728
+ .app-empty {
729
+ max-width: var(--dashboard-readable-max);
730
+ border: 1px solid var(--line);
731
+ border-radius: 8px;
732
+ background: var(--paper);
733
+ padding: 24px;
734
+ text-align: left;
735
+ }
736
+
737
+ .app-empty-title {
738
+ color: var(--ink);
739
+ font-size: 18px;
740
+ font-weight: 650;
741
+ }
742
+
743
+ .app-empty-body,
744
+ .error {
745
+ margin-top: 8px;
746
+ color: var(--faint);
747
+ font-size: 15px;
748
+ line-height: 1.6;
749
+ }
750
+
751
+ .error {
752
+ color: var(--danger);
753
+ }
754
+
755
+ @media (min-width: 640px) {
756
+ .dashboard-header-inner {
757
+ flex-direction: row;
758
+ align-items: center;
759
+ justify-content: space-between;
760
+ padding-inline: var(--dashboard-gutter-md);
761
+ }
762
+
763
+ .dashboard-page-body {
764
+ padding-inline: var(--dashboard-gutter-md);
765
+ }
766
+ }
767
+
768
+ @media (min-width: 768px) {
769
+ .dashboard-shell {
770
+ display: grid;
771
+ height: 100dvh;
772
+ grid-template-columns: var(--dashboard-rail-width) minmax(0, 1fr);
773
+ overflow: hidden;
774
+ }
775
+
776
+ .dashboard-main {
777
+ min-height: 0;
778
+ overflow-y: auto;
779
+ }
780
+
781
+ .dashboard-rail {
782
+ box-sizing: border-box;
783
+ height: 100%;
784
+ overflow-y: auto;
785
+ padding: 16px;
786
+ border-right: 1px solid var(--rail-edge);
787
+ border-bottom: 0;
788
+ box-shadow: none;
789
+ }
790
+
791
+ .dashboard-rail-nav {
792
+ margin-top: 4px;
793
+ margin-inline: 0;
794
+ overflow: visible;
795
+ padding-inline: 0;
796
+ }
797
+
798
+ .dashboard-nav-scope {
799
+ display: block;
800
+ }
801
+
802
+ .dashboard-nav {
803
+ min-width: 0;
804
+ flex-direction: column;
805
+ gap: 1px;
806
+ }
807
+
808
+ .dashboard-rail-user-desktop {
809
+ display: block;
810
+ margin-top: auto;
811
+ }
812
+
813
+ .dashboard-header {
814
+ position: sticky;
815
+ top: 0;
816
+ z-index: 5;
817
+ }
818
+ }
819
+
820
+ @media (max-width: 767px) {
821
+ .dashboard-rail {
822
+ padding-inline: 8px;
823
+ }
824
+
825
+ .dashboard-nav {
826
+ gap: 2px;
827
+ }
828
+
829
+ .dashboard-nav-item {
830
+ gap: 6px;
831
+ padding: 7px 8px;
832
+ font-size: 12px;
833
+ white-space: nowrap;
834
+ }
835
+
836
+ .dashboard-nav-scope,
837
+ .wiki-rail-section {
838
+ display: none;
839
+ }
840
+ }
841
+
842
+ @media (max-width: 639px) {
843
+ .wiki-search-form,
844
+ .wiki-detail-grid,
845
+ .wiki-page-row,
846
+ .wiki-stats {
847
+ grid-template-columns: 1fr;
848
+ }
849
+
850
+ .wiki-search-button {
851
+ width: 100%;
852
+ }
853
+
854
+ .wiki-page-row {
855
+ gap: 6px;
856
+ }
857
+
858
+ .wiki-page-title {
859
+ font-size: 30px;
860
+ }
861
+
862
+ .wiki-side-panel {
863
+ display: none;
864
+ }
865
+ }