forgedock 1.0.16 → 1.0.18
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/README.md +54 -3
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +2205 -541
- package/bin/github-app-manifest.json.license +2 -0
- package/bin/hooks/session-start.mjs +4 -5
- package/bin/registry.mjs +20 -0
- package/bin/tui.mjs +172 -96
- package/commands/adopt.md +433 -0
- package/commands/analytics.md +2 -0
- package/commands/audit-agents.md +2 -0
- package/commands/audit.md +2 -0
- package/commands/autopilot.md +77 -0
- package/commands/changelog.md +354 -0
- package/commands/cleanup.md +2 -0
- package/commands/compat-audit.md +330 -0
- package/commands/deploy-info.md +6 -5
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/diagnose.md +483 -0
- package/commands/explain.md +349 -0
- package/commands/forge-stats.md +2 -0
- package/commands/forgedock-init.md +2 -0
- package/commands/geo-audit.md +2 -0
- package/commands/incident-response.md +2 -0
- package/commands/issue.md +9 -3
- package/commands/milestone.md +2 -0
- package/commands/optimize.md +411 -0
- package/commands/orchestrate.md +239 -0
- package/commands/pipeline-health.md +60 -1
- package/commands/qa-sweep.md +39 -2
- package/commands/quality-gate.md +67 -0
- package/commands/replay.md +263 -0
- package/commands/resume.md +264 -0
- package/commands/review-pr-agents.md +5 -1
- package/commands/review-pr-staging.md +160 -2
- package/commands/review-pr.md +85 -3
- package/commands/rollback.md +2 -0
- package/commands/scope.md +280 -0
- package/commands/security-audit.md +2 -0
- package/commands/status.md +262 -0
- package/commands/sync-ecosystem.md +2 -0
- package/commands/test-gate.md +929 -0
- package/commands/validate.md +2 -0
- package/commands/work-on/build/architect.md +128 -18
- package/commands/work-on/build/context.md +130 -17
- package/commands/work-on/build/implement.md +7 -3
- package/commands/work-on/build/validate.md +2 -0
- package/commands/work-on/build.md +32 -7
- package/commands/work-on/close.md +85 -0
- package/commands/work-on/decompose.md +2 -0
- package/commands/work-on/investigate.md +30 -3
- package/commands/work-on/review.md +13 -1
- package/commands/work-on-monolithic.md +2 -0
- package/commands/work-on.md +676 -38
- package/docs/BRAND.md +51 -0
- package/docs/CI.md +177 -0
- package/docs/CONFIG.md +94 -0
- package/docs/FORGE-PROTOCOL.md +324 -0
- package/docs/articles/b-vs-c-baseline.md +210 -0
- package/docs/articles/full-abc-benchmark.md +205 -0
- package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/claude-breakpoints.json +47 -0
- package/docs/design/abc-benchmark.md +195 -0
- package/docs/design/design-architect-rationale.md +123 -0
- package/docs/design/design-memory.md +61 -0
- package/docs/design/design-spec-schema.md +248 -0
- package/docs/design/design-system-lint.md +150 -0
- package/docs/design/divergent-generation.md +106 -0
- package/docs/design/effects-appropriateness.md +133 -0
- package/docs/design/fixtures/briefs/README.md +47 -0
- package/docs/design/fixtures/briefs/cadence.md +39 -0
- package/docs/design/fixtures/briefs/plume.md +39 -0
- package/docs/design/fixtures/briefs/slipstream.md +39 -0
- package/docs/design/fixtures/briefs/tender.md +39 -0
- package/docs/design/fixtures/briefs/voltage.md +39 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
- package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
- package/docs/design/foundations/brutalist.css +294 -0
- package/docs/design/foundations/editorial.css +300 -0
- package/docs/design/foundations/minimal-luxury.css +295 -0
- package/docs/design/foundations/technical.css +293 -0
- package/docs/design/foundations/warm-photo.css +299 -0
- package/docs/design/reference-corpus.md +1726 -0
- package/docs/design/render-critique-loop.md +57 -0
- package/docs/site/getting-started.md +21 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +3 -3
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/classify-lane.sh +138 -0
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +169 -0
- package/scripts/validate-pr-target.sh +30 -0
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/devdocs/README.md +72 -0
- package/templates/devdocs/agent/using-forgedock.md +3 -0
- package/templates/devdocs/agent/using-github.md +3 -0
- package/templates/devdocs/index.yaml +162 -0
- package/templates/devdocs/project/architecture.md +3 -0
- package/templates/devdocs/project/conventions.md +3 -0
- package/templates/devdocs/project/custom-instructions.md +3 -0
- package/templates/devdocs/project/glossary.md +3 -0
- package/templates/devdocs/project/stack.md +3 -0
- package/templates/devdocs/templates/commit-convention.md +3 -0
- package/templates/devdocs/templates/issue.md +3 -0
- package/templates/devdocs/templates/pull-request.md +3 -0
- package/templates/devdocs/templates/review-finding.md +3 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* minimal-luxury.css — Foundation for the minimal-luxury archetype
|
|
3
|
+
*
|
|
4
|
+
* Archetype ID: minimal-luxury
|
|
5
|
+
* Craft profile (reference-corpus.md):
|
|
6
|
+
* radius system: mixed — 20px card / 12px input / 8px button
|
|
7
|
+
* button style: ghost or borderless; minimal fill; no visible shadow
|
|
8
|
+
* divider style: spacing only — no visible line between sections
|
|
9
|
+
* icon treatment: none or near-invisible; no colored backgrounds
|
|
10
|
+
*
|
|
11
|
+
* Override --color-accent (and related tokens) via a :root block in the
|
|
12
|
+
* generated page to brand this foundation without touching the file.
|
|
13
|
+
*
|
|
14
|
+
* Issue: #1048 — custom CSS component library per archetype
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* ==========================================================================
|
|
18
|
+
1. Design Tokens — CSS Custom Properties
|
|
19
|
+
========================================================================== */
|
|
20
|
+
|
|
21
|
+
:root {
|
|
22
|
+
/* Accent — override per brand */
|
|
23
|
+
--color-accent: #1a1a1a; /* near-black default — silent luxury */
|
|
24
|
+
--color-accent-subtle: rgba(26, 26, 26, 0.06);
|
|
25
|
+
--color-accent-hover: rgba(26, 26, 26, 0.10);
|
|
26
|
+
|
|
27
|
+
/* Surface palette — near-white / pure */
|
|
28
|
+
--color-bg: #ffffff;
|
|
29
|
+
--color-bg-raised: #f9f9f9;
|
|
30
|
+
--color-bg-sunken: #f3f3f3;
|
|
31
|
+
--color-fg: #111111;
|
|
32
|
+
--color-fg-muted: #555555;
|
|
33
|
+
--color-fg-faint: #aaaaaa;
|
|
34
|
+
--color-border: rgba(0, 0, 0, 0.08);
|
|
35
|
+
--color-border-strong: rgba(0, 0, 0, 0.14);
|
|
36
|
+
|
|
37
|
+
/* Code surface */
|
|
38
|
+
--code-bg: rgba(0, 0, 0, 0.04);
|
|
39
|
+
|
|
40
|
+
/* Radius system — mixed, at least 3 distinct values (N13 compliance) */
|
|
41
|
+
--radius-sm: 4px; /* micro elements */
|
|
42
|
+
--radius-btn: 8px; /* button */
|
|
43
|
+
--radius-input: 12px; /* input */
|
|
44
|
+
--radius-card: 20px; /* card — most generous */
|
|
45
|
+
--radius-pill: 9999px; /* pill badge */
|
|
46
|
+
|
|
47
|
+
/* Shadow tokens — near-zero, luxury restraint */
|
|
48
|
+
--shadow-card: 0 1px 2px rgba(0, 0, 0, 0.04),
|
|
49
|
+
0 0 0 1px rgba(0, 0, 0, 0.06);
|
|
50
|
+
--shadow-card-hover: 0 4px 16px rgba(0, 0, 0, 0.06),
|
|
51
|
+
0 0 0 1px rgba(0, 0, 0, 0.08);
|
|
52
|
+
--shadow-btn: none; /* no visible shadow — craft profile */
|
|
53
|
+
--shadow-elevated: 0 8px 40px rgba(0, 0, 0, 0.08);
|
|
54
|
+
|
|
55
|
+
/* Transition — measured, unhurried */
|
|
56
|
+
--transition-fast: 180ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
57
|
+
--transition-base: 280ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
58
|
+
--transition-slow: 420ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
59
|
+
|
|
60
|
+
/* Spacing scale — generous air */
|
|
61
|
+
--space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px;
|
|
62
|
+
--space-6:24px; --space-8:32px; --space-12:48px; --space-16:64px; --space-24:96px;
|
|
63
|
+
|
|
64
|
+
/* Icon sizing — contextual (craft profile: near-invisible, no backgrounds) */
|
|
65
|
+
--icon-feature: 20px;
|
|
66
|
+
--icon-nav: 16px;
|
|
67
|
+
--icon-inline: 14px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* ==========================================================================
|
|
71
|
+
2. Element Overrides — Professional baseline defaults (N18 compliance)
|
|
72
|
+
========================================================================== */
|
|
73
|
+
|
|
74
|
+
/* Custom selection — subtle black tint */
|
|
75
|
+
::selection {
|
|
76
|
+
background: var(--color-accent-subtle);
|
|
77
|
+
color: var(--color-fg);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Custom focus ring — restrained, thin (N18, N15 compliance) */
|
|
81
|
+
:focus-visible {
|
|
82
|
+
outline: 1.5px solid var(--color-fg);
|
|
83
|
+
outline-offset: 3px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Custom scrollbar — ultra-thin, near-invisible */
|
|
87
|
+
::-webkit-scrollbar { width: 4px; height: 4px; }
|
|
88
|
+
::-webkit-scrollbar-track { background: transparent; }
|
|
89
|
+
::-webkit-scrollbar-thumb {
|
|
90
|
+
background: rgba(0, 0, 0, 0.18);
|
|
91
|
+
border-radius: var(--radius-pill);
|
|
92
|
+
}
|
|
93
|
+
::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.32); }
|
|
94
|
+
|
|
95
|
+
/* Code blocks — clean, minimal */
|
|
96
|
+
code, kbd {
|
|
97
|
+
background: var(--code-bg);
|
|
98
|
+
border-radius: var(--radius-sm);
|
|
99
|
+
padding: 2px 6px;
|
|
100
|
+
font-size: 0.875em;
|
|
101
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Links — custom underline (N17 compliance) */
|
|
105
|
+
a:not([class]) {
|
|
106
|
+
color: var(--color-fg);
|
|
107
|
+
text-decoration: underline;
|
|
108
|
+
text-decoration-color: rgba(0, 0, 0, 0.25);
|
|
109
|
+
text-underline-offset: 3px;
|
|
110
|
+
text-decoration-thickness: 1px;
|
|
111
|
+
transition: text-decoration-color var(--transition-fast);
|
|
112
|
+
}
|
|
113
|
+
a:not([class]):hover {
|
|
114
|
+
text-decoration-color: var(--color-fg);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ==========================================================================
|
|
118
|
+
3. Component Classes — Buttons, Cards, Badges, Inputs
|
|
119
|
+
========================================================================== */
|
|
120
|
+
|
|
121
|
+
/* --- Button (N14, N15, N20 compliance) ----------------------------------- */
|
|
122
|
+
|
|
123
|
+
.btn {
|
|
124
|
+
display: inline-flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
gap: var(--space-2);
|
|
127
|
+
padding: 10px 22px;
|
|
128
|
+
border-radius: var(--radius-btn); /* 8px */
|
|
129
|
+
font-size: 0.9375rem;
|
|
130
|
+
font-weight: 400;
|
|
131
|
+
line-height: 1;
|
|
132
|
+
letter-spacing: 0.04em;
|
|
133
|
+
cursor: pointer;
|
|
134
|
+
white-space: nowrap;
|
|
135
|
+
transition: background-color var(--transition-fast),
|
|
136
|
+
color var(--transition-fast),
|
|
137
|
+
transform var(--transition-fast);
|
|
138
|
+
/* Minimal fill — craft profile: ghost or borderless, minimal fill */
|
|
139
|
+
background-color: var(--color-fg);
|
|
140
|
+
color: var(--color-bg);
|
|
141
|
+
border: none;
|
|
142
|
+
box-shadow: none; /* no shadow — craft profile */
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.btn:hover {
|
|
146
|
+
background-color: rgba(17, 17, 17, 0.80);
|
|
147
|
+
transform: translateY(-1px); /* lift on hover — N20 compliance */
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.btn:active {
|
|
151
|
+
transform: translateY(0px); /* press-down — N20 compliance */
|
|
152
|
+
background-color: rgba(17, 17, 17, 0.90);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.btn:focus-visible {
|
|
156
|
+
outline: 1.5px solid var(--color-fg);
|
|
157
|
+
outline-offset: 3px; /* custom focus ring — N18 compliance */
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Ghost / borderless variant */
|
|
161
|
+
.btn-ghost {
|
|
162
|
+
background-color: transparent;
|
|
163
|
+
color: var(--color-fg);
|
|
164
|
+
border: none;
|
|
165
|
+
box-shadow: none;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.btn-ghost:hover {
|
|
169
|
+
background-color: var(--color-accent-hover);
|
|
170
|
+
transform: translateY(-1px);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.btn-ghost:active {
|
|
174
|
+
transform: translateY(0px);
|
|
175
|
+
background-color: var(--color-accent-subtle);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* --- Card (N13 — distinct radius from button) ----------------------------- */
|
|
179
|
+
|
|
180
|
+
.card {
|
|
181
|
+
background: var(--color-bg-raised);
|
|
182
|
+
border-radius: var(--radius-card); /* 20px — most generous in system */
|
|
183
|
+
box-shadow: var(--shadow-card);
|
|
184
|
+
padding: var(--space-8);
|
|
185
|
+
transition: box-shadow var(--transition-base),
|
|
186
|
+
transform var(--transition-base);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.card:hover {
|
|
190
|
+
box-shadow: var(--shadow-card-hover);
|
|
191
|
+
transform: translateY(-2px);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* --- Badge (N13 — distinct radius from card and button) ------------------- */
|
|
195
|
+
|
|
196
|
+
.badge {
|
|
197
|
+
display: inline-flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
gap: var(--space-1);
|
|
200
|
+
padding: 3px 10px;
|
|
201
|
+
border-radius: var(--radius-pill); /* pill — categorical difference */
|
|
202
|
+
font-size: 0.75rem;
|
|
203
|
+
font-weight: 400;
|
|
204
|
+
letter-spacing: 0.06em;
|
|
205
|
+
text-transform: uppercase;
|
|
206
|
+
background-color: var(--color-bg-sunken);
|
|
207
|
+
color: var(--color-fg-muted);
|
|
208
|
+
border: none;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* --- Input (N13, N15, N18 compliance) ------------------------------------ */
|
|
212
|
+
|
|
213
|
+
.input {
|
|
214
|
+
display: block;
|
|
215
|
+
width: 100%;
|
|
216
|
+
padding: 10px 16px;
|
|
217
|
+
border-radius: var(--radius-input); /* 12px — distinct from card and btn */
|
|
218
|
+
font-size: 0.9375rem;
|
|
219
|
+
font-weight: 400;
|
|
220
|
+
background-color: var(--color-bg);
|
|
221
|
+
color: var(--color-fg);
|
|
222
|
+
border: 1px solid var(--color-border);
|
|
223
|
+
transition: border-color var(--transition-fast);
|
|
224
|
+
-webkit-appearance: none;
|
|
225
|
+
appearance: none;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.input::placeholder { color: var(--color-fg-faint); }
|
|
229
|
+
|
|
230
|
+
.input:focus {
|
|
231
|
+
outline: none;
|
|
232
|
+
border-color: var(--color-fg);
|
|
233
|
+
box-shadow: 0 0 0 2px var(--color-accent-subtle); /* custom focus ring — N18 */
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* ==========================================================================
|
|
237
|
+
4. Utility Classes — Animations, Reveals, Layout Helpers
|
|
238
|
+
========================================================================== */
|
|
239
|
+
|
|
240
|
+
/* Scroll-triggered reveal (honors prefers-reduced-motion) */
|
|
241
|
+
.reveal {
|
|
242
|
+
opacity: 0;
|
|
243
|
+
transform: translateY(24px);
|
|
244
|
+
transition: opacity var(--transition-slow), transform var(--transition-slow);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.reveal.visible {
|
|
248
|
+
opacity: 1;
|
|
249
|
+
transform: translateY(0);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@media (prefers-reduced-motion: reduce) {
|
|
253
|
+
.reveal,
|
|
254
|
+
.reveal.visible {
|
|
255
|
+
opacity: 1;
|
|
256
|
+
transform: none;
|
|
257
|
+
transition: none;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* Gradient text — luxury monochrome */
|
|
262
|
+
.gradient-text {
|
|
263
|
+
background-image: linear-gradient(135deg, var(--color-fg) 0%, var(--color-fg-muted) 100%);
|
|
264
|
+
-webkit-background-clip: text;
|
|
265
|
+
background-clip: text;
|
|
266
|
+
-webkit-text-fill-color: transparent;
|
|
267
|
+
color: transparent;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Glass — clean, near-invisible */
|
|
271
|
+
.glass {
|
|
272
|
+
background: rgba(255, 255, 255, 0.85);
|
|
273
|
+
backdrop-filter: blur(16px);
|
|
274
|
+
-webkit-backdrop-filter: blur(16px);
|
|
275
|
+
border: 1px solid var(--color-border);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* Divider — spacing only, no visible line (craft profile) */
|
|
279
|
+
.divider {
|
|
280
|
+
height: var(--space-12); /* spacing creates the visual break — no line */
|
|
281
|
+
border: none;
|
|
282
|
+
background: none;
|
|
283
|
+
display: block;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* Icon container — near-invisible, no background (craft profile) */
|
|
287
|
+
.icon-container {
|
|
288
|
+
display: inline-flex;
|
|
289
|
+
align-items: center;
|
|
290
|
+
justify-content: center;
|
|
291
|
+
width: var(--icon-feature);
|
|
292
|
+
height: var(--icon-feature);
|
|
293
|
+
color: var(--color-fg-faint); /* near-invisible */
|
|
294
|
+
flex-shrink: 0;
|
|
295
|
+
}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* technical.css — Foundation for the technical-dense archetype
|
|
3
|
+
*
|
|
4
|
+
* Archetype ID: technical-dense
|
|
5
|
+
* Craft profile (reference-corpus.md):
|
|
6
|
+
* radius system: tight — 8px card / 6px input / 4px button
|
|
7
|
+
* button style: sharp, mono-label; no gradient; high-contrast border on ghost
|
|
8
|
+
* divider style: hairline 1px solid at 8% opacity
|
|
9
|
+
* icon treatment: monochrome, small (16px), uniform
|
|
10
|
+
*
|
|
11
|
+
* Override --color-accent (and related tokens) via a :root block in the
|
|
12
|
+
* generated page to brand this foundation without touching the file.
|
|
13
|
+
*
|
|
14
|
+
* Issue: #1048 — custom CSS component library per archetype
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* --- 1. Design Tokens --- */
|
|
18
|
+
|
|
19
|
+
:root {
|
|
20
|
+
/* Accent — override per brand */
|
|
21
|
+
--color-accent: #0ea5e9; /* cool sky blue default */
|
|
22
|
+
--color-accent-subtle: rgba(14, 165, 233, 0.10);
|
|
23
|
+
--color-accent-hover: rgba(14, 165, 233, 0.16);
|
|
24
|
+
|
|
25
|
+
/* Surface palette — dark-first technical */
|
|
26
|
+
--color-bg: #0d1117;
|
|
27
|
+
--color-bg-raised: #161b22;
|
|
28
|
+
--color-bg-sunken: #090d13;
|
|
29
|
+
--color-fg: #e6edf3;
|
|
30
|
+
--color-fg-muted: #8b949e;
|
|
31
|
+
--color-fg-faint: #484f58;
|
|
32
|
+
--color-border: rgba(240, 246, 252, 0.08);
|
|
33
|
+
--color-border-strong: rgba(240, 246, 252, 0.14);
|
|
34
|
+
|
|
35
|
+
/* Code surface */
|
|
36
|
+
--code-bg: rgba(240, 246, 252, 0.06);
|
|
37
|
+
|
|
38
|
+
/* Radius system — tight, at least 3 distinct values (N13 compliance) */
|
|
39
|
+
--radius-sm: 2px; /* tags / micro elements */
|
|
40
|
+
--radius-btn: 4px; /* button — tight, sharp */
|
|
41
|
+
--radius-input: 6px; /* input — slightly more than button */
|
|
42
|
+
--radius-card: 8px; /* card — most generous in this system */
|
|
43
|
+
--radius-pill: 9999px; /* pill badge */
|
|
44
|
+
|
|
45
|
+
/* Shadow tokens — cool, flat, low-spread */
|
|
46
|
+
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.24),
|
|
47
|
+
0 0 0 1px rgba(240, 246, 252, 0.08);
|
|
48
|
+
--shadow-card-hover: 0 4px 16px rgba(0, 0, 0, 0.32),
|
|
49
|
+
0 0 0 1px rgba(240, 246, 252, 0.14);
|
|
50
|
+
--shadow-btn: none; /* technical: no shadow on primary */
|
|
51
|
+
--shadow-elevated: 0 8px 32px rgba(0, 0, 0, 0.40);
|
|
52
|
+
|
|
53
|
+
/* Transition — crisp, fast */
|
|
54
|
+
--transition-fast: 120ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
55
|
+
--transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
56
|
+
--transition-slow: 320ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
57
|
+
|
|
58
|
+
/* Spacing scale */
|
|
59
|
+
--space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px;
|
|
60
|
+
--space-6:24px; --space-8:32px; --space-12:48px; --space-16:64px; --space-24:96px;
|
|
61
|
+
|
|
62
|
+
/* Icon sizing — uniform 16px (craft profile: monochrome, small, uniform) */
|
|
63
|
+
--icon-feature: 16px;
|
|
64
|
+
--icon-nav: 16px;
|
|
65
|
+
--icon-inline: 14px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* --- 2. Element Overrides (N18 compliance) --- */
|
|
69
|
+
|
|
70
|
+
/* Custom selection — cool accent tint */
|
|
71
|
+
::selection {
|
|
72
|
+
background: var(--color-accent-subtle);
|
|
73
|
+
color: var(--color-fg);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Custom focus ring — technical accent (N18, N15 compliance) */
|
|
77
|
+
:focus-visible {
|
|
78
|
+
outline: 2px solid var(--color-accent);
|
|
79
|
+
outline-offset: 2px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Custom scrollbar — thin, cool-dark theme */
|
|
83
|
+
::-webkit-scrollbar { width: 5px; height: 5px; }
|
|
84
|
+
::-webkit-scrollbar-track { background: var(--color-bg-sunken); }
|
|
85
|
+
::-webkit-scrollbar-thumb {
|
|
86
|
+
background: var(--color-border-strong);
|
|
87
|
+
border-radius: var(--radius-sm);
|
|
88
|
+
}
|
|
89
|
+
::-webkit-scrollbar-thumb:hover { background: var(--color-fg-muted); }
|
|
90
|
+
|
|
91
|
+
/* Code blocks — dark, dense */
|
|
92
|
+
code, kbd {
|
|
93
|
+
background: var(--code-bg);
|
|
94
|
+
border-radius: var(--radius-sm);
|
|
95
|
+
padding: 2px 6px;
|
|
96
|
+
font-size: 0.875em;
|
|
97
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
98
|
+
color: var(--color-fg);
|
|
99
|
+
border: 1px solid var(--color-border);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Links — custom underline treatment (N17 compliance) */
|
|
103
|
+
a:not([class]) {
|
|
104
|
+
color: var(--color-accent);
|
|
105
|
+
text-decoration: underline;
|
|
106
|
+
text-decoration-color: transparent;
|
|
107
|
+
text-underline-offset: 3px;
|
|
108
|
+
text-decoration-thickness: 1px;
|
|
109
|
+
transition: text-decoration-color var(--transition-fast);
|
|
110
|
+
}
|
|
111
|
+
a:not([class]):hover {
|
|
112
|
+
text-decoration-color: var(--color-accent);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* --- 3. Component Classes --- */
|
|
116
|
+
|
|
117
|
+
/* --- Button --- */
|
|
118
|
+
|
|
119
|
+
.btn {
|
|
120
|
+
display: inline-flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
gap: var(--space-2);
|
|
123
|
+
padding: 8px 16px;
|
|
124
|
+
border-radius: var(--radius-btn); /* 4px — sharp, technical */
|
|
125
|
+
font-size: 0.875rem;
|
|
126
|
+
font-weight: 500;
|
|
127
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
128
|
+
line-height: 1;
|
|
129
|
+
letter-spacing: 0.02em;
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
white-space: nowrap;
|
|
132
|
+
transition: background-color var(--transition-fast),
|
|
133
|
+
border-color var(--transition-fast),
|
|
134
|
+
transform var(--transition-fast);
|
|
135
|
+
/* Flat fill with high-contrast border — technical depth signal (N14) */
|
|
136
|
+
background-color: var(--color-accent);
|
|
137
|
+
color: #fff;
|
|
138
|
+
border: 1px solid transparent;
|
|
139
|
+
box-shadow: none;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.btn:hover {
|
|
143
|
+
background-color: color-mix(in srgb, var(--color-accent) 85%, #000);
|
|
144
|
+
transform: translateY(-1px); /* lift on hover — N20 compliance */
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.btn:active {
|
|
148
|
+
transform: translateY(0px); /* press-down — N20 compliance */
|
|
149
|
+
background-color: color-mix(in srgb, var(--color-accent) 75%, #000);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.btn:focus-visible {
|
|
153
|
+
outline: 2px solid var(--color-accent);
|
|
154
|
+
outline-offset: 2px; /* custom focus ring — N18 compliance */
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Ghost — high-contrast border (craft profile: "high-contrast border on ghost") */
|
|
158
|
+
.btn-ghost {
|
|
159
|
+
background-color: transparent;
|
|
160
|
+
color: var(--color-fg);
|
|
161
|
+
border: 1px solid var(--color-border-strong);
|
|
162
|
+
box-shadow: none;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.btn-ghost:hover {
|
|
166
|
+
background-color: var(--color-bg-raised);
|
|
167
|
+
border-color: var(--color-fg-muted);
|
|
168
|
+
transform: translateY(-1px);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.btn-ghost:active {
|
|
172
|
+
transform: translateY(0px);
|
|
173
|
+
background-color: var(--color-bg-sunken);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* --- Card --- */
|
|
177
|
+
|
|
178
|
+
.card {
|
|
179
|
+
background: var(--color-bg-raised);
|
|
180
|
+
border-radius: var(--radius-card); /* 8px — tight, dense */
|
|
181
|
+
box-shadow: var(--shadow-card);
|
|
182
|
+
padding: var(--space-4);
|
|
183
|
+
transition: box-shadow var(--transition-base),
|
|
184
|
+
transform var(--transition-base);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.card:hover {
|
|
188
|
+
box-shadow: var(--shadow-card-hover);
|
|
189
|
+
transform: translateY(-1px);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* --- Badge --- */
|
|
193
|
+
|
|
194
|
+
.badge {
|
|
195
|
+
display: inline-flex;
|
|
196
|
+
align-items: center;
|
|
197
|
+
gap: var(--space-1);
|
|
198
|
+
padding: 2px 8px;
|
|
199
|
+
border-radius: var(--radius-pill); /* pill — categorical difference */
|
|
200
|
+
font-size: 0.6875rem;
|
|
201
|
+
font-weight: 500;
|
|
202
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
203
|
+
letter-spacing: 0.05em;
|
|
204
|
+
text-transform: uppercase;
|
|
205
|
+
background-color: var(--color-accent-subtle);
|
|
206
|
+
color: var(--color-accent);
|
|
207
|
+
border: 1px solid rgba(14, 165, 233, 0.20);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* --- Input --- */
|
|
211
|
+
|
|
212
|
+
.input {
|
|
213
|
+
display: block;
|
|
214
|
+
width: 100%;
|
|
215
|
+
padding: 8px 12px;
|
|
216
|
+
border-radius: var(--radius-input); /* 6px — distinct from card and btn */
|
|
217
|
+
font-size: 0.875rem;
|
|
218
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
219
|
+
background-color: var(--color-bg-sunken);
|
|
220
|
+
color: var(--color-fg);
|
|
221
|
+
border: 1px solid var(--color-border-strong);
|
|
222
|
+
transition: border-color var(--transition-fast),
|
|
223
|
+
box-shadow var(--transition-fast);
|
|
224
|
+
-webkit-appearance: none;
|
|
225
|
+
appearance: none;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.input::placeholder { color: var(--color-fg-faint); }
|
|
229
|
+
|
|
230
|
+
.input:focus {
|
|
231
|
+
outline: none;
|
|
232
|
+
border-color: var(--color-accent);
|
|
233
|
+
box-shadow: 0 0 0 3px var(--color-accent-subtle); /* custom focus ring — N18 */
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* --- 4. Utility Classes --- */
|
|
237
|
+
|
|
238
|
+
/* Scroll-triggered reveal (honors prefers-reduced-motion) */
|
|
239
|
+
.reveal {
|
|
240
|
+
opacity: 0;
|
|
241
|
+
transform: translateY(16px);
|
|
242
|
+
transition: opacity var(--transition-slow), transform var(--transition-slow);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.reveal.visible {
|
|
246
|
+
opacity: 1;
|
|
247
|
+
transform: translateY(0);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
@media (prefers-reduced-motion: reduce) {
|
|
251
|
+
.reveal,
|
|
252
|
+
.reveal.visible {
|
|
253
|
+
opacity: 1;
|
|
254
|
+
transform: none;
|
|
255
|
+
transition: none;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Gradient text — technical cool-to-accent */
|
|
260
|
+
.gradient-text {
|
|
261
|
+
background-image: linear-gradient(135deg, var(--color-accent) 0%, #38bdf8 100%);
|
|
262
|
+
-webkit-background-clip: text;
|
|
263
|
+
background-clip: text;
|
|
264
|
+
-webkit-text-fill-color: transparent;
|
|
265
|
+
color: transparent;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* Glass — dark, technical tint */
|
|
269
|
+
.glass {
|
|
270
|
+
background: rgba(22, 27, 34, 0.80);
|
|
271
|
+
backdrop-filter: blur(8px);
|
|
272
|
+
-webkit-backdrop-filter: blur(8px);
|
|
273
|
+
border: 1px solid var(--color-border);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* Divider — hairline 1px solid at 8% opacity (craft profile) */
|
|
277
|
+
.divider {
|
|
278
|
+
height: 1px;
|
|
279
|
+
border: none;
|
|
280
|
+
background: var(--color-border); /* 8% opacity border = hairline */
|
|
281
|
+
margin: var(--space-8) 0;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* Icon container — no tinted background (craft profile: monochrome, no container) */
|
|
285
|
+
.icon-container {
|
|
286
|
+
display: inline-flex;
|
|
287
|
+
align-items: center;
|
|
288
|
+
justify-content: center;
|
|
289
|
+
width: var(--icon-feature);
|
|
290
|
+
height: var(--icon-feature);
|
|
291
|
+
color: var(--color-fg-muted);
|
|
292
|
+
flex-shrink: 0;
|
|
293
|
+
}
|