@jflamb/ledger 0.1.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 +17 -0
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/ledger.css +169 -0
- package/package.json +50 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 — 2026-07-13
|
|
4
|
+
|
|
5
|
+
Initial release, implementing the Ledger v2 foundations specification.
|
|
6
|
+
|
|
7
|
+
- Layer-1 primitives (theme-varying) and layer-2 semantic aliases (theme-stable); components consume only layer 2.
|
|
8
|
+
- Light, dark (media query + `data-theme` override), high-contrast, and print themes.
|
|
9
|
+
- Status semantics: critical (red, failure/blocker only), attention (amber), info/waiting (blue), neutral/done (grey). Viridian is brand & interactive only.
|
|
10
|
+
- Three type roles: `--font-prose` (serif), `--font-ui` (system sans), `--font-mono`.
|
|
11
|
+
- 4px spacing grid including `--space-5` (20px); `--control-min-block-size: 48px` as its own token.
|
|
12
|
+
- Contextual radii: static 0, tag 2px, control 6px, selectable 8px, pill 999px. `--shadow-overlay` for overlays only.
|
|
13
|
+
- Contrast gate (`npm test`): 69 checks across three themes, parsed from the shipped `ledger.css`.
|
|
14
|
+
|
|
15
|
+
### Deviation from the v2 spec document
|
|
16
|
+
|
|
17
|
+
- `--rule-strong` darkened from the spec's `#99a094 / #4d564a` to **`#7d857b` (light) / `#6a7366` (dark)**: the gate measured the spec values at ~2.4:1 against paper, below the 3:1 requirement for interactive control borders. First bug caught by the gate, before first release. The spec document should be updated to match.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jaime Lamb
|
|
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
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Ledger
|
|
2
|
+
|
|
3
|
+
Ledger is the shared CSS foundation for [jflamb.com](https://jflamb.com), [Assistant Workbench](https://assistant.jflamb.com), and the [Retirement Dashboard](https://retirement.jflamb.com). It gives the three products one visual identity: ink on warm paper, a viridian brand, serif prose, mono figures, and rules instead of decorative shadows.
|
|
4
|
+
|
|
5
|
+
The package is intentionally small. It provides versioned design tokens, themes, accessibility defaults, and a stable contract for site-local components. It does not force the three products into one component library.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @jflamb/ledger
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Until the first npm release is published, projects can install the package directly from this public repository:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npm install github:jflamb/ledger
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Import the stylesheet from application CSS:
|
|
20
|
+
|
|
21
|
+
```css
|
|
22
|
+
@import "@jflamb/ledger/ledger.css";
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or import it from JavaScript when the bundler handles CSS:
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
import "@jflamb/ledger/ledger.css";
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For a site without npm tooling, use a version-pinned CDN URL or vendor the file into the site repository:
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<link rel="stylesheet" href="https://unpkg.com/@jflamb/ledger@0.1.0/ledger.css">
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Pin the version in production. Do not load an unversioned `latest` URL.
|
|
38
|
+
|
|
39
|
+
## Use semantic tokens
|
|
40
|
+
|
|
41
|
+
Site components should use semantic roles rather than palette values:
|
|
42
|
+
|
|
43
|
+
```css
|
|
44
|
+
.panel {
|
|
45
|
+
color: var(--color-text-primary);
|
|
46
|
+
background: var(--color-surface-panel);
|
|
47
|
+
border: 1px solid var(--color-border);
|
|
48
|
+
border-radius: var(--radius-static);
|
|
49
|
+
padding: var(--space-4);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.primary-action {
|
|
53
|
+
min-block-size: var(--control-min-block-size);
|
|
54
|
+
color: var(--color-text-on-action);
|
|
55
|
+
background: var(--color-action);
|
|
56
|
+
border-radius: var(--radius-control);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.primary-action:focus-visible {
|
|
60
|
+
outline: var(--focus-ring);
|
|
61
|
+
outline-offset: var(--focus-ring-offset);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Palette primitives such as `--viridian` and `--paper` are implementation details. Keeping components on semantic tokens lets Ledger improve contrast or rebalance themes without requiring component rewrites.
|
|
66
|
+
|
|
67
|
+
## Rules of consumption
|
|
68
|
+
|
|
69
|
+
1. **Components consume only layer-2 semantic tokens** (`--color-*`, `--font-*`, `--text-*`, `--space-*`, `--radius-*`, `--control-*`, `--focus-*`, `--shadow-*`). Layer-1 primitives (`--paper`, `--ink`, `--viridian`, …) are private to `ledger.css` and are the only values that change per theme.
|
|
70
|
+
2. **Color never carries meaning alone.** Every status has a text label; selection changes border weight and adds a check, not just a fill.
|
|
71
|
+
3. **Square is static, round is interactive.** `--radius-static` for panels and tables; `--radius-control` / `--radius-selectable` mark what can be operated.
|
|
72
|
+
4. **Shadows are for overlays only** (`--shadow-overlay`): menus, tooltips, dialogs. Static grouping uses rules and the one-step paper raise.
|
|
73
|
+
5. **Type roles:** `--font-prose` (serif) for display and explanatory text, `--font-ui` (system sans) for controls/navigation/dense labels, `--font-mono` for figures, dates, codes, and short statuses (with `font-variant-numeric: tabular-nums`).
|
|
74
|
+
6. Site-local tokens (e.g. the dashboard's `--chart-*`) may alias down to Ledger tokens; they may not redefine shared names.
|
|
75
|
+
|
|
76
|
+
## Token families
|
|
77
|
+
|
|
78
|
+
- `--color-*`: text, surfaces, borders, actions, focus, and statuses
|
|
79
|
+
- `--font-*`: prose, interface, and numeric roles
|
|
80
|
+
- `--text-*`: type scale
|
|
81
|
+
- `--space-*`: 4px spacing scale
|
|
82
|
+
- `--radius-*`: static, tag, control, selectable, and pill shapes
|
|
83
|
+
- `--control-*`: interaction sizing
|
|
84
|
+
- `--focus-*`: keyboard focus treatment
|
|
85
|
+
- `--shadow-*`: overlays only
|
|
86
|
+
|
|
87
|
+
The full token list and values live in [`ledger.css`](./ledger.css).
|
|
88
|
+
|
|
89
|
+
## Theming
|
|
90
|
+
|
|
91
|
+
`ledger.css` defines light (default), dark (`prefers-color-scheme` **and** `:root[data-theme="dark"]`, so a manual toggle beats the system), high contrast (`prefers-contrast: more`), and print. The theme preference is shared across subdomains via a first-party cookie — localStorage is origin-scoped and serves only as a same-origin fallback:
|
|
92
|
+
|
|
93
|
+
```js
|
|
94
|
+
// set on toggle — readable by every *.jflamb.com origin
|
|
95
|
+
document.cookie =
|
|
96
|
+
"jflamb-theme=dark; Domain=.jflamb.com; Path=/; Max-Age=31536000; SameSite=Lax; Secure";
|
|
97
|
+
|
|
98
|
+
// no-flash bootstrap (inline in <head>): cookie → localStorage → system
|
|
99
|
+
const t = document.cookie.match(/(?:^|; )jflamb-theme=(dark|light)/)?.[1]
|
|
100
|
+
?? localStorage.getItem("jflamb-theme");
|
|
101
|
+
if (t) document.documentElement.dataset.theme = t;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Use `data-theme="light"` or `data-theme="dark"` for a manual override. Without an override, Ledger follows `prefers-color-scheme`. The stylesheet also includes `prefers-contrast: more` and print values.
|
|
105
|
+
|
|
106
|
+
## CI
|
|
107
|
+
|
|
108
|
+
`npm test` runs the contrast gate: it parses `ledger.css` itself and verifies every text-role/surface pair at ≥ 4.5:1 and every interactive-border/focus pair at ≥ 3:1, across light, dark, and high-contrast, and confirms the two dark blocks never diverge. A palette change that regresses accessibility fails the build.
|
|
109
|
+
|
|
110
|
+
Run the local checks before committing:
|
|
111
|
+
|
|
112
|
+
```sh
|
|
113
|
+
npm test
|
|
114
|
+
npm run check:package
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`npm run sync:site -- /path/to/jflamb.com` vendors the canonical stylesheet into a zero-tooling site. `npm run check:drift -- /path/to/jflamb.com` verifies that copy byte-for-byte.
|
|
118
|
+
|
|
119
|
+
## Versioning
|
|
120
|
+
|
|
121
|
+
Semver. Renaming or removing a primitive or semantic token is **major**; adding or re-pointing a semantic alias is **minor**; value tweaks that pass the gate are **patch**.
|
|
122
|
+
|
|
123
|
+
## Publishing
|
|
124
|
+
|
|
125
|
+
1. Update `version` in `package.json` and add a dated entry to `CHANGELOG.md`.
|
|
126
|
+
2. Merge the change to `main`.
|
|
127
|
+
3. Create a GitHub release whose tag exactly matches `v<package version>`.
|
|
128
|
+
4. The `publish` workflow validates the tag, reruns the accessibility and package checks, and publishes the public package to npm with provenance.
|
|
129
|
+
|
|
130
|
+
The repository needs an npm automation token stored as the `NPM_TOKEN` Actions secret. Publishing is intentionally tied to a GitHub release; ordinary pushes and pull requests cannot publish packages.
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
[MIT](./LICENSE)
|
package/ledger.css
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════════
|
|
2
|
+
@jflamb/ledger · v0.1.0
|
|
3
|
+
Design tokens for jflamb.com, assistant.jflamb.com, retirement.jflamb.com
|
|
4
|
+
Source of truth: this repo. Spec: see README.
|
|
5
|
+
Components consume ONLY layer-2 semantic tokens (--color-*, --font-*,
|
|
6
|
+
--text-*, --space-*, --radius-*, --control-*, --focus-*, --shadow-*).
|
|
7
|
+
Layer-1 primitives are theme-varying and private to this file.
|
|
8
|
+
═══════════════════════════════════════════════════════════════════ */
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
color-scheme: light dark;
|
|
12
|
+
|
|
13
|
+
/* ── layer 1 · primitives (theme-varying) ─────────────────────── */
|
|
14
|
+
--paper: #f6f3eb;
|
|
15
|
+
--paper-raised: #fcfaf4;
|
|
16
|
+
--ink: #182320;
|
|
17
|
+
--ink-soft: #4c564f;
|
|
18
|
+
--graphite: #666d63; /* small-text tertiary · >=4.5:1 on both papers */
|
|
19
|
+
--faint: #878e86; /* decoration + disabled text ONLY */
|
|
20
|
+
--rule: #c8cbc0; /* hairline dividers, static panel borders */
|
|
21
|
+
--rule-strong: #7d857b; /* interactive borders · >=3:1 on both papers */
|
|
22
|
+
--viridian: #1d5c46;
|
|
23
|
+
--viridian-deep: #143f30;
|
|
24
|
+
--viridian-wash: #e6efe8;
|
|
25
|
+
--red: #a6301f; --red-wash: #f6e9e5;
|
|
26
|
+
--amber: #8a5a12; --amber-wash: #f3ecdd;
|
|
27
|
+
--blue: #40618d; --blue-wash: #e8edf4;
|
|
28
|
+
|
|
29
|
+
/* ── layer 2 · semantics (theme-stable · components consume these) ── */
|
|
30
|
+
--color-text-primary: var(--ink);
|
|
31
|
+
--color-text-secondary: var(--ink-soft);
|
|
32
|
+
--color-text-tertiary: var(--graphite);
|
|
33
|
+
--color-text-disabled: var(--faint);
|
|
34
|
+
--color-text-on-action: var(--paper);
|
|
35
|
+
--color-surface-page: var(--paper);
|
|
36
|
+
--color-surface-panel: var(--paper-raised);
|
|
37
|
+
--color-surface-selected: var(--viridian-wash);
|
|
38
|
+
--color-border: var(--rule);
|
|
39
|
+
--color-border-interactive: var(--rule-strong);
|
|
40
|
+
--color-action: var(--viridian);
|
|
41
|
+
--color-action-hover: var(--viridian-deep);
|
|
42
|
+
--color-link: var(--viridian);
|
|
43
|
+
--color-focus: var(--blue);
|
|
44
|
+
--color-status-critical: var(--red);
|
|
45
|
+
--color-status-critical-surface: var(--red-wash);
|
|
46
|
+
--color-status-attention: var(--amber);
|
|
47
|
+
--color-status-attention-surface: var(--amber-wash);
|
|
48
|
+
--color-status-info: var(--blue);
|
|
49
|
+
--color-status-info-surface: var(--blue-wash);
|
|
50
|
+
--color-status-neutral: var(--ink-soft);
|
|
51
|
+
--color-status-neutral-surface: var(--paper-raised);
|
|
52
|
+
|
|
53
|
+
/* ── type roles ──────────────────────────────────────────────── */
|
|
54
|
+
--font-prose: Charter, "Bitstream Charter", "Iowan Old Style", Georgia, serif;
|
|
55
|
+
--font-ui: system-ui, "Segoe UI", -apple-system, "Helvetica Neue", sans-serif;
|
|
56
|
+
--font-mono: ui-monospace, "Cascadia Mono", "SF Mono", Menlo, Consolas, monospace;
|
|
57
|
+
|
|
58
|
+
/* ── scales ──────────────────────────────────────────────────── */
|
|
59
|
+
--text-xs: 0.72rem;
|
|
60
|
+
--text-sm: 0.85rem;
|
|
61
|
+
--text-base: 1rem;
|
|
62
|
+
--text-lg: 1.15rem;
|
|
63
|
+
--text-xl: 1.45rem;
|
|
64
|
+
--text-2xl: 1.9rem;
|
|
65
|
+
--text-hero: clamp(3rem, 9vw, 8.5rem);
|
|
66
|
+
|
|
67
|
+
--space-1: 4px;
|
|
68
|
+
--space-2: 8px;
|
|
69
|
+
--space-3: 12px;
|
|
70
|
+
--space-4: 16px;
|
|
71
|
+
--space-5: 20px;
|
|
72
|
+
--space-6: 24px;
|
|
73
|
+
--space-8: 32px;
|
|
74
|
+
--space-12: 48px;
|
|
75
|
+
--space-16: 64px;
|
|
76
|
+
|
|
77
|
+
/* ── shape & interaction ─────────────────────────────────────── */
|
|
78
|
+
--radius-static: 0; /* read, not operated */
|
|
79
|
+
--radius-tag: 2px; /* status tags, badges, tooltips */
|
|
80
|
+
--radius-control: 6px; /* buttons, inputs, segmented controls */
|
|
81
|
+
--radius-selectable: 8px; /* selectable cards, alternative choosers */
|
|
82
|
+
--radius-pill: 999px; /* filter chips (site-local, sparingly) */
|
|
83
|
+
--control-min-block-size: 48px;
|
|
84
|
+
--focus-ring: 2px solid var(--color-focus);
|
|
85
|
+
--focus-ring-offset: 2px;
|
|
86
|
+
--shadow-overlay: 0 8px 28px rgba(10, 18, 14, 0.18); /* overlays ONLY */
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── dark · system preference ─────────────────────────────────── */
|
|
90
|
+
@media (prefers-color-scheme: dark) {
|
|
91
|
+
:root {
|
|
92
|
+
--paper: #10150f;
|
|
93
|
+
--paper-raised: #171d16;
|
|
94
|
+
--ink: #e8e6d9;
|
|
95
|
+
--ink-soft: #adb3a6;
|
|
96
|
+
--graphite: #868d81;
|
|
97
|
+
--faint: #6d746a;
|
|
98
|
+
--rule: #333b31;
|
|
99
|
+
--rule-strong: #6a7366;
|
|
100
|
+
--viridian: #79c4a0;
|
|
101
|
+
--viridian-deep: #a4dcc0;
|
|
102
|
+
--viridian-wash: #1c2b22;
|
|
103
|
+
--red: #e08268; --red-wash: #2e1c16;
|
|
104
|
+
--amber: #d3a355; --amber-wash: #2b2312;
|
|
105
|
+
--blue: #8aa8cf; --blue-wash: #171f2b;
|
|
106
|
+
--shadow-overlay: 0 8px 28px rgba(0, 0, 0, 0.5);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* ── manual theme · beats the media query ─────────────────────── */
|
|
111
|
+
:root[data-theme="dark"] {
|
|
112
|
+
--paper: #10150f;
|
|
113
|
+
--paper-raised: #171d16;
|
|
114
|
+
--ink: #e8e6d9;
|
|
115
|
+
--ink-soft: #adb3a6;
|
|
116
|
+
--graphite: #868d81;
|
|
117
|
+
--faint: #6d746a;
|
|
118
|
+
--rule: #333b31;
|
|
119
|
+
--rule-strong: #6a7366;
|
|
120
|
+
--viridian: #79c4a0;
|
|
121
|
+
--viridian-deep: #a4dcc0;
|
|
122
|
+
--viridian-wash: #1c2b22;
|
|
123
|
+
--red: #e08268; --red-wash: #2e1c16;
|
|
124
|
+
--amber: #d3a355; --amber-wash: #2b2312;
|
|
125
|
+
--blue: #8aa8cf; --blue-wash: #171f2b;
|
|
126
|
+
--shadow-overlay: 0 8px 28px rgba(0, 0, 0, 0.5);
|
|
127
|
+
}
|
|
128
|
+
:root[data-theme="light"] {
|
|
129
|
+
--paper: #f6f3eb;
|
|
130
|
+
--paper-raised: #fcfaf4;
|
|
131
|
+
--ink: #182320;
|
|
132
|
+
--ink-soft: #4c564f;
|
|
133
|
+
--graphite: #666d63;
|
|
134
|
+
--faint: #878e86;
|
|
135
|
+
--rule: #c8cbc0;
|
|
136
|
+
--rule-strong: #7d857b;
|
|
137
|
+
--viridian: #1d5c46;
|
|
138
|
+
--viridian-deep: #143f30;
|
|
139
|
+
--viridian-wash: #e6efe8;
|
|
140
|
+
--red: #a6301f; --red-wash: #f6e9e5;
|
|
141
|
+
--amber: #8a5a12; --amber-wash: #f3ecdd;
|
|
142
|
+
--blue: #40618d; --blue-wash: #e8edf4;
|
|
143
|
+
--shadow-overlay: 0 8px 28px rgba(10, 18, 14, 0.18);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* ── high contrast · system-level (promoted from jflamb.com) ──── */
|
|
147
|
+
@media (prefers-contrast: more) {
|
|
148
|
+
:root {
|
|
149
|
+
--paper: #ffffff;
|
|
150
|
+
--paper-raised: #ffffff;
|
|
151
|
+
--ink: #081214;
|
|
152
|
+
--ink-soft: #1c2a26;
|
|
153
|
+
--graphite: #2e3a35;
|
|
154
|
+
--rule: #081214;
|
|
155
|
+
--rule-strong: #081214;
|
|
156
|
+
--viridian: #143f30;
|
|
157
|
+
--viridian-deep: #0c2a1f;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* ── print ────────────────────────────────────────────────────── */
|
|
162
|
+
@media print {
|
|
163
|
+
:root {
|
|
164
|
+
--paper: #ffffff;
|
|
165
|
+
--paper-raised: #ffffff;
|
|
166
|
+
--ink: #000000;
|
|
167
|
+
--shadow-overlay: none;
|
|
168
|
+
}
|
|
169
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jflamb/ledger",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Ledger — design tokens for jflamb.com, assistant.jflamb.com, and retirement.jflamb.com. Ink on warm paper, viridian brand, semantic tokens underneath.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/jflamb/ledger.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/jflamb/ledger#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/jflamb/ledger/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"css",
|
|
16
|
+
"design-system",
|
|
17
|
+
"design-tokens",
|
|
18
|
+
"themes",
|
|
19
|
+
"accessibility"
|
|
20
|
+
],
|
|
21
|
+
"style": "ledger.css",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": "./ledger.css",
|
|
24
|
+
"./ledger.css": "./ledger.css"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"ledger.css",
|
|
28
|
+
"README.md",
|
|
29
|
+
"CHANGELOG.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"sideEffects": [
|
|
33
|
+
"*.css"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"test": "node scripts/check-contrast.mjs",
|
|
37
|
+
"check:package": "npm pack --dry-run",
|
|
38
|
+
"sync:site": "node scripts/sync-site.mjs",
|
|
39
|
+
"check:drift": "node scripts/check-drift.mjs"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public",
|
|
46
|
+
"provenance": true,
|
|
47
|
+
"registry": "https://registry.npmjs.org/"
|
|
48
|
+
},
|
|
49
|
+
"license": "MIT"
|
|
50
|
+
}
|