@cloudgrid-io/ui 0.29.1 → 0.30.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/blocks/agent-prompt.d.ts +17 -1
- package/dist/blocks/agent-prompt.d.ts.map +1 -1
- package/dist/blocks/agent-prompt.js +33 -3
- package/dist/blocks/agent-prompt.js.map +1 -1
- package/dist/blocks/command-field.d.ts +38 -0
- package/dist/blocks/command-field.d.ts.map +1 -0
- package/dist/blocks/command-field.js +70 -0
- package/dist/blocks/command-field.js.map +1 -0
- package/dist/blocks/drop-zone.d.ts +2 -1
- package/dist/blocks/drop-zone.d.ts.map +1 -1
- package/dist/blocks/drop-zone.js.map +1 -1
- package/dist/blocks/icons.d.ts +13 -0
- package/dist/blocks/icons.d.ts.map +1 -1
- package/dist/blocks/icons.js +13 -0
- package/dist/blocks/icons.js.map +1 -1
- package/dist/blocks/phosphor-marks.d.ts +4 -0
- package/dist/blocks/phosphor-marks.d.ts.map +1 -1
- package/dist/blocks/phosphor-marks.js +6 -0
- package/dist/blocks/phosphor-marks.js.map +1 -1
- package/dist/blocks/prompt-block.d.ts +49 -0
- package/dist/blocks/prompt-block.d.ts.map +1 -0
- package/dist/blocks/prompt-block.js +210 -0
- package/dist/blocks/prompt-block.js.map +1 -0
- package/dist/blocks/step-item.d.ts +21 -1
- package/dist/blocks/step-item.d.ts.map +1 -1
- package/dist/blocks/step-item.js +27 -2
- package/dist/blocks/step-item.js.map +1 -1
- package/dist/blocks/tool-setup.d.ts +83 -3
- package/dist/blocks/tool-setup.d.ts.map +1 -1
- package/dist/blocks/tool-setup.js +129 -49
- package/dist/blocks/tool-setup.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/tokens/base.json +2 -2
- package/dist/tokens.css +8 -4
- package/dist/tokens.json +1 -1
- package/package.json +1 -1
- package/dist/blocks/plug-method.d.ts +0 -76
- package/dist/blocks/plug-method.d.ts.map +0 -1
- package/dist/blocks/plug-method.js +0 -30
- package/dist/blocks/plug-method.js.map +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { CheckIcon, CopyIcon } from "./icons.js";
|
|
5
|
+
import { cn } from "../lib/cloudgrid-cn.js";
|
|
6
|
+
/**
|
|
7
|
+
* The prompt you hand an agent, as a FIELD rather than as a terminal.
|
|
8
|
+
*
|
|
9
|
+
* `CodeBlock` is the ink slab: `data-cg-surface="ink"` on a `#222` ground, for a
|
|
10
|
+
* command you would type. This is the other half of the pair the install blocks
|
|
11
|
+
* (#262) need — five lines of prose addressed to Claude Code or Cursor, sitting
|
|
12
|
+
* in a hairline field on whatever surface the page already is. The live block's
|
|
13
|
+
* own stylesheet says why in as many words: "Stays on the LIGHT subtle surface on
|
|
14
|
+
* purpose — --cg-surface-code is the ink #222 ground, and a black slab is not
|
|
15
|
+
* what this block is for."
|
|
16
|
+
*
|
|
17
|
+
* ## The grammar, and why there is one at all
|
|
18
|
+
*
|
|
19
|
+
* `ToolSetup`'s `body` takes a ReactNode precisely so the library never invents a
|
|
20
|
+
* text grammar (#117, #121, #126). A prompt is the exception, and the reason is
|
|
21
|
+
* that it is not markup at either end: it is a plain string that has to reach a
|
|
22
|
+
* clipboard byte for byte, and a caller who wanted emphasis inside one would have
|
|
23
|
+
* to hand over nodes for the screen and a second string for the clipboard, which
|
|
24
|
+
* is two sources for one prompt and the way they come to disagree.
|
|
25
|
+
*
|
|
26
|
+
* So two marks, both of which survive being pasted:
|
|
27
|
+
*
|
|
28
|
+
* `backticks` the segment reads as the literal it is — a command, a JSON blob,
|
|
29
|
+
* a path — in `--cg-text-accent` at medium weight. The fences are
|
|
30
|
+
* DELIMITERS: they never reach the screen and never reach the
|
|
31
|
+
* clipboard, the same way the `~` marker does not. CONTENT.md says
|
|
32
|
+
* "a line in backticks renders bold", and a delimiter you can see
|
|
33
|
+
* is a delimiter that was not consumed.
|
|
34
|
+
* ~ at line a closing aside to the agent rather than part of the
|
|
35
|
+
* start instruction: the muted text colour on screen, and REMOVED from
|
|
36
|
+
* the clipboard. The marker itself never renders.
|
|
37
|
+
*
|
|
38
|
+
* Both are parsed here, in `promptSegments` and `promptCopyText`, which are
|
|
39
|
+
* exported so the node suite can assert the grammar and the clipboard payload
|
|
40
|
+
* without a browser.
|
|
41
|
+
*
|
|
42
|
+
* ## `clip`
|
|
43
|
+
*
|
|
44
|
+
* The design clips a long prompt at five lines under a bottom fade rather than
|
|
45
|
+
* scrolling it: the prompt is a thing you copy, not a thing you read, and a
|
|
46
|
+
* scrollbar inside a column beside another column is two scroll ports fighting
|
|
47
|
+
* for one wheel. `clip` is opt-in because the same component renders a two-line
|
|
48
|
+
* prompt, where a fixed height is an empty box with a gradient in it.
|
|
49
|
+
*
|
|
50
|
+
* The fade ends on the field's own ground token rather than on a colour, so it
|
|
51
|
+
* flips with the surface instead of being a white-to-transparent wash that turns
|
|
52
|
+
* into a grey smear on ink.
|
|
53
|
+
*
|
|
54
|
+
* ## Copy feedback is announced, not merely shown
|
|
55
|
+
*
|
|
56
|
+
* `AgentPrompt`'s rule, kept: the control is ICON-only here, so there is no label
|
|
57
|
+
* to flip at all and a screen reader would get nothing. The accessible name stays
|
|
58
|
+
* stable and the result is written to a polite live region. The failure path says
|
|
59
|
+
* so rather than doing nothing, because `navigator.clipboard` rejects on insecure
|
|
60
|
+
* origins, inside some frames, and without permission.
|
|
61
|
+
*/
|
|
62
|
+
/**
|
|
63
|
+
* THE FIELD GROUND, and why it is written as an arbitrary property.
|
|
64
|
+
*
|
|
65
|
+
* `--cg-hover` is the only ground token declared in ALL THREE scopes: a 4.5% ink
|
|
66
|
+
* wash on the page, 10% white on the panel, 6% white on ink. That is exactly the
|
|
67
|
+
* quiet tint the design draws for a field, and it is the one that flips.
|
|
68
|
+
*
|
|
69
|
+
* `bg-subtle` was the first choice and it is CLAUDE.md rule 3 in its purest form.
|
|
70
|
+
* `--cg-surface-subtle` is declared at `:root` only, so on ink it stays the
|
|
71
|
+
* lavender `#f2f1f7` — a near-white slab on a `#222` ground, with the body text
|
|
72
|
+
* inside it flipping to white as it should and landing at about 1.1:1. Nothing
|
|
73
|
+
* errors, nothing in the class list looks wrong, and it was caught by taking a
|
|
74
|
+
* screenshot of the ink strip. `--cg-text-placeholder` has the same shape and the
|
|
75
|
+
* aside used it; it is `text-faint` now, which is two steps darker on the page and
|
|
76
|
+
* is on the ramp in every scope.
|
|
77
|
+
*
|
|
78
|
+
* It is spelled `bg-(--cg-hover)` because theme.css deliberately declines to
|
|
79
|
+
* generate a utility for it: `bg-hover` sits one character from Tailwind's own
|
|
80
|
+
* `hover:` variant, and a name that reads as a variant is a name someone writes by
|
|
81
|
+
* accident. The arbitrary form is how this library reaches an ungenerated token,
|
|
82
|
+
* the same way `Logo` reaches `--cg-text-accent` and `SideNavItem` reaches this
|
|
83
|
+
* very one.
|
|
84
|
+
*/
|
|
85
|
+
const FIELD = "border border-line bg-(--cg-hover)";
|
|
86
|
+
/**
|
|
87
|
+
* Split a prompt into lines and each line into runs.
|
|
88
|
+
*
|
|
89
|
+
* A code run carries its INNER text. The fences are delimiters and are dropped
|
|
90
|
+
* here, once, so that the screen and the clipboard cannot disagree about them —
|
|
91
|
+
* `promptCopyText` below is built from this same parse rather than from a second
|
|
92
|
+
* pass over the raw string.
|
|
93
|
+
*
|
|
94
|
+
* An UNCLOSED backtick is left as literal text rather than swallowing the rest of
|
|
95
|
+
* the prompt: a JSON blob or a shell line can carry one legitimately, and a
|
|
96
|
+
* grammar that eats everything after a stray character is a grammar that loses
|
|
97
|
+
* the user's prompt while looking like it worked. That lone backtick is real
|
|
98
|
+
* content, so it is kept.
|
|
99
|
+
*/
|
|
100
|
+
export function promptSegments(prompt) {
|
|
101
|
+
return prompt.split("\n").map((raw) => {
|
|
102
|
+
const aside = raw.startsWith("~");
|
|
103
|
+
// The marker is a MARKER. It never renders and it is never copied, so the
|
|
104
|
+
// one space authors write after it goes with it.
|
|
105
|
+
const line = aside ? raw.slice(1).replace(/^ /, "") : raw;
|
|
106
|
+
const segments = [];
|
|
107
|
+
let rest = line;
|
|
108
|
+
while (rest.length > 0) {
|
|
109
|
+
const open = rest.indexOf("`");
|
|
110
|
+
if (open === -1)
|
|
111
|
+
break;
|
|
112
|
+
const close = rest.indexOf("`", open + 1);
|
|
113
|
+
if (close === -1)
|
|
114
|
+
break;
|
|
115
|
+
if (open > 0)
|
|
116
|
+
segments.push({ text: rest.slice(0, open), code: false });
|
|
117
|
+
// The inner text, without the fences. An EMPTY pair (``) contributes
|
|
118
|
+
// nothing rather than an empty accent span with nothing in it.
|
|
119
|
+
const inner = rest.slice(open + 1, close);
|
|
120
|
+
if (inner.length > 0)
|
|
121
|
+
segments.push({ text: inner, code: true });
|
|
122
|
+
rest = rest.slice(close + 1);
|
|
123
|
+
}
|
|
124
|
+
if (rest.length > 0)
|
|
125
|
+
segments.push({ text: rest, code: false });
|
|
126
|
+
return { segments, aside };
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* What the clipboard gets: every line that is not an aside, with the fences
|
|
131
|
+
* consumed.
|
|
132
|
+
*
|
|
133
|
+
* Derived from `promptSegments` rather than from a second pass over the raw
|
|
134
|
+
* string, deliberately. The two used to be independent and they disagreed: the
|
|
135
|
+
* screen showed the fences and so did the clipboard, and a payload built by its
|
|
136
|
+
* own rules is a payload that drifts from the paint one edit later.
|
|
137
|
+
*
|
|
138
|
+
* Trailing blank lines left behind by a stripped aside go too. A prompt that ends
|
|
139
|
+
* in a newline pastes into an agent's box as an empty last turn, which looks like
|
|
140
|
+
* the copy truncated.
|
|
141
|
+
*/
|
|
142
|
+
export function promptCopyText(prompt) {
|
|
143
|
+
return promptSegments(prompt)
|
|
144
|
+
.filter((line) => !line.aside)
|
|
145
|
+
.map((line) => line.segments.map((segment) => segment.text).join(""))
|
|
146
|
+
.join("\n")
|
|
147
|
+
.replace(/\n+$/, "");
|
|
148
|
+
}
|
|
149
|
+
function PromptBlock({ prompt, copyLabel = "Copy prompt", clip = false, className, ...props }) {
|
|
150
|
+
const [state, setState] = React.useState("idle");
|
|
151
|
+
const timer = React.useRef(undefined);
|
|
152
|
+
// Cleared on unmount, or the timeout fires against a component that is gone
|
|
153
|
+
// when someone switches tool inside the 1600ms window.
|
|
154
|
+
React.useEffect(() => () => clearTimeout(timer.current), []);
|
|
155
|
+
async function copy() {
|
|
156
|
+
try {
|
|
157
|
+
await navigator.clipboard.writeText(promptCopyText(prompt));
|
|
158
|
+
setState("copied");
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
setState("blocked");
|
|
162
|
+
}
|
|
163
|
+
clearTimeout(timer.current);
|
|
164
|
+
timer.current = setTimeout(() => setState("idle"), 1600);
|
|
165
|
+
}
|
|
166
|
+
const lines = promptSegments(prompt);
|
|
167
|
+
return (_jsxs("div", { "data-slot": "prompt-block", "data-clipped": clip ? "" : undefined, className: cn("relative rounded-sm", FIELD,
|
|
168
|
+
// The right gutter is the copy control's room. Without it a long first
|
|
169
|
+
// line runs under a 28px button and the last word is simply gone.
|
|
170
|
+
"py-3 pr-12 pl-3.5",
|
|
171
|
+
// FIVE LINES of the brand's own mono ramp, plus this box's own vertical
|
|
172
|
+
// padding — computed rather than measured, so a change to --cg-mono-size
|
|
173
|
+
// or --cg-mono-line moves the clip with it instead of leaving a height
|
|
174
|
+
// that used to show five lines. The design's 118px was five lines of a
|
|
175
|
+
// 12px mono; this library's mono is 14 and the floor says it stays 14, so
|
|
176
|
+
// the pixel value would have shown four.
|
|
177
|
+
clip && "h-[calc(5*var(--cg-mono-size)*var(--cg-mono-line)+1.5rem)] overflow-hidden", className), ...props, children: [_jsx("pre", { "data-slot": "prompt-block-text", className: cn("m-0 font-mono text-mono leading-mono whitespace-pre-wrap text-body",
|
|
178
|
+
// `break-words`, not `break-all`: a prompt carries URLs and package
|
|
179
|
+
// names, and breaking mid-token makes a copied-looking string that is
|
|
180
|
+
// not the string.
|
|
181
|
+
"break-words",
|
|
182
|
+
// No scrollbar inside the clip. The fade says there is more and the
|
|
183
|
+
// copy control is what the user actually wants; a scroll port here
|
|
184
|
+
// competes with the page's own wheel.
|
|
185
|
+
clip && "h-full overflow-hidden pb-7"), children: lines.map((line, i) => (_jsxs(React.Fragment, { children: [i > 0 ? "\n" : null, line.aside ? (_jsx("span", { "data-slot": "prompt-block-aside", className: "text-faint", children: line.segments.map((s) => s.text).join("") })) : (line.segments.map((segment, j) => segment.code ? (_jsx("b", { "data-slot": "prompt-block-code",
|
|
186
|
+
// `--cg-text-accent` has no generated `--color-*` utility, so
|
|
187
|
+
// it is reached the way `Logo` and `ToolSetup` already reach
|
|
188
|
+
// it. It flips purple -> white -> lime across the three
|
|
189
|
+
// scopes, which is the one accent that is legible in all of
|
|
190
|
+
// them.
|
|
191
|
+
className: "font-medium text-(--cg-text-accent)", children: segment.text }, j)) : (_jsx(React.Fragment, { children: segment.text }, j))))] }, i))) }), clip ? (
|
|
192
|
+
// Decorative, and it must not swallow a click meant for the text under
|
|
193
|
+
// it. The gradient ends on the field's own ground rather than on a
|
|
194
|
+
// literal, so it flips with the surface.
|
|
195
|
+
_jsx("span", { "aria-hidden": "true", "data-slot": "prompt-block-fade", className: "pointer-events-none absolute inset-x-px bottom-px h-9 rounded-b-sm bg-linear-to-b from-transparent to-(--cg-hover)" })) : null, _jsx("button", { type: "button", onClick: copy, "data-slot": "prompt-block-copy", "data-state": state,
|
|
196
|
+
// Not `Button`. The design's control is a 28px square with a hairline and
|
|
197
|
+
// the card ground, and `Button`'s `icon-sm` is 28px with `bg-background`
|
|
198
|
+
// — which maps to `--cg-surface-page` and is deliberately NOT flipped per
|
|
199
|
+
// surface, so on ink it paints a white square with a white glyph on it.
|
|
200
|
+
// `CodeBlock` carries the same note and works around it with
|
|
201
|
+
// `bg-transparent`; here the control needs a ground of its own to sit on
|
|
202
|
+
// over the prompt text, and `bg-card` is the one that flips.
|
|
203
|
+
className: "absolute top-2.5 right-2.5 z-10 inline-flex size-7 items-center justify-center rounded-sm border border-line bg-card text-faint transition-colors hover:border-line-accent hover:text-(--cg-text-accent) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", "aria-label": copyLabel, children: state === "copied" ? _jsx(CheckIcon, { className: "size-3.5" }) : _jsx(CopyIcon, { className: "size-3.5" }) }), _jsx("span", { "aria-live": "polite", className: "sr-only", children: state === "copied"
|
|
204
|
+
? "Copied to the clipboard"
|
|
205
|
+
: state === "blocked"
|
|
206
|
+
? "The browser blocked the copy"
|
|
207
|
+
: "" })] }));
|
|
208
|
+
}
|
|
209
|
+
export { PromptBlock };
|
|
210
|
+
//# sourceMappingURL=prompt-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-block.js","sourceRoot":"","sources":["../../src/blocks/prompt-block.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,31 @@
|
|
|
14
14
|
* One deliberate change. v0's badge is 26px, which is on no step of the 4px
|
|
15
15
|
* spacing ramp. This is 24px (`size-6`), which is. Two pixels, and it stops the
|
|
16
16
|
* component being the reason someone thinks the ramp has exceptions.
|
|
17
|
+
*
|
|
18
|
+
* ## `tone="outline"` (#262)
|
|
19
|
+
*
|
|
20
|
+
* The install blocks number a sequence — ChatGPT's two connector steps, Claude's
|
|
21
|
+
* two — inside a pane that already carries a filled brand badge on the column
|
|
22
|
+
* beside it. Two filled pills of two different brand colours in one pane is the
|
|
23
|
+
* exact collision the note above warns about ("do not put an accent button beside
|
|
24
|
+
* one"), so those numerals are drawn as a hairline circle with the body colour
|
|
25
|
+
* inside instead.
|
|
26
|
+
*
|
|
27
|
+
* It is a TONE and not a second component because everything else about the item
|
|
28
|
+
* — the `<li>`, the aria-hidden numeral, the title, the body slot — is identical,
|
|
29
|
+
* and a fork would be a second place for the `<ol>` rule to be forgotten.
|
|
30
|
+
* `default` paints exactly what it painted before.
|
|
17
31
|
*/
|
|
32
|
+
declare const TONES: {
|
|
33
|
+
readonly default: "bg-cyan font-bold text-on-accent";
|
|
34
|
+
readonly outline: "border border-line bg-(--cg-hover) font-medium text-body";
|
|
35
|
+
};
|
|
18
36
|
declare function StepList({ className, ...props }: React.ComponentProps<"ol">): import("react").JSX.Element;
|
|
19
|
-
declare function StepItem({ index, title, className, children, ...props }: React.ComponentProps<"li"> & {
|
|
37
|
+
declare function StepItem({ index, title, tone, className, children, ...props }: React.ComponentProps<"li"> & {
|
|
20
38
|
index: number;
|
|
21
39
|
title: string;
|
|
40
|
+
/** `outline` is the hairline numeral, for a pane that already has a filled badge. */
|
|
41
|
+
tone?: keyof typeof TONES;
|
|
22
42
|
}): import("react").JSX.Element;
|
|
23
43
|
export { StepItem, StepList };
|
|
24
44
|
//# sourceMappingURL=step-item.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-item.d.ts","sourceRoot":"","sources":["../../src/blocks/step-item.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"step-item.d.ts","sourceRoot":"","sources":["../../src/blocks/step-item.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,QAAA,MAAM,KAAK;;;CAUD,CAAA;AAEV,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,+BAepE;AAED,iBAAS,QAAQ,CAAC,EAChB,KAAK,EACL,KAAK,EACL,IAAgB,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,CAAA;CAC1B,+BA0BA;AAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA"}
|
package/dist/blocks/step-item.js
CHANGED
|
@@ -16,7 +16,32 @@ import { cn } from "../lib/cloudgrid-cn.js";
|
|
|
16
16
|
* One deliberate change. v0's badge is 26px, which is on no step of the 4px
|
|
17
17
|
* spacing ramp. This is 24px (`size-6`), which is. Two pixels, and it stops the
|
|
18
18
|
* component being the reason someone thinks the ramp has exceptions.
|
|
19
|
+
*
|
|
20
|
+
* ## `tone="outline"` (#262)
|
|
21
|
+
*
|
|
22
|
+
* The install blocks number a sequence — ChatGPT's two connector steps, Claude's
|
|
23
|
+
* two — inside a pane that already carries a filled brand badge on the column
|
|
24
|
+
* beside it. Two filled pills of two different brand colours in one pane is the
|
|
25
|
+
* exact collision the note above warns about ("do not put an accent button beside
|
|
26
|
+
* one"), so those numerals are drawn as a hairline circle with the body colour
|
|
27
|
+
* inside instead.
|
|
28
|
+
*
|
|
29
|
+
* It is a TONE and not a second component because everything else about the item
|
|
30
|
+
* — the `<li>`, the aria-hidden numeral, the title, the body slot — is identical,
|
|
31
|
+
* and a fork would be a second place for the `<ol>` rule to be forgotten.
|
|
32
|
+
* `default` paints exactly what it painted before.
|
|
19
33
|
*/
|
|
34
|
+
const TONES = {
|
|
35
|
+
// No border at all on the default, rather than a transparent one. `size-6`
|
|
36
|
+
// is a border-box, so a 1px transparent ring would quietly shrink the
|
|
37
|
+
// numeral's content area by two pixels on every existing step list.
|
|
38
|
+
default: "bg-cyan font-bold text-on-accent",
|
|
39
|
+
// `bg-(--cg-hover)` rather than `bg-subtle`: --cg-surface-subtle is declared at
|
|
40
|
+
// :root only, so on ink it freezes to a near-white lavender and the numeral
|
|
41
|
+
// becomes a white disc. --cg-hover is the one ground token declared in all
|
|
42
|
+
// three scopes. See the FIELD note in prompt-block.tsx.
|
|
43
|
+
outline: "border border-line bg-(--cg-hover) font-medium text-body",
|
|
44
|
+
};
|
|
20
45
|
function StepList({ className, ...props }) {
|
|
21
46
|
return (_jsx("ol", {
|
|
22
47
|
// Explicit, and load-bearing. WebKit drops the implicit `list` role from an
|
|
@@ -27,8 +52,8 @@ function StepList({ className, ...props }) {
|
|
|
27
52
|
// in review on #42.
|
|
28
53
|
role: "list", "data-slot": "step-list", className: cn("flex list-none flex-col gap-5 p-0", className), ...props }));
|
|
29
54
|
}
|
|
30
|
-
function StepItem({ index, title, className, children, ...props }) {
|
|
31
|
-
return (_jsxs("li", { "data-slot": "step-item", className: cn("flex items-start gap-4", className), ...props, children: [_jsx("span", { "aria-hidden": "true", className: "flex size-6 shrink-0 items-center justify-center rounded-pill
|
|
55
|
+
function StepItem({ index, title, tone = "default", className, children, ...props }) {
|
|
56
|
+
return (_jsxs("li", { "data-slot": "step-item", className: cn("flex items-start gap-4", className), ...props, children: [_jsx("span", { "aria-hidden": "true", "data-slot": "step-item-numeral", "data-tone": tone, className: cn("flex size-6 shrink-0 items-center justify-center rounded-pill text-caption", TONES[tone]), children: index }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-2", children: [_jsx("span", { className: "text-heading-sm font-medium text-ink", children: title }), children ? _jsx("div", { className: "text-body-sm text-body", children: children }) : null] })] }));
|
|
32
57
|
}
|
|
33
58
|
export { StepItem, StepList };
|
|
34
59
|
//# sourceMappingURL=step-item.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-item.js","sourceRoot":"","sources":["../../src/blocks/step-item.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAEvC
|
|
1
|
+
{"version":3,"file":"step-item.js","sourceRoot":"","sources":["../../src/blocks/step-item.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,KAAK,GAAG;IACZ,2EAA2E;IAC3E,sEAAsE;IACtE,oEAAoE;IACpE,OAAO,EAAE,kCAAkC;IAC3C,gFAAgF;IAChF,4EAA4E;IAC5E,2EAA2E;IAC3E,wDAAwD;IACxD,OAAO,EAAE,0DAA0D;CAC3D,CAAA;AAEV,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA8B;IACnE,OAAO,CACL;QACE,4EAA4E;QAC5E,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,0EAA0E;QAC1E,oBAAoB;QACpB,IAAI,EAAC,MAAM,eACD,WAAW,EACrB,SAAS,EAAE,EAAE,CAAC,mCAAmC,EAAE,SAAS,CAAC,KACzD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,EAChB,KAAK,EACL,KAAK,EACL,IAAI,GAAG,SAAS,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EAMT;IACC,OAAO,CACL,2BACY,WAAW,EACrB,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,KAC9C,KAAK,aAET,8BACc,MAAM,eACR,mBAAmB,eAClB,IAAI,EACf,SAAS,EAAE,EAAE,CACX,4EAA4E,EAC5E,KAAK,CAAC,IAAI,CAAC,CACZ,YAEA,KAAK,GACD,EACP,eAAK,SAAS,EAAC,oCAAoC,aACjD,eAAM,SAAS,EAAC,sCAAsC,YAAE,KAAK,GAAQ,EAGpE,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,wBAAwB,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IACvE,IACH,CACN,CAAA;AACH,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -9,11 +9,38 @@ import { PageHeading } from "./page-heading.js";
|
|
|
9
9
|
* were heading for two implementations of one screen, which is how the two come
|
|
10
10
|
* to disagree about the same setup with nothing to catch it.
|
|
11
11
|
*
|
|
12
|
-
* ## The
|
|
12
|
+
* ## The repaint that the PROVISIONAL note was waiting for (#262)
|
|
13
13
|
*
|
|
14
14
|
* Founder, 2026-08-25: a better component design exists and is not ready yet —
|
|
15
|
-
* "make this nice and we will replace the full component shortly".
|
|
16
|
-
*
|
|
15
|
+
* "make this nice and we will replace the full component shortly". It arrived on
|
|
16
|
+
* 2026-09-23, and this file is that design: the bordered method pills, the tool
|
|
17
|
+
* strip with a glyph per group and a rule under it, the brand fill on the
|
|
18
|
+
* selected tab, the 60/40 pane with a badge per column, and `PromptBlock` and
|
|
19
|
+
* `CommandField` in place of an ink slab.
|
|
20
|
+
*
|
|
21
|
+
* The bet the original note made paid off exactly as written: the props were the
|
|
22
|
+
* contract and the class lists were the disposable half, so the repaint changed
|
|
23
|
+
* what this renders and not what a consumer passes. Everything the note protected
|
|
24
|
+
* is untouched — the methods x tools x steps engine, the render-time fallbacks,
|
|
25
|
+
* the two reconcile-after-paint effects, the grouping that rides on each tab's
|
|
26
|
+
* accessible name.
|
|
27
|
+
*
|
|
28
|
+
* ## THIS IS A COMPONENT, NOT A PAGE (founder ruling, 2026-09-23)
|
|
29
|
+
*
|
|
30
|
+
* The first pass of #262 also grew a `header` (a wordmark over a row of vendor
|
|
31
|
+
* logos), a `layout: "bare" | "card"`, a `prompt` slot and a `footnote` — enough
|
|
32
|
+
* to rebuild the marketing install page inside the library, which is what it then
|
|
33
|
+
* did in the gallery. Rejected in review, in as many words: *"I didn't mean you
|
|
34
|
+
* will design it similarly to what I showed you. The entire idea was to design it
|
|
35
|
+
* the way it already looks like in the UI library. The problem now is that we
|
|
36
|
+
* have two versions."*
|
|
37
|
+
*
|
|
38
|
+
* All four are gone. A wordmark is a page's, a hero headline is a page's, and a
|
|
39
|
+
* footer with source links is a page's; this renders a title, a sub, a control
|
|
40
|
+
* and a pane, on whichever of the library's surfaces it is dropped on. If a
|
|
41
|
+
* marketing page wants the rest, the page composes it around this.
|
|
42
|
+
*
|
|
43
|
+
* The original reasoning, kept because it is still why the repaint was cheap:
|
|
17
44
|
*
|
|
18
45
|
* - **The props are the contract.** `tools`, `value`/`defaultValue`/
|
|
19
46
|
* `onValueChange`, `onContinue`. A redesign changes what this renders, not
|
|
@@ -28,6 +55,48 @@ import { PageHeading } from "./page-heading.js";
|
|
|
28
55
|
* Do not build anything on the internals — the slots and the class lists are
|
|
29
56
|
* the disposable half.
|
|
30
57
|
*
|
|
58
|
+
* ## The selected tab is the brand FILL, and that closes #223
|
|
59
|
+
*
|
|
60
|
+
* The selected tool tab used to be `bg-code`/`text-on-code`, the library's own
|
|
61
|
+
* ink pair. `--cg-surface-code` is `#222` in all three scopes and that is also
|
|
62
|
+
* the ink GROUND, so inside `data-cg-surface="ink"` the pill was the colour of
|
|
63
|
+
* what sits behind it. The backlog offered two ways out — a new semantic token
|
|
64
|
+
* declared in all three scopes, or a ruling that this is not an ink component —
|
|
65
|
+
* and the design answers it a third way that needs neither: the brand fill,
|
|
66
|
+
* which is what `hub.html` draws (`.tab.on{background:var(--cg-primary)}`).
|
|
67
|
+
*
|
|
68
|
+
* `--cg-primary` and `--cg-text-on-primary` are declared at `:root` and
|
|
69
|
+
* redeclared on NEITHER surface, so the pair is one value everywhere and carries
|
|
70
|
+
* its own ground, exactly the construction `Button`'s `cta` variant relies on
|
|
71
|
+
* (#225, #236). Measured on all three gallery strips: the selected label is
|
|
72
|
+
* 5.84:1 on its own pill in every scope, the same number by construction.
|
|
73
|
+
*
|
|
74
|
+
* ONE CAVEAT, recorded rather than fixed. On the PURPLE PANEL the pill's ground
|
|
75
|
+
* is the panel's own hue, so what separates the selected tab from the strip
|
|
76
|
+
* around it there is the 10% white wash on the bar plus the idle labels being
|
|
77
|
+
* 82% white against the selected one's 100% — a much smaller margin than on the
|
|
78
|
+
* page or on ink, where the pill reads at a glance. The label itself is legible
|
|
79
|
+
* everywhere, which is the floor; "which tab is selected" is quieter on that one
|
|
80
|
+
* surface. Fixing it means a panel-scoped selected treatment, which is a design
|
|
81
|
+
* decision and not a worker's to make. The strip is on the gallery's panel
|
|
82
|
+
* surface so it stays visible.
|
|
83
|
+
*
|
|
84
|
+
* ## THE CALLER CHOOSES WHAT IS ON SCREEN
|
|
85
|
+
*
|
|
86
|
+
* `tools` and `methods` are lists, and every one of them is the caller's: which
|
|
87
|
+
* tools, which methods, and in what order. Two tools is a valid strip. One method
|
|
88
|
+
* is a valid axis. This component renders what it is handed and sorts nothing,
|
|
89
|
+
* filters nothing by its own opinion and adds nothing that was not passed —
|
|
90
|
+
* founder, 2026-09-23: *"it's important to pick what I want to show each time —
|
|
91
|
+
* not to show all if I want, only two integrations if I want, or only CLI or only
|
|
92
|
+
* MCP."*
|
|
93
|
+
*
|
|
94
|
+
* The one thing it decides for itself is that a control with a single option is
|
|
95
|
+
* not a control. Pass one method and the method axis still works — the pane is
|
|
96
|
+
* still read from `steps[method]` — but no pill row renders, because a row of one
|
|
97
|
+
* is furniture for a choice nobody has. Pass none and there is no axis at all,
|
|
98
|
+
* which is the older shape where a tool carries a single `prompt`.
|
|
99
|
+
*
|
|
31
100
|
* ## Presentation only
|
|
32
101
|
*
|
|
33
102
|
* The line #117 and #121 drew, held again. This component carries no CloudGrid
|
|
@@ -69,6 +138,17 @@ export interface ToolSetupMethod {
|
|
|
69
138
|
export interface ToolSetupGroup {
|
|
70
139
|
value: string;
|
|
71
140
|
label: string;
|
|
141
|
+
/**
|
|
142
|
+
* A glyph in place of the visible label. The design labels a run of tools with
|
|
143
|
+
* a terminal or a chat bubble rather than a word, so the strip stays one row.
|
|
144
|
+
*
|
|
145
|
+
* It replaces the label ON SCREEN only. The label is still required and is
|
|
146
|
+
* still what reaches assistive tech, through each tab's own accessible name —
|
|
147
|
+
* see the note on the strip below for why the visible marker cannot carry it.
|
|
148
|
+
* A glyph with no words behind it would take the grouping away from everyone
|
|
149
|
+
* who is not looking at the screen.
|
|
150
|
+
*/
|
|
151
|
+
icon?: React.ReactNode;
|
|
72
152
|
}
|
|
73
153
|
/**
|
|
74
154
|
* One step of a pane.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-setup.d.ts","sourceRoot":"","sources":["../../src/blocks/tool-setup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"tool-setup.d.ts","sourceRoot":"","sources":["../../src/blocks/tool-setup.tsx"],"names":[],"mappings":"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"}
|