altitude-design 0.5.0 → 0.6.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/dist/altitude.css +9 -2
- package/dist/altitude.iife.js +15 -15
- package/dist/altitude.no-fonts.css +9 -2
- package/dist/guidance/components/AgentFleet/README.md +1 -1
- package/dist/guidance/components/Board/README.md +35 -11
- package/dist/guidance/components/CommentThread/README.md +3 -1
- package/dist/guidance/components/InlineEdit/README.md +1 -1
- package/dist/guidance/components/SaveBar/README.md +3 -1
- package/dist/guidance/index.json +14 -14
- package/dist/guidance/llms.txt +1 -1
- package/dist/guidance/manifest.json +20 -20
- package/dist/guidance/references/build/checks/agent-action-pattern.mjs +2 -0
- package/dist/guidance/references/build/checks/assistant-conversation-pattern.mjs +2 -0
- package/dist/guidance/references/build/checks/members-pattern.mjs +2 -0
- package/dist/guidance/references/build/checks/settings-pattern.mjs +2 -0
- package/dist/guidance/references/build/fixtures/patterns/agent-action.jsx +34 -30
- package/dist/guidance/references/build/fixtures/patterns/assistant-conversation.jsx +8 -6
- package/dist/guidance/references/build/fixtures/patterns/members.jsx +28 -24
- package/dist/guidance/references/build/fixtures/patterns/settings.jsx +34 -30
- package/dist/guidance/visual/ActionsInPlace.md +8 -11
- package/dist/guidance/visual/Distinctiveness.md +1 -1
- package/dist/guidance/visual/Research.md +1 -1
- package/dist/guidance/visual/Theming.md +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +2 -1
- package/dist/index.js.map +2 -2
- package/dist/types/collections.d.ts +7 -2
- package/dist/types-cjs/collections.d.cts +7 -2
- package/package.json +1 -1
|
@@ -3158,13 +3158,20 @@ a.alt-notes-link:focus-visible { outline: 2px solid var(--accent-ink); outline-o
|
|
|
3158
3158
|
transition: box-shadow var(--dur-travel-1) var(--ease-rise), background-color var(--dur-travel-1), transform var(--dur-travel-2) var(--ease-settle),
|
|
3159
3159
|
rotate var(--dur-travel-2) var(--ease-settle), scale var(--dur-travel-2) var(--ease-settle);
|
|
3160
3160
|
}
|
|
3161
|
-
@media (hover: hover) { .alt-board-card:hover:not([data-carried]):not([data-held]) { box-shadow: var(--elev-2); } }
|
|
3161
|
+
@media (hover: hover) { .alt-board-card:hover:not([data-carried]):not([data-held]):not([data-status="failed"]) { box-shadow: var(--elev-2); } }
|
|
3162
3162
|
.alt-board-card:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
|
|
3163
3163
|
.alt-board-card[data-carried] { z-index: 10; cursor: grabbing; background: var(--surface-floating); box-shadow: var(--elev-3); rotate: calc(-1.2deg * var(--alt-travel)); scale: calc(1 + 0.015 * var(--alt-travel)); }
|
|
3164
3164
|
.alt-board-card[data-carried]:not([data-following]) { transform: translateY(calc(-3px * var(--alt-travel))); }
|
|
3165
3165
|
.alt-board-card[data-following] { transition: box-shadow var(--dur-travel-1), background-color var(--dur-travel-1), rotate var(--dur-travel-2) var(--ease-settle), scale var(--dur-travel-2) var(--ease-settle); }
|
|
3166
3166
|
.alt-board-card[data-landing] { transition-duration: var(--dur-travel-2); transition-timing-function: var(--ease-settle); }
|
|
3167
3167
|
.alt-board-card[data-held] { cursor: not-allowed; box-shadow: var(--elev-3); transform: translateY(calc(-2px * var(--alt-travel))) rotate(calc(-0.5deg * var(--alt-travel))); }
|
|
3168
|
+
/* A write about the card (#438): the shared commitment readings, restated here because the card's own surface and shadow
|
|
3169
|
+
share their specificity and come later. Pending's hover is an animation, which wins anyway; failed needs the trench. */
|
|
3170
|
+
.alt-board-card[data-status="failed"] { background: var(--critical-soft); box-shadow: var(--trench); outline: 1px solid var(--critical); outline-offset: -1px; }
|
|
3171
|
+
.alt-board-card[data-status="failed"]:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; } /* focus stays visible on a refused card */
|
|
3172
|
+
/* Reduced motion: pending is a shadow without the hover's travel, as everywhere, restated over the card's own elev-1. */
|
|
3173
|
+
@media (prefers-reduced-motion: reduce) { .alt-board-card[data-status="pending"] { box-shadow: var(--elev-2); transition: box-shadow var(--dur-travel-1) var(--ease-rise) var(--dur-grace); } }
|
|
3174
|
+
[data-motion="reduced"] .alt-board-card[data-status="pending"] { box-shadow: var(--elev-2); transition: box-shadow var(--dur-travel-1) var(--ease-rise) var(--dur-grace); }
|
|
3168
3175
|
.alt-board-card[data-held-by] { outline: 2px solid var(--alt-presence); outline-offset: 2px; }
|
|
3169
3176
|
.alt-board-card small { display: block; margin-top: 4px; font: 400 12.5px/17px var(--font-sans); color: var(--ink-muted); }
|
|
3170
3177
|
.alt-board-slot { position: absolute; left: 0; right: 0; border-radius: var(--radius-md); background: var(--surface-trench); box-shadow: var(--trench); outline: 1.5px dashed var(--line-control); outline-offset: -3px; pointer-events: none; transition: top var(--dur-travel-2) var(--ease-settle); }
|
|
@@ -3807,7 +3814,7 @@ button.alt-legend-key[aria-disabled] { cursor: default; }
|
|
|
3807
3814
|
.alt-input[data-filled]:not([data-invalid]) { border-style: solid !important; }
|
|
3808
3815
|
.alt-select-option[data-active] { outline: 2px solid Highlight; outline-offset: -2px; } .alt-select-tick { color: CanvasText; }
|
|
3809
3816
|
.alt-tr:is([data-selected], [data-row-relevance="match"], [data-interactive]:hover) > .alt-td { border-block: 1px solid CanvasText; } .alt-tr[data-row-relevance="miss"] > .alt-td { border-bottom: 1px dashed CanvasText; }
|
|
3810
|
-
.alt-board-card { border: 1px solid CanvasText; } .alt-board-card[data-carried] { border-width: 2px; } .alt-board[data-carrying] .alt-board-col { border: 1px dashed CanvasText; } .alt-board[data-carrying] .alt-board-col[data-over] { border: 2px dashed Highlight; } .alt-board-slot { outline-color: CanvasText; }
|
|
3817
|
+
.alt-board-card { border: 1px solid CanvasText; } .alt-board-card[data-status="pending"] { border: 2px dotted CanvasText; } .alt-board-card[data-status="failed"] { border: 2px dashed CanvasText; } .alt-board-card[data-carried] { border-width: 2px; } .alt-board[data-carrying] .alt-board-col { border: 1px dashed CanvasText; } .alt-board[data-carrying] .alt-board-col[data-over] { border: 2px dashed Highlight; } .alt-board-slot { outline-color: CanvasText; }
|
|
3811
3818
|
.alt-tr[data-row-held] > .alt-td { border-block: 2px solid CanvasText; } .alt-table-slot { outline-color: CanvasText; } .alt-table-wrap[data-top] .alt-th { border-bottom: 1px solid CanvasText; }
|
|
3812
3819
|
.alt-step[data-state="current"] { border: 1px solid CanvasText; } .alt-step[data-state="upcoming"] { border: 1px dashed CanvasText; } .alt-step-mark { border: 1px solid CanvasText; } .alt-step-line[data-done] { background: Highlight; }
|
|
3813
3820
|
.alt-avatar:is([data-status="offline"], [data-more]) .alt-avatar-face { border-color: GrayText; } .alt-avatar[data-live] .alt-avatar-face { border-width: 2px; }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AgentFleet
|
|
2
2
|
|
|
3
|
-
Every agent working on one job, as a roster: grouped by what they need from you (needs you, working, done), each row saying the agent's state in words, what it's doing in one line, how long it has waited or run, where it is in its plan and what it has spent, with warnings for trouble that's coming (two agents changing one file, an agent making no progress). For supervising several agents at once; see [the research](https://github.com/richlaconte/altitude/blob/v0.
|
|
3
|
+
Every agent working on one job, as a roster: grouped by what they need from you (needs you, working, done), each row saying the agent's state in words, what it's doing in one line, how long it has waited or run, where it is in its plan and what it has spent, with warnings for trouble that's coming (two agents changing one file, an agent making no progress). For supervising several agents at once; see [the research](https://github.com/richlaconte/altitude/blob/v0.6.0/docs/research/agent-orchestration/README.md).
|
|
4
4
|
|
|
5
5
|
**Elevation: a record of agents, with live rows.**
|
|
6
6
|
- **Rows** are the record: flush at rest, lifting one level when pointed at because selecting one opens it. The open agent is selected, as a table's row is: `accent-soft`, raised one level, `aria-current`.
|
|
@@ -7,6 +7,7 @@ Columns of cards you move between, a kanban: columns are receptacles that open w
|
|
|
7
7
|
- **A collapsed column is a Pile.** Its thickness (one, two or three sheets) and its count badge say how many cards it holds. It still takes drops: carried over it, it deepens and fans its sheets toward the card, and the card is added to the end.
|
|
8
8
|
- **Someone else's hand.** A card a collaborator is holding (`heldBy`) is lifted to level 3, outlined in their presence colour and wears their name; you can't pick it up meanwhile.
|
|
9
9
|
- **Afterglow.** `settle` makes a card arrive tinted and lifted, then settle: for cards moved by someone else.
|
|
10
|
+
- **A move the server can refuse.** `status` on a `BoardCard` gives it Card's commitment readings. While a move is `pending` the card hovers (level 2 to 3) and is `aria-busy`. When it's `committed` it lands. When it's `failed` it drops into a trench (`critical-soft`, `trench`, a 1px `critical` outline), and stays there until you clear it, usually on its next move. The hover starts after `dur-grace`, so a card dropped as pending first settles from the carry and rises only if the write is still in flight; a fast write never flickers. That's intended, so don't work around it. Where a refused card goes is yours to decide (back where it came from is usual), and so are the words saying why: put them on the card and announce them. A pending card can still be picked up, so a second move while the first is waiting is yours to merge, queue or cancel. Forced colours: dotted while pending, dashed when failed.
|
|
10
11
|
|
|
11
12
|
**Editing in place.** On a board the column you add to is the context, so cards are added and edited where they are, not in a Dialog.
|
|
12
13
|
|
|
@@ -20,7 +21,7 @@ Columns of cards you move between, a kanban: columns are receptacles that open w
|
|
|
20
21
|
|---|---|
|
|
21
22
|
| `Board` | `onMove({ cardId, from, to })`, where `from` and `to` are `{ column, index }`; you update your data and the board carries the cards |
|
|
22
23
|
| `BoardColumn` | `id`, `title`, `collapsible`, `collapsed`/`defaultCollapsed`/`onCollapsedChange`, `onCreate`, `addLabel` |
|
|
23
|
-
| `BoardCard` | `id`, `label` (for announcements), `heldBy`, `settle`, `onRename`, `value`/`renderEditor`/`onSave`/`onValueChange`; anything inside it |
|
|
24
|
+
| `BoardCard` | `id`, `label` (for announcements), `heldBy`, `settle`, `status` (`pending`, `committed`, `failed`), `onRename`, `value`/`renderEditor`/`onSave`/`onValueChange`; anything inside it |
|
|
24
25
|
|
|
25
26
|
**On touch.** A swipe scrolls the board; a press-and-hold picks a card up, then a drag moves it. The card tools are always shown where there's no hover.
|
|
26
27
|
|
|
@@ -40,11 +41,11 @@ import { Board, BoardCard, BoardColumn, Field, Input } from 'altitude-design';
|
|
|
40
41
|
|
|
41
42
|
<Board onMove={move} aria-label="Launch board">
|
|
42
43
|
{Object.keys(titles).map(k => <BoardColumn key={k} id={k} title={titles[k]} collapsible={k === "done"} defaultCollapsed={k === "done"} onCreate={k === "done" ? undefined : create(k)}>
|
|
43
|
-
{cols[k].map(c => <BoardCard key={c.id} id={c.id} label={c.t} heldBy={c.held} onRename={rename(k, c.id)}
|
|
44
|
+
{cols[k].map(c => <BoardCard key={c.id} id={c.id} label={c.t} heldBy={c.held} status={writes[c.id]?.status} onRename={rename(k, c.id)}
|
|
44
45
|
{...(k === "review" ? { value: { title: c.t, meta: c.m }, onValueChange: update(k, c.id),
|
|
45
46
|
renderEditor: field => <><Field label="Title"><Input {...field("title")} size="sm" /></Field><Field label="Details"><Input {...field("meta")} size="sm" /></Field></>,
|
|
46
47
|
onSave: async draft => { await wait(200); return refuse(draft.title) || { ok: true, value: draft }; } } : {})}>
|
|
47
|
-
{c.t}<small>{c.m}</small>
|
|
48
|
+
{c.t}<small>{writes[c.id]?.note ?? c.m}</small>
|
|
48
49
|
</BoardCard>)}
|
|
49
50
|
</BoardColumn>)}
|
|
50
51
|
</Board>
|
|
@@ -54,7 +55,7 @@ The full preview, as rendered in Storybook and checked in CI (`col`, `cap` are t
|
|
|
54
55
|
|
|
55
56
|
```tsx
|
|
56
57
|
import * as React from 'react';
|
|
57
|
-
import { Board, BoardCard, BoardColumn, Field, Input } from 'altitude-design';
|
|
58
|
+
import { Board, BoardCard, BoardColumn, Field, Input, Switch } from 'altitude-design';
|
|
58
59
|
|
|
59
60
|
const start = {
|
|
60
61
|
todo: [{ id: "c1", t: "Write release notes", m: "Docs \xB7 Jon" }, { id: "c2", t: "Fix cold-start regression", m: "Runtime \xB7 Lena" }, { id: "c3", t: "Plan Q1 roadmap", m: "Planning \xB7 Ada" }],
|
|
@@ -67,14 +68,34 @@ export default function App() {
|
|
|
67
68
|
const [cols, setCols] = React.useState(start);
|
|
68
69
|
const [last, setLast] = React.useState(null);
|
|
69
70
|
const seq = React.useRef(0);
|
|
70
|
-
const
|
|
71
|
+
const wait = ms => new Promise(r => setTimeout(r, ms));
|
|
72
|
+
// Each move is a write the demo server can refuse: the card hovers while it's pending, lands when it's committed,
|
|
73
|
+
// and goes back where it came from, in a trench with the reason, when it's refused.
|
|
74
|
+
const [writes, setWrites] = React.useState({});
|
|
75
|
+
const [failNext, setFailNext] = React.useState(false);
|
|
76
|
+
const fail = React.useRef(false); fail.current = failNext;
|
|
77
|
+
const place = (c, from, to) => {
|
|
71
78
|
const next = Object.fromEntries(Object.entries(c).map(([k, v]) => [k, v.slice()]));
|
|
72
79
|
const [card] = next[from.column].splice(from.index, 1);
|
|
73
80
|
next[to.column].splice(to.index, 0, card);
|
|
74
|
-
setLast(`${card.t} \u2192 ${titles[to.column]}`);
|
|
75
81
|
return next;
|
|
76
|
-
}
|
|
77
|
-
const
|
|
82
|
+
};
|
|
83
|
+
const move = async ({ cardId, from, to }) => {
|
|
84
|
+
const card = Object.values(cols).flat().find(x => x.id === cardId);
|
|
85
|
+
setCols(c => place(c, from, to));
|
|
86
|
+
setWrites(w => ({ ...w, [cardId]: { status: "pending" } }));
|
|
87
|
+
await wait(700);
|
|
88
|
+
if (fail.current) {
|
|
89
|
+
setFailNext(false);
|
|
90
|
+
setCols(c => place(c, to, from));
|
|
91
|
+
const note = `Couldn’t move it: the server refused. It’s back in ${titles[from.column]}.`;
|
|
92
|
+
setWrites(w => ({ ...w, [cardId]: { status: "failed", note } }));
|
|
93
|
+
setLast(`${card.t}: ${note}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
setWrites(w => ({ ...w, [cardId]: { status: "committed" } }));
|
|
97
|
+
setLast(`Moved: ${card.t} → ${titles[to.column]}.`);
|
|
98
|
+
};
|
|
78
99
|
// The demo service refuses titles with “TBD” in them.
|
|
79
100
|
const refuse = t => /tbd/i.test(t) ? { ok: false, error: "Write the task, not \u201cTBD\u201d." } : null;
|
|
80
101
|
const create = k => async t => { await wait(250); const no = refuse(t); if (no) return no; const card = { id: "n" + ++seq.current, t, m: "New" }; setCols(c => ({ ...c, [k]: [...c[k], card] })); return { ok: true, value: { id: card.id } }; };
|
|
@@ -83,15 +104,18 @@ export default function App() {
|
|
|
83
104
|
return <div className="col" style={{ gap: 4 }}>
|
|
84
105
|
<Board onMove={move} aria-label="Launch board">
|
|
85
106
|
{Object.keys(titles).map(k => <BoardColumn key={k} id={k} title={titles[k]} collapsible={k === "done"} defaultCollapsed={k === "done"} onCreate={k === "done" ? undefined : create(k)}>
|
|
86
|
-
{cols[k].map(c => <BoardCard key={c.id} id={c.id} label={c.t} heldBy={c.held} onRename={rename(k, c.id)}
|
|
107
|
+
{cols[k].map(c => <BoardCard key={c.id} id={c.id} label={c.t} heldBy={c.held} status={writes[c.id]?.status} onRename={rename(k, c.id)}
|
|
87
108
|
{...(k === "review" ? { value: { title: c.t, meta: c.m }, onValueChange: update(k, c.id),
|
|
88
109
|
renderEditor: field => <><Field label="Title"><Input {...field("title")} size="sm" /></Field><Field label="Details"><Input {...field("meta")} size="sm" /></Field></>,
|
|
89
110
|
onSave: async draft => { await wait(200); return refuse(draft.title) || { ok: true, value: draft }; } } : {})}>
|
|
90
|
-
{c.t}<small>{c.m}</small>
|
|
111
|
+
{c.t}<small>{writes[c.id]?.note ?? c.m}</small>
|
|
91
112
|
</BoardCard>)}
|
|
92
113
|
</BoardColumn>)}
|
|
93
114
|
</Board>
|
|
94
|
-
<p className="cap">{last
|
|
115
|
+
<p className="cap" role="status">{last ?? "Drag a card, or focus one and press Space, then the arrow keys. F2 renames a card; each column adds cards at its foot. Done is collapsed into a pile and still takes cards."}</p>
|
|
116
|
+
<details className="preview-fixtures"><summary>Example fixtures</summary>
|
|
117
|
+
<Switch label="Make the next move fail" checked={failNext} onCheckedChange={setFailNext} />
|
|
118
|
+
</details>
|
|
95
119
|
</div>;
|
|
96
120
|
}
|
|
97
121
|
```
|
|
@@ -73,7 +73,9 @@ export default function App() {
|
|
|
73
73
|
onDelete={(id) => setComments((xs) => xs.map((x) => (x.id === id ? { ...x, deleted: true } : x)))}
|
|
74
74
|
onUndoDelete={(id) => setComments((xs) => xs.map((x) => (x.id === id ? { ...x, deleted: false } : x)))}
|
|
75
75
|
mentionable={(q) => people.filter((p) => p.name.toLowerCase().includes(q.toLowerCase()))} typing={resolved ? [] : ['Ada Obi']} />
|
|
76
|
-
<
|
|
76
|
+
<details className="preview-fixtures"><summary>Example fixtures</summary>
|
|
77
|
+
<Switch label="Make the next post fail" checked={failNext} onCheckedChange={setFailNext} />
|
|
78
|
+
</details>
|
|
77
79
|
</div>
|
|
78
80
|
);
|
|
79
81
|
}
|
|
@@ -130,7 +130,7 @@ Optional labels are `editLabel` (default `Edit ${label}`), `saveLabel` (“Save
|
|
|
130
130
|
|
|
131
131
|
The canonical `InlineEdit` section in `build/previews.txt` renders a task title (in its heading font), a multiline description, the task's status (Select, on choose, with a rejected “Blocked”), assignee (Combobox, on choose) and estimate (a numeric Input), an independent filename table cell with this component, and “Ways to open”: a pencil and two fields on hover, with seams. A collapsed documentation harness selects deterministic fixtures before mounting, resets records and counters, delays validation, applies external updates, removes the filename consumer during work and opens a dialog comparison using the same validation and persistence adapter. Fixture controls and operation logs stay outside the product scene.
|
|
132
132
|
|
|
133
|
-
Run `node checks/inline-edit.mjs` from `build/` after generating preview fixtures. `ALT_FIXTURE_ROOT=test/react19` selects the React 19 source fixtures. The checks cover editing in place (the value's text doesn't move, the control takes its font, the pencil and the field move nothing on hover, the caret lands where clicked, the seam, the announcement that clears itself), multiline (newline on Enter, Ctrl/Cmd+Enter, IME, Escape, caret at the end, growth to `maxRows`, line breaks in read mode), custom editors (focus, Escape layering, on-choose saves and rejections, unchanged choices, numeric validation), lifecycle races, retained input, uncertainty reconciliation, conflict latching, keyboard/IME, focus, disabled behavior and the four-scheme responsive/accessibility matrix. Automated checks do not replace the human screen-reader, touch, magnification or formative comparisons recorded in [Actions in place validation](https://github.com/richlaconte/altitude/blob/v0.
|
|
133
|
+
Run `node checks/inline-edit.mjs` from `build/` after generating preview fixtures. `ALT_FIXTURE_ROOT=test/react19` selects the React 19 source fixtures. The checks cover editing in place (the value's text doesn't move, the control takes its font, the pencil and the field move nothing on hover, the caret lands where clicked, the seam, the announcement that clears itself), multiline (newline on Enter, Ctrl/Cmd+Enter, IME, Escape, caret at the end, growth to `maxRows`, line breaks in read mode), custom editors (focus, Escape layering, on-choose saves and rejections, unchanged choices, numeric validation), lifecycle races, retained input, uncertainty reconciliation, conflict latching, keyboard/IME, focus, disabled behavior and the four-scheme responsive/accessibility matrix. Automated checks do not replace the human screen-reader, touch, magnification or formative comparisons recorded in [Actions in place validation](https://github.com/richlaconte/altitude/blob/v0.6.0/project/ActionsInPlaceValidation.md).
|
|
134
134
|
|
|
135
135
|
<!-- example: generated from build/previews.txt by build/previews.mjs. Edit the preview, not this section. -->
|
|
136
136
|
## Example
|
|
@@ -55,9 +55,11 @@ export default function App() {
|
|
|
55
55
|
return (
|
|
56
56
|
<div className="col">
|
|
57
57
|
<div className="sb">{f('name', 'Workspace name')}{f('domain', 'Domain')}{f('seats', 'Seats')}{f('region', 'Region')}</div>
|
|
58
|
-
<Switch label="Make the next save fail" checked={failNext} onCheckedChange={setFailNext} />
|
|
59
58
|
<p className="cap">Change a field: once the change settles, the bar rises from the bottom edge. ⌘S or Save hovers while saving and lowers away when saved; a failed save drops into a trench and keeps your changes.</p>
|
|
60
59
|
<SaveBar record={record} />
|
|
60
|
+
<details className="preview-fixtures"><summary>Example fixtures</summary>
|
|
61
|
+
<Switch label="Make the next save fail" checked={failNext} onCheckedChange={setFailNext} />
|
|
62
|
+
</details>
|
|
61
63
|
</div>
|
|
62
64
|
);
|
|
63
65
|
}
|
package/dist/guidance/index.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "altitude-design",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"entry": "README.md",
|
|
6
6
|
"design": "visual/README.md",
|
|
7
7
|
"patterns": [
|
|
@@ -1087,16 +1087,16 @@
|
|
|
1087
1087
|
"scripts/build-framework-fixture.mjs": "references/scripts/build-framework-fixture.mjs"
|
|
1088
1088
|
},
|
|
1089
1089
|
"sourceHashes": {
|
|
1090
|
-
"build/checks/agent-action-pattern.mjs": "
|
|
1090
|
+
"build/checks/agent-action-pattern.mjs": "3a28b6ae2e8e7cfa4c6c81653ab968f1f36db483d9c05fb966b93540a0fb66c3",
|
|
1091
1091
|
"build/checks/agent-setup.mjs": "173dac8125bf1201db023d42a862d3c6f226ee3886efe40079fbd87e4fc53e8b",
|
|
1092
|
-
"build/checks/assistant-conversation-pattern.mjs": "
|
|
1092
|
+
"build/checks/assistant-conversation-pattern.mjs": "14777b35732ac0b07401f46f844091b8d343a7f51a266e496169cb62daffed18",
|
|
1093
1093
|
"build/checks/audit-log-pattern.mjs": "af7770e7bf08caa9e1875161e4fc39509e4f0a84e612cdf79cb547cb6046af74",
|
|
1094
1094
|
"build/checks/auth-pattern.mjs": "7406cfa7c29c3bb3ac9075c8af079c6f7fd0bc296e81fef1c62667ec245c660b",
|
|
1095
1095
|
"build/checks/billing-pattern.mjs": "75e1809769420bc4c714ba0ddb1298489af7152603018d980182e6131182edc2",
|
|
1096
1096
|
"build/checks/developer-settings-pattern.mjs": "946cf163177db4aa4dfa30dac754d0229bc4b703ef1eac17a17dc35d19e2f093",
|
|
1097
1097
|
"build/checks/guidance.mjs": "ccbf3f1138a99106b3811a41304752be012c1a2a16fede1469271f7235b08636",
|
|
1098
1098
|
"build/checks/import-pattern.mjs": "6b98c0533bb0d8584ba0d677e579a0fdfdbdb5bd4663f261ecbdfb39181c45f6",
|
|
1099
|
-
"build/checks/members-pattern.mjs": "
|
|
1099
|
+
"build/checks/members-pattern.mjs": "ab46f394037fb4b21860987a6bca2d01e823496bf40a18f4a21065e955ae573a",
|
|
1100
1100
|
"build/checks/onboarding-pattern.mjs": "721ef5a202365d3597985bff9ade68bf3312c309687e846ce9a1669dcc00cae2",
|
|
1101
1101
|
"build/checks/pattern-types.mjs": "858431d8b622af096b8a41f35df1789343f96aa07433e8a98185b8740a1ded19",
|
|
1102
1102
|
"build/checks/pattern-workflows.mjs": "72e708399c0141c2b62ca94ab96382eb0e000df9d5a54045be814e261d9a9bdc",
|
|
@@ -1104,29 +1104,29 @@
|
|
|
1104
1104
|
"build/checks/render-tells.mjs": "93eae3f005f2a93654e111627a343440a7d87fa4b11c7c9403283b627fc1834c",
|
|
1105
1105
|
"build/checks/screen-layout-pattern.mjs": "c744bb32b29da50e2a1d852c1005b42addc0e1d7a98297e168f8ce7d51e4ad93",
|
|
1106
1106
|
"build/checks/semantics.mjs": "2ee7689b0472dba2e782ff19304e01018ca470b252fe7137e82bb36a3e0042c0",
|
|
1107
|
-
"build/checks/settings-pattern.mjs": "
|
|
1107
|
+
"build/checks/settings-pattern.mjs": "8830130d4e62294bd759b056e96aef264490a94e8c686d5a9bcfe0f1135f8691",
|
|
1108
1108
|
"build/checks/source-check.mjs": "07a22ce606b28e788ff501ff10da06ec66c2f947cf671d0cd57cb71e629007e0",
|
|
1109
1109
|
"build/checks/sync-pattern.mjs": "2cf9f1ac96be6c48948dea0ffab0fda0a909b5ff19e3e3f9835b6d8bcdd7fbef",
|
|
1110
1110
|
"build/checks/tells-lint.mjs": "f254fa9166f65a085d78cecf7ca66145151cd8b7868c732c25c44bbec2c2deac",
|
|
1111
1111
|
"build/fixtures/pattern-workflows.tsx": "6781938d83aa85f48c63fff98f9eb5b45fcb5531b6a49f902ec9d497f6e65265",
|
|
1112
|
-
"build/fixtures/patterns/agent-action.jsx": "
|
|
1112
|
+
"build/fixtures/patterns/agent-action.jsx": "6840e91a8cd6726adda221bb2d1baacbabc0618d56b80b783215606d4782d5d7",
|
|
1113
1113
|
"build/fixtures/patterns/app-skeleton.jsx": "d2d8e7d5373ee4d65c2e0ecc69451f35d9dfd4bed9f04cf66405cbe9c9478825",
|
|
1114
|
-
"build/fixtures/patterns/assistant-conversation.jsx": "
|
|
1114
|
+
"build/fixtures/patterns/assistant-conversation.jsx": "9d6b6232da8fd1097bc7d82ec91e7c081843f990531216962c3e9cb030f714d2",
|
|
1115
1115
|
"build/fixtures/patterns/audit-log.jsx": "ec1183de4c94c0309824b4187c082f7ea76d50a09953224e4164b4fc5fa70780",
|
|
1116
1116
|
"build/fixtures/patterns/auth.jsx": "1b41c43b734deb75acd8bfd34dae445e627381884abd23512e37bfb1d644eabe",
|
|
1117
1117
|
"build/fixtures/patterns/billing.jsx": "8f56ab9e6d09d73f1ae9ad5d690ff20372f9279d23010d6db7ef5e2a79d0100a",
|
|
1118
1118
|
"build/fixtures/patterns/developer-settings.jsx": "7803d792f516b5a1ee823436c505802954865720f7c8dbae0742a1adc0b2d490",
|
|
1119
1119
|
"build/fixtures/patterns/import.jsx": "3b4148a99bf90a477ae01a0905cae75200bc53427ea197cc2bcda0a9c2469ca2",
|
|
1120
|
-
"build/fixtures/patterns/members.jsx": "
|
|
1120
|
+
"build/fixtures/patterns/members.jsx": "df0e6ab0a6030cf09715e1ea78f01a8ca6c61dde10c2679a2c75fe47247dfdba",
|
|
1121
1121
|
"build/fixtures/patterns/onboarding.jsx": "3ae1325880efa862b84b5d9bcc0691bf6029e1f1ac031bb99adb6c0527c498a9",
|
|
1122
1122
|
"build/fixtures/patterns/screen-layout-decision.jsx": "409d5ce48ddef3ca5de3427155e901f06d142938474894e9eabbc167c910c47a",
|
|
1123
1123
|
"build/fixtures/patterns/screen-layout-editor.jsx": "a93c41d7590fd98fae48403c49e4d4e793b4e92e4cf5b8cc66e30ed0aa55ba68",
|
|
1124
1124
|
"build/fixtures/patterns/screen-layout-report.jsx": "5de2691104456175ef51d2e1d11c85b4075341457e8acd3d5495615c2fbeb0a9",
|
|
1125
|
-
"build/fixtures/patterns/settings.jsx": "
|
|
1125
|
+
"build/fixtures/patterns/settings.jsx": "ecf7a60de4ca08e58474c6cc83b9dcb1009d393e11f67d3e9f83b74e5c0837a0",
|
|
1126
1126
|
"build/fixtures/patterns/sync.jsx": "8474f762f7c63c4bd99fd337b080df1a788b4b92b2ced7fac5aaa1379b1a1eaf",
|
|
1127
|
-
"build/previews.txt": "
|
|
1127
|
+
"build/previews.txt": "ef5cf7d4191c58f008aebf00b2313d7cd6dcf6c329095df95404244550dc3bfb",
|
|
1128
1128
|
"docs/framework/AGENT-SETUP.md": "57b4ba98719fce472e08226a5c784ed4b9eb20241904445825cb2287a84a0162",
|
|
1129
|
-
"project/ActionsInPlace.md": "
|
|
1129
|
+
"project/ActionsInPlace.md": "6e92cffea09a960cbd872ae9208053b798939ce3145acc3404dac3b1272b1868",
|
|
1130
1130
|
"project/Charts.md": "9439a024d8123088f90bb49844f922ce50ba4f255d85e7e6324bb55eee07f287",
|
|
1131
1131
|
"project/Distinctiveness.md": "d2933b1d4c53622c31906154beca9edd89d457baa94fb4be3ae0fb8d414e76ce",
|
|
1132
1132
|
"project/Elevation.md": "100532c631803e9a97018b9da5ffff60acf7d80559f9f162ba9e371f5510371f",
|
|
@@ -1151,7 +1151,7 @@
|
|
|
1151
1151
|
"project/components/Badge/README.md": "118520cbd5dca26aa4d048a429c1574467c25321e376f60e073daed0be875ea3",
|
|
1152
1152
|
"project/components/BarChart/README.md": "e7a68dca5e1ba3036aab25bc3ba434d60f6542032262bec41d2fc6c50d163b80",
|
|
1153
1153
|
"project/components/BarList/README.md": "96ec0d5cae26ce7bdeb995652cc4147d64caea14771f82e92dd0f56f002eed61",
|
|
1154
|
-
"project/components/Board/README.md": "
|
|
1154
|
+
"project/components/Board/README.md": "40a752b89d035f6c44c04416364cb44d0688e90e0fd46b4e1111e91095f29456",
|
|
1155
1155
|
"project/components/Breadcrumb/README.md": "fe28cfe23113fcfaf8842181bfa9f9274e192dd9421ec9ce992a53e7ebdf80c9",
|
|
1156
1156
|
"project/components/Button/README.md": "46ee13103d00c0435c00496fbcc25b909b63388e05f2a76b483d43e7619c74f3",
|
|
1157
1157
|
"project/components/Card/README.md": "74fe7bcd95c8600a506751f9ab7f6ebfa8691d7c207fd2e3c87c84a8b5292cb0",
|
|
@@ -1166,7 +1166,7 @@
|
|
|
1166
1166
|
"project/components/ColorPicker/README.md": "24a0f90b86d7b246976d8a41dc047c25bb4b6ccb80717f388783723f15497018",
|
|
1167
1167
|
"project/components/Combobox/README.md": "f19169c7453cba104859b28eb54e8ec0224bd6ab9263a28bca8bbb4be0c67151",
|
|
1168
1168
|
"project/components/CommandPalette/README.md": "a6bf308a4d791873cfedeaf190b422cd67ed4e6dbb7273f3b340f93432d7e741",
|
|
1169
|
-
"project/components/CommentThread/README.md": "
|
|
1169
|
+
"project/components/CommentThread/README.md": "a15f6473a03ba3c0fd04b6478349207725d1c73c508e8fdcc06c4d26718ee56a",
|
|
1170
1170
|
"project/components/Confirmation/README.md": "c6ed60c3ae6c563da1a5473546d14986ecfe5ecf691794ee3e6d89e39f4e3ed4",
|
|
1171
1171
|
"project/components/ContextMenu/README.md": "ab86dfa366dd2bacc98e6b01b45cc6e9919301e680a1d19798a0902b1b23475a",
|
|
1172
1172
|
"project/components/Conversation/README.md": "13ad68c8d4c5a5687245d64136f413d3edc62ce06efcaa0a5771004157ec04f0",
|
|
@@ -1215,7 +1215,7 @@
|
|
|
1215
1215
|
"project/components/RelativeTime/README.md": "5b1a7f716825233b457319c2398ba574419a757c2c92c11223dac5d64a9990a2",
|
|
1216
1216
|
"project/components/RemovalReceipt/README.md": "b5a0392079b5f0db25ea12fa1e40fc5a2b7415360e9c35ecf523462fa88adc66",
|
|
1217
1217
|
"project/components/Resizable/README.md": "c166d0af35119ec622919a7c274696deee465beb3b3a999e263d5ea9d248c1f1",
|
|
1218
|
-
"project/components/SaveBar/README.md": "
|
|
1218
|
+
"project/components/SaveBar/README.md": "7c2babe2cc3254122f438b67d0b6568135d235402261d83f7be127e6b8cf0f29",
|
|
1219
1219
|
"project/components/SavedViews/README.md": "1eb6996c7ba7b6fe2f680603f66c4dcb0b2e98b5901dfa1ad405fd967a2e3fab",
|
|
1220
1220
|
"project/components/ScatterChart/README.md": "73f447b83eea8093ffca91b260a71102bd4e5d7953b4028ffd005f29276bd8c6",
|
|
1221
1221
|
"project/components/Schedule/README.md": "cab13327ec2b8ff9c317dc19ac12390705f15f9f9d61b94c3bc52810cb54ce82",
|
package/dist/guidance/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Altitude 0.
|
|
1
|
+
# Altitude 0.6.0
|
|
2
2
|
|
|
3
3
|
> Altitude's guidance for this installed version of altitude-design: the design rules, the task patterns and every component's guide. Height is the interface: settled content sits on the ground, anything live rises above it, anything waiting to receive sinks below it.
|
|
4
4
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"files": {
|
|
5
5
|
"agent-setup.md": "57b4ba98719fce472e08226a5c784ed4b9eb20241904445825cb2287a84a0162",
|
|
6
6
|
"app-skeleton.md": "bc70896a86f4c1dbd3467620562eec62ccf99a9356ff72a7eab8621f492554d9",
|
|
7
7
|
"components/Accordion/README.md": "b166e499eb3604ef84a375818db3aec91c5459870b5d6cd3133ecbdf36e145d6",
|
|
8
|
-
"components/AgentFleet/README.md": "
|
|
8
|
+
"components/AgentFleet/README.md": "d61f1912dc433efd553de55c2f2206189a25293fabd230be5856b10f5de3625f",
|
|
9
9
|
"components/AgentLanes/README.md": "247eb6e0ead0de5f15da920f083dbaa4150673723b081acf70e19026f982cd16",
|
|
10
10
|
"components/AgentRequests/README.md": "e7ac986cef68b09b5a7df7d1c11cf44ef8d417a3d22f9436f7cea1d8b4190c18",
|
|
11
11
|
"components/AILabel/README.md": "0002447d340029fe28652ed26c474c91edf89a0e23be300d24c198afb7086646",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"components/Badge/README.md": "118520cbd5dca26aa4d048a429c1574467c25321e376f60e073daed0be875ea3",
|
|
20
20
|
"components/BarChart/README.md": "80370de4bc1bc6864577bcb0c9163a748bcd6bbd95eee789723d64cc2fada9b1",
|
|
21
21
|
"components/BarList/README.md": "96ec0d5cae26ce7bdeb995652cc4147d64caea14771f82e92dd0f56f002eed61",
|
|
22
|
-
"components/Board/README.md": "
|
|
22
|
+
"components/Board/README.md": "40a752b89d035f6c44c04416364cb44d0688e90e0fd46b4e1111e91095f29456",
|
|
23
23
|
"components/Breadcrumb/README.md": "fe28cfe23113fcfaf8842181bfa9f9274e192dd9421ec9ce992a53e7ebdf80c9",
|
|
24
24
|
"components/Button/README.md": "46ee13103d00c0435c00496fbcc25b909b63388e05f2a76b483d43e7619c74f3",
|
|
25
25
|
"components/Card/README.md": "74fe7bcd95c8600a506751f9ab7f6ebfa8691d7c207fd2e3c87c84a8b5292cb0",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"components/ColorPicker/README.md": "24a0f90b86d7b246976d8a41dc047c25bb4b6ccb80717f388783723f15497018",
|
|
35
35
|
"components/Combobox/README.md": "f19169c7453cba104859b28eb54e8ec0224bd6ab9263a28bca8bbb4be0c67151",
|
|
36
36
|
"components/CommandPalette/README.md": "a6bf308a4d791873cfedeaf190b422cd67ed4e6dbb7273f3b340f93432d7e741",
|
|
37
|
-
"components/CommentThread/README.md": "
|
|
37
|
+
"components/CommentThread/README.md": "a15f6473a03ba3c0fd04b6478349207725d1c73c508e8fdcc06c4d26718ee56a",
|
|
38
38
|
"components/Confirmation/README.md": "c6ed60c3ae6c563da1a5473546d14986ecfe5ecf691794ee3e6d89e39f4e3ed4",
|
|
39
39
|
"components/ContextMenu/README.md": "ab86dfa366dd2bacc98e6b01b45cc6e9919301e680a1d19798a0902b1b23475a",
|
|
40
40
|
"components/Conversation/README.md": "13ad68c8d4c5a5687245d64136f413d3edc62ce06efcaa0a5771004157ec04f0",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"components/HoldButton/README.md": "bb81a002a2d37701a84a04123fbabd8cb820c52befaacaaf881de48d12f733f5",
|
|
58
58
|
"components/HoverCard/README.md": "23e6de1b79fa302b2ce168431fd15339b33132663911521594882f338c1ca366",
|
|
59
59
|
"components/InlineCitation/README.md": "b3f66c18bdf054f818525fbcf5f5db36535d121289f6d0451413ac0803bf8edd",
|
|
60
|
-
"components/InlineEdit/README.md": "
|
|
60
|
+
"components/InlineEdit/README.md": "f19b97a5105532092fc04c32f75ea7a41b13d3c48c8b017954647e25c9d14325",
|
|
61
61
|
"components/Input/README.md": "8b7df74399ce471bead1c81967e63ca1bb249aebd827abefd4fbf1a6a2a13e26",
|
|
62
62
|
"components/InputOTP/README.md": "e1a17bca55de012b26f25dca299d7ffe01b21248efde19bea63ebeac4e2625aa",
|
|
63
63
|
"components/ItemGroup/README.md": "87a1e6c3e124aec1012ef71dc69c3e5ab85feeb4735fa0b77db449a22692f6e8",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"components/RelativeTime/README.md": "5b1a7f716825233b457319c2398ba574419a757c2c92c11223dac5d64a9990a2",
|
|
84
84
|
"components/RemovalReceipt/README.md": "30ab65617692614d846298cb103d7737a5ba464610f44cda64bd0d737cefbc88",
|
|
85
85
|
"components/Resizable/README.md": "c166d0af35119ec622919a7c274696deee465beb3b3a999e263d5ea9d248c1f1",
|
|
86
|
-
"components/SaveBar/README.md": "
|
|
86
|
+
"components/SaveBar/README.md": "7c2babe2cc3254122f438b67d0b6568135d235402261d83f7be127e6b8cf0f29",
|
|
87
87
|
"components/SavedViews/README.md": "1eb6996c7ba7b6fe2f680603f66c4dcb0b2e98b5901dfa1ad405fd967a2e3fab",
|
|
88
88
|
"components/ScatterChart/README.md": "ff9a5f079a75dabeb2df15d2c8db7282f280aae159ad618dfbaa5d25c8a77150",
|
|
89
89
|
"components/Schedule/README.md": "cab13327ec2b8ff9c317dc19ac12390705f15f9f9d61b94c3bc52810cb54ce82",
|
|
@@ -118,8 +118,8 @@
|
|
|
118
118
|
"components/Trace/README.md": "62c571b2d96a83e5515988eacecd47de3e2c1a2452476d00645d1a26d3cbae3d",
|
|
119
119
|
"components/Tree/README.md": "9fadf66c7d223653bd299362e997c814f06baf2a9c59f8ebc15ef9a0a24235e4",
|
|
120
120
|
"evidence.json": "71e9602167286fb714419d0e89a80d4765b632c910d51875d1b167fd1ee499d9",
|
|
121
|
-
"index.json": "
|
|
122
|
-
"llms.txt": "
|
|
121
|
+
"index.json": "0a53d607886b8d945c696d3e08a28608fe32a08f4e2be5fc7330c85cadd4f554",
|
|
122
|
+
"llms.txt": "3cefd6d688081c282f5d8cdd3408391fcd0b07011935c90381a8f4ff6aa0cf87",
|
|
123
123
|
"pattern.schema.json": "abcb37bd5de4a74f27ac079e587e5d288b23e491569a73971f1a31131a37d309",
|
|
124
124
|
"patterns/agent-action.json": "532915c25183d1a6093d9e14b929f3e49d29e400b116ef0612d933d70d49b09a",
|
|
125
125
|
"patterns/agent-action.md": "a11e9d98a84d8a0fae755bae3e618e7daa2608f1f853cfe88e2e58ee74cc01e7",
|
|
@@ -155,16 +155,16 @@
|
|
|
155
155
|
"patterns/sync.md": "9b6c6928fe19c6f28b88bd092997c0c0645aedddf02a25327a1c7c60969e3729",
|
|
156
156
|
"principles.md": "1c57c684c4b0029012a79d6a38b26b8821abf75852b14db2b18b7e7f6d364b32",
|
|
157
157
|
"README.md": "bde7983588a9fd0f7bbcc0d282dc110ecb4811cd5753a4ea835399c7ea7ff520",
|
|
158
|
-
"references/build/checks/agent-action-pattern.mjs": "
|
|
158
|
+
"references/build/checks/agent-action-pattern.mjs": "3a28b6ae2e8e7cfa4c6c81653ab968f1f36db483d9c05fb966b93540a0fb66c3",
|
|
159
159
|
"references/build/checks/agent-setup.mjs": "173dac8125bf1201db023d42a862d3c6f226ee3886efe40079fbd87e4fc53e8b",
|
|
160
|
-
"references/build/checks/assistant-conversation-pattern.mjs": "
|
|
160
|
+
"references/build/checks/assistant-conversation-pattern.mjs": "14777b35732ac0b07401f46f844091b8d343a7f51a266e496169cb62daffed18",
|
|
161
161
|
"references/build/checks/audit-log-pattern.mjs": "af7770e7bf08caa9e1875161e4fc39509e4f0a84e612cdf79cb547cb6046af74",
|
|
162
162
|
"references/build/checks/auth-pattern.mjs": "7406cfa7c29c3bb3ac9075c8af079c6f7fd0bc296e81fef1c62667ec245c660b",
|
|
163
163
|
"references/build/checks/billing-pattern.mjs": "75e1809769420bc4c714ba0ddb1298489af7152603018d980182e6131182edc2",
|
|
164
164
|
"references/build/checks/developer-settings-pattern.mjs": "946cf163177db4aa4dfa30dac754d0229bc4b703ef1eac17a17dc35d19e2f093",
|
|
165
165
|
"references/build/checks/guidance.mjs": "ccbf3f1138a99106b3811a41304752be012c1a2a16fede1469271f7235b08636",
|
|
166
166
|
"references/build/checks/import-pattern.mjs": "6b98c0533bb0d8584ba0d677e579a0fdfdbdb5bd4663f261ecbdfb39181c45f6",
|
|
167
|
-
"references/build/checks/members-pattern.mjs": "
|
|
167
|
+
"references/build/checks/members-pattern.mjs": "ab46f394037fb4b21860987a6bca2d01e823496bf40a18f4a21065e955ae573a",
|
|
168
168
|
"references/build/checks/onboarding-pattern.mjs": "721ef5a202365d3597985bff9ade68bf3312c309687e846ce9a1669dcc00cae2",
|
|
169
169
|
"references/build/checks/pattern-types.mjs": "858431d8b622af096b8a41f35df1789343f96aa07433e8a98185b8740a1ded19",
|
|
170
170
|
"references/build/checks/pattern-workflows.mjs": "72e708399c0141c2b62ca94ab96382eb0e000df9d5a54045be814e261d9a9bdc",
|
|
@@ -172,25 +172,25 @@
|
|
|
172
172
|
"references/build/checks/render-tells.mjs": "93eae3f005f2a93654e111627a343440a7d87fa4b11c7c9403283b627fc1834c",
|
|
173
173
|
"references/build/checks/screen-layout-pattern.mjs": "c744bb32b29da50e2a1d852c1005b42addc0e1d7a98297e168f8ce7d51e4ad93",
|
|
174
174
|
"references/build/checks/semantics.mjs": "2ee7689b0472dba2e782ff19304e01018ca470b252fe7137e82bb36a3e0042c0",
|
|
175
|
-
"references/build/checks/settings-pattern.mjs": "
|
|
175
|
+
"references/build/checks/settings-pattern.mjs": "8830130d4e62294bd759b056e96aef264490a94e8c686d5a9bcfe0f1135f8691",
|
|
176
176
|
"references/build/checks/source-check.mjs": "07a22ce606b28e788ff501ff10da06ec66c2f947cf671d0cd57cb71e629007e0",
|
|
177
177
|
"references/build/checks/sync-pattern.mjs": "2cf9f1ac96be6c48948dea0ffab0fda0a909b5ff19e3e3f9835b6d8bcdd7fbef",
|
|
178
178
|
"references/build/checks/tells-lint.mjs": "f254fa9166f65a085d78cecf7ca66145151cd8b7868c732c25c44bbec2c2deac",
|
|
179
179
|
"references/build/fixtures/pattern-workflows.tsx": "6781938d83aa85f48c63fff98f9eb5b45fcb5531b6a49f902ec9d497f6e65265",
|
|
180
|
-
"references/build/fixtures/patterns/agent-action.jsx": "
|
|
180
|
+
"references/build/fixtures/patterns/agent-action.jsx": "6840e91a8cd6726adda221bb2d1baacbabc0618d56b80b783215606d4782d5d7",
|
|
181
181
|
"references/build/fixtures/patterns/app-skeleton.jsx": "d2d8e7d5373ee4d65c2e0ecc69451f35d9dfd4bed9f04cf66405cbe9c9478825",
|
|
182
|
-
"references/build/fixtures/patterns/assistant-conversation.jsx": "
|
|
182
|
+
"references/build/fixtures/patterns/assistant-conversation.jsx": "9d6b6232da8fd1097bc7d82ec91e7c081843f990531216962c3e9cb030f714d2",
|
|
183
183
|
"references/build/fixtures/patterns/audit-log.jsx": "ec1183de4c94c0309824b4187c082f7ea76d50a09953224e4164b4fc5fa70780",
|
|
184
184
|
"references/build/fixtures/patterns/auth.jsx": "1b41c43b734deb75acd8bfd34dae445e627381884abd23512e37bfb1d644eabe",
|
|
185
185
|
"references/build/fixtures/patterns/billing.jsx": "8f56ab9e6d09d73f1ae9ad5d690ff20372f9279d23010d6db7ef5e2a79d0100a",
|
|
186
186
|
"references/build/fixtures/patterns/developer-settings.jsx": "7803d792f516b5a1ee823436c505802954865720f7c8dbae0742a1adc0b2d490",
|
|
187
187
|
"references/build/fixtures/patterns/import.jsx": "3b4148a99bf90a477ae01a0905cae75200bc53427ea197cc2bcda0a9c2469ca2",
|
|
188
|
-
"references/build/fixtures/patterns/members.jsx": "
|
|
188
|
+
"references/build/fixtures/patterns/members.jsx": "df0e6ab0a6030cf09715e1ea78f01a8ca6c61dde10c2679a2c75fe47247dfdba",
|
|
189
189
|
"references/build/fixtures/patterns/onboarding.jsx": "3ae1325880efa862b84b5d9bcc0691bf6029e1f1ac031bb99adb6c0527c498a9",
|
|
190
190
|
"references/build/fixtures/patterns/screen-layout-decision.jsx": "409d5ce48ddef3ca5de3427155e901f06d142938474894e9eabbc167c910c47a",
|
|
191
191
|
"references/build/fixtures/patterns/screen-layout-editor.jsx": "a93c41d7590fd98fae48403c49e4d4e793b4e92e4cf5b8cc66e30ed0aa55ba68",
|
|
192
192
|
"references/build/fixtures/patterns/screen-layout-report.jsx": "5de2691104456175ef51d2e1d11c85b4075341457e8acd3d5495615c2fbeb0a9",
|
|
193
|
-
"references/build/fixtures/patterns/settings.jsx": "
|
|
193
|
+
"references/build/fixtures/patterns/settings.jsx": "ecf7a60de4ca08e58474c6cc83b9dcb1009d393e11f67d3e9f83b74e5c0837a0",
|
|
194
194
|
"references/build/fixtures/patterns/sync.jsx": "8474f762f7c63c4bd99fd337b080df1a788b4b92b2ced7fac5aaa1379b1a1eaf",
|
|
195
195
|
"references/project/components/src/pattern-async-collection.tsx": "9e4df2265d1de6f269278eb4a42d8d63b3ef74a881a455eb17102be477ecbf4d",
|
|
196
196
|
"references/project/components/src/pattern-consequential-action.tsx": "ffe49b7a9fa978e9177c6f3d839d311bdd3da913a6eeedc241800b10fc3287f7",
|
|
@@ -199,15 +199,15 @@
|
|
|
199
199
|
"references/project/components/src/settings.tsx": "957a04e37936746f2b6b4086d8e2f866ce71f7fb9dded8ba81fff56840206e01",
|
|
200
200
|
"references/scripts/build-framework-fixture.mjs": "1b4a2d7ece0459d2c4df2ec067d8d3b9d00110f2af1cef3be6042ab8f9ea90c9",
|
|
201
201
|
"rules.json": "552c8328f60adc9eef4aa9aeed098e3a5c617e993bd300781389da8ad0e402c9",
|
|
202
|
-
"visual/ActionsInPlace.md": "
|
|
202
|
+
"visual/ActionsInPlace.md": "efcce76b8fe7b8d1cf3693f59c433b4249c3168aa10ad5e20b30be776f99154f",
|
|
203
203
|
"visual/Charts.md": "9439a024d8123088f90bb49844f922ce50ba4f255d85e7e6324bb55eee07f287",
|
|
204
|
-
"visual/Distinctiveness.md": "
|
|
204
|
+
"visual/Distinctiveness.md": "5dde4d0a1b2aee39ae635f300c3041ed44bdc553c2dcdc91e0fd13bc05aa62d5",
|
|
205
205
|
"visual/Elevation.md": "50f2aeefd457e1a329cc80578b196c48cbf0c019a5f43d75901d92b4b4632c44",
|
|
206
206
|
"visual/Fundamentals.md": "65120fd170ff8ea9f50b1498bfedc8c45dbe1a616bfccc32664213e5404d3a32",
|
|
207
207
|
"visual/Mobile.md": "511db58119a1653c2c00e2ccb34c6cf943de93f2184dec0faf3228f563e0b1b7",
|
|
208
208
|
"visual/Motion.md": "7fa4e7501b710a5599c7a8c99e531f2b9b1b4dfeba6a6a4d9716685d45f33d31",
|
|
209
209
|
"visual/README.md": "08c3a9ef3ff53a0fb8f9f873240022edefc67739a16d1f50c3a47367f72fc9f9",
|
|
210
|
-
"visual/Research.md": "
|
|
211
|
-
"visual/Theming.md": "
|
|
210
|
+
"visual/Research.md": "fa9f2e6880bd763702db755b1f4924977f7db080a1be0af7947695d9bd82296d",
|
|
211
|
+
"visual/Theming.md": "e1e3d2a282e0d89c99bbb1714af5833bf54dfca94df3a909437ae14a56f44898"
|
|
212
212
|
}
|
|
213
213
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// failed step says nothing changed and retries; the changed record carries an AI label naming the approver. Run after a
|
|
5
5
|
// render of every preview (it opens test/p-AgentActionPattern-daylight.html); exits non-zero on a failure.
|
|
6
6
|
import { chromium } from 'playwright-core';
|
|
7
|
+
import { openFixtures } from './preview-fixtures.mjs';
|
|
7
8
|
const browser = await chromium.launch(process.env.CHROME ? { executablePath: process.env.CHROME } : {});
|
|
8
9
|
const T = new URL('../test/', import.meta.url).pathname;
|
|
9
10
|
let pass = 0, fail = 0;
|
|
@@ -43,6 +44,7 @@ await page.getByRole('button', { name: 'Undo archive' }).click();
|
|
|
43
44
|
await page.waitForTimeout(200);
|
|
44
45
|
expect(/Archive undone/.test(await page.evaluate(() => document.querySelector('.ag-receipt').textContent)), 'Undo reverses the reversible step');
|
|
45
46
|
|
|
47
|
+
await openFixtures(page);
|
|
46
48
|
await page.getByRole('switch', { name: 'Make the next step fail' }).click();
|
|
47
49
|
await page.getByRole('button', { name: 'Run again' }).click();
|
|
48
50
|
await page.waitForTimeout(1100);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// words. Run after a render of every preview (it opens test/p-AssistantConversationPattern-daylight.html); exits
|
|
6
6
|
// non-zero on a failure.
|
|
7
7
|
import { chromium } from 'playwright-core';
|
|
8
|
+
import { openFixtures } from './preview-fixtures.mjs';
|
|
8
9
|
const browser = await chromium.launch(process.env.CHROME ? { executablePath: process.env.CHROME } : {});
|
|
9
10
|
const T = new URL('../test/', import.meta.url).pathname;
|
|
10
11
|
let pass = 0, fail = 0;
|
|
@@ -26,6 +27,7 @@ await page.click('.alt-msg[data-from="assistant"] button:has-text("Retry")'); aw
|
|
|
26
27
|
a = await answer();
|
|
27
28
|
expect(a.stream === 'complete' && a.text.includes('decision from legal by Friday'), `Retry completes the answer (${a.stream})`);
|
|
28
29
|
// Offline: the message stays in the composer, said in words.
|
|
30
|
+
await openFixtures(page);
|
|
29
31
|
await page.click('[role="radio"]:has-text("Offline"), button:has-text("Offline")'); await page.waitForTimeout(100);
|
|
30
32
|
await box.fill('Summarise it'); await box.press('Enter'); await page.waitForTimeout(700);
|
|
31
33
|
let r = await read();
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// what they lose and is said once done; revoking an invitation is said and focus goes to the heading. Run after a render
|
|
6
6
|
// of every preview (it opens test/p-MembersPattern-daylight.html); exits non-zero on a failure.
|
|
7
7
|
import { chromium } from 'playwright-core';
|
|
8
|
+
import { openFixtures } from './preview-fixtures.mjs';
|
|
8
9
|
const browser = await chromium.launch(process.env.CHROME ? { executablePath: process.env.CHROME } : {});
|
|
9
10
|
const T = new URL('../test/', import.meta.url).pathname;
|
|
10
11
|
let pass = 0, fail = 0;
|
|
@@ -43,6 +44,7 @@ expect(r.status === 'pending' && /Changing role…/.test(r.text), `a role change
|
|
|
43
44
|
await page.waitForTimeout(700);
|
|
44
45
|
r = await row('Theo Marsh');
|
|
45
46
|
expect(r.status === 'committed' && /Role changed/.test(r.text), 'and lands as changed');
|
|
47
|
+
await openFixtures(page);
|
|
46
48
|
await page.getByRole('switch', { name: 'Make the next role change fail' }).click();
|
|
47
49
|
await page.getByRole('button', { name: 'Role for Ines Duarte' }).click();
|
|
48
50
|
await page.getByRole('option', { name: 'Viewer' }).click();
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// needs the workspace's name typed into a stationary dialog. Run after a render of every preview (it opens
|
|
6
6
|
// test/p-SettingsPattern-daylight.html); exits non-zero on a failure.
|
|
7
7
|
import { chromium } from 'playwright-core';
|
|
8
|
+
import { openFixtures } from './preview-fixtures.mjs';
|
|
8
9
|
const browser = await chromium.launch(process.env.CHROME ? { executablePath: process.env.CHROME } : {});
|
|
9
10
|
const T = new URL('../test/', import.meta.url).pathname;
|
|
10
11
|
let pass = 0, fail = 0;
|
|
@@ -29,6 +30,7 @@ expect(await page.evaluate(() => getComputedStyle(document.querySelector('.alt-s
|
|
|
29
30
|
await page.waitForTimeout(800);
|
|
30
31
|
r = await row('Weekly digest');
|
|
31
32
|
expect(r.status === 'committed' && r.words === 'Saved' && r.checked === 'false', `then lands, saved (${JSON.stringify(r)})`);
|
|
33
|
+
await openFixtures(page);
|
|
32
34
|
await page.getByRole('switch', { name: 'Make the next change fail' }).click();
|
|
33
35
|
await page.getByRole('switch', { name: 'Mentions' }).click();
|
|
34
36
|
await page.waitForTimeout(1300);
|
|
@@ -24,36 +24,40 @@ function App() {
|
|
|
24
24
|
const stepFor = (c) => (c === 'requested' ? 'awaiting-approval' : c === 'running' || c === 'approved' ? 'running' : c === 'failed' ? 'failed' : 'done');
|
|
25
25
|
const ready = archive === 'done';
|
|
26
26
|
return (
|
|
27
|
-
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
27
|
+
<>
|
|
28
|
+
<main className="ag-page">
|
|
29
|
+
<div className="ag-ask"><span className="ag-who">You asked</span><p>Clean up leads nobody has touched since July, and tell their owners.</p></div>
|
|
30
|
+
<A.Trace aria-label="Assistant run: clean up stale leads">
|
|
31
|
+
<A.TraceStep title="Find leads untouched since July" status={search} duration={search === 'done' ? 900 : undefined}
|
|
32
|
+
error={search === 'failed' ? 'The CRM didn’t answer in time. Nothing was changed.' : undefined} onRetry={search === 'failed' ? runSearch : undefined}>
|
|
33
|
+
<A.TraceToolCall name="search_leads" input={{ untouchedSince: '2026-07-01', limit: 50 }} output={search === 'done' ? { found: 4 } : undefined} />
|
|
34
|
+
</A.TraceStep>
|
|
35
|
+
<A.TraceStep title="Archive 4 stale leads" status={archive}>
|
|
36
|
+
{archive === 'done' && <div className="ag-receipt"><span role="status">{undone ? 'Archive undone. The 4 leads are back.' : '4 leads archived. You can undo this for 30 days.'}</span>
|
|
37
|
+
{!undone && <A.Button size="sm" variant="ghost" onClick={() => setUndone(true)}>Undo archive</A.Button>}</div>}
|
|
38
|
+
</A.TraceStep>
|
|
39
|
+
<A.TraceStep title={email === 'rejected' ? 'Didn’t email the lead owners' : 'Email 3 lead owners'} status={ready ? stepFor(email) : 'planned'}>
|
|
40
|
+
{ready && <A.Confirmation state={email} title="Email 3 lead owners" requestedBy="The assistant" resolvedBy="Maya Chen"
|
|
41
|
+
consequence="Theo Marsh, Ines Duarte and Sam Okafor will get an email listing the leads that were archived."
|
|
42
|
+
approveLabel="Send 3 emails" rejectLabel="Don’t send" runningLabel="Sending…" doneLabel="3 emails sent" failedLabel="The emails weren’t sent."
|
|
43
|
+
onApprove={() => resolve(setEmail, !fail.current)} onReject={() => setEmail('rejected')} onRetry={() => resolve(setEmail, true)} />}
|
|
44
|
+
</A.TraceStep>
|
|
45
|
+
<A.TraceStep title="Delete the “Summer import” list for good" status={ready && email !== 'requested' ? stepFor(purge) : 'planned'}>
|
|
46
|
+
{ready && email !== 'requested' && <A.Confirmation state={purge} escalate="dialog" title="Delete the “Summer import” list" resolvedBy="Maya Chen"
|
|
47
|
+
consequence="The list and its 212 rows are deleted permanently. Leads in it stay; only the list goes."
|
|
48
|
+
approveLabel="Delete list" rejectLabel="Keep the list" runningLabel="Deleting…" doneLabel="List deleted"
|
|
49
|
+
onApprove={() => resolve(setPurge, true)} onReject={() => setPurge('rejected')} />}
|
|
50
|
+
</A.TraceStep>
|
|
51
|
+
</A.Trace>
|
|
52
|
+
{email === 'done' && <section className="ag-record" aria-labelledby="ag-rec-h"><h3 id="ag-rec-h" className="ag-sub">Northwind Traders</h3>
|
|
53
|
+
<p className="ag-line">Status: Archived <A.AILabel subject="Change" model="Opus 5.5" reviewedBy="Maya Chen" generatedAt="2026-10-30T09:00:00Z" /></p>
|
|
54
|
+
<p className="ag-muted">Archived by the assistant, approved by Maya Chen.</p>
|
|
55
|
+
</section>}
|
|
56
|
+
</main>
|
|
57
|
+
<details className="preview-fixtures"><summary>Example fixtures</summary>
|
|
58
|
+
<div className="ag-demo"><A.Switch label="Make the next step fail" checked={failNext} onCheckedChange={setFailNext} /><A.Button size="sm" onClick={restart}>Run again</A.Button></div>
|
|
59
|
+
</details>
|
|
60
|
+
</>
|
|
57
61
|
);
|
|
58
62
|
}
|
|
59
63
|
// preview:end
|