@antoneeo/mkt-agentic-sdlc-skill 0.18.0 → 0.20.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.
- package/CHANGELOG.md +10 -0
- package/README.md +2 -0
- package/gemini-extension.json +1 -1
- package/package.json +6 -1
- package/skills/mkt-agentic-sdlc/SKILL.md +4 -3
- package/skills/mkt-agentic-sdlc/docs_site/app.js +1127 -0
- package/skills/mkt-agentic-sdlc/docs_site/index.html +17 -0
- package/skills/mkt-agentic-sdlc/docs_site/strings.js +323 -0
- package/skills/mkt-agentic-sdlc/docs_site/style.css +288 -0
- package/skills/mkt-agentic-sdlc/scripts/docs_site.py +1362 -0
- package/skills/mkt-agentic-sdlc/scripts/knowledge.py +20 -6
- package/skills/mkt-agentic-sdlc/scripts/mkt_check.py +9 -0
- package/skills/mkt-agentic-sdlc/scripts/sdlc_core.py +305 -0
- package/skills/mkt-agentic-sdlc/templates.md +12 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self' file:; style-src 'self' file:; img-src 'self' data:; connect-src 'none'; font-src 'none'; frame-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'">
|
|
7
|
+
<meta name="referrer" content="no-referrer">
|
|
8
|
+
<title></title>
|
|
9
|
+
<link rel="stylesheet" href="style.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app"></div>
|
|
13
|
+
<script src="strings.js"></script>
|
|
14
|
+
<script src="data/core.js"></script>
|
|
15
|
+
<script src="app.js"></script>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
// Every word the docs site shows. The page and the generator carry no wording of
|
|
2
|
+
// their own: the generator writes codes, the page looks them up here.
|
|
3
|
+
window.DOCS_SITE_STRINGS = {
|
|
4
|
+
site_name: "Project docs",
|
|
5
|
+
loading: "Loading…",
|
|
6
|
+
loading_documents: "Loading documents…",
|
|
7
|
+
loading_knowledge: "Loading what is known…",
|
|
8
|
+
incomplete: "This site's data is incomplete — run the generator again.",
|
|
9
|
+
not_found: "Not found — it may have changed since this site was generated.",
|
|
10
|
+
back_home: "Back to the home page",
|
|
11
|
+
stamp_git: "Generated {date} from commit {commit}",
|
|
12
|
+
stamp_changed_one: ", plus 1 changed file not yet committed",
|
|
13
|
+
stamp_changed_many: ", plus {n} changed files not yet committed",
|
|
14
|
+
stamp_no_git: "Generated {date} — not a git repository",
|
|
15
|
+
|
|
16
|
+
nav_home: "Home",
|
|
17
|
+
nav_chronology: "Chronology",
|
|
18
|
+
nav_work: "Open work",
|
|
19
|
+
nav_features: "Features",
|
|
20
|
+
nav_courses: "Courses",
|
|
21
|
+
nav_rules: "Rules",
|
|
22
|
+
nav_guides: "Guides",
|
|
23
|
+
nav_documents: "Documents",
|
|
24
|
+
nav_map: "Map",
|
|
25
|
+
nav_sources: "Source documents",
|
|
26
|
+
nav_search: "Search",
|
|
27
|
+
search_hint: "Ctrl+K",
|
|
28
|
+
|
|
29
|
+
home_project: "This project",
|
|
30
|
+
home_project_why: "What the project is, from its own reading guide and Vision.",
|
|
31
|
+
home_lately: "Lately",
|
|
32
|
+
home_lately_why: "The most recent dated events in the project's documents.",
|
|
33
|
+
home_open: "Open now",
|
|
34
|
+
home_open_why: "Work in progress, as each one declares it, with its next step.",
|
|
35
|
+
home_known: "What is known",
|
|
36
|
+
home_known_why: "The areas of the knowledge base and their topics.",
|
|
37
|
+
home_vision: "Vision",
|
|
38
|
+
home_vision_status: "Status: {status}",
|
|
39
|
+
home_vision_none: "This project has no Vision document yet.",
|
|
40
|
+
home_readme: "Read the reading guide",
|
|
41
|
+
home_manifest: "The list of the project's main documents",
|
|
42
|
+
home_router: "Which guide to read before which task",
|
|
43
|
+
home_register: "The register of open work",
|
|
44
|
+
home_rules: "The project's rules",
|
|
45
|
+
home_notes: "Project notes",
|
|
46
|
+
home_all_chronology: "The whole chronology",
|
|
47
|
+
home_all_work: "All open work",
|
|
48
|
+
home_map: "Open the map",
|
|
49
|
+
home_no_title: "This project's reading guide has no title.",
|
|
50
|
+
home_known_none: "No knowledge base yet: topics and facts appear here once the project records them.",
|
|
51
|
+
|
|
52
|
+
chronology_title: "Chronology",
|
|
53
|
+
chronology_why: "Dated events the project's documents record, most recent first. Not the history of commits.",
|
|
54
|
+
chronology_empty: "Nothing dated yet. Events appear here as the project's documents record them with a date.",
|
|
55
|
+
event_diary: "analysis diary",
|
|
56
|
+
event_request: "request record",
|
|
57
|
+
event_note: "note",
|
|
58
|
+
event_source: "source document received",
|
|
59
|
+
event_review: "review",
|
|
60
|
+
event_decision: "decision record",
|
|
61
|
+
event_project_note: "project note",
|
|
62
|
+
event_spike: "exploration outcome",
|
|
63
|
+
|
|
64
|
+
work_title: "Open work",
|
|
65
|
+
work_why: "Each piece of open work, as its own resume notes declare it. Nothing here is computed.",
|
|
66
|
+
work_empty: "No open work is declared. Each piece of work in progress appears here, with its next step, once it has resume notes.",
|
|
67
|
+
work_status: "Status",
|
|
68
|
+
work_level: "Size",
|
|
69
|
+
work_since: "Since",
|
|
70
|
+
work_updated: "Last updated",
|
|
71
|
+
work_branch: "Branch",
|
|
72
|
+
work_next: "Next step",
|
|
73
|
+
work_resume: "Read the resume notes",
|
|
74
|
+
work_notes: "Project notes",
|
|
75
|
+
work_notes_why: "Notes true for the whole project, as written.",
|
|
76
|
+
work_register: "Read the register of open work",
|
|
77
|
+
|
|
78
|
+
units_features: "Features",
|
|
79
|
+
units_courses: "Courses",
|
|
80
|
+
units_why: "One entry per analysis, as each declares itself, sorted by its id.",
|
|
81
|
+
units_empty: "No analyses yet. Each significant change gets one, and it appears here.",
|
|
82
|
+
units_columns: "Columns by status",
|
|
83
|
+
units_list: "Single list",
|
|
84
|
+
units_lens: "Kind of work",
|
|
85
|
+
units_lens_all: "All kinds",
|
|
86
|
+
units_id: "Id",
|
|
87
|
+
units_name: "Name",
|
|
88
|
+
units_dates: "Dates",
|
|
89
|
+
|
|
90
|
+
group_1: "blocked",
|
|
91
|
+
group_2: "planned",
|
|
92
|
+
group_3: "in progress",
|
|
93
|
+
group_4: "paused",
|
|
94
|
+
group_5: "completed",
|
|
95
|
+
group_6: "cancelled",
|
|
96
|
+
group_7: "archived",
|
|
97
|
+
group_8: "other status",
|
|
98
|
+
|
|
99
|
+
level_L1: "trivial",
|
|
100
|
+
level_L2: "small",
|
|
101
|
+
level_L3: "significant change",
|
|
102
|
+
level_Spike: "time-boxed exploration",
|
|
103
|
+
|
|
104
|
+
lens_code: "software",
|
|
105
|
+
lens_knowledge: "knowledge",
|
|
106
|
+
lens_marketing: "marketing",
|
|
107
|
+
lens_course: "course",
|
|
108
|
+
|
|
109
|
+
rules_title: "Rules",
|
|
110
|
+
rules_why: "What the project has decided: its Vision, its principles and its decisions.",
|
|
111
|
+
rules_vision: "Vision",
|
|
112
|
+
rules_decisions: "Decisions",
|
|
113
|
+
rules_decisions_why: "Why a structural choice was made, and what was rejected.",
|
|
114
|
+
rules_manifest: "The list of the project's main documents",
|
|
115
|
+
rules_empty: "Nothing yet. The Vision and the decision records appear here once written.",
|
|
116
|
+
rules_see_guides: "How work is done here: the guides",
|
|
117
|
+
rules_when: "Read when: {when}",
|
|
118
|
+
|
|
119
|
+
guides_title: "Guides",
|
|
120
|
+
guides_why: "How work is done in this project, and how its complex parts work. The agent reads the matching guide before the task it covers.",
|
|
121
|
+
guides_router: "Which guide to read before which task",
|
|
122
|
+
guides_router_why: "The map the agent consults before starting a piece of work.",
|
|
123
|
+
guides_operative: "How work is done",
|
|
124
|
+
guides_operative_why: "Instructions to follow for a kind of task, written from what the project's people indicated.",
|
|
125
|
+
guides_comprehension: "How it works",
|
|
126
|
+
guides_comprehension_why: "Maps of complex parts of the system, written from its code so the next session does not have to rebuild them.",
|
|
127
|
+
guides_empty: "No guides yet. A guide appears here when a way of working is written down, or when a complex part of the system is mapped.",
|
|
128
|
+
|
|
129
|
+
documents_title: "Documents",
|
|
130
|
+
documents_why: "The project's documents, by folder.",
|
|
131
|
+
documents_empty: "No documents yet.",
|
|
132
|
+
doc_about: "About this document",
|
|
133
|
+
|
|
134
|
+
chain_title: "How this change was worked through",
|
|
135
|
+
chain_step_vision: "Vision",
|
|
136
|
+
chain_step_vision_why: "Why: the benefit it serves",
|
|
137
|
+
chain_step_use_cases: "Use cases",
|
|
138
|
+
chain_step_use_cases_why: "Who needs what, and why",
|
|
139
|
+
chain_step_flows: "Flows and interfaces",
|
|
140
|
+
chain_step_flows_why: "What happens, and through which surfaces",
|
|
141
|
+
chain_step_risks: "Risks",
|
|
142
|
+
chain_step_risks_why: "What can go wrong, and how it is prevented",
|
|
143
|
+
chain_step_solution: "Solution study",
|
|
144
|
+
chain_step_solution_why: "What the system already has, and what changes",
|
|
145
|
+
chain_step_design: "Design and tests",
|
|
146
|
+
chain_step_design_why: "The steps of the work, and how it is tested",
|
|
147
|
+
chain_step_merge_tests: "Merge and tests",
|
|
148
|
+
chain_step_merge_tests_why: "What to check before merging, and what to test after",
|
|
149
|
+
chain_step_diary: "Diary",
|
|
150
|
+
chain_step_diary_why: "What happened, dated",
|
|
151
|
+
chain_absent: "Not in this analysis",
|
|
152
|
+
chain_request: "The requester's own words",
|
|
153
|
+
chain_north_star: "The project's North Star",
|
|
154
|
+
chain_merge: "Merge review",
|
|
155
|
+
chain_e2e: "End-to-end test script",
|
|
156
|
+
home_north_star_why: "What everything in this project is measured against, as the Vision states it.",
|
|
157
|
+
|
|
158
|
+
folder_: "Top level",
|
|
159
|
+
folder_vision: "Vision",
|
|
160
|
+
folder_vision_features: "Feature visions",
|
|
161
|
+
folder_reference: "Guides",
|
|
162
|
+
folder_architecture: "Decisions",
|
|
163
|
+
folder_functional: "How the system works",
|
|
164
|
+
folder_strategic: "Architecture and features",
|
|
165
|
+
folder_solutions: "Analyses",
|
|
166
|
+
folder_research: "Research",
|
|
167
|
+
folder_strategy: "Strategy",
|
|
168
|
+
folder_tactics: "Tactics",
|
|
169
|
+
folder_deliverables: "Deliverables",
|
|
170
|
+
folder_spikes: "Explorations",
|
|
171
|
+
folder_topics: "Topics",
|
|
172
|
+
folder_corpus_notes: "Notes",
|
|
173
|
+
folder_memory: "Catalog",
|
|
174
|
+
|
|
175
|
+
map_title: "Map",
|
|
176
|
+
map_why: "Topics, sized by how many facts each holds and coloured by area.",
|
|
177
|
+
map_view_topics: "Topics",
|
|
178
|
+
map_view_close: "One topic up close",
|
|
179
|
+
map_view_every: "Everything",
|
|
180
|
+
map_legend: "Legend",
|
|
181
|
+
map_kinds: "Kinds",
|
|
182
|
+
map_lines: "Lines",
|
|
183
|
+
map_edge_part: "part of",
|
|
184
|
+
map_edge_related: "related",
|
|
185
|
+
map_edge_shared: "share source documents (computed)",
|
|
186
|
+
map_edge_based: "based on",
|
|
187
|
+
map_edge_newer: "newer version of",
|
|
188
|
+
map_edge_replaced: "replaced by",
|
|
189
|
+
map_edge_conflict: "in conflict with",
|
|
190
|
+
map_kind_topic: "topic",
|
|
191
|
+
map_kind_fact: "fact",
|
|
192
|
+
map_kind_source: "source document",
|
|
193
|
+
map_kind_note: "note",
|
|
194
|
+
map_no_area: "no area",
|
|
195
|
+
map_hint: "Drag to move, scroll or use + and − to zoom: more names appear as you zoom in. Click a topic to see it up close.",
|
|
196
|
+
map_empty: "No topics yet.",
|
|
197
|
+
map_fit: "Fit",
|
|
198
|
+
map_zoom_in: "+",
|
|
199
|
+
map_zoom_in_why: "Zoom in",
|
|
200
|
+
map_zoom_out: "−",
|
|
201
|
+
map_zoom_out_why: "Zoom out",
|
|
202
|
+
map_why_close: "One topic at the centre, its facts around it coloured by origin, and the documents and notes they come from on the outer ring.",
|
|
203
|
+
map_why_every: "Every topic, fact and source document at once: an overview of how much is known and where. Names and facts appear wherever there is room to read them: zoom in to see more. Click a topic to see it up close.",
|
|
204
|
+
map_hint_close: "Click a fact, a document or a note to open it; click the centre to open the topic.",
|
|
205
|
+
map_open_topic: "Open the page of {name}",
|
|
206
|
+
|
|
207
|
+
topic_area: "Area",
|
|
208
|
+
topic_no_area: "no area",
|
|
209
|
+
topic_aka: "Also known as",
|
|
210
|
+
topic_gaps: "Known gaps",
|
|
211
|
+
topic_related: "Related topics",
|
|
212
|
+
topic_children: "Sub-topics",
|
|
213
|
+
topic_parents: "Part of",
|
|
214
|
+
topic_facts: "Facts",
|
|
215
|
+
topic_facts_count: "{n} facts",
|
|
216
|
+
topic_facts_one: "1 fact",
|
|
217
|
+
topic_filter: "Filter by words",
|
|
218
|
+
topic_origin: "Origin",
|
|
219
|
+
topic_origin_all: "All origins",
|
|
220
|
+
topic_no_facts: "No facts recorded in this topic yet.",
|
|
221
|
+
topic_merged: "This topic was merged into another one.",
|
|
222
|
+
topic_on_map: "See it on the map",
|
|
223
|
+
|
|
224
|
+
origin_given: "from a document",
|
|
225
|
+
origin_given_why: "The passage can be re-read in the document it comes from.",
|
|
226
|
+
origin_elicited: "stated by a person",
|
|
227
|
+
origin_elicited_why: "Said and recorded on the day, not found in a document and maybe never: treat it as that person's statement.",
|
|
228
|
+
origin_derived: "inferred",
|
|
229
|
+
origin_derived_why: "Reasoned from other facts, shown with what it rests on.",
|
|
230
|
+
origin_ruling: "decision",
|
|
231
|
+
origin_ruling_why: "Taken to settle a conflict.",
|
|
232
|
+
origin_imported: "from another knowledge base",
|
|
233
|
+
origin_imported_why: "Brought in from another knowledge base, where its own sources are.",
|
|
234
|
+
origin_other: "origin as written: {v}",
|
|
235
|
+
origin_other_why: "An origin this site does not know.",
|
|
236
|
+
|
|
237
|
+
state_ok: "current",
|
|
238
|
+
state_superseded: "replaced",
|
|
239
|
+
state_superseded_why: "A newer fact takes its place.",
|
|
240
|
+
state_contested: "in conflict",
|
|
241
|
+
state_contested_why: "Facts that disagree, not yet settled.",
|
|
242
|
+
|
|
243
|
+
statement_mark: "statement",
|
|
244
|
+
statement_prefix: "[statement] {text}",
|
|
245
|
+
statement_notice: "Not found in a document. Treat it as a statement, not as documented evidence.",
|
|
246
|
+
|
|
247
|
+
fact_title: "Fact",
|
|
248
|
+
fact_close: "Close",
|
|
249
|
+
fact_origin: "Origin",
|
|
250
|
+
fact_valid: "Holds when",
|
|
251
|
+
fact_qty: "Value",
|
|
252
|
+
fact_about: "Also concerns",
|
|
253
|
+
fact_topic: "Topic",
|
|
254
|
+
fact_replaced_by: "Replaced by",
|
|
255
|
+
fact_current_at_end: "Current fact at the end of each chain",
|
|
256
|
+
fact_in_conflict_with: "In conflict with",
|
|
257
|
+
fact_rests_on: "What it rests on",
|
|
258
|
+
fact_untraced: "This part could not be traced.",
|
|
259
|
+
fact_sources: "Sources",
|
|
260
|
+
fact_page: "page {n}",
|
|
261
|
+
fact_lines: "lines {a}–{b}",
|
|
262
|
+
fact_line: "line {a}",
|
|
263
|
+
fact_open_source: "Open the source document",
|
|
264
|
+
fact_open_note: "Open the note",
|
|
265
|
+
fact_open_doc: "Open the document",
|
|
266
|
+
fact_unknown: "This fact is not in this knowledge base.",
|
|
267
|
+
|
|
268
|
+
ground_document: "a document",
|
|
269
|
+
ground_statement: "a person's statement",
|
|
270
|
+
ground_decision: "a decision",
|
|
271
|
+
ground_kb: "another knowledge base",
|
|
272
|
+
ground_untraceable: "could not be traced",
|
|
273
|
+
ground_class_statement: "Rests, at least in part, on a person's statement.",
|
|
274
|
+
ground_class_untraceable: "Part of what it rests on could not be traced.",
|
|
275
|
+
ground_class_imported: "Rests on another knowledge base.",
|
|
276
|
+
ground_class_documents: "Rests on documents or decisions only.",
|
|
277
|
+
|
|
278
|
+
chain_loop: "The chain of replacements loops back to {id}: it stops here.",
|
|
279
|
+
chain_missing: "The chain names {id}, which is not in this knowledge base: it stops here.",
|
|
280
|
+
|
|
281
|
+
reason_no_file: "The source document is not in the knowledge base.",
|
|
282
|
+
reason_no_extraction: "No stored text of this document to show the passage from.",
|
|
283
|
+
reason_no_span: "The passage it points to is not in the stored text.",
|
|
284
|
+
reason_cell: "Spreadsheet cell {cell}: the cell itself is not shown here.",
|
|
285
|
+
reason_unknown_form: "The position of the passage is written in a form this site cannot read.",
|
|
286
|
+
reason_no_locator: "The fact does not say where in the document it comes from.",
|
|
287
|
+
reason_outside: "Points outside the project's documents: not followed.",
|
|
288
|
+
reason_unreadable: "The file could not be read.",
|
|
289
|
+
|
|
290
|
+
sources_title: "Source documents",
|
|
291
|
+
sources_why: "The documents the knowledge base was built from.",
|
|
292
|
+
sources_empty: "No source documents yet.",
|
|
293
|
+
source_name: "Name",
|
|
294
|
+
source_kind: "Kind",
|
|
295
|
+
source_date: "Date",
|
|
296
|
+
source_facts: "Facts taken",
|
|
297
|
+
source_topics: "Topics using it",
|
|
298
|
+
source_read: "How far it was read",
|
|
299
|
+
source_newer: "Newer version",
|
|
300
|
+
source_older: "Older version",
|
|
301
|
+
source_facts_list: "Facts taken from it",
|
|
302
|
+
source_record: "Its record",
|
|
303
|
+
read_complete: "read in full",
|
|
304
|
+
read_page: "read up to page {n}",
|
|
305
|
+
read_page_of: "read up to page {n} of {m}",
|
|
306
|
+
read_line: "read up to line {n}",
|
|
307
|
+
read_line_of: "read up to line {n} of {m}",
|
|
308
|
+
read_unrecorded: "reading not recorded",
|
|
309
|
+
read_unreadable: "not readable",
|
|
310
|
+
|
|
311
|
+
search_title: "Search",
|
|
312
|
+
search_placeholder: "Search facts, topics and documents",
|
|
313
|
+
search_placeholder_docs: "Search the documents",
|
|
314
|
+
search_none_kb: "Nothing found among facts, topics and documents. The full text of source documents is not searched here — not finding something does not mean the sources are silent on it.",
|
|
315
|
+
search_none_docs: "Nothing found in the documents.",
|
|
316
|
+
search_group_facts: "Facts",
|
|
317
|
+
search_group_topics: "Topics",
|
|
318
|
+
search_group_documents: "Documents",
|
|
319
|
+
search_more: "and {n} more — add a word to narrow it",
|
|
320
|
+
search_keys: "Enter opens · arrows move · Esc closes",
|
|
321
|
+
|
|
322
|
+
not_fact_id: "Not a fact id in this knowledge base"
|
|
323
|
+
};
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/* Docs site — a dark reading room. No remote font, image or import: the page
|
|
2
|
+
opens from disk with the network off. */
|
|
3
|
+
:root {
|
|
4
|
+
--ink: #0f1216;
|
|
5
|
+
--ink-2: #151a20;
|
|
6
|
+
--ink-3: #1c232b;
|
|
7
|
+
--rule: #2a333d;
|
|
8
|
+
--rule-2: #38434f;
|
|
9
|
+
--paper: #e8e2d4;
|
|
10
|
+
--paper-2: #b9b2a3;
|
|
11
|
+
--paper-3: #847e72;
|
|
12
|
+
--accent: #d9a441;
|
|
13
|
+
--accent-ink: #2b2110;
|
|
14
|
+
--link: #8fc1d4;
|
|
15
|
+
/* the five origins */
|
|
16
|
+
--o-given: #6fb7a8;
|
|
17
|
+
--o-elicited: #e0a24a;
|
|
18
|
+
--o-derived: #a99be0;
|
|
19
|
+
--o-ruling: #7fa7e6;
|
|
20
|
+
--o-imported: #9cc96b;
|
|
21
|
+
--conflict: #e0605a;
|
|
22
|
+
--display: "Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Charter, Georgia, serif;
|
|
23
|
+
--body: "Segoe UI Variable Text", "Avenir Next", Avenir, "Gill Sans Nova", "Gill Sans", "Trebuchet MS", sans-serif;
|
|
24
|
+
--mono: "Cascadia Mono", "SF Mono", Consolas, "Liberation Mono", Menlo, monospace;
|
|
25
|
+
}
|
|
26
|
+
* { box-sizing: border-box; }
|
|
27
|
+
html, body { margin: 0; height: 100%; }
|
|
28
|
+
body {
|
|
29
|
+
background: var(--ink);
|
|
30
|
+
background-image:
|
|
31
|
+
radial-gradient(1200px 600px at 85% -10%, rgba(217, 164, 65, 0.07), transparent 60%),
|
|
32
|
+
radial-gradient(900px 500px at -10% 110%, rgba(111, 183, 168, 0.05), transparent 60%);
|
|
33
|
+
color: var(--paper);
|
|
34
|
+
font: 15px/1.6 var(--body);
|
|
35
|
+
min-width: 1024px;
|
|
36
|
+
}
|
|
37
|
+
a { color: var(--link); text-decoration: none; }
|
|
38
|
+
a:hover { text-decoration: underline; text-underline-offset: 3px; }
|
|
39
|
+
code, pre { font-family: var(--mono); font-size: 0.88em; }
|
|
40
|
+
code { background: var(--ink-3); padding: 1px 5px; border-radius: 3px; }
|
|
41
|
+
pre { background: var(--ink-2); border: 1px solid var(--rule); padding: 12px 14px; overflow: auto; border-radius: 4px; }
|
|
42
|
+
pre code { background: none; padding: 0; }
|
|
43
|
+
button, select, input { font: inherit; color: inherit; }
|
|
44
|
+
|
|
45
|
+
#app { display: grid; grid-template-columns: 232px 1fr; min-height: 100vh; }
|
|
46
|
+
|
|
47
|
+
/* ------- rail */
|
|
48
|
+
.rail {
|
|
49
|
+
position: sticky; top: 0; height: 100vh; overflow: auto;
|
|
50
|
+
border-right: 1px solid var(--rule); background: rgba(15, 18, 22, 0.85);
|
|
51
|
+
padding: 22px 0 18px; display: flex; flex-direction: column;
|
|
52
|
+
}
|
|
53
|
+
.brand { padding: 0 22px 18px; border-bottom: 1px solid var(--rule); margin-bottom: 10px; }
|
|
54
|
+
.brand .name { font-family: var(--display); font-size: 21px; line-height: 1.2; color: var(--paper); }
|
|
55
|
+
.brand .kicker { font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--paper-3); margin-bottom: 6px; }
|
|
56
|
+
.rail nav a {
|
|
57
|
+
display: block; padding: 7px 22px; color: var(--paper-2); border-left: 2px solid transparent;
|
|
58
|
+
}
|
|
59
|
+
.rail nav a:hover { color: var(--paper); background: var(--ink-2); text-decoration: none; }
|
|
60
|
+
.rail nav a.on { color: var(--paper); border-left-color: var(--accent); background: var(--ink-2); }
|
|
61
|
+
.rail .searchbtn {
|
|
62
|
+
gap: 10px;
|
|
63
|
+
margin: 14px 18px 0; padding: 8px 12px; background: var(--ink-3); border: 1px solid var(--rule-2);
|
|
64
|
+
border-radius: 6px; text-align: left; cursor: pointer; color: var(--paper-2); display: flex; justify-content: space-between;
|
|
65
|
+
}
|
|
66
|
+
.rail .searchbtn:hover { border-color: var(--accent); color: var(--paper); }
|
|
67
|
+
.rail .searchbtn kbd { font-family: var(--mono); font-size: 11px; color: var(--paper-3); }
|
|
68
|
+
.rail .stamp { margin-top: auto; padding: 16px 22px 0; font-size: 11.5px; color: var(--paper-3); line-height: 1.5; border-top: 1px solid var(--rule); }
|
|
69
|
+
|
|
70
|
+
/* ------- main */
|
|
71
|
+
main { padding: 34px 48px 80px; max-width: 1180px; width: 100%; }
|
|
72
|
+
main.wide { max-width: none; }
|
|
73
|
+
h1, h2, h3 { font-family: var(--display); font-weight: 600; letter-spacing: 0.005em; color: var(--paper); }
|
|
74
|
+
h1 { font-size: 32px; line-height: 1.15; margin: 0 0 6px; }
|
|
75
|
+
h2 { font-size: 22px; margin: 34px 0 10px; }
|
|
76
|
+
h3 { font-size: 17px; margin: 24px 0 8px; }
|
|
77
|
+
.why { color: var(--paper-3); margin: 0 0 22px; font-size: 14px; }
|
|
78
|
+
.muted { color: var(--paper-3); }
|
|
79
|
+
.empty { color: var(--paper-2); border: 1px dashed var(--rule-2); padding: 14px 16px; border-radius: 6px; background: var(--ink-2); }
|
|
80
|
+
.notice { color: var(--accent); }
|
|
81
|
+
|
|
82
|
+
/* ------- home */
|
|
83
|
+
.home-head { display: grid; grid-template-columns: 1fr; gap: 6px; margin-bottom: 26px; }
|
|
84
|
+
.home-head .intro { font-size: 17px; color: var(--paper-2); max-width: 760px; }
|
|
85
|
+
.quad { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
|
|
86
|
+
.block {
|
|
87
|
+
background: linear-gradient(180deg, var(--ink-2), rgba(21, 26, 32, 0.6));
|
|
88
|
+
border: 1px solid var(--rule); border-radius: 8px; padding: 18px 20px 16px; position: relative;
|
|
89
|
+
}
|
|
90
|
+
.block h2 { margin: 0 0 2px; font-size: 19px; }
|
|
91
|
+
.block h2 a { color: var(--paper); }
|
|
92
|
+
.block .why { margin-bottom: 12px; font-size: 13px; }
|
|
93
|
+
.block .more { display: inline-block; margin-top: 10px; font-size: 13.5px; }
|
|
94
|
+
.block ul { list-style: none; margin: 0; padding: 0; }
|
|
95
|
+
.block li { padding: 6px 0; border-top: 1px solid var(--rule); }
|
|
96
|
+
.block li:first-child { border-top: none; }
|
|
97
|
+
.vision-box { border-left: 2px solid var(--accent); padding: 2px 0 2px 12px; margin: 10px 0; }
|
|
98
|
+
.vision-box .status { font-size: 12.5px; color: var(--accent); letter-spacing: 0.02em; }
|
|
99
|
+
.links { display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 13.5px; margin-top: 8px; }
|
|
100
|
+
.area-row { padding: 6px 0; }
|
|
101
|
+
.area-row .area { font-family: var(--display); font-size: 16px; }
|
|
102
|
+
.chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
|
|
103
|
+
.chip { font-size: 12.5px; padding: 1px 9px; border-radius: 999px; border: 1px solid var(--rule-2); color: var(--paper-2); }
|
|
104
|
+
a.chip:hover { border-color: var(--link); text-decoration: none; color: var(--paper); }
|
|
105
|
+
|
|
106
|
+
/* ------- events */
|
|
107
|
+
.events { list-style: none; padding: 0; margin: 0; }
|
|
108
|
+
.event { display: grid; grid-template-columns: 104px 1fr; gap: 14px; padding: 8px 0; border-top: 1px solid var(--rule); }
|
|
109
|
+
.event .date { font-family: var(--mono); font-size: 12.5px; color: var(--accent); padding-top: 2px; }
|
|
110
|
+
.event .kind { font-size: 11.5px; color: var(--paper-3); text-transform: uppercase; letter-spacing: 0.08em; }
|
|
111
|
+
.block .event { grid-template-columns: 92px 1fr; }
|
|
112
|
+
|
|
113
|
+
/* ------- work */
|
|
114
|
+
.cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); gap: 14px; }
|
|
115
|
+
.card { background: var(--ink-2); border: 1px solid var(--rule); border-radius: 8px; padding: 14px 16px; }
|
|
116
|
+
.card h3 { margin: 0 0 8px; font-size: 17px; }
|
|
117
|
+
.card dl { display: grid; grid-template-columns: 110px 1fr; gap: 3px 10px; margin: 0 0 10px; font-size: 13.5px; }
|
|
118
|
+
.card dt { color: var(--paper-3); }
|
|
119
|
+
.card dd { margin: 0; }
|
|
120
|
+
.card .next { border-top: 1px solid var(--rule); padding-top: 8px; margin-top: 4px; white-space: pre-wrap; }
|
|
121
|
+
.card .next b { display: block; font-size: 11.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--paper-3); font-weight: 600; }
|
|
122
|
+
.pill { display: inline-block; font-size: 12px; padding: 0 8px; border-radius: 999px; border: 1px solid var(--rule-2); color: var(--paper-2); }
|
|
123
|
+
.pill.g1 { border-color: var(--conflict); color: var(--conflict); }
|
|
124
|
+
.pill.g3 { border-color: var(--accent); color: var(--accent); }
|
|
125
|
+
.pill.g5 { border-color: var(--o-given); color: var(--o-given); }
|
|
126
|
+
.prose-box { background: var(--ink-2); border: 1px solid var(--rule); border-radius: 8px; padding: 6px 20px; }
|
|
127
|
+
|
|
128
|
+
/* ------- units */
|
|
129
|
+
.toolbar { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
|
|
130
|
+
.seg { display: inline-flex; border: 1px solid var(--rule-2); border-radius: 6px; overflow: hidden; }
|
|
131
|
+
.seg button { background: none; border: none; padding: 5px 12px; cursor: pointer; color: var(--paper-2); }
|
|
132
|
+
.seg button.on { background: var(--accent); color: var(--accent-ink); }
|
|
133
|
+
select, input[type=search], input[type=text] {
|
|
134
|
+
background: var(--ink-2); border: 1px solid var(--rule-2); border-radius: 6px; padding: 5px 10px;
|
|
135
|
+
}
|
|
136
|
+
.columns { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(250px, 1fr); gap: 14px; overflow-x: auto; }
|
|
137
|
+
.column h3 { margin: 0 0 8px; font-family: var(--body); font-size: 12px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--paper-3); }
|
|
138
|
+
.unit { background: var(--ink-2); border: 1px solid var(--rule); border-radius: 6px; padding: 9px 12px; margin-bottom: 8px; font-size: 13.5px; }
|
|
139
|
+
.unit .id { font-family: var(--mono); font-size: 12px; color: var(--paper-3); }
|
|
140
|
+
.unit .name { display: block; color: var(--paper); margin: 2px 0; }
|
|
141
|
+
table.list { width: 100%; border-collapse: collapse; font-size: 13.5px; }
|
|
142
|
+
table.list th { text-align: left; font-weight: 600; color: var(--paper-3); font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; padding: 6px 10px; border-bottom: 1px solid var(--rule-2); }
|
|
143
|
+
table.list td { padding: 7px 10px; border-bottom: 1px solid var(--rule); vertical-align: top; }
|
|
144
|
+
|
|
145
|
+
/* ------- documents */
|
|
146
|
+
.tree details { border-top: 1px solid var(--rule); padding: 6px 0; }
|
|
147
|
+
.tree summary { cursor: pointer; font-family: var(--display); font-size: 17px; padding: 4px 0; }
|
|
148
|
+
.tree summary .muted { font-family: var(--body); font-size: 12px; margin-left: 8px; }
|
|
149
|
+
.tree ul { list-style: none; margin: 4px 0 8px; padding-left: 16px; }
|
|
150
|
+
.tree li { padding: 2px 0; }
|
|
151
|
+
.doc-meta { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 20px; }
|
|
152
|
+
.doc-meta .label { font-size: 12px; border: 1px solid var(--rule-2); border-radius: 4px; padding: 1px 8px; color: var(--paper-2); max-width: 100%; }
|
|
153
|
+
.doc-meta .label b { color: var(--paper-3); font-weight: 600; margin-right: 6px; }
|
|
154
|
+
.prose { max-width: 820px; }
|
|
155
|
+
.prose table { border-collapse: collapse; margin: 14px 0; font-size: 13.5px; display: block; overflow-x: auto; }
|
|
156
|
+
.prose th, .prose td { border: 1px solid var(--rule); padding: 5px 9px; vertical-align: top; }
|
|
157
|
+
.prose th { background: var(--ink-3); text-align: left; }
|
|
158
|
+
.prose blockquote { margin: 12px 0; padding: 2px 16px; border-left: 2px solid var(--rule-2); color: var(--paper-2); }
|
|
159
|
+
.prose hr { border: none; border-top: 1px solid var(--rule); margin: 24px 0; }
|
|
160
|
+
.prose h1 { font-size: 28px; }
|
|
161
|
+
.prose li { margin: 2px 0; }
|
|
162
|
+
code.notfact { text-decoration: underline dotted var(--conflict); text-underline-offset: 3px; cursor: help; }
|
|
163
|
+
a.factid code { color: var(--link); }
|
|
164
|
+
|
|
165
|
+
/* ------- facts */
|
|
166
|
+
.facts { list-style: none; padding: 0; margin: 0; }
|
|
167
|
+
.fact { display: grid; grid-template-columns: 10px 1fr; gap: 12px; padding: 9px 0; border-top: 1px solid var(--rule); cursor: pointer; }
|
|
168
|
+
.fact:hover .text { color: #fff; }
|
|
169
|
+
.fact .dot { width: 10px; height: 10px; border-radius: 50%; margin-top: 7px; }
|
|
170
|
+
.fact .marks { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 3px; }
|
|
171
|
+
.fact.replaced { opacity: 0.5; }
|
|
172
|
+
.fact.replaced .text { text-decoration: line-through; text-decoration-color: var(--paper-3); }
|
|
173
|
+
.tag { font-size: 11.5px; padding: 0 7px; border-radius: 4px; border: 1px solid currentColor; }
|
|
174
|
+
.tag.conflict { color: var(--conflict); }
|
|
175
|
+
.tag.replaced { color: var(--paper-3); }
|
|
176
|
+
.tag.statement { color: var(--o-elicited); font-weight: 600; letter-spacing: 0.02em; }
|
|
177
|
+
.o-given { color: var(--o-given); } .bg-given { background: var(--o-given); }
|
|
178
|
+
.o-elicited { color: var(--o-elicited); } .bg-elicited { background: var(--o-elicited); }
|
|
179
|
+
.o-derived { color: var(--o-derived); } .bg-derived { background: var(--o-derived); }
|
|
180
|
+
.o-ruling { color: var(--o-ruling); } .bg-ruling { background: var(--o-ruling); }
|
|
181
|
+
.o-imported { color: var(--o-imported); } .bg-imported { background: var(--o-imported); }
|
|
182
|
+
.o-other { color: var(--paper-3); } .bg-other { background: var(--paper-3); }
|
|
183
|
+
|
|
184
|
+
.panel {
|
|
185
|
+
position: fixed; top: 0; right: 0; bottom: 0; width: min(560px, 46vw); background: var(--ink-2);
|
|
186
|
+
border-left: 1px solid var(--rule-2); box-shadow: -24px 0 48px rgba(0, 0, 0, 0.45); overflow: auto;
|
|
187
|
+
padding: 24px 26px 60px; z-index: 20;
|
|
188
|
+
}
|
|
189
|
+
.panel .close { position: absolute; top: 14px; right: 16px; background: none; border: 1px solid var(--rule-2); border-radius: 6px; padding: 2px 10px; cursor: pointer; color: var(--paper-2); }
|
|
190
|
+
.panel .ftext { font-family: var(--display); font-size: 21px; line-height: 1.35; margin: 18px 0 10px; }
|
|
191
|
+
.panel dl { display: grid; grid-template-columns: 130px 1fr; gap: 6px 12px; font-size: 14px; }
|
|
192
|
+
.panel dt { color: var(--paper-3); }
|
|
193
|
+
.panel dd { margin: 0; }
|
|
194
|
+
.panel .why-line { color: var(--paper-3); font-size: 12.5px; display: block; }
|
|
195
|
+
.statement-notice { border: 1px solid var(--o-elicited); color: var(--o-elicited); background: rgba(224, 162, 74, 0.08); padding: 9px 12px; border-radius: 6px; margin: 10px 0; font-size: 14px; }
|
|
196
|
+
.passage { background: var(--ink); border: 1px solid var(--rule); border-radius: 6px; padding: 10px 12px; font-family: var(--mono); font-size: 12.5px; white-space: pre-wrap; word-break: break-word; color: var(--paper-3); margin: 6px 0 4px; }
|
|
197
|
+
.passage mark { background: rgba(217, 164, 65, 0.22); color: var(--paper); border-bottom: 1px solid var(--accent); padding: 0 1px; }
|
|
198
|
+
.src { padding: 10px 0; border-top: 1px solid var(--rule); }
|
|
199
|
+
.src .head { font-size: 13.5px; display: flex; gap: 10px; flex-wrap: wrap; align-items: baseline; }
|
|
200
|
+
.reason { color: var(--paper-2); font-size: 13.5px; font-style: italic; }
|
|
201
|
+
|
|
202
|
+
/* ------- map */
|
|
203
|
+
.mapwrap { position: relative; height: calc(100vh - 210px); min-height: 460px; border: 1px solid var(--rule); border-radius: 8px; background: radial-gradient(circle at 50% 50%, #141a20, #0c0f13); overflow: hidden; }
|
|
204
|
+
/* system cursors only: the bitmap grab hand renders blurred under Windows display scaling */
|
|
205
|
+
.mapwrap canvas { display: block; width: 100%; height: 100%; cursor: default; }
|
|
206
|
+
.mapwrap canvas.drag { cursor: move; }
|
|
207
|
+
.legend { position: absolute; left: 12px; bottom: 12px; background: rgba(15, 18, 22, 0.88); border: 1px solid var(--rule-2); border-radius: 6px; padding: 9px 12px; font-size: 12.5px; max-width: 330px; }
|
|
208
|
+
.legend label { display: flex; gap: 7px; align-items: center; cursor: pointer; padding: 1px 0; }
|
|
209
|
+
.legend .sw { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
|
|
210
|
+
.legend .sw.sq { border-radius: 1px; }
|
|
211
|
+
.legend .sw.ring { background: none; border: 1.5px dashed var(--o-elicited); }
|
|
212
|
+
.legend summary { cursor: pointer; font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--paper-2); }
|
|
213
|
+
.legend[open] summary { margin-bottom: 4px; }
|
|
214
|
+
.legend { max-height: calc(100% - 24px); overflow: auto; }
|
|
215
|
+
.legend .ln { width: 18px; height: 0; border-top: 2px solid var(--paper-3); display: inline-block; }
|
|
216
|
+
.legend .ln.dash { border-top-style: dashed; }
|
|
217
|
+
.legend .ln.thin { border-top-width: 1px; border-top-color: #5b6672; }
|
|
218
|
+
.legend .ln.based { border-top-color: var(--o-derived); }
|
|
219
|
+
.legend .ln.newer { border-top-color: var(--o-given); border-top-style: dotted; }
|
|
220
|
+
.legend .ln.conflict { border-top-color: var(--conflict); }
|
|
221
|
+
.legend h4 { margin: 6px 0 3px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--paper-3); font-weight: 600; }
|
|
222
|
+
.legend h4:first-child { margin-top: 0; }
|
|
223
|
+
.maphint { position: absolute; right: 12px; top: 10px; font-size: 12px; color: var(--paper-3); }
|
|
224
|
+
.tip { position: absolute; pointer-events: none; background: var(--ink-3); border: 1px solid var(--rule-2); border-radius: 5px; padding: 4px 8px; font-size: 12.5px; max-width: 320px; display: none; }
|
|
225
|
+
|
|
226
|
+
/* ------- search */
|
|
227
|
+
.overlay { position: fixed; inset: 0; background: rgba(5, 7, 9, 0.66); z-index: 40; display: flex; justify-content: center; padding-top: 12vh; }
|
|
228
|
+
.searchbox { width: min(720px, 90vw); background: var(--ink-2); border: 1px solid var(--rule-2); border-radius: 10px; box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6); display: flex; flex-direction: column; max-height: 72vh; }
|
|
229
|
+
.searchbox input { border: none; border-bottom: 1px solid var(--rule); border-radius: 10px 10px 0 0; padding: 16px 18px; font-size: 17px; background: transparent; outline: none; }
|
|
230
|
+
.searchbox .results { overflow: auto; padding: 6px 0; }
|
|
231
|
+
.searchbox .grp { padding: 8px 18px 2px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--paper-3); }
|
|
232
|
+
.searchbox .res { display: block; padding: 6px 18px; color: var(--paper-2); }
|
|
233
|
+
.searchbox .res.sel, .searchbox .res:hover { background: var(--ink-3); color: var(--paper); text-decoration: none; }
|
|
234
|
+
.searchbox .res small { color: var(--paper-3); margin-left: 8px; font-family: var(--mono); font-size: 11px; }
|
|
235
|
+
.searchbox .none { padding: 16px 18px; color: var(--paper-2); }
|
|
236
|
+
.searchbox .keys { border-top: 1px solid var(--rule); padding: 7px 18px; font-size: 11.5px; color: var(--paper-3); }
|
|
237
|
+
|
|
238
|
+
/* ------- narrow windows (a side pane, a small laptop): the rail becomes a bar */
|
|
239
|
+
@media (max-width: 1000px) {
|
|
240
|
+
body { min-width: 0; font-size: 14px; }
|
|
241
|
+
#app { grid-template-columns: 1fr; }
|
|
242
|
+
.rail { position: sticky; top: 0; z-index: 10; height: auto; flex-direction: row; flex-wrap: wrap; align-items: center; padding: 8px 12px; gap: 4px 10px; }
|
|
243
|
+
.brand { border: none; padding: 0 8px 0 0; margin: 0; }
|
|
244
|
+
.brand .kicker { display: none; }
|
|
245
|
+
.brand .name { font-size: 16px; }
|
|
246
|
+
.rail nav { display: flex; flex-wrap: wrap; }
|
|
247
|
+
.rail nav a { padding: 4px 8px; border-left: none; border-bottom: 2px solid transparent; }
|
|
248
|
+
.rail nav a.on { border-bottom-color: var(--accent); }
|
|
249
|
+
.rail .searchbtn { margin: 0; padding: 4px 10px; }
|
|
250
|
+
.rail .stamp { flex-basis: 100%; margin: 0; padding: 4px 0 0; border: none; font-size: 11px; }
|
|
251
|
+
main { padding: 18px 16px 60px; }
|
|
252
|
+
.quad { grid-template-columns: 1fr; }
|
|
253
|
+
.mapwrap { height: calc(100vh - 230px); min-height: 360px; }
|
|
254
|
+
.legend { max-width: 60%; font-size: 11.5px; }
|
|
255
|
+
.panel { width: 100vw; }
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* ------- an analysis read as its chain (R24) */
|
|
259
|
+
.chain { border: 1px solid var(--rule); border-radius: 8px; background: var(--ink-2); padding: 14px 18px 8px; margin: 4px 0 26px; max-width: 900px; }
|
|
260
|
+
.chain h2 { margin: 0 0 8px; font-size: 16px; }
|
|
261
|
+
.chain ol { list-style: none; margin: 0; padding: 0; counter-reset: step; }
|
|
262
|
+
.chain li { display: grid; grid-template-columns: 250px 1fr; gap: 12px; padding: 7px 0; border-top: 1px solid var(--rule); counter-increment: step; }
|
|
263
|
+
.chain li:first-child { border-top: none; }
|
|
264
|
+
.chain .step b { font-weight: 600; }
|
|
265
|
+
.chain .step b::before { content: counter(step) " "; color: var(--accent); font-family: var(--mono); font-size: 12px; }
|
|
266
|
+
.chain .step .why-line { color: var(--paper-3); font-size: 12.5px; display: block; }
|
|
267
|
+
.chain .links { display: flex; flex-wrap: wrap; gap: 4px 14px; align-content: flex-start; }
|
|
268
|
+
.chain li.absent .step b { color: var(--paper-2); }
|
|
269
|
+
@media (max-width: 1000px) { .chain li { grid-template-columns: 1fr; gap: 2px; } }
|
|
270
|
+
|
|
271
|
+
/* ------- the Vision's North Star, in view on the home page (R25) */
|
|
272
|
+
.north-star { border: 1px solid rgba(217, 164, 65, 0.45); border-left: 4px solid var(--accent); border-radius: 8px; padding: 16px 22px 12px; margin: 0 0 22px; background: linear-gradient(90deg, rgba(217, 164, 65, 0.09), rgba(21, 26, 32, 0.4)); max-width: 1000px; }
|
|
273
|
+
.north-star h2 { margin: 0 0 2px; font-size: 22px; color: var(--accent); }
|
|
274
|
+
.north-star .why { margin-bottom: 8px; font-size: 13px; }
|
|
275
|
+
.north-star .prose { font-family: var(--display); font-size: 17px; line-height: 1.55; max-width: none; }
|
|
276
|
+
.north-star .links { align-items: baseline; }
|
|
277
|
+
.north-star .status { font-size: 12.5px; color: var(--paper-3); }
|
|
278
|
+
|
|
279
|
+
/* a grid item may shrink below its widest content (long code lines, wide tables scroll inside) */
|
|
280
|
+
main { min-width: 0; }
|
|
281
|
+
.prose pre, .prose table { max-width: 100%; }
|
|
282
|
+
|
|
283
|
+
/* ------- guides (R26) */
|
|
284
|
+
.router { border: 1px solid var(--rule); border-left: 3px solid var(--o-ruling); border-radius: 6px; padding: 10px 14px; background: var(--ink-2); max-width: 900px; }
|
|
285
|
+
.router .why-line { display: block; color: var(--paper-3); font-size: 12.5px; }
|
|
286
|
+
ul.guides { list-style: none; padding: 0; margin: 0; max-width: 900px; }
|
|
287
|
+
ul.guides li { padding: 8px 0; border-top: 1px solid var(--rule); }
|
|
288
|
+
ul.guides li:first-child { border-top: none; }
|