@homepages/template-kit 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -0
- package/README.md +61 -17
- package/dist/base.css +9 -0
- package/dist/cli/check/config.js +37 -0
- package/dist/cli/check/css.js +117 -0
- package/dist/cli/check/diagnostics.js +32 -0
- package/dist/cli/check/index.js +87 -0
- package/dist/cli/check/loader.js +142 -0
- package/dist/cli/check/paths.js +15 -0
- package/dist/cli/check/relativize.js +18 -0
- package/dist/cli/check/render-invariants.js +24 -0
- package/dist/cli/check/resolve-tool.js +38 -0
- package/dist/cli/check/stages/deps.js +337 -0
- package/dist/cli/check/stages/lint.js +46 -0
- package/dist/cli/check/stages/render.js +101 -0
- package/dist/cli/check/stages/size.js +158 -0
- package/dist/cli/check/stages/tree.js +207 -0
- package/dist/cli/check/stages/typecheck.js +46 -0
- package/dist/cli/check/stages/validate/catalog-exhaustiveness.js +18 -0
- package/dist/cli/check/stages/validate/facts.js +18 -0
- package/dist/cli/check/stages/validate/formatter-contract.js +14 -0
- package/dist/cli/check/stages/validate/group-contract.js +21 -0
- package/dist/cli/check/stages/validate/index.js +66 -0
- package/dist/cli/check/stages/validate/list-scalar-contract.js +22 -0
- package/dist/cli/check/stages/validate/nav-contract.js +93 -0
- package/dist/cli/check/stages/validate/nested-slot-contract.js +12 -0
- package/dist/cli/check/stages/validate/object-list-contract.js +31 -0
- package/dist/cli/check/stages/validate/orchestrator.js +241 -0
- package/dist/cli/check/stages/validate/produced-by-contract.js +18 -0
- package/dist/cli/check/stages/validate/row-contract.js +31 -0
- package/dist/cli/check/stages/validate/select-contract.js +13 -0
- package/dist/cli/check/stages/validate/source-contract.js +21 -0
- package/dist/cli/check/stages/validate/variant-contract.js +15 -0
- package/dist/cli/check/workspace.js +86 -0
- package/dist/cli/theme/generate.js +43 -0
- package/dist/cli/theme/index.js +33 -0
- package/dist/cli/theme/load-theme.js +69 -0
- package/dist/cli.js +22 -4
- package/dist/contracts/fill-treatments.js +47 -0
- package/dist/design-system/theme.d.ts +30 -300
- package/dist/design-system/theme.js +112 -90
- package/dist/eslint/rules/no-hex.js +78 -6
- package/dist/eslint.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/package.js +1 -1
- package/dist/primitives/Image.js +1 -1
- package/dist/schema/fill-spec.d.ts +80 -590
- package/dist/schema/fixture-schema.d.ts +5 -81
- package/dist/schema/manifest.d.ts +39 -475
- package/dist/schema/resolve-section-ref.js +10 -0
- package/dist/schema/rows.js +10 -0
- package/dist/schema/section-nav.js +9 -0
- package/dist/schema/section-schema.d.ts +51 -437
- package/dist/schema/slot-types.d.ts +12 -16
- package/dist/styles.css +31 -88
- package/docs/INDEX.md +4 -3
- package/docs/check.md +121 -0
- package/docs/eslint.md +18 -8
- package/docs/llms.txt +21 -9
- package/docs/primitives.md +5 -0
- package/docs/rules/INDEX.md +11 -4
- package/docs/rules/bundle-binary-asset.md +102 -0
- package/docs/rules/fixtures-invalid.md +96 -0
- package/docs/rules/license-denied.md +11 -3
- package/docs/rules/manifest-invalid.md +99 -0
- package/docs/rules/no-hex.md +76 -10
- package/docs/rules/no-templates.md +87 -0
- package/docs/rules/parse-error.md +76 -0
- package/docs/rules/schema-invalid.md +96 -0
- package/docs/rules/size-section-css.md +2 -2
- package/docs/theme-and-css.md +155 -90
- package/package.json +4 -9
- package/tsconfig.json +1 -1
package/docs/theme-and-css.md
CHANGED
|
@@ -1,41 +1,170 @@
|
|
|
1
1
|
---
|
|
2
2
|
purpose: The kit's two CSS entries, how a section's own CSS reaches the page, the TokenTheme a template supplies, and the breakpoint ladder.
|
|
3
3
|
status: living
|
|
4
|
-
related: [primitives.md, schema-system.md, eslint.md, rules/INDEX.md]
|
|
5
|
-
updated: 2026-07-
|
|
4
|
+
related: [primitives.md, schema-system.md, eslint.md, rules/INDEX.md, check.md]
|
|
5
|
+
updated: 2026-07-15
|
|
6
6
|
---
|
|
7
7
|
# Theme and CSS
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
`
|
|
9
|
+
Your template owns its design system end to end — **the token names included**. You
|
|
10
|
+
declare the tokens your design actually has in a `TokenTheme`, and `template-kit theme`
|
|
11
|
+
compiles that one declaration into the Tailwind utilities that expose them. Declare a
|
|
12
|
+
colour named `lagoon` and `bg-lagoon` exists.
|
|
13
|
+
|
|
14
|
+
The kit owns only what is true of **every** template: the breakpoint ladder, the spacing
|
|
15
|
+
base unit, the motion defaults, the reset gaps Tailwind's preflight leaves, and the
|
|
16
|
+
section box model. It ships no colour, font, type, radius or shadow of its own, and there
|
|
17
|
+
is no shared file for you to edit to make a token of yours usable.
|
|
13
18
|
|
|
14
19
|
Two CSS entries ship, and they are not interchangeable.
|
|
15
20
|
|
|
16
21
|
| Entry | What it is | How it loads |
|
|
17
22
|
|---|---|---|
|
|
18
|
-
| `@homepages/template-kit/styles.css` | The Tailwind
|
|
19
|
-
| `@homepages/template-kit/base.css` | Cascade-layer order, the three reset gaps Tailwind's preflight leaves, `.tr-section`, and the motion tokens | its **own stylesheet** on the page — not part of the Tailwind entry |
|
|
23
|
+
| `@homepages/template-kit/styles.css` | The global Tailwind preamble: breakpoint ladder, `--spacing`, motion defaults, and `@source` registration of the kit's compiled JS | imported into **your Tailwind entry**, after Tailwind |
|
|
24
|
+
| `@homepages/template-kit/base.css` | Cascade-layer order, the three reset gaps Tailwind's preflight leaves, `.tr-section`, `.tr-image-frame`, and the motion tokens | its **own stylesheet** on the page — not part of the Tailwind entry |
|
|
20
25
|
|
|
21
|
-
##
|
|
26
|
+
## Your Tailwind entry
|
|
22
27
|
|
|
23
28
|
```css
|
|
24
29
|
/* your CSS entry */
|
|
25
30
|
@import "tailwindcss";
|
|
26
31
|
@import "@homepages/template-kit/styles.css";
|
|
32
|
+
@import "./theme.css"; /* generated by `template-kit theme` from theme.ts */
|
|
27
33
|
```
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
Three constraints, all of them silent when broken:
|
|
36
|
+
|
|
37
|
+
- **Import Tailwind exactly once per build graph.** `styles.css` deliberately does not
|
|
38
|
+
`@import "tailwindcss"` itself — yours does. Two double-emit Tailwind's preflight reset
|
|
39
|
+
(`box-sizing` declared twice, several KB of duplicate base layer), and nothing errors.
|
|
40
|
+
- **Your generated theme must be imported here, inside the Tailwind build graph.** It
|
|
41
|
+
contains an `@theme` block, which is a Tailwind directive: anywhere outside the graph it
|
|
42
|
+
is inert, and you get a stylesheet with no token utilities and no error explaining why.
|
|
43
|
+
- **Import it after `styles.css`**, so the kit's globals are in place before your tokens
|
|
44
|
+
land on top of them.
|
|
45
|
+
|
|
46
|
+
`styles.css` also carries an `@source` line registering the kit's own shipped `dist` for
|
|
47
|
+
Tailwind's class scan. That is how the utility classes baked into the kit's primitives
|
|
48
|
+
(`Image`'s `object-cover`, …) reach your compiled CSS; it also overrides Tailwind's default
|
|
49
|
+
exclusion of `node_modules`. You do not need to add a `@source` for the kit yourself.
|
|
50
|
+
|
|
51
|
+
## `TokenTheme` — your template's design system
|
|
52
|
+
|
|
53
|
+
A template's `theme.ts` exports a `TokenTheme`: six open records of tokens, plus the
|
|
54
|
+
document defaults that dress the page. `theme.ts` is the file you write; run
|
|
55
|
+
`template-kit theme` to compile it into the `theme.css` your Tailwind entry imports
|
|
56
|
+
(see [Generating `theme.css`](#generating-themecss) below).
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import type { TokenTheme } from "@homepages/template-kit";
|
|
60
|
+
|
|
61
|
+
export const theme: TokenTheme = {
|
|
62
|
+
colors: { ink: "#111418", page: "#ffffff", "surface-alt": "#f4f4f5", lagoon: "#1c6e7d" },
|
|
63
|
+
fonts: { sans: '"Inter", system-ui, sans-serif', display: '"Canela", Georgia, serif' },
|
|
64
|
+
type: { base: "1rem", "2xl": "1.5rem", display: "clamp(2.5rem, 6vw, 4.5rem)" },
|
|
65
|
+
radii: { md: "6px", pill: "9999px" },
|
|
66
|
+
shadows: { card: "0 1px 2px rgb(0 0 0 / 0.06)" },
|
|
67
|
+
layout: { "container-max": "1280px", "header-height": "72px" },
|
|
68
|
+
|
|
69
|
+
// Optional font-loading block, emitted ahead of everything else.
|
|
70
|
+
fontFaces: '@import url("https://fonts.example/inter.css");',
|
|
71
|
+
|
|
72
|
+
// Which of YOUR tokens dress the document.
|
|
73
|
+
document: { font: "sans", color: "ink", background: "page", fontSize: "base" },
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Nothing is required to exist. Tailwind's own defaults survive underneath your tokens —
|
|
78
|
+
`text-2xl`, `rounded-lg`, `red-500` all still work — so a sparse theme is a working theme.
|
|
79
|
+
(The breakpoint ladder is the one exception: `sm:`, `xl:` and `2xl:` are deliberately
|
|
80
|
+
switched off. See below.)
|
|
81
|
+
|
|
82
|
+
### Namespaces and the utilities they produce
|
|
83
|
+
|
|
84
|
+
Each record maps to one Tailwind theme namespace. A token's key is emitted **verbatim**
|
|
85
|
+
into both the custom property and the utility — no camelCase-to-kebab transform, so what
|
|
86
|
+
you type is what you get.
|
|
87
|
+
|
|
88
|
+
| Record | Custom property | Tailwind utilities | Example |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| `colors` | `--tr-color-<name>` | `bg-`, `text-`, `border-`, `ring-`, `fill-`, `stroke-`, … | `lagoon` → `bg-lagoon` |
|
|
91
|
+
| `fonts` | `--tr-font-<name>` | `font-<name>` | `display` → `font-display` |
|
|
92
|
+
| `type` | `--tr-text-<name>` | `text-<name>` | `2xl` → `text-2xl` |
|
|
93
|
+
| `radii` | `--tr-radius-<name>` | `rounded-<name>` | `pill` → `rounded-pill` |
|
|
94
|
+
| `shadows` | `--tr-shadow-<name>` | `shadow-<name>` | `card` → `shadow-card` |
|
|
95
|
+
| `layout` | `--tr-<name>` | *(none)* | `header-height` → `var(--tr-header-height)` |
|
|
96
|
+
|
|
97
|
+
`layout` has no Tailwind utility namespace, so its tokens get a `--tr-*` value and no
|
|
98
|
+
utility — reference them with `var()` from your own CSS.
|
|
99
|
+
|
|
100
|
+
### Token names
|
|
101
|
+
|
|
102
|
+
Kebab-case: `[a-z0-9]` groups separated by single hyphens (`ink`, `ink-soft`, `bp2`).
|
|
103
|
+
`TokenNameSchema` is exported if you want to validate names yourself.
|
|
104
|
+
|
|
105
|
+
**One token, one utility.** Two utility names cannot share a token — if you want both
|
|
106
|
+
`bg-brand` and `bg-primary`, declare both.
|
|
107
|
+
|
|
108
|
+
### The `document` block
|
|
109
|
+
|
|
110
|
+
Required. It names which of your **own** tokens dress the page — the `body` font-family,
|
|
111
|
+
colour, background, and font-size. `font` and `fontSize` resolve against `fonts` and
|
|
112
|
+
`type`; `color` and `background` resolve against `colors`.
|
|
113
|
+
|
|
114
|
+
Every reference is validated against your declared tokens, in its own group: a typo, or a
|
|
115
|
+
colour name where a font belongs, fails at parse rather than rendering an unthemed page in
|
|
116
|
+
silence.
|
|
117
|
+
|
|
118
|
+
### Validation
|
|
119
|
+
|
|
120
|
+
`TokenThemeSchema` validates the object at runtime, and it is `.strict()` — an unknown
|
|
121
|
+
top-level key is an error rather than a silently-dead set of tokens.
|
|
122
|
+
|
|
123
|
+
## Generating `theme.css`
|
|
33
124
|
|
|
34
|
-
`
|
|
35
|
-
`
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
125
|
+
`template-kit theme` loads `templates/<key>/theme.ts`, validates its `theme` export
|
|
126
|
+
against `TokenThemeSchema`, and writes `templates/<key>/theme.css` — the file your
|
|
127
|
+
Tailwind entry imports.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
template-kit theme # infer the template from cwd, or the workspace's one template
|
|
131
|
+
template-kit theme <template> # generate one named template's theme.css, by its key
|
|
132
|
+
template-kit theme --all # generate every template in the workspace
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`theme.css` is generated — it opens with a header saying so, and it is not meant to be
|
|
136
|
+
hand-edited. Re-run `template-kit theme` after changing `theme.ts` and commit the
|
|
137
|
+
regenerated file alongside it.
|
|
138
|
+
|
|
139
|
+
A missing `theme.ts`, a `theme.ts` that doesn't export `theme`, or a `theme` that fails
|
|
140
|
+
`TokenThemeSchema` all fail the command with a message naming the file and the problem —
|
|
141
|
+
nothing is written in that case.
|
|
142
|
+
|
|
143
|
+
In order, the file it writes contains:
|
|
144
|
+
|
|
145
|
+
1. your `fontFaces` block, if you set one;
|
|
146
|
+
2. `@theme inline { --color-<name>: var(--tr-color-<name>); … }` — the alias layer, which
|
|
147
|
+
is what brings your token utilities into existence;
|
|
148
|
+
3. `:root { --tr-color-<name>: <value>; … }` — the values behind those aliases;
|
|
149
|
+
4. `body { … }` — your `document` defaults, written as `var()` indirections so a runtime
|
|
150
|
+
`:root` override still cascades to the page.
|
|
151
|
+
|
|
152
|
+
Deterministic: keys are sorted, so the same theme always content-hashes identically.
|
|
153
|
+
|
|
154
|
+
## Colour in sections
|
|
155
|
+
|
|
156
|
+
A section carries no palette of its own, in server-rendered code or inside an island — the
|
|
157
|
+
`template-kit/no-hex` [lint rule](rules/no-hex.md) flags a hard-coded hex literal in a
|
|
158
|
+
colour context, and a CSS colour function anywhere, without exempting `"use client"` files
|
|
159
|
+
the way most of the preset's other rules do. Sections spend the theme's tokens; the theme
|
|
160
|
+
is where a colour is named.
|
|
161
|
+
|
|
162
|
+
For a colour the theme does not name — a hover, active, or pressed step, or a translucent
|
|
163
|
+
tint — derive it from the tokens that *are* named, with a `color-mix()` over theme-derived
|
|
164
|
+
arguments:
|
|
165
|
+
`hover:bg-[color-mix(in_srgb,var(--tr-color-primary)_80%,var(--tr-color-surface))]`. Such a
|
|
166
|
+
mix composes a colour out of the theme rather than stating one, and is the single colour
|
|
167
|
+
function `no-hex` allows — it carves out no other.
|
|
39
168
|
|
|
40
169
|
## How a section's CSS reaches the page
|
|
41
170
|
|
|
@@ -70,12 +199,10 @@ Two constraints follow directly, and both are enforced by lint:
|
|
|
70
199
|
|
|
71
200
|
A published page loads, in order:
|
|
72
201
|
|
|
73
|
-
1. **`base.css`** — layer order, the reset gaps, `.tr-section`, motion
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
3. **Your compiled Tailwind bundle** — `@import "tailwindcss"` + `styles.css` + your
|
|
78
|
-
section markup's utilities.
|
|
202
|
+
1. **`base.css`** — layer order, the reset gaps, `.tr-section`, `.tr-image-frame`, motion
|
|
203
|
+
tokens.
|
|
204
|
+
2. **Your compiled Tailwind bundle** — your entry: `@import "tailwindcss"` + the kit's
|
|
205
|
+
`styles.css` + your compiled theme + the utilities your section markup uses.
|
|
79
206
|
|
|
80
207
|
The layer order `base.css` declares is:
|
|
81
208
|
|
|
@@ -96,70 +223,9 @@ not make: `font-smoothing`, `button { cursor: pointer }` (Tailwind v4 leaves but
|
|
|
96
223
|
|
|
97
224
|
Ship `base.css` without a Tailwind entry on the page and you get an unreset page.
|
|
98
225
|
|
|
99
|
-
`base.css` references **no
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
## `TokenTheme` — your template's values
|
|
104
|
-
|
|
105
|
-
A template's `theme.ts` exports a `TokenTheme`. `compileThemeToCss` turns it into the
|
|
106
|
-
`:root { --tr-*: … }` block that defines your tokens **and** the `body` block that
|
|
107
|
-
applies them (font-family, color, background, size) to the document — together, the
|
|
108
|
-
CSS the template's bundle ships. Deterministic (stable key order, palette keys
|
|
109
|
-
sorted), so the same theme always content-hashes identically.
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
import { compileThemeToCss, type TokenTheme } from "@homepages/template-kit";
|
|
113
|
-
|
|
114
|
-
export const theme: TokenTheme = {
|
|
115
|
-
colors: { ink: "#111418", background: "#ffffff", /* …every role, see below */ },
|
|
116
|
-
palette: { "brand-gold": "#c8a248" }, // optional escape hatch
|
|
117
|
-
fonts: {
|
|
118
|
-
body: '"Inter", system-ui, sans-serif',
|
|
119
|
-
heading: '"Canela", Georgia, serif',
|
|
120
|
-
numeric: '"Inter", system-ui, sans-serif',
|
|
121
|
-
label: '"Inter", system-ui, sans-serif',
|
|
122
|
-
fontFaces: '@import url("https://fonts.example/inter.css");', // optional, emitted before :root
|
|
123
|
-
},
|
|
124
|
-
type: { xs: "0.75rem", sm: "0.875rem", base: "1rem", /* lg xl 2xl 3xl 4xl 5xl display */ },
|
|
125
|
-
radii: { sm: "2px", md: "6px", lg: "12px", full: "9999px" },
|
|
126
|
-
shadows: { sm: "…", md: "…", lg: "…" },
|
|
127
|
-
layout: { containerMax: "1280px", containerPad: "1.5rem", headerHeight: "72px" },
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
const css = compileThemeToCss(theme);
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
`TokenThemeSchema` validates it at runtime; the object is `.strict()`, so an unknown key
|
|
134
|
-
is an error rather than a silently-dead token. Every scale is **complete or invalid** —
|
|
135
|
-
there are no defaults to fall back on.
|
|
136
|
-
|
|
137
|
-
### Color roles
|
|
138
|
-
|
|
139
|
-
The role keys are fixed. Each maps 1:1 to a `--tr-color-*` variable, and the Tailwind
|
|
140
|
-
utility is named after **the variable**, not the role key — so `surfaceAlt` is
|
|
141
|
-
`bg-surface-alt`, and `primaryStrong` is `bg-primary-darker`. Read the mapping off the
|
|
142
|
-
exported `COLOR_ROLE_VARS` (and `FONT_ROLE_VARS`, `TYPE_STEP_VARS`, `RADIUS_VARS`,
|
|
143
|
-
`SHADOW_VARS`, `LAYOUT_VARS` for the other scales), or let your editor autocomplete the
|
|
144
|
-
`ColorRole` union:
|
|
145
|
-
|
|
146
|
-
| Role key | CSS variable | Utility |
|
|
147
|
-
|---|---|---|
|
|
148
|
-
| `ink` `inkSoft` `inkMute` | `--tr-color-ink[-soft|-mute]` | `text-ink`, `text-ink-soft`, `text-ink-mute` |
|
|
149
|
-
| `background` `surface` `surfaceAlt` | `--tr-color-background` / `-surface` / `-surface-alt` | `bg-surface-alt`, … |
|
|
150
|
-
| `border` `borderStrong` | `--tr-color-border[-strong]` | `border-border-strong`, … |
|
|
151
|
-
| `primary` `primaryFg` `primaryStrong` | `--tr-color-primary` / `-primary-fg` / `-primary-darker` | `bg-primary`, `text-primary-fg`, `bg-primary-darker` |
|
|
152
|
-
| `accent` `accentFg` `accentStrong` | `--tr-color-accent` / `-accent-contrast` / `-accent-strong` | `bg-accent`, `text-accent-contrast`, `bg-accent-strong` |
|
|
153
|
-
| `overlay` `overlayStrong` `overlayLight` | `--tr-color-overlay[-strong|-light]` | `bg-overlay`, … |
|
|
154
|
-
| `darkBg` `darkFg` `darkFgMute` `darkBorder` | `--tr-color-footer-bg` / `-footer-fg` / `-footer-fg-mute` / `-footer-divider` | `bg-footer-bg`, `text-footer-fg`, `border-footer-divider`, … |
|
|
155
|
-
|
|
156
|
-
`palette` is the open escape hatch: each key becomes `--tr-color-<key>`. Sections normally
|
|
157
|
-
use the semantic roles — reach for a brand swatch only when no role honestly fits.
|
|
158
|
-
|
|
159
|
-
A section carries no palette of its own, in server-rendered code or inside an island —
|
|
160
|
-
the `template-kit/no-hex` [lint rule](eslint.md#universal--no-island-exemption) bans a
|
|
161
|
-
hard-coded hex literal or CSS color function in a color context and does not exempt
|
|
162
|
-
`"use client"` files, unlike most of the preset's other rules.
|
|
226
|
+
`base.css` references **no design token of yours** — nothing global is opinionated about
|
|
227
|
+
your brand. Its one tintable surface is the `Image` frame's placeholder fill; see
|
|
228
|
+
[`Image`](primitives.md#image--the-defensive-image-primitive).
|
|
163
229
|
|
|
164
230
|
## The breakpoint ladder
|
|
165
231
|
|
|
@@ -191,8 +257,7 @@ memory — enough to make it evict a live WebGL map's layer on scroll, blanking
|
|
|
191
257
|
they stop consuming that memory.
|
|
192
258
|
|
|
193
259
|
The kit does **not** apply this for you — it has a real cost (below), and only you know
|
|
194
|
-
whether your page needs it. If it does, add the rule to
|
|
195
|
-
`@import "tailwindcss"; @import "@homepages/template-kit/styles.css";` — the third
|
|
260
|
+
whether your page needs it. If it does, add the rule to your Tailwind entry — the second
|
|
196
261
|
stylesheet the page loads:
|
|
197
262
|
|
|
198
263
|
```css
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homepages/template-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Authoring kit for HomePages marketing-section templates: schema system, contract primitives, theme tokens, and the template-kit CLI.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"build": "tsdown",
|
|
59
59
|
"typecheck": "tsc --noEmit",
|
|
60
60
|
"lint": "eslint .",
|
|
61
|
+
"pretest": "node test/link-fixture-workspace.mjs",
|
|
61
62
|
"test": "node --import tsx --test 'src/**/*.test.ts' 'src/**/*.test.tsx'",
|
|
62
63
|
"lint:pkg": "publint --strict && attw --pack . --profile esm-only --exclude-entrypoints styles.css base.css",
|
|
63
64
|
"verify:consumer": "node scripts/verify-consumer.mjs",
|
|
@@ -67,15 +68,9 @@
|
|
|
67
68
|
"release": "changeset publish"
|
|
68
69
|
},
|
|
69
70
|
"peerDependencies": {
|
|
70
|
-
"eslint": "^9.0.0",
|
|
71
71
|
"react": "^19.0.0",
|
|
72
72
|
"react-dom": "^19.0.0"
|
|
73
73
|
},
|
|
74
|
-
"peerDependenciesMeta": {
|
|
75
|
-
"eslint": {
|
|
76
|
-
"optional": true
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
74
|
"devDependencies": {
|
|
80
75
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
81
76
|
"@changesets/cli": "^2.29.8",
|
|
@@ -85,6 +80,7 @@
|
|
|
85
80
|
"@types/node": "^20.17.10",
|
|
86
81
|
"@types/react": "^19.0.0",
|
|
87
82
|
"@types/react-dom": "^19.0.0",
|
|
83
|
+
"@typescript-eslint/parser": "^8.60.1",
|
|
88
84
|
"esbuild": "^0.28.1",
|
|
89
85
|
"eslint": "^9.39.4",
|
|
90
86
|
"jsdom": "^26.1.0",
|
|
@@ -98,7 +94,6 @@
|
|
|
98
94
|
"typescript-eslint": "^8.60.1"
|
|
99
95
|
},
|
|
100
96
|
"dependencies": {
|
|
101
|
-
"
|
|
102
|
-
"zod": "^3.23.8"
|
|
97
|
+
"zod": "^4.4.3"
|
|
103
98
|
}
|
|
104
99
|
}
|
package/tsconfig.json
CHANGED