@inixiative/config 0.5.183 → 0.5.184

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Inixiative
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -6,44 +6,32 @@ Shared toolchain for the inixiative ecosystem: tsconfig/biome/tsup presets, a ve
6
6
 
7
7
  | Export | Use |
8
8
  | --- | --- |
9
- | `@inixiative/config/tsconfig/base.json` | bun library (bundler resolution, verbatimModuleSyntax, `types: ["bun"]`) |
10
- | `@inixiative/config/tsconfig/node.json` | base + `types: ["node"]` |
11
- | `@inixiative/config/tsconfig/react.json` | base + DOM lib + `jsx: react-jsx` |
12
- | `@inixiative/config/biome/base.json` | formatter + linter core (single quotes, lineWidth 100, recommended + strictness block) |
13
- | `@inixiative/config/biome/react.json` | overlay: hook dependency linting |
14
- | `@inixiative/config/tsup` | `node(options)` / `react(options)` build presets |
15
- | `@inixiative/config/lefthook/base.yml` | pre-commit hooks: typecheck + biome on staged files |
16
-
17
- Adoption is three stub files plus the devDependency:
18
-
19
- ```jsonc
20
- // tsconfig.json
21
- { "extends": "@inixiative/config/tsconfig/base.json", "exclude": ["dist"] }
22
-
23
- // biome.json
24
- { "extends": ["@inixiative/config/biome/base.json"] }
25
- ```
26
-
27
- ```ts
28
- // tsup.config.ts
29
- import { node } from '@inixiative/config/tsup';
30
-
31
- export default node();
32
- ```
9
+ | `@inixiative/config/theme/public.css` | the brand: base, `--app-*` slots, status (`--success` / `--warning` / `--error`), UI (incl. `--shadow`) and type tokens, plus `@font-face` for Bricolage Grotesque, Instrument Sans and JetBrains Mono |
10
+ | `@inixiative/config/theme/status.css` | the thread/work status layer (`--status-problem / attention / working / queued / done / idle / archived`) and the badge layer, for apps that show agent work |
11
+ | `@inixiative/config/theme/domains.css` | four palettes on one structure, set with `data-domain="agentic \| building-blocks \| governance \| inixiative"` on any element; they nest |
12
+ | `@inixiative/config/theme/marketing.css` | the marketing grammar: fluid type scale, spacing and section rhythm, container and gutter, radius, elevation and motion tokens (zeroed under `prefers-reduced-motion`), and the shared classes inside `.marketing` (`eyebrow` + `status-dot`, `button` / `button-secondary` / `text-link`, `nav`, `brand`, `section`, `card`, `card-grid`, `footer`, `prose`, all in `@layer components` so Tailwind utilities and unlayered page CSS override them) |
13
+ | `@inixiative/config/theme/fonts/*` | the latin variable fonts `public.css` loads (SIL OFL 1.1, texts in `theme/fonts/LICENSES.md`) |
33
14
 
34
- Stubs hold `extends` plus minimal reviewed overrides only. This package never generates config bodies.
15
+ Apps load `public.css`, then `status.css`, then their own CSS. Marketing pages load `public.css`, `domains.css`, then `marketing.css` (after template's `theme.css` where an app has it: `[data-domain]` ties `:root`/`.dark` on specificity, so load order decides), and put `class="marketing" data-domain="…"` on the page root. Light is `:root`; dark is the `.dark` class on `<html>`. Values are HSL channels: `hsl(var(--app-primary))`, `hsl(var(--border) / .5)`. The fonts load from `./fonts/` relative to `public.css`, so serve the folder as it ships. `demo/marketing.html` (not shipped) shows every domain, the type scale, buttons, sections and long-form prose; open it from a checkout.
35
16
 
36
- ## Theme
17
+ ### Domain palettes
37
18
 
38
- The inixiative look, read at runtime by every app that wears it (Kingdom, Foundry), so a decision about the look lands in all of them with the next release.
19
+ Each palette fills the same four slots; marketing CSS reads the slots directly (`--app-primary`), because template's `--primary` is resolved once on `:root` and does not follow a nested `data-domain`. The primary is the page's one accent (CTA, eyebrow, wordmark stop). Tertiary and quaternary appear only where they mean something (agentic: blue = shared, pink = Signet). `inixiative` is neutral ink; its secondary, tertiary and quaternary are the agentic, building-blocks and governance primaries, so each door on the hub can wear its domain. Long-form reading (`.prose`) is set for the light theme.
39
20
 
40
- | Export | Use |
41
- | --- | --- |
42
- | `@inixiative/config/theme/public.css` | the brand: base, `--app-*`, status (`--success` / `--warning` / `--error`), UI and type tokens, plus `@font-face` for Bricolage Grotesque, Instrument Sans and JetBrains Mono |
43
- | `@inixiative/config/theme/agentic.css` | the status layer (`--status-problem / attention / working / queued / done / idle / archived`) and the badge layer, for apps that show agent work |
44
- | `@inixiative/config/theme/fonts/*` | the latin variable fonts `public.css` loads (SIL OFL 1.1, texts in `theme/fonts/LICENSES.md`) |
21
+ Contrast as text on the background (light `#f6f7f2`, dark ink `#0b1014`); the test holds every accent at 4.5:1 or more on the background and the card, and each accent's foreground on the accent.
45
22
 
46
- Load `public.css`, then `agentic.css`, then the app's own CSS. Light is `:root`; dark is the `.dark` class on `<html>`. Values are HSL channels: `hsl(var(--app-primary))`, `hsl(var(--border) / .5)`. The fonts load from `./fonts/` relative to `public.css`, so serve the folder as it ships.
23
+ | Domain | Slot | Light | on `#f6f7f2` | Dark | on ink |
24
+ | --- | --- | --- | --- | --- | --- |
25
+ | agentic | primary | `#466713` | 6.08 | `#c8f77e` | 15.53 |
26
+ | agentic | tertiary (shared) | `#1e69b8` | 5.18 | `#94c8ff` | 10.89 |
27
+ | agentic | quaternary (Signet) | `#a33e84` | 5.45 | `#f1b7e2` | 11.48 |
28
+ | building-blocks | primary (amber) | `#955104` | 5.64 | `#faba4c` | 11.10 |
29
+ | building-blocks | tertiary (teal) | `#0c6d6e` | 5.69 | `#51d6cd` | 10.79 |
30
+ | building-blocks | quaternary (brick) | `#ae3f29` | 5.51 | `#f9a18b` | 9.56 |
31
+ | governance | primary (violet) | `#613bba` | 6.86 | `#c0a7fb` | 9.25 |
32
+ | governance | tertiary (jade) | `#12684e` | 6.26 | `#66d6ad` | 10.73 |
33
+ | governance | quaternary (rose) | `#a92d42` | 6.21 | `#fba7b8` | 10.31 |
34
+ | inixiative | primary (ink) | `#0d1317` | 17.37 | `#eff2ed` | 16.93 |
47
35
 
48
36
  Apps load the theme from this package at runtime, so it is a runtime `dependency` of theirs. To keep that cheap this package has no runtime dependencies and every peer is optional; a test holds both.
49
37
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inixiative/config",
3
- "version": "0.5.183",
3
+ "version": "0.5.184",
4
4
  "description": "Shared toolchain for the inixiative ecosystem: tsconfig/biome/tsup presets, a version manifest (BOM), and a sync/check CLI",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -39,7 +39,9 @@
39
39
  },
40
40
  "./ports.json": "./ports.json",
41
41
  "./theme/public.css": "./theme/public.css",
42
- "./theme/agentic.css": "./theme/agentic.css",
42
+ "./theme/status.css": "./theme/status.css",
43
+ "./theme/domains.css": "./theme/domains.css",
44
+ "./theme/marketing.css": "./theme/marketing.css",
43
45
  "./theme/fonts/*": "./theme/fonts/*"
44
46
  },
45
47
  "scripts": {
@@ -0,0 +1,137 @@
1
+ /*
2
+ * @inixiative/config/theme/domains.css — one structure, four palettes (Aron, 2026-11-02).
3
+ *
4
+ * Load after theme/public.css. A palette is the four --app-* slots (primary, secondary, tertiary,
5
+ * quaternary, each with its foreground) plus --ring, set on any element with `data-domain`:
6
+ * agentic Kingdom, Foundry, Archive, Oracle: lime = yours, blue = shared, pink = Signet (public.css's own values)
7
+ * building-blocks the primitives (json-rules, permissions, transitions, …): amber, teal, brick
8
+ * governance the whitepaper and proposals: violet, jade, rose
9
+ * inixiative the org: neutral ink; secondary/tertiary/quaternary are the three domain primaries
10
+ * Why an attribute and not one file per palette: palettes nest. The hub is `inixiative` and each door
11
+ * inside it wears its own domain (`<a data-domain="governance">`); a file per palette can't do that.
12
+ * Why raw tokens per mode and plain mappings: the `[data-domain]` rules hold no colour, so they work in
13
+ * light and dark alike and at any depth. Read slots directly (hsl(var(--app-primary))): template's
14
+ * --primary is resolved once on :root and does not follow a nested data-domain.
15
+ * Every primary, tertiary and quaternary is AA (4.5:1) as text on its mode's background and card;
16
+ * the ratios are in the README.
17
+ */
18
+
19
+ :root {
20
+ --agentic-primary: 84 69% 24%;
21
+ --agentic-primary-foreground: 70 25% 97%;
22
+ --agentic-secondary: 80 14% 91%;
23
+ --agentic-secondary-foreground: 206 29% 10%;
24
+ --agentic-tertiary: 211 72% 42%;
25
+ --agentic-tertiary-foreground: 0 0% 100%;
26
+ --agentic-quaternary: 318 45% 44%;
27
+ --agentic-quaternary-foreground: 0 0% 100%;
28
+ --agentic-ring: 84 69% 30%;
29
+
30
+ --building-blocks-primary: 32 95% 30%;
31
+ --building-blocks-primary-foreground: 70 25% 97%;
32
+ --building-blocks-secondary: 36 20% 91%;
33
+ --building-blocks-secondary-foreground: 206 29% 10%;
34
+ --building-blocks-tertiary: 181 80% 24%;
35
+ --building-blocks-tertiary-foreground: 0 0% 100%;
36
+ --building-blocks-quaternary: 10 62% 42%;
37
+ --building-blocks-quaternary-foreground: 0 0% 100%;
38
+ --building-blocks-ring: 32 95% 30%;
39
+
40
+ --governance-primary: 258 52% 48%;
41
+ --governance-primary-foreground: 0 0% 100%;
42
+ --governance-secondary: 255 18% 92%;
43
+ --governance-secondary-foreground: 206 29% 10%;
44
+ --governance-tertiary: 162 70% 24%;
45
+ --governance-tertiary-foreground: 0 0% 100%;
46
+ --governance-quaternary: 350 58% 42%;
47
+ --governance-quaternary-foreground: 0 0% 100%;
48
+ --governance-ring: 258 52% 48%;
49
+
50
+ --inixiative-primary: 206 29% 7%;
51
+ --inixiative-primary-foreground: 70 25% 97%;
52
+ --inixiative-ring: 206 29% 7%;
53
+ }
54
+
55
+ .dark {
56
+ --agentic-primary: 83 88% 73%;
57
+ --agentic-primary-foreground: 206 29% 6%;
58
+ --agentic-secondary: 204 25% 12%;
59
+ --agentic-secondary-foreground: 96 17% 94%;
60
+ --agentic-tertiary: 211 100% 79%;
61
+ --agentic-tertiary-foreground: 206 29% 6%;
62
+ --agentic-quaternary: 315 67% 83%;
63
+ --agentic-quaternary-foreground: 206 29% 6%;
64
+ --agentic-ring: 83 88% 73%;
65
+
66
+ --building-blocks-primary: 38 95% 64%;
67
+ --building-blocks-primary-foreground: 206 29% 6%;
68
+ --building-blocks-secondary: 30 16% 12%;
69
+ --building-blocks-secondary-foreground: 96 17% 94%;
70
+ --building-blocks-tertiary: 176 62% 58%;
71
+ --building-blocks-tertiary-foreground: 206 29% 6%;
72
+ --building-blocks-quaternary: 12 90% 76%;
73
+ --building-blocks-quaternary-foreground: 206 29% 6%;
74
+ --building-blocks-ring: 38 95% 64%;
75
+
76
+ --governance-primary: 258 92% 82%;
77
+ --governance-primary-foreground: 206 29% 6%;
78
+ --governance-secondary: 250 18% 13%;
79
+ --governance-secondary-foreground: 96 17% 94%;
80
+ --governance-tertiary: 158 58% 62%;
81
+ --governance-tertiary-foreground: 206 29% 6%;
82
+ --governance-quaternary: 348 92% 82%;
83
+ --governance-quaternary-foreground: 206 29% 6%;
84
+ --governance-ring: 258 92% 82%;
85
+
86
+ --inixiative-primary: 96 17% 94%;
87
+ --inixiative-primary-foreground: 206 29% 6%;
88
+ --inixiative-ring: 96 17% 94%;
89
+ }
90
+
91
+ [data-domain="agentic"] {
92
+ --app-primary: var(--agentic-primary);
93
+ --app-primary-foreground: var(--agentic-primary-foreground);
94
+ --app-secondary: var(--agentic-secondary);
95
+ --app-secondary-foreground: var(--agentic-secondary-foreground);
96
+ --app-tertiary: var(--agentic-tertiary);
97
+ --app-tertiary-foreground: var(--agentic-tertiary-foreground);
98
+ --app-quaternary: var(--agentic-quaternary);
99
+ --app-quaternary-foreground: var(--agentic-quaternary-foreground);
100
+ --ring: var(--agentic-ring);
101
+ }
102
+
103
+ [data-domain="building-blocks"] {
104
+ --app-primary: var(--building-blocks-primary);
105
+ --app-primary-foreground: var(--building-blocks-primary-foreground);
106
+ --app-secondary: var(--building-blocks-secondary);
107
+ --app-secondary-foreground: var(--building-blocks-secondary-foreground);
108
+ --app-tertiary: var(--building-blocks-tertiary);
109
+ --app-tertiary-foreground: var(--building-blocks-tertiary-foreground);
110
+ --app-quaternary: var(--building-blocks-quaternary);
111
+ --app-quaternary-foreground: var(--building-blocks-quaternary-foreground);
112
+ --ring: var(--building-blocks-ring);
113
+ }
114
+
115
+ [data-domain="governance"] {
116
+ --app-primary: var(--governance-primary);
117
+ --app-primary-foreground: var(--governance-primary-foreground);
118
+ --app-secondary: var(--governance-secondary);
119
+ --app-secondary-foreground: var(--governance-secondary-foreground);
120
+ --app-tertiary: var(--governance-tertiary);
121
+ --app-tertiary-foreground: var(--governance-tertiary-foreground);
122
+ --app-quaternary: var(--governance-quaternary);
123
+ --app-quaternary-foreground: var(--governance-quaternary-foreground);
124
+ --ring: var(--governance-ring);
125
+ }
126
+
127
+ [data-domain="inixiative"] {
128
+ --app-primary: var(--inixiative-primary);
129
+ --app-primary-foreground: var(--inixiative-primary-foreground);
130
+ --app-secondary: var(--agentic-primary);
131
+ --app-secondary-foreground: var(--agentic-primary-foreground);
132
+ --app-tertiary: var(--building-blocks-primary);
133
+ --app-tertiary-foreground: var(--building-blocks-primary-foreground);
134
+ --app-quaternary: var(--governance-primary);
135
+ --app-quaternary-foreground: var(--governance-primary-foreground);
136
+ --ring: var(--inixiative-ring);
137
+ }
@@ -0,0 +1,513 @@
1
+ /*
2
+ * @inixiative/config/theme/marketing.css — the marketing grammar: scales and the shared page classes.
3
+ *
4
+ * Load after theme/public.css and theme/domains.css. Lifted from Kingdom's landing (apps/web/app/components/landing),
5
+ * so the hub, Kingdom's landing and every product page share one type scale, rhythm and set of parts.
6
+ * Colour comes only from public.css and domains.css tokens; this file holds none of its own.
7
+ * Classes apply inside `.marketing` (put it on the page root, with a `data-domain`). They sit in
8
+ * `@layer components` behind :where(), so Tailwind's utilities (a later layer) and any unlayered page CSS win.
9
+ * Rules the grammar carries: the domain primary is the one accent (CTA, eyebrow, wordmark stop); tertiary
10
+ * and quaternary only appear where they mean something (agentic: shared, Signet). Motion means live: only
11
+ * `.status-dot[data-live]` animates, and nothing moves under prefers-reduced-motion. Long-form reading
12
+ * (`.prose`) is set for the light theme: give that page no `.dark`.
13
+ */
14
+
15
+ :root {
16
+ /* Type: fluid steps, 640px → 1440px viewport */
17
+ --text-display-1: clamp(2.25rem, 1.05rem + 3vw, 3.75rem);
18
+ --text-display-2: clamp(2rem, 1.2rem + 2vw, 3rem);
19
+ --text-display-3: clamp(1.75rem, 1.05rem + 1.75vw, 2.625rem);
20
+ --text-heading-1: clamp(1.625rem, 1.125rem + 1.25vw, 2.25rem);
21
+ --text-heading-2: clamp(1.25rem, 0.95rem + 0.75vw, 1.625rem);
22
+ --text-heading-3: clamp(1.1875rem, 1.0375rem + 0.375vw, 1.375rem);
23
+ --text-lede: clamp(1.0625rem, 1rem + 0.25vw, 1.1875rem);
24
+ --text-body: 1rem;
25
+ --text-small: 0.9375rem;
26
+ --text-caption: 0.8125rem;
27
+ --text-eyebrow: 0.75rem;
28
+ --text-micro: 0.6875rem;
29
+
30
+ --leading-display: 1.04;
31
+ --leading-heading: 1.12;
32
+ --leading-body: 1.6;
33
+ --leading-prose: 1.72;
34
+
35
+ --tracking-display: -0.03em;
36
+ --tracking-heading: -0.02em;
37
+ --tracking-eyebrow: 0.14em;
38
+ --tracking-label: 0.1em;
39
+
40
+ --weight-display: 750;
41
+ --weight-heading: 650;
42
+ --weight-strong: 600;
43
+
44
+ /* Spacing: 4px base */
45
+ --gap-1: 0.25rem;
46
+ --gap-2: 0.5rem;
47
+ --gap-3: 0.75rem;
48
+ --gap-4: 1rem;
49
+ --gap-5: 1.25rem;
50
+ --gap-6: 1.5rem;
51
+ --gap-7: 2rem;
52
+ --gap-8: 3rem;
53
+ --gap-9: 4rem;
54
+ --gap-10: 6rem;
55
+
56
+ /* Section rhythm and containers */
57
+ --section-padding: clamp(4rem, 2rem + 5vw, 6.5rem);
58
+ --section-padding-compact: 2.25rem;
59
+ --section-gap: var(--gap-8);
60
+ --container-max: 82.5rem;
61
+ --container-heading: 42.5rem;
62
+ --measure: 68ch;
63
+ --gutter: clamp(1rem, -0.5rem + 4vw, 3rem);
64
+ --nav-height: clamp(4.5rem, 3.5rem + 2vw, 5.5rem);
65
+
66
+ /* Radius (numbered, so Tailwind's --radius-sm/md/lg stay Tailwind's) */
67
+ --radius-1: 0.375rem;
68
+ --radius-2: 0.5rem;
69
+ --radius-3: 0.75rem;
70
+ --radius-4: 1rem;
71
+ --radius-5: 1.25rem;
72
+ --radius-pill: 999px;
73
+
74
+ /* Motion */
75
+ --duration-fast: 150ms;
76
+ --duration-base: 200ms;
77
+ --duration-slow: 250ms;
78
+ --duration-scene: 500ms;
79
+ --duration-live: 2.4s;
80
+ --ease-standard: cubic-bezier(0.2, 0.7, 0.2, 1);
81
+ --ease-move: cubic-bezier(0.5, 0, 0.2, 1);
82
+ --lift: -1px;
83
+
84
+ /* Elevation (paper cards staged as objects) */
85
+ --elevation-1: 0 18px 40px -24px hsl(var(--shadow) / 0.45);
86
+ --elevation-2: 0 30px 60px -30px hsl(var(--shadow) / 0.6);
87
+ }
88
+
89
+ @media (prefers-reduced-motion: reduce) {
90
+ :root {
91
+ --duration-fast: 0ms;
92
+ --duration-base: 0ms;
93
+ --duration-slow: 0ms;
94
+ --duration-scene: 0ms;
95
+ --lift: 0px;
96
+ }
97
+ :where(.marketing) .status-dot[data-live] {
98
+ animation: none;
99
+ }
100
+ }
101
+
102
+ @layer components {
103
+ :where(.marketing) {
104
+ background: hsl(var(--background));
105
+ color: hsl(var(--foreground));
106
+ font-family: var(--font-sans);
107
+ font-size: var(--text-body);
108
+ line-height: var(--leading-body);
109
+ -webkit-font-smoothing: antialiased;
110
+ color-scheme: light;
111
+ }
112
+ :where(.dark .marketing, .marketing.dark) {
113
+ color-scheme: dark;
114
+ }
115
+ :where(.marketing) *,
116
+ :where(.marketing) *::before,
117
+ :where(.marketing) *::after {
118
+ box-sizing: border-box;
119
+ }
120
+ :where(.marketing) a {
121
+ color: inherit;
122
+ text-decoration: none;
123
+ }
124
+ :where(.marketing) :focus-visible {
125
+ outline: 2px solid hsl(var(--ring));
126
+ outline-offset: 4px;
127
+ border-radius: var(--radius-1);
128
+ }
129
+ :where(.marketing) :is(h1, h2, h3, h4),
130
+ :where(.marketing) :is(.display-1, .display-2, .display-3, .heading-1, .heading-2, .heading-3) {
131
+ margin: 0;
132
+ font-family: var(--font-display);
133
+ font-weight: var(--weight-display);
134
+ letter-spacing: var(--tracking-display);
135
+ line-height: var(--leading-heading);
136
+ text-wrap: balance;
137
+ }
138
+
139
+ :where(.marketing) .display-1 {
140
+ font-size: var(--text-display-1);
141
+ line-height: var(--leading-display);
142
+ }
143
+ :where(.marketing) .display-2 {
144
+ font-size: var(--text-display-2);
145
+ line-height: var(--leading-display);
146
+ }
147
+ :where(.marketing) .display-3 {
148
+ font-size: var(--text-display-3);
149
+ line-height: var(--leading-display);
150
+ }
151
+ :where(.marketing) .heading-1 {
152
+ font-size: var(--text-heading-1);
153
+ }
154
+ :where(.marketing) .heading-2 {
155
+ font-size: var(--text-heading-2);
156
+ font-weight: var(--weight-heading);
157
+ letter-spacing: var(--tracking-heading);
158
+ }
159
+ :where(.marketing) .heading-3 {
160
+ font-size: var(--text-heading-3);
161
+ font-weight: var(--weight-heading);
162
+ letter-spacing: var(--tracking-heading);
163
+ }
164
+ :where(.marketing) .lede {
165
+ margin: 0;
166
+ font-size: var(--text-lede);
167
+ line-height: var(--leading-body);
168
+ color: hsl(var(--muted-foreground));
169
+ }
170
+ :where(.marketing) .accent {
171
+ color: hsl(var(--app-primary));
172
+ }
173
+
174
+ :where(.marketing) .skip {
175
+ position: absolute;
176
+ left: var(--gap-4);
177
+ top: -4rem;
178
+ z-index: 10;
179
+ padding: var(--gap-2) var(--gap-4);
180
+ border-radius: var(--radius-2);
181
+ background: hsl(var(--app-primary));
182
+ color: hsl(var(--app-primary-foreground));
183
+ }
184
+ :where(.marketing) .skip:focus {
185
+ top: var(--gap-4);
186
+ }
187
+
188
+ :where(.marketing) .shell {
189
+ width: 100%;
190
+ max-width: var(--container-max);
191
+ margin: 0 auto;
192
+ padding: 0 var(--gutter);
193
+ }
194
+
195
+ :where(.marketing) .eyebrow {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ gap: var(--gap-3);
199
+ font-family: var(--font-mono);
200
+ font-size: var(--text-eyebrow);
201
+ font-weight: 500;
202
+ letter-spacing: var(--tracking-eyebrow);
203
+ line-height: 1.2;
204
+ text-transform: uppercase;
205
+ color: hsl(var(--app-primary));
206
+ }
207
+ :where(.marketing) .eyebrow[data-quiet] {
208
+ color: hsl(var(--muted-foreground));
209
+ }
210
+ :where(.marketing) .status-dot {
211
+ flex-shrink: 0;
212
+ width: 8px;
213
+ height: 8px;
214
+ border-radius: 50%;
215
+ background: hsl(var(--app-primary));
216
+ box-shadow: 0 0 12px hsl(var(--app-primary));
217
+ }
218
+ :where(.marketing) .status-dot[data-live] {
219
+ animation: marketing-live var(--duration-live) var(--ease-move) infinite;
220
+ }
221
+ @keyframes marketing-live {
222
+ 50% {
223
+ box-shadow: 0 0 2px hsl(var(--app-primary));
224
+ opacity: 0.55;
225
+ }
226
+ }
227
+
228
+ :where(.marketing) .nav {
229
+ height: var(--nav-height);
230
+ display: flex;
231
+ align-items: center;
232
+ gap: var(--gap-7);
233
+ border-bottom: 1px solid hsl(var(--border));
234
+ }
235
+ :where(.marketing) .nav-links {
236
+ display: flex;
237
+ gap: var(--gap-7);
238
+ margin: 0 0 0 auto;
239
+ padding: 0;
240
+ list-style: none;
241
+ }
242
+ :where(.marketing) .nav-links a {
243
+ font-size: var(--text-small);
244
+ color: hsl(var(--muted-foreground));
245
+ transition: color var(--duration-base) var(--ease-standard);
246
+ }
247
+ :where(.marketing) .nav-links a:hover,
248
+ :where(.marketing) .nav-links a[aria-current="page"] {
249
+ color: hsl(var(--foreground));
250
+ }
251
+ :where(.marketing) .brand {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ gap: var(--gap-3);
255
+ font-family: var(--font-display);
256
+ font-size: var(--text-heading-2);
257
+ font-weight: var(--weight-display);
258
+ letter-spacing: var(--tracking-display);
259
+ }
260
+ :where(.marketing) .brand svg {
261
+ width: 1em;
262
+ height: 1.15em;
263
+ color: hsl(var(--app-primary));
264
+ }
265
+ :where(.marketing) .brand-period {
266
+ color: hsl(var(--app-primary));
267
+ }
268
+
269
+ :where(.marketing) .actions {
270
+ display: flex;
271
+ flex-wrap: wrap;
272
+ align-items: center;
273
+ gap: var(--gap-5);
274
+ }
275
+ :where(.marketing) .button {
276
+ display: inline-flex;
277
+ align-items: center;
278
+ justify-content: center;
279
+ gap: var(--gap-3);
280
+ height: 52px;
281
+ padding: 0 var(--gap-6);
282
+ border: 0;
283
+ border-radius: var(--radius-3);
284
+ font: inherit;
285
+ font-size: var(--text-body);
286
+ font-weight: var(--weight-strong);
287
+ background: hsl(var(--app-primary));
288
+ color: hsl(var(--app-primary-foreground));
289
+ cursor: pointer;
290
+ transition:
291
+ transform var(--duration-fast) var(--ease-standard),
292
+ box-shadow var(--duration-base) var(--ease-standard);
293
+ }
294
+ :where(.marketing) .button:hover {
295
+ transform: translateY(var(--lift));
296
+ box-shadow: 0 10px 30px -10px hsl(var(--app-primary) / 0.6);
297
+ }
298
+ :where(.marketing) .button-secondary {
299
+ background: transparent;
300
+ color: hsl(var(--foreground));
301
+ box-shadow: inset 0 0 0 1px hsl(var(--input));
302
+ }
303
+ :where(.marketing) .button-secondary:hover {
304
+ transform: none;
305
+ box-shadow: inset 0 0 0 1px hsl(var(--app-primary));
306
+ }
307
+ :where(.marketing) .button[data-size="small"] {
308
+ height: 42px;
309
+ padding: 0 var(--gap-5);
310
+ border-radius: var(--radius-3);
311
+ font-size: var(--text-small);
312
+ }
313
+ :where(.marketing) .text-link {
314
+ font-weight: 500;
315
+ color: hsl(var(--foreground));
316
+ border-bottom: 1px solid hsl(var(--input));
317
+ padding-bottom: 2px;
318
+ transition: border-color var(--duration-base) var(--ease-standard);
319
+ }
320
+ :where(.marketing) .text-link:hover {
321
+ border-color: hsl(var(--app-primary));
322
+ }
323
+
324
+ :where(.marketing) .section {
325
+ display: flex;
326
+ flex-direction: column;
327
+ gap: var(--section-gap);
328
+ padding: var(--section-padding) 0;
329
+ }
330
+ :where(.marketing) .section[data-compact] {
331
+ gap: var(--gap-5);
332
+ padding: var(--section-padding-compact) 0;
333
+ }
334
+ :where(.marketing) .section + .section,
335
+ :where(.marketing) .section[data-rule] {
336
+ border-top: 1px solid hsl(var(--border));
337
+ }
338
+ :where(.marketing) .section-heading {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: var(--gap-4);
342
+ max-width: var(--container-heading);
343
+ }
344
+ :where(.marketing) .section-heading h2 {
345
+ font-size: var(--text-display-2);
346
+ }
347
+
348
+ :where(.marketing) .card {
349
+ position: relative;
350
+ display: flex;
351
+ flex-direction: column;
352
+ gap: var(--gap-3);
353
+ padding: var(--gap-7);
354
+ border-radius: var(--radius-5);
355
+ overflow: hidden;
356
+ color: hsl(var(--card-foreground));
357
+ background:
358
+ radial-gradient(120% 80% at 0% 0%, hsl(var(--app-primary) / 0.12), transparent 60%),
359
+ hsl(var(--card));
360
+ box-shadow: inset 0 0 0 1px hsl(var(--border));
361
+ transition:
362
+ transform var(--duration-slow) var(--ease-standard),
363
+ box-shadow var(--duration-slow) var(--ease-standard);
364
+ }
365
+ :where(.marketing) .card[data-plain] {
366
+ background: hsl(var(--card));
367
+ }
368
+ :where(.marketing) .card[data-raised] {
369
+ box-shadow:
370
+ inset 0 0 0 1px hsl(var(--border)),
371
+ var(--elevation-2);
372
+ }
373
+ :where(.marketing) :is(a.card, .card[data-interactive]):hover {
374
+ transform: translateY(calc(var(--lift) * 3));
375
+ box-shadow:
376
+ inset 0 0 0 1px hsl(var(--app-primary) / 0.55),
377
+ 0 24px 50px -28px hsl(var(--app-primary) / 0.6);
378
+ }
379
+ :where(.marketing) .card h3 {
380
+ font-size: var(--text-heading-3);
381
+ font-weight: var(--weight-heading);
382
+ letter-spacing: var(--tracking-heading);
383
+ }
384
+ :where(.marketing) .card p {
385
+ margin: 0;
386
+ color: hsl(var(--muted-foreground));
387
+ }
388
+ :where(.marketing) .card-grid {
389
+ display: grid;
390
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
391
+ gap: var(--gap-5);
392
+ }
393
+
394
+ :where(.marketing) .footer {
395
+ display: flex;
396
+ flex-wrap: wrap;
397
+ align-items: center;
398
+ justify-content: space-between;
399
+ gap: var(--gap-6);
400
+ padding: var(--gap-7) 0 var(--gap-8);
401
+ border-top: 1px solid hsl(var(--border));
402
+ font-size: var(--text-small);
403
+ color: hsl(var(--muted-foreground));
404
+ }
405
+ :where(.marketing) .footer .brand {
406
+ font-size: var(--text-heading-3);
407
+ color: hsl(var(--foreground));
408
+ }
409
+ :where(.marketing) .footer-links {
410
+ display: flex;
411
+ flex-wrap: wrap;
412
+ gap: var(--gap-3) var(--gap-6);
413
+ margin: 0;
414
+ padding: 0;
415
+ list-style: none;
416
+ }
417
+ :where(.marketing) .footer-links a:hover {
418
+ color: hsl(var(--foreground));
419
+ }
420
+
421
+ :where(.marketing) .prose {
422
+ max-width: var(--measure);
423
+ font-size: 1.0625rem;
424
+ line-height: var(--leading-prose);
425
+ color: hsl(var(--foreground));
426
+ }
427
+ :where(.marketing) .prose > * + * {
428
+ margin-top: 1.1em;
429
+ }
430
+ :where(.marketing) .prose :is(h2, h3) {
431
+ margin-top: 2.2em;
432
+ }
433
+ :where(.marketing) .prose h2 {
434
+ font-size: var(--text-heading-1);
435
+ }
436
+ :where(.marketing) .prose h3 {
437
+ font-size: var(--text-heading-2);
438
+ font-weight: var(--weight-heading);
439
+ letter-spacing: var(--tracking-heading);
440
+ }
441
+ :where(.marketing) .prose :is(h2, h3) + * {
442
+ margin-top: 0.6em;
443
+ }
444
+ :where(.marketing) .prose p,
445
+ :where(.marketing) .prose :is(ul, ol) {
446
+ margin-bottom: 0;
447
+ }
448
+ :where(.marketing) .prose :is(ul, ol) {
449
+ padding-left: 1.4em;
450
+ }
451
+ :where(.marketing) .prose li + li {
452
+ margin-top: 0.4em;
453
+ }
454
+ :where(.marketing) .prose li::marker {
455
+ color: hsl(var(--app-primary));
456
+ }
457
+ :where(.marketing) .prose a {
458
+ color: hsl(var(--app-primary));
459
+ text-decoration: underline;
460
+ text-decoration-thickness: 1px;
461
+ text-underline-offset: 0.18em;
462
+ }
463
+ :where(.marketing) .prose strong {
464
+ font-weight: var(--weight-strong);
465
+ }
466
+ :where(.marketing) .prose blockquote {
467
+ margin-left: 0;
468
+ margin-right: 0;
469
+ padding-left: var(--gap-5);
470
+ border-left: 3px solid hsl(var(--app-primary));
471
+ color: hsl(var(--muted-foreground));
472
+ }
473
+ :where(.marketing) .prose :not(pre) > code {
474
+ padding: 0.1em 0.35em;
475
+ border-radius: var(--radius-1);
476
+ font-family: var(--font-mono);
477
+ font-size: 0.88em;
478
+ background: hsl(var(--muted));
479
+ }
480
+ :where(.marketing) .prose pre {
481
+ overflow-x: auto;
482
+ padding: var(--gap-5);
483
+ border-radius: var(--radius-3);
484
+ font-family: var(--font-mono);
485
+ font-size: var(--text-caption);
486
+ line-height: 1.6;
487
+ background: hsl(var(--muted));
488
+ }
489
+ :where(.marketing) .prose hr {
490
+ border: 0;
491
+ border-top: 1px solid hsl(var(--border));
492
+ margin: 2.4em 0;
493
+ }
494
+ :where(.marketing) .prose figcaption,
495
+ :where(.marketing) .prose .aside {
496
+ font-size: var(--text-small);
497
+ color: hsl(var(--muted-foreground));
498
+ }
499
+ :where(.marketing) .prose .aside {
500
+ padding: var(--gap-5) var(--gap-6);
501
+ border-radius: var(--radius-4);
502
+ background: hsl(var(--muted));
503
+ }
504
+
505
+ @media (max-width: 760px) {
506
+ :where(.marketing) .nav-links {
507
+ display: none;
508
+ }
509
+ :where(.marketing) .nav > :last-child {
510
+ margin-left: auto;
511
+ }
512
+ }
513
+ }
package/theme/public.css CHANGED
@@ -6,7 +6,7 @@
6
6
  * Values are HSL channels, used as hsl(var(--x)) or hsl(var(--x) / .12).
7
7
  * Light is the default (:root); dark is the `.dark` class on <html>, as in template and Kingdom.
8
8
  * Colour meaning: lime = yours / live (--app-primary), blue = shared (--app-tertiary), pink = Signet (--app-quaternary).
9
- * Thread and work status colours are a separate layer: theme/agentic.css.
9
+ * Thread and work status colours are a separate layer: theme/status.css. Domain palettes: theme/domains.css; marketing grammar: theme/marketing.css.
10
10
  */
11
11
 
12
12
  @font-face {
@@ -67,6 +67,7 @@
67
67
  --border: 87 12% 86%;
68
68
  --input: 87 12% 82%;
69
69
  --ring: 84 69% 30%;
70
+ --shadow: 206 29% 7%; /* elevation: hsl(var(--shadow) / .3) */
70
71
  --radius: 0.75rem;
71
72
 
72
73
  /* Type */
@@ -109,4 +110,5 @@
109
110
  --border: 202 22% 15%;
110
111
  --input: 204 22% 19%;
111
112
  --ring: 83 88% 73%;
113
+ --shadow: 206 40% 2%;
112
114
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * @inixiative/config/theme/agentic.css — the status and badge layers for agentic apps (Foundry, Kingdom).
2
+ * @inixiative/config/theme/status.css — the status and badge layers for apps that show agent work (Foundry, Kingdom).
3
3
  *
4
4
  * Load after theme/public.css. Light is :root, dark is `.dark`, like public.css.
5
5
  *
package/versions.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "@types/bun"
14
14
  ],
15
15
  "ecosystem": {
16
- "@inixiative/config": "0.5.183",
16
+ "@inixiative/config": "0.5.184",
17
17
  "@inixiative/json-rules": "3.16.0",
18
18
  "@inixiative/permissions": "0.18.0",
19
19
  "@inixiative/transitions": "0.6.0",
@@ -51,6 +51,7 @@
51
51
  }
52
52
  },
53
53
  "candidates": {
54
- "@inixiative/atlas": "0.5.0"
54
+ "@inixiative/atlas": "0.5.0",
55
+ "@inixiative/agent-session": "0.10.0"
55
56
  }
56
57
  }