isotone 0.4.1 → 1.0.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/AGENTS.md +40 -50
- package/CHANGELOG.md +20 -0
- package/README.md +3 -12
- package/dist/{chunk-UMVPMPVE.js → chunk-BJ4UI73I.js} +2 -2
- package/dist/{chunk-UMVPMPVE.js.map → chunk-BJ4UI73I.js.map} +1 -1
- package/dist/{chunk-ZBULKB3S.js → chunk-DD6BKC3R.js} +2 -2
- package/dist/{chunk-SNGBNVH2.js → chunk-OSETWKGE.js} +1 -27
- package/dist/{chunk-SNGBNVH2.js.map → chunk-OSETWKGE.js.map} +1 -1
- package/dist/{chunk-YWMOXPE7.js → chunk-UYMMI2IH.js} +3 -3
- package/dist/{chunk-YWMOXPE7.js.map → chunk-UYMMI2IH.js.map} +1 -1
- package/dist/cli.js +3 -3
- package/dist/core.js +2 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/isotone.global.js +10 -10
- package/dist/serve.js +1 -1
- package/dist/server.js +2 -2
- package/dist/vite-plugin.js +3 -3
- package/docs/migration.md +7 -5
- package/docs/updates.md +6 -5
- package/package.json +7 -2
- package/docs/design.md +0 -213
- package/docs/development.md +0 -86
- package/docs/releasing.md +0 -87
- /package/dist/{chunk-ZBULKB3S.js.map → chunk-DD6BKC3R.js.map} +0 -0
package/dist/serve.js
CHANGED
package/dist/server.js
CHANGED
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
readActive,
|
|
11
11
|
variantsResponse,
|
|
12
12
|
writeActive
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-DD6BKC3R.js";
|
|
14
14
|
import {
|
|
15
15
|
VARIANTS_ENDPOINT
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OSETWKGE.js";
|
|
17
17
|
import {
|
|
18
18
|
NOTES_ENDPOINT,
|
|
19
19
|
PAYLOAD_MAX,
|
package/dist/vite-plugin.js
CHANGED
|
@@ -15,14 +15,14 @@ import {
|
|
|
15
15
|
resolveOverride,
|
|
16
16
|
variantsDir,
|
|
17
17
|
variantsResponse
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-DD6BKC3R.js";
|
|
19
19
|
import {
|
|
20
20
|
VARIANTS_ENDPOINT
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-OSETWKGE.js";
|
|
22
22
|
import {
|
|
23
23
|
UPDATE_ENDPOINT,
|
|
24
24
|
startUpdateCheck
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-BJ4UI73I.js";
|
|
26
26
|
import {
|
|
27
27
|
NOTES_ENDPOINT,
|
|
28
28
|
ensureDirIgnored,
|
package/docs/migration.md
CHANGED
|
@@ -12,8 +12,10 @@ its coding agent. The package and CLI are now `isotone`; the exported API names,
|
|
|
12
12
|
CLI commands, standalone script URLs (`/isotone.js`), environment variables
|
|
13
13
|
(`ISOTONE_UPDATE_CHECK` and `ISOTONE_VARIANT`), and agent instructions.
|
|
14
14
|
Keep API names such as `iteration`, `IterationPanel`, and `mountIteration`.
|
|
15
|
-
4.
|
|
16
|
-
|
|
15
|
+
4. Move the entire `.iso-iterate/` directory to `.isotone/`, including
|
|
16
|
+
`knobs.json`, `active.json`, and any local variants. Update ignore rules,
|
|
17
|
+
including a `.git/info/exclude` entry for `.isotone/active.json` if the
|
|
18
|
+
old active file was ignored there. Check each variant preview
|
|
17
19
|
before promotion: a stored base snapshot containing the old package import
|
|
18
20
|
can appear stale after the rename. Recreate or sync that variant against the
|
|
19
21
|
renamed source rather than promoting it blindly. Leave
|
|
@@ -26,6 +28,6 @@ On the same browser origin, Isotone carries forward the previous default
|
|
|
26
28
|
storage keys for offline notes, drafts, and knob selections. A different host,
|
|
27
29
|
port, or browser profile has separate storage. Custom keys stay unchanged.
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`iso-iterate` versions remain installable.
|
|
31
|
+
Use `isotone@0.4.1` or newer. The older 0.4.0 package includes a one-time
|
|
32
|
+
`migrate` command but also has note-saving bugs fixed in 0.4.1; use this guide
|
|
33
|
+
for the work repositories. Existing `iso-iterate` versions remain installable.
|
package/docs/updates.md
CHANGED
|
@@ -35,9 +35,9 @@ The suggested command pins the specific version you just checked, rather than a
|
|
|
35
35
|
`latest` tag that could move before installation. For example:
|
|
36
36
|
|
|
37
37
|
```sh
|
|
38
|
-
npm install -D --save-exact isotone@0.
|
|
39
|
-
pnpm add -D --exact isotone@0.
|
|
40
|
-
yarn add -D --exact isotone@0.
|
|
38
|
+
npm install -D --save-exact isotone@1.0.0
|
|
39
|
+
pnpm add -D --exact isotone@1.0.0
|
|
40
|
+
yarn add -D --exact isotone@1.0.0
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
These examples illustrate the syntax; use the version reported by your check.
|
|
@@ -86,8 +86,9 @@ A lockfile records the selected dependency tree. `npm ci` installs that tree
|
|
|
86
86
|
without updating the manifest or lockfile; publishing another version does not
|
|
87
87
|
change it. [npm ci](https://docs.npmjs.com/cli/v11/commands/npm-ci/)
|
|
88
88
|
|
|
89
|
-
`npm update` respects the declared range.
|
|
90
|
-
releases below `
|
|
89
|
+
`npm update` respects the declared range. `^1.0.0` accepts compatible minor
|
|
90
|
+
and patch releases below `2.0.0`. Older `^0.3.4` installs stay below `0.4.0`;
|
|
91
|
+
they do not adopt `1.0.0`. `^0.0.4` stays below `0.0.5`.
|
|
91
92
|
An explicit install of a new version deliberately changes that choice.
|
|
92
93
|
[npm's range examples](https://docs.npmjs.com/cli/v11/commands/npm-update/)
|
|
93
94
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isotone",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Local feedback and design variants for your running web app. Pin elements, leave notes, and give your coding agent the context to make the change.",
|
|
@@ -35,7 +35,12 @@
|
|
|
35
35
|
},
|
|
36
36
|
"files": [
|
|
37
37
|
"dist",
|
|
38
|
-
"docs",
|
|
38
|
+
"docs/assets/preview.jpg",
|
|
39
|
+
"docs/integrations.md",
|
|
40
|
+
"docs/migration.md",
|
|
41
|
+
"docs/updates.md",
|
|
42
|
+
"docs/variants.md",
|
|
43
|
+
"docs/third-party-notices.md",
|
|
39
44
|
"AGENTS.md",
|
|
40
45
|
"CHANGELOG.md"
|
|
41
46
|
],
|
package/docs/design.md
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
# Instrument design
|
|
2
|
-
|
|
3
|
-
Instrument is the single design for Isotone: a horizontal pill with feedback
|
|
4
|
-
and variant panels above it. Light and dark mode share components, geometry,
|
|
5
|
-
typography, interaction states and motion. Only their paint tokens differ.
|
|
6
|
-
|
|
7
|
-
The panel should feel like a small physical control placed on the host page.
|
|
8
|
-
Depth explains function; decoration should not compete with the app being
|
|
9
|
-
reviewed.
|
|
10
|
-
|
|
11
|
-
## Materials and states
|
|
12
|
-
|
|
13
|
-
| Role | Light | Dark |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| Panel surface | White with a light edge and crisp contact shadow | Dark neutral surface with a quiet edge and shadow |
|
|
16
|
-
| Recessed field or selector slot | Gray fill and one crisp inset border | Deeper background with a restrained inset shadow |
|
|
17
|
-
| Raised action or persistent selection | White face, gray border and unblurred gray bottom shadow | Lighter face, edge highlight and contact shadow |
|
|
18
|
-
| Hover | Stronger text or edge within the existing material | Stronger text or a subtle lighter face |
|
|
19
|
-
|
|
20
|
-
Gray means recessed in light mode. In the default design, selection means raised. Saved notes being
|
|
21
|
-
edited, selected segments and thumbnails, the element picker toggle and open
|
|
22
|
-
pill buttons indicate persistent selection. Segments, thumbnails and the picker
|
|
23
|
-
use the shared selection recipe; pill buttons use Clean Highlight's simpler
|
|
24
|
-
face, fine border and crisp contact shadow. A selected colour swatch
|
|
25
|
-
keeps its represented colour inside that raised frame.
|
|
26
|
-
|
|
27
|
-
Save as defaults, Send and other raised actions share their normal and hover
|
|
28
|
-
recipes. Do not create a special Save button material, stack several inset
|
|
29
|
-
borders, or use a brightness filter that also washes out the border. Hover must
|
|
30
|
-
remain less prominent than a persistent selection.
|
|
31
|
-
|
|
32
|
-
Idle pill icons and the count badge use the same muted visual hierarchy. The
|
|
33
|
-
badge is part of the control, not a contrasting notification bubble. All icons
|
|
34
|
-
come through the shared `Icon` component.
|
|
35
|
-
|
|
36
|
-
Keyboard focus uses the common visible outline. The text field is an intentional
|
|
37
|
-
exception: focusing it reveals the caret without changing the field's border,
|
|
38
|
-
fill or bottom edge. Clicking any noninteractive area of the composer focuses
|
|
39
|
-
the textarea. Its buttons retain their own actions. Disabled controls keep their
|
|
40
|
-
shape and material, reduce opacity and do not receive hover treatment.
|
|
41
|
-
|
|
42
|
-
## Geometry and content
|
|
43
|
-
|
|
44
|
-
The layout constants live in `styles.ts`. Current anchors are:
|
|
45
|
-
|
|
46
|
-
| Measure | Value |
|
|
47
|
-
| --- | --- |
|
|
48
|
-
| Panel inset and regular section spacing | 12px |
|
|
49
|
-
| Space between panels and between panel and pill | 8px |
|
|
50
|
-
| Composer inset | 10px, derived from the panel inset |
|
|
51
|
-
| Composer controls | 24px faces, 14px icons, 28px hit areas |
|
|
52
|
-
| Collapsed pill | 44 × 44px |
|
|
53
|
-
| Expanded pill with two tools | 76 × 44px |
|
|
54
|
-
| Tool faces | 28px, with 4px between faces and around them |
|
|
55
|
-
| Saved note padding | 6px vertically, 11px horizontally; background extends 1px past the composer on each side |
|
|
56
|
-
|
|
57
|
-
The expanded pill is the same material stretched horizontally. Preserve its
|
|
58
|
-
lower surrounding rim, inset and proportions. Panels stay anchored above it;
|
|
59
|
-
opening one must not move the pill or scale the text in another. Save as defaults
|
|
60
|
-
sits at the bottom left of the variants panel and appears only when needed.
|
|
61
|
-
|
|
62
|
-
Slider label spacing accounts for the thumb's inset within its hit area, so its
|
|
63
|
-
visible edge has the same 6px gap below the header as other controls. Range
|
|
64
|
-
inputs use block layout to avoid extra inline baseline space.
|
|
65
|
-
|
|
66
|
-
Selector labels and their action-dialog titles share one font rule. Opening a
|
|
67
|
-
dialog must not make the same label heavier. Selected and unselected options
|
|
68
|
-
use the same font weight; their material and text colour indicate selection. The host's `--font-sans` may provide
|
|
69
|
-
the typeface; component weights and sizing stay in the shared stylesheet.
|
|
70
|
-
|
|
71
|
-
Saved feedback uses one row with inline references and no extra gap between rows.
|
|
72
|
-
Note text sits 3px outside the composer text inset. References use at most 42%
|
|
73
|
-
of the row, leaving the note the remaining width. The delete action floats over
|
|
74
|
-
the top-right corner with a 24px hit target; it reserves no column. Show it on
|
|
75
|
-
hover, keyboard focus or selection, and always on touch devices.
|
|
76
|
-
References name the pinned element or selector rather than displaying a route
|
|
77
|
-
and pin count. Defaults and feedback references use the same compact tag shape,
|
|
78
|
-
typeface, border and shadow. A single tag may use all available width; multiple
|
|
79
|
-
tags receive compact width limits. Preserve the full accessible text when
|
|
80
|
-
clipping it visually.
|
|
81
|
-
|
|
82
|
-
Composer tags share a horizontal strip. At rest their first and last edges align
|
|
83
|
-
with the field's inset. While scrolling they can reach the field edges; there is
|
|
84
|
-
no permanent side padding or dark fade in front of them. Editing and selector
|
|
85
|
-
reference tags follow this same rule.
|
|
86
|
-
|
|
87
|
-
Selector action dialogs show feedback first, then individual choices without
|
|
88
|
-
an “Options” heading, followed by Reset to default, Keep default only, and
|
|
89
|
-
removal last.
|
|
90
|
-
|
|
91
|
-
Selector action dialogs have a 260px minimum height and reserve 360px in their
|
|
92
|
-
parent panel when space allows, even for a selector with only one action. The viewport remains the upper
|
|
93
|
-
bound; short screens scroll instead of pushing controls off-screen.
|
|
94
|
-
|
|
95
|
-
Removal actions create readable, editable requests for the coding agent. They do
|
|
96
|
-
not hide or mutate selectors, options or dependent controls. Cancel a pending
|
|
97
|
-
request from its feedback note; selectors do not add a status or Undo row. Pending actions are
|
|
98
|
-
disabled in the menu to avoid duplicate requests. Cancelling a pending request
|
|
99
|
-
leaves the preview unchanged. Once an agent applies a source change, deleting the
|
|
100
|
-
request does not undo that change.
|
|
101
|
-
|
|
102
|
-
Native tooltips are reserved for brief icon-only hints and labels that actually
|
|
103
|
-
overflow. Do not put full feedback notes, readable labels or internal selectors
|
|
104
|
-
in `title` attributes. Check label overflow on pointer entry, without observing
|
|
105
|
-
or measuring every row during render. Accessible labels retain the full text.
|
|
106
|
-
|
|
107
|
-
## Scrolling
|
|
108
|
-
|
|
109
|
-
Keep native scrolling, wheel/trackpad input and keyboard focus reveal. Hide
|
|
110
|
-
scrollbar chrome without disabling overflow.
|
|
111
|
-
|
|
112
|
-
Content passing under a fixed area fades into the actual surface. This applies
|
|
113
|
-
to the Save footer, selector action-dialog header, conditional error footer and
|
|
114
|
-
both edges of the saved-note list and the top of scrolled composer text. List
|
|
115
|
-
padding lets its first and last rows scroll fully clear of the fades. The textarea top
|
|
116
|
-
mask appears only after scrolling, preserving its first line at rest. Without
|
|
117
|
-
reference tags, the textarea extends through the field's top inset: that space
|
|
118
|
-
scrolls away with the content, and the fade reaches the field edge. With tags,
|
|
119
|
-
the gap below the reference strip also belongs to the scrolling text area;
|
|
120
|
-
scrolled text fades directly beneath the strip. Use the shared surface token or a mask so the
|
|
121
|
-
fade also works over dark gradients. Do not create a hard clipping edge inside
|
|
122
|
-
an otherwise empty inset. The first and last item must remain fully reachable;
|
|
123
|
-
reserve scroll padding for fixed controls and keyboard outlines.
|
|
124
|
-
|
|
125
|
-
## Theme configuration
|
|
126
|
-
|
|
127
|
-
`theme` accepts four values on the React panel, mount and integrations:
|
|
128
|
-
|
|
129
|
-
| Value | Meaning |
|
|
130
|
-
| --- | --- |
|
|
131
|
-
| `auto` (default) | Follow the actual page background near the dock |
|
|
132
|
-
| `system` | Follow the OS colour preference, independent of the host page |
|
|
133
|
-
| `light` | Always use the light palette |
|
|
134
|
-
| `dark` | Always use the dark palette |
|
|
135
|
-
|
|
136
|
-
Automatic detection ignores the overlay itself, composites transparent page
|
|
137
|
-
backgrounds and follows page changes without polling. An unpainted canvas uses
|
|
138
|
-
CSS `color-scheme`, or white when no dark canvas is declared. Open shadow roots
|
|
139
|
-
at the sample point are included where the browser exposes them.
|
|
140
|
-
|
|
141
|
-
Image and gradient backgrounds, closed shadow roots and CSSOM-only changes
|
|
142
|
-
without a DOM or browser event cannot be reliably inferred. Those hosts should
|
|
143
|
-
pass an explicit theme or use `system`. Keep detection in `theme.ts`; do not add
|
|
144
|
-
component-level checks of page classes, media queries or background colour.
|
|
145
|
-
|
|
146
|
-
## Motion
|
|
147
|
-
|
|
148
|
-
Motion explains opening, closing and layout changes. Keyboard-initiated actions
|
|
149
|
-
are immediate. Reduced motion removes spatial movement. Pointer hover stays
|
|
150
|
-
brief. The launcher expands on mouse or hovering-pen entry, including on hybrid
|
|
151
|
-
devices whose primary pointer reports as coarse. Touch still opens it by tap.
|
|
152
|
-
The pill has a continuous hit surface across its rim and the gap between icons.
|
|
153
|
-
|
|
154
|
-
`motion.ts` owns the shared timings: 200ms entry, 125ms exit and 180ms list reflow,
|
|
155
|
-
with `cubic-bezier(.23,1,.32,1)`. Reuse these values instead of adding timing
|
|
156
|
-
literals. There is no stagger across a queue of controls.
|
|
157
|
-
|
|
158
|
-
Panel and list movement uses transforms and opacity through the Web Animations
|
|
159
|
-
API. Text, corners and hit targets retain their natural size. Read positions
|
|
160
|
-
before writing styles, retarget interrupted movement, and cancel animations on
|
|
161
|
-
cleanup. The small pill width transition is bounded to the dock itself; do not
|
|
162
|
-
extend width or height animation to long content lists.
|
|
163
|
-
|
|
164
|
-
Lists above `MAX_ANIMATED_ITEMS` (40) update immediately. Large panels also skip
|
|
165
|
-
cloned exit snapshots. Hidden lists do not measure every render, and typing in
|
|
166
|
-
the composer must not remeasure unchanged selectors or notes.
|
|
167
|
-
|
|
168
|
-
## Where changes belong
|
|
169
|
-
|
|
170
|
-
| File | Responsibility |
|
|
171
|
-
| --- | --- |
|
|
172
|
-
| `src/react/appearance.ts` | Complete light/dark palettes and the shared material recipe |
|
|
173
|
-
| `src/react/styles.ts` | Geometry, typography, shared control classes and state selectors |
|
|
174
|
-
| `src/react/feedback-layout.ts`, `pill-active.ts` | Small material/layout recipes that can be independently previewed as overlays |
|
|
175
|
-
| `src/react/UpdateNotice.tsx` | Quiet local update snapshot and explicit upgrade instructions |
|
|
176
|
-
| `src/react/icons.tsx` | Icon choices, optical size and stroke |
|
|
177
|
-
| `src/react/NoteSummary.tsx` | Saved feedback/defaults summaries and their shared tag rendering |
|
|
178
|
-
| `src/react/IterationPanel.tsx` | Dock, composer, feedback and element-picking behavior |
|
|
179
|
-
| `src/react/VariantsView.tsx` | Selectors, action dialogs and Save as defaults |
|
|
180
|
-
| `src/react/theme.ts` | Theme resolution, observation and cleanup |
|
|
181
|
-
| `src/react/motion.ts` | Motion timing and work limits |
|
|
182
|
-
| `src/react/useDockMotion.ts`, `useLayoutMotion.ts` | Measured movement and interruption handling |
|
|
183
|
-
|
|
184
|
-
To add a control, choose its semantic role first: surface, well, raised action or
|
|
185
|
-
selection. Reuse that recipe and an existing control class where possible.
|
|
186
|
-
Add any new state selector once in `styles.ts`. A new paint token must exist in
|
|
187
|
-
both palettes; a spacing or behavior change never belongs in a theme branch.
|
|
188
|
-
Extract repeated markup when it has shared behavior or content rules, as with
|
|
189
|
-
summary tags, rather than copying a component for another theme.
|
|
190
|
-
|
|
191
|
-
## Verification
|
|
192
|
-
|
|
193
|
-
Inspect the same content in both themes: collapsed and expanded pill, empty and
|
|
194
|
-
saved feedback, editing, pinned references, selectors, action dialogs, hover,
|
|
195
|
-
keyboard focus, disabled actions and scrolling edges. Include a narrow viewport,
|
|
196
|
-
long unbroken labels, many notes and many selector options. Exercise rapid
|
|
197
|
-
open/close, keyboard shortcuts and reduced motion.
|
|
198
|
-
|
|
199
|
-
The style tests reject theme-specific component/state rules and missing or
|
|
200
|
-
circular paint tokens. React tests cover shared interactions, theme changes and
|
|
201
|
-
async state preservation. Run `pnpm check` before a release. For screenshots,
|
|
202
|
-
use synthetic demo content; never include local feedback files, personal notes
|
|
203
|
-
or a real project's private interface.
|
|
204
|
-
|
|
205
|
-
## Accepted design choices
|
|
206
|
-
|
|
207
|
-
Inline references is the feedback layout. Clean Highlight is the active-pill
|
|
208
|
-
material: a slightly lighter solid face, fine border and crisp 1px contact
|
|
209
|
-
shadow. Both themes use the same recipe in `pill-active.ts`.
|
|
210
|
-
|
|
211
|
-
Earlier list alternatives and the default, ring, dot, recessed and inset pill
|
|
212
|
-
experiments have been removed. New alternatives should start from this baseline
|
|
213
|
-
and remain separate until explicitly chosen.
|
package/docs/development.md
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# Development
|
|
2
|
-
|
|
3
|
-
The runtime is TypeScript throughout. The expensive work is DOM traversal, disk
|
|
4
|
-
access, and redundant updates; avoiding that work matters more here than adding
|
|
5
|
-
a second language or runtime.
|
|
6
|
-
|
|
7
|
-
## Boundaries
|
|
8
|
-
|
|
9
|
-
| Layer | Responsibility |
|
|
10
|
-
| --- | --- |
|
|
11
|
-
| `src/core` | Note descriptors, browser persistence, variant sources and selection rules. No React or Vite. |
|
|
12
|
-
| `src/react` | Shadow-root panel, shared materials, controls, themes and motion. |
|
|
13
|
-
| `src/store.ts`, `src/file-store.ts` | Validated note storage, atomic writes and serialized updates. |
|
|
14
|
-
| `src/variants-store.ts` | Manifests, file alternatives, path guards, activation and promotion. |
|
|
15
|
-
| `src/server` | Request adapters, bounded bodies and origin checks. |
|
|
16
|
-
| `src/vite`, `src/serve` | Development-server integration and self-contained panel delivery. |
|
|
17
|
-
| `src/cli` | Setup, feedback and variant commands over the same stores. |
|
|
18
|
-
| `src/standalone` | Private bundled React runtime for hosts without React. |
|
|
19
|
-
|
|
20
|
-
Public entry points are `react`, `core`, `server`, `serve`, `vite`, and `cli`.
|
|
21
|
-
Keep browser code out of server entries and keep React/Vite optional for CLI and
|
|
22
|
-
standalone consumers. The build bundles only the icons used by the panel.
|
|
23
|
-
|
|
24
|
-
## Local workflow
|
|
25
|
-
|
|
26
|
-
`pnpm dev` starts the fictional demo at `http://127.0.0.1:4173`. Its top bar
|
|
27
|
-
provides the theme settings:
|
|
28
|
-
|
|
29
|
-
| Control | What it changes |
|
|
30
|
-
| --- | --- |
|
|
31
|
-
| Page | The mock app's actual light or dark background |
|
|
32
|
-
| Panel | Automatic page detection, system preference, or an explicit theme |
|
|
33
|
-
|
|
34
|
-
The sample app's Spacing, Accent colour, Card radius and Card padding selectors
|
|
35
|
-
remain inside the panel. Clean Highlight is the product default; there is no
|
|
36
|
-
active-pill design switcher.
|
|
37
|
-
|
|
38
|
-
`/preview.html` composes real components in both themes for the README image.
|
|
39
|
-
Demo feedback uses seeded files in a temporary
|
|
40
|
-
directory, separate from project notes; the server removes them when it closes.
|
|
41
|
-
Open `/?stress=1` for 500 selectors and 500 notes, including long labels and large
|
|
42
|
-
feedback.
|
|
43
|
-
|
|
44
|
-
`pnpm check` runs types, lint, build, and the test suite. `pnpm check:package`
|
|
45
|
-
exercises the packed artifact in a clean consumer. Tests focus on observable
|
|
46
|
-
behaviour, transport/store failures, lifecycle cleanup, and design boundaries.
|
|
47
|
-
Use small regression cases for bugs; avoid tests that merely duplicate code.
|
|
48
|
-
|
|
49
|
-
## Performance
|
|
50
|
-
|
|
51
|
-
Selector dependencies are walked iteratively in linear time; long chains do not
|
|
52
|
-
consume the JavaScript call stack. DOM descriptors read sibling metadata only
|
|
53
|
-
where a selector needs it. Variant status uses an in-process Git-compatible blob
|
|
54
|
-
hash rather than launching a process per file.
|
|
55
|
-
|
|
56
|
-
Theme events and picker geometry are coalesced per frame. Note and selector layout
|
|
57
|
-
animation runs only when the collection changes; collections above 40 items skip
|
|
58
|
-
per-item motion. Reads precede writes, interrupted animations start from the
|
|
59
|
-
visible position, and reduced-motion or keyboard actions remove movement.
|
|
60
|
-
|
|
61
|
-
Do not add virtualization or a new runtime without a measured bottleneck and a
|
|
62
|
-
clear benefit. Preserve native scrolling and keyboard access. Before changing
|
|
63
|
-
performance-sensitive code, include large collections and failure/retry paths in
|
|
64
|
-
validation; a fast happy path is insufficient.
|
|
65
|
-
|
|
66
|
-
## UI changes
|
|
67
|
-
|
|
68
|
-
Follow [the design language](design.md). Use shared semantic materials and
|
|
69
|
-
components rather than selector-specific theme overrides. Check both themes,
|
|
70
|
-
selected/hover/focus/disabled states, long labels, empty and populated feedback,
|
|
71
|
-
sticky fades, narrow viewports, and reduced motion. Context must remain accessible
|
|
72
|
-
even when a label is visually truncated.
|
|
73
|
-
|
|
74
|
-
`src/react/feedback-layout.ts` holds the accepted inline-reference layout.
|
|
75
|
-
`src/react/pill-active.ts` holds the accepted Clean Highlight recipe. Future
|
|
76
|
-
review alternatives belong under `.isotone/variants/`.
|
|
77
|
-
Edit the copied recipe when developing an alternative; keep shared geometry,
|
|
78
|
-
theme tokens and unrelated controls in the main stylesheet.
|
|
79
|
-
|
|
80
|
-
The panel's auto theme samples rendered background colours, not pixels from
|
|
81
|
-
images. A host can pass `light` or `dark` when those samples do not represent the
|
|
82
|
-
page. `system` deliberately ignores the host theme.
|
|
83
|
-
|
|
84
|
-
For notice layout checks, `/?review=1&update-preview=1` supplies a fictional
|
|
85
|
-
update result. It does not contact npm or install anything. `/?review=1` keeps
|
|
86
|
-
feedback open across variant reloads.
|
package/docs/releasing.md
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# Releasing
|
|
2
|
-
|
|
3
|
-
A push runs CI; it does not publish. Publishing a stable GitHub Release starts
|
|
4
|
-
`.github/workflows/publish.yml`. Its tag must be exactly `v` followed by the
|
|
5
|
-
version in `package.json`. Prereleases are skipped.
|
|
6
|
-
|
|
7
|
-
## Before making the repository public
|
|
8
|
-
|
|
9
|
-
Review the tracked tree and Git history, including deleted files, for private
|
|
10
|
-
notes, credentials, internal URLs, screenshots and personal machine paths.
|
|
11
|
-
Check the actual npm archive too: source maps contain source text. Keep demo
|
|
12
|
-
content fictional and keep local feedback and scratch files out of Git and npm.
|
|
13
|
-
A clean current tree does not prove that old commits are suitable for publication.
|
|
14
|
-
|
|
15
|
-
Keep the MIT copyright notice and [third-party license notices](third-party-notices.md). Public author
|
|
16
|
-
attribution and the intended repository/package links are deliberate; do not
|
|
17
|
-
remove them as part of privacy cleanup. If history needs cleanup, agree on that
|
|
18
|
-
separately before changing it or opening the repository.
|
|
19
|
-
|
|
20
|
-
## Prepare a release
|
|
21
|
-
|
|
22
|
-
1. Update the package version and changelog. Preserve the lockfile's resolved
|
|
23
|
-
versions unless the release intentionally changes dependencies.
|
|
24
|
-
2. Run `pnpm install --frozen-lockfile`, `pnpm check`, and `pnpm check:package`.
|
|
25
|
-
Inspect both themes in the demo and confirm a production Vite build contains
|
|
26
|
-
no panel. Manual integrations must also guard their endpoints in production.
|
|
27
|
-
3. Inspect `npm pack --dry-run --json`. Expect the built entries, declarations,
|
|
28
|
-
source maps, documentation and licenses. Check that the README preview image
|
|
29
|
-
exists and uses fictional content.
|
|
30
|
-
4. After approval to release, commit the reviewed changes and publish a GitHub
|
|
31
|
-
Release at `v<version>`. Do not reuse a version already published to npm.
|
|
32
|
-
|
|
33
|
-
The release check job rebuilds and tests the tagged checkout, then creates an
|
|
34
|
-
archive. A separate job downloads that archive and publishes it with provenance.
|
|
35
|
-
Only that job has OIDC permission; it does not install dependencies or run project
|
|
36
|
-
scripts. CI also checks the packed runtime on Node 20 and full development checks
|
|
37
|
-
on Node 22 and 24.
|
|
38
|
-
|
|
39
|
-
## npm setup outside the repository
|
|
40
|
-
|
|
41
|
-
In the package's npm settings, verify the trusted publisher names the intended
|
|
42
|
-
GitHub owner, repository and **`publish.yml`**. Allow direct `npm publish`; new
|
|
43
|
-
configurations can default to staged publishing only. This workflow has no GitHub
|
|
44
|
-
environment name, so the configured publisher must not require one. An existing
|
|
45
|
-
working publisher does not need replacing. A new configuration must complete its
|
|
46
|
-
first publish within two days. The workflow uses GitHub-hosted runners, Node 24,
|
|
47
|
-
and checks for npm 11.5.1 or newer. No long-lived publish token is needed.
|
|
48
|
-
See [npm's trusted publishing guide](https://docs.npmjs.com/trusted-publishers/).
|
|
49
|
-
|
|
50
|
-
The intended repository and package must be public for provenance, and
|
|
51
|
-
`package.json`'s repository URL must match the publishing repository. Opening the
|
|
52
|
-
repository and changing npm settings are separate maintainer actions. The local
|
|
53
|
-
checks do not verify account-side configuration or prove that publication will
|
|
54
|
-
succeed. See [npm's provenance requirements](https://docs.npmjs.com/generating-provenance-statements/).
|
|
55
|
-
|
|
56
|
-
After publishing, verify the new version, README image, exports and provenance
|
|
57
|
-
on npm, then try the documented quick start in a clean project.
|
|
58
|
-
|
|
59
|
-
## First release under the Isotone name
|
|
60
|
-
|
|
61
|
-
Renaming the GitHub repository does not rename an npm package or change existing
|
|
62
|
-
installs. npm requires publishing under the new name. Keep `iso-iterate`
|
|
63
|
-
available so its existing lockfiles remain installable; deprecate it only after
|
|
64
|
-
the new package and migration have been verified. See npm's
|
|
65
|
-
[rename guidance](https://docs.npmjs.com/unpublishing-packages-from-the-registry/)
|
|
66
|
-
and [deprecation guidance](https://docs.npmjs.com/deprecating-and-undeprecating-packages-or-package-versions/).
|
|
67
|
-
|
|
68
|
-
Before tagging the first release, confirm that the publishing account can use
|
|
69
|
-
`isotone`. A registry 404 or an unpublished-package record does not establish
|
|
70
|
-
ownership or permission to publish. A successful local build establishes neither.
|
|
71
|
-
If npm does not offer settings for the new package yet, establish it using an
|
|
72
|
-
authenticated, maintainer-approved first publication before relying on its
|
|
73
|
-
trusted publisher. Do not create a release tag on the assumption that the old
|
|
74
|
-
package's publisher configuration applies to the new name.
|
|
75
|
-
|
|
76
|
-
Configure the new package's publisher for `aaroi/isotone` and `publish.yml`, and
|
|
77
|
-
verify its repository metadata. Then test both a clean install and the
|
|
78
|
-
[migration](migration.md) in a copy of an existing project. Only after those pass,
|
|
79
|
-
an authorized maintainer can set the old package's deprecation message:
|
|
80
|
-
|
|
81
|
-
```sh
|
|
82
|
-
npm deprecate iso-iterate "Renamed to isotone. Migration: https://github.com/aaroi/isotone/blob/main/docs/migration.md"
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Deprecation displays guidance during installation; it does not migrate files,
|
|
86
|
-
change dependencies, or remove existing installations. Do not unpublish the old
|
|
87
|
-
package as part of the rename.
|
|
File without changes
|