@vibes.diy/base 14.3.106 → 14.3.109
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/components/HomeBuildChips.d.ts +29 -0
- package/components/HomeBuildChips.js +152 -0
- package/components/HomeBuildChips.js.map +1 -0
- package/components/index.d.ts +1 -0
- package/components/index.js +1 -0
- package/components/index.js.map +1 -1
- package/components/vibe-menu/VibeMenu.js +5 -3
- package/components/vibe-menu/VibeMenu.js.map +1 -1
- package/components/vibe-menu/cards/AccountCard.d.ts +4 -0
- package/components/vibe-menu/cards/AccountCard.js +64 -1
- package/components/vibe-menu/cards/AccountCard.js.map +1 -1
- package/components/vibe-menu/cards/CodeCard.d.ts +2 -1
- package/components/vibe-menu/cards/CodeCard.js +12 -3
- package/components/vibe-menu/cards/CodeCard.js.map +1 -1
- package/components/vibe-menu/cards/CodeTabRow.d.ts +1 -1
- package/components/vibe-menu/cards/CodeTabRow.js +6 -0
- package/components/vibe-menu/cards/CodeTabRow.js.map +1 -1
- package/components/vibe-menu/cards/HomeCard.d.ts +8 -0
- package/components/vibe-menu/cards/HomeCard.js +67 -5
- package/components/vibe-menu/cards/HomeCard.js.map +1 -1
- package/components/vibe-menu/cards/ShareCard.d.ts +3 -0
- package/components/vibe-menu/cards/ShareCard.js +109 -16
- package/components/vibe-menu/cards/ShareCard.js.map +1 -1
- package/components/vibe-menu/index.d.ts +3 -0
- package/components/vibe-menu/index.js +3 -0
- package/components/vibe-menu/index.js.map +1 -1
- package/components/vibe-menu/moments.d.ts +9 -0
- package/components/vibe-menu/moments.js +6 -0
- package/components/vibe-menu/moments.js.map +1 -1
- package/components/vibe-menu/parts/AccessToggle.js +2 -1
- package/components/vibe-menu/parts/AccessToggle.js.map +1 -1
- package/components/vibe-menu/parts/CardTabRow.d.ts +27 -0
- package/components/vibe-menu/{sketches → parts}/CardTabRow.js +2 -7
- package/components/vibe-menu/parts/CardTabRow.js.map +1 -0
- package/components/vibe-menu/parts/Composer.js +2 -1
- package/components/vibe-menu/parts/Composer.js.map +1 -1
- package/components/vibe-menu/parts/MomentLine.js +10 -5
- package/components/vibe-menu/parts/MomentLine.js.map +1 -1
- package/components/vibe-menu/parts/SurveyStrip.d.ts +13 -3
- package/components/vibe-menu/parts/SurveyStrip.js +97 -54
- package/components/vibe-menu/parts/SurveyStrip.js.map +1 -1
- package/components/vibe-menu/parts/ThinkingLine.d.ts +24 -0
- package/components/vibe-menu/parts/ThinkingLine.js +77 -0
- package/components/vibe-menu/parts/ThinkingLine.js.map +1 -0
- package/components/vibe-menu/parts/brief-faces-art.d.ts +12 -0
- package/components/vibe-menu/parts/brief-faces-art.js +540 -0
- package/components/vibe-menu/parts/brief-faces-art.js.map +1 -0
- package/components/vibe-menu/sketches/CodeTierAudition.js +1 -1
- package/components/vibe-menu/sketches/CodeTierAudition.js.map +1 -1
- package/components/vibe-menu/slices.d.ts +5 -0
- package/components/vibe-menu/slices.js.map +1 -1
- package/components/vibe-menu/vibe-menu.styles.d.ts +1 -1
- package/components/vibe-menu/vibe-menu.styles.js +0 -25
- package/components/vibe-menu/vibe-menu.styles.js.map +1 -1
- package/package.json +5 -5
- package/components/vibe-menu/sketches/AccountTabAudition.d.ts +0 -11
- package/components/vibe-menu/sketches/AccountTabAudition.js +0 -90
- package/components/vibe-menu/sketches/AccountTabAudition.js.map +0 -1
- package/components/vibe-menu/sketches/CardTabRow.d.ts +0 -27
- package/components/vibe-menu/sketches/CardTabRow.js.map +0 -1
- package/components/vibe-menu/sketches/HomeTabAudition.d.ts +0 -26
- package/components/vibe-menu/sketches/HomeTabAudition.js +0 -87
- package/components/vibe-menu/sketches/HomeTabAudition.js.map +0 -1
- package/components/vibe-menu/sketches/ShareTabAudition.d.ts +0 -14
- package/components/vibe-menu/sketches/ShareTabAudition.js +0 -155
- package/components/vibe-menu/sketches/ShareTabAudition.js.map +0 -1
|
@@ -2,6 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import { Chip } from "./Chip.js";
|
|
3
3
|
import { Glyph } from "./Glyph.js";
|
|
4
4
|
import { nextRadioIndex } from "./radio-keys.js";
|
|
5
|
+
import { FacesGlyph } from "./ThinkingLine.js";
|
|
5
6
|
const POSTURES = [
|
|
6
7
|
{ value: "restricted", label: "Restricted" },
|
|
7
8
|
{ value: "public", label: "Public" },
|
|
@@ -47,7 +48,7 @@ export function AccessToggle(props) {
|
|
|
47
48
|
event.preventDefault();
|
|
48
49
|
choose(next);
|
|
49
50
|
} }, busy ? (React.createElement(React.Fragment, null,
|
|
50
|
-
React.createElement(
|
|
51
|
+
React.createElement(FacesGlyph, { size: 16, ink: "current" }),
|
|
51
52
|
"Securing\u2026")) : (option.label)));
|
|
52
53
|
})),
|
|
53
54
|
React.createElement("p", { className: "vm-access-line" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessToggle.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/AccessToggle.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAkB,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AccessToggle.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/AccessToggle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type GlyphName } from "./Glyph.js";
|
|
3
|
+
export type CardTabKind = "drill" | "link" | "action";
|
|
4
|
+
export interface CardTabItem {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly glyph: GlyphName;
|
|
8
|
+
readonly kind: CardTabKind;
|
|
9
|
+
readonly href?: string;
|
|
10
|
+
readonly onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare const CARD_TAB_ROW_CSS = "\n[data-vibe-menu] .vm-ctab { display: flex; flex-direction: column; }\n[data-vibe-menu] .vm-ctab .vm-composer { margin-bottom: 0; }\n[data-vibe-menu] .vm-ctab .vm-drill + .vm-done { margin-top: var(--space-14); }\n/* The opened chat ends with the suggestions: the clip holds the log's own\n 160px cap plus them, and the log alone scrolls. */\n[data-vibe-menu] .vm-ctab .vm-log-clip[data-open=\"true\"] { max-height: none; }\n[data-vibe-menu] .vm-ctab .vm-log-clip .vm-suggestions { margin: var(--space-12) 0 0; }\n[data-vibe-menu] .vm-cnav {\n display: flex; flex: none; height: var(--size-bar);\n margin: var(--space-14) calc(-1 * var(--space-16)) calc(-1 * var(--space-16));\n border-top: var(--stroke-hairline) solid var(--line-hairline);\n}\n[data-vibe-menu] .vm-cnav button {\n position: relative; flex: 1 1 auto; min-width: 0;\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-4);\n padding: var(--space-4) var(--space-2);\n color: var(--ink);\n}\n/* A drill or an opened log taller than the card scrolls the card; the row sticks\n on the band so it stays in view. In flow (no overflow) this changes nothing.\n Code mode's tier layout fills the card instead, so it keeps the row in flow. */\n[data-vibe-menu] .vm-ctab:not([data-tier-mode]) > .vm-cnav {\n position: sticky; bottom: var(--vm-band, 0px); z-index: 1; background: var(--card-bg);\n}\n[data-vibe-menu] .vm-cnav button + button { border-left: var(--stroke-hairline) solid var(--line-hairline); }\n[data-vibe-menu] .vm-cnav button:focus-visible { outline: var(--stroke-focus) solid var(--line-card); outline-offset: -3px; }\n[data-vibe-menu] .vm-cnav button[aria-pressed=\"true\"] { background: var(--accent); color: var(--on-accent); }\n[data-vibe-menu] .vm-cnav-circle {\n display: flex; align-items: center; justify-content: center; flex: none;\n width: var(--size-icon-circle-phone); height: var(--size-icon-circle-phone);\n border-radius: 50%; background: var(--ink);\n}\n[data-vibe-menu] .vm-cnav-circle svg {\n width: 12px; height: 12px; fill: none; stroke: var(--card-bg); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round;\n}\n[data-vibe-menu] .vm-cnav button[aria-pressed=\"true\"] .vm-cnav-circle { background: var(--menu-ink); }\n[data-vibe-menu] .vm-cnav button[aria-pressed=\"true\"] .vm-cnav-circle svg { stroke: var(--vibes-cream); }\n/* Code mode with the row: the retained workspace sits above this card's\n content, then the composer, the scroll tier and the row, flush. */\n[data-vibe-menu] .vm-ctab[data-tier-mode]:not([data-fill]) { padding-top: var(--space-14); }\n[data-vibe-menu] .vm-ctab[data-tier-mode] .vm-tier-body {\n flex: 1 1 auto; min-height: 0; overflow: auto; overscroll-behavior: contain; margin-bottom: var(--space-14);\n}\n[data-vibe-menu] .vm-ctab .vm-srow + .vm-cnav { margin-top: 0; }\n[data-vibe-menu] .vm-cnav-label {\n max-width: 100%; overflow: hidden; text-overflow: ellipsis;\n font: 700 9.6px/1 var(--font-tab); letter-spacing: 0.5px; text-transform: uppercase; white-space: nowrap;\n}\n\n[data-vibe-menu] .vm-cnav > a {\n position: relative; flex: 1 1 auto; min-width: 0;\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-4);\n padding: var(--space-4) var(--space-2);\n color: var(--ink); text-decoration: none;\n}\n[data-vibe-menu] .vm-cnav > * + a,\n[data-vibe-menu] .vm-cnav > a + button { border-left: var(--stroke-hairline) solid var(--line-hairline); }\n[data-vibe-menu] .vm-cnav > a:focus-visible { outline: var(--stroke-focus) solid var(--line-card); outline-offset: -3px; }\n[data-vibe-menu] .vm-xtab[data-row-drill] .vm-back { display: none; }\n[data-vibe-menu] .vm-xtab .vm-drill > .vm-subhead:first-child { margin-top: 0; }\n/* The hierarchy (owner 2026-10-13), bottom up: the strip, this row, the card's\n ONE main action, then the stretch. The two zones are layout-free wrappers, so\n each card keeps its own spacing; the main action sits on the row's own top\n margin, as Code's composer does. */\n[data-vibe-menu] .vm-xtab .vm-stretch,\n[data-vibe-menu] .vm-xtab .vm-main { display: contents; }\n[data-vibe-menu] .vm-xtab .vm-main > :last-child { margin-bottom: 0; }\n[data-vibe-menu] .vm-xtab .vm-stretch > .vm-subhead:first-child { margin-top: 0; }\n[data-vibe-menu] .vm-xtab .vm-stretch > .vm-group.is-flush { border-bottom: var(--stroke-hairline) solid var(--line-hairline); }\n[data-vibe-menu] .vm-xtab .vm-stretch > .vm-group:last-child { margin-bottom: var(--space-14); }\n[data-vibe-menu] .vm-xtab .vm-stretch > .vm-group + * { margin-top: var(--space-14); }\n";
|
|
13
|
+
export interface CardTabRowProps {
|
|
14
|
+
readonly label: string;
|
|
15
|
+
readonly items: readonly CardTabItem[];
|
|
16
|
+
readonly active: string | null;
|
|
17
|
+
readonly onDrill: (key: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function CardTabRow(props: CardTabRowProps): React.ReactElement;
|
|
20
|
+
export declare function MainAction(props: {
|
|
21
|
+
readonly children: React.ReactNode;
|
|
22
|
+
}): React.ReactElement;
|
|
23
|
+
export declare function Stretch(props: {
|
|
24
|
+
readonly children: React.ReactNode;
|
|
25
|
+
}): React.ReactElement | null;
|
|
26
|
+
export declare function toggleDrill(open: string | null, key: string): string | null;
|
|
27
|
+
export declare function isPlainLeftClick(event: React.MouseEvent<HTMLElement>): boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { CODE_TAB_ROW_CSS } from "../cards/CodeTabRow.js";
|
|
3
|
-
import { Glyph } from "
|
|
3
|
+
import { Glyph } from "./Glyph.js";
|
|
4
4
|
export const CARD_TAB_ROW_CSS = `${CODE_TAB_ROW_CSS}
|
|
5
5
|
[data-vibe-menu] .vm-cnav > a {
|
|
6
6
|
position: relative; flex: 1 1 auto; min-width: 0;
|
|
@@ -11,13 +11,8 @@ export const CARD_TAB_ROW_CSS = `${CODE_TAB_ROW_CSS}
|
|
|
11
11
|
[data-vibe-menu] .vm-cnav > * + a,
|
|
12
12
|
[data-vibe-menu] .vm-cnav > a + button { border-left: var(--stroke-hairline) solid var(--line-hairline); }
|
|
13
13
|
[data-vibe-menu] .vm-cnav > a:focus-visible { outline: var(--stroke-focus) solid var(--line-card); outline-offset: -3px; }
|
|
14
|
-
[data-vibe-menu] .vm-xtab .vm-back { display: none; }
|
|
14
|
+
[data-vibe-menu] .vm-xtab[data-row-drill] .vm-back { display: none; }
|
|
15
15
|
[data-vibe-menu] .vm-xtab .vm-drill > .vm-subhead:first-child { margin-top: 0; }
|
|
16
|
-
/* A drill taller than the card (Handles, Share settings) scrolls the card; the
|
|
17
|
-
row sticks on the band so it stays in view, pressed. Code's row never needed
|
|
18
|
-
this: its drills are short. In flow (no overflow) this changes nothing. */
|
|
19
|
-
[data-vibe-menu] .vm-xtab .vm-cnav { position: sticky; bottom: var(--vm-band, 0px); z-index: 1; background: var(--card-bg); }
|
|
20
|
-
[data-vibe-menu] .vm-xtab .vm-drill + .vm-done { margin-top: var(--space-14); }
|
|
21
16
|
/* The hierarchy (owner 2026-10-13), bottom up: the strip, this row, the card's
|
|
22
17
|
ONE main action, then the stretch. The two zones are layout-free wrappers, so
|
|
23
18
|
each card keeps its own spacing; the main action sits on the row's own top
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CardTabRow.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/CardTabRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,12 @@ import * as React from "react";
|
|
|
2
2
|
import { ATTACHMENT_ACCEPT } from "../../../attachments/attachment-types.js";
|
|
3
3
|
import { composerFileDrop } from "../../../attachments/composer-file-drop.js";
|
|
4
4
|
import { Glyph } from "./Glyph.js";
|
|
5
|
+
import { FacesGlyph } from "./ThinkingLine.js";
|
|
5
6
|
function StagedAttachments(props) {
|
|
6
7
|
if (props.chips.length === 0)
|
|
7
8
|
return null;
|
|
8
9
|
return (React.createElement("div", { className: "vm-picks vm-attachments", "aria-live": "polite" }, props.chips.map((chip) => (React.createElement("button", { key: chip.id, className: "vm-chip is-name is-ghost", type: "button", "data-status": chip.status, title: chip.error, "aria-label": `Remove ${chip.name}`, onClick: () => props.onRemove(chip.id) },
|
|
9
|
-
chip.status === "processing" ? React.createElement(
|
|
10
|
+
chip.status === "processing" ? React.createElement(FacesGlyph, { size: 12, ink: "current" }) : null,
|
|
10
11
|
React.createElement("span", null, chip.name))))));
|
|
11
12
|
}
|
|
12
13
|
export const STOP_GUARD_MS = 600;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0CAA0C,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/Composer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { Chip } from "./Chip.js";
|
|
3
3
|
import { Glyph } from "./Glyph.js";
|
|
4
|
+
import { ThinkingLine, useElapsedText } from "./ThinkingLine.js";
|
|
4
5
|
const WHO_LABEL = { you: "You", built: "Built", agent: "Agent" };
|
|
5
6
|
export function AgentLog(props) {
|
|
6
7
|
const logRef = React.useRef(null);
|
|
@@ -32,25 +33,29 @@ function stayIfHere(e) {
|
|
|
32
33
|
if (here === there)
|
|
33
34
|
e.preventDefault();
|
|
34
35
|
}
|
|
36
|
+
function ProgressWords(props) {
|
|
37
|
+
const { item } = props;
|
|
38
|
+
const resting = item.resting === true;
|
|
39
|
+
const elapsed = useElapsedText(item.startedAtMs, resting ? item.stoppedAtMs : undefined);
|
|
40
|
+
return React.createElement(ThinkingLine, { verb: item.text.replace(/…$/, ""), elapsed: elapsed, wrapping: resting, ink: "current" });
|
|
41
|
+
}
|
|
35
42
|
function LiveMoment(props) {
|
|
36
43
|
const logId = React.useId();
|
|
37
44
|
const item = props.item;
|
|
38
45
|
const kindClass = item.kind === "progress" ? "is-progress" : "is-summary";
|
|
39
|
-
const
|
|
46
|
+
const words = item.kind === "progress" ? React.createElement(ProgressWords, { item: item }) : React.createElement("span", null, item.text);
|
|
40
47
|
const log = props.log;
|
|
41
48
|
const link = item.link === undefined ? null : (React.createElement("a", { className: "vm-moment-link", href: item.link.href, onClick: stayIfHere }, item.link.label));
|
|
42
49
|
if (log === null) {
|
|
43
50
|
return (React.createElement("p", { className: `vm-moment ${kindClass}`, "data-moment": item.kind },
|
|
44
|
-
|
|
45
|
-
React.createElement("span", null, item.text),
|
|
51
|
+
words,
|
|
46
52
|
link));
|
|
47
53
|
}
|
|
48
54
|
return (React.createElement("div", { className: "vm-live" },
|
|
49
55
|
React.createElement("button", { className: `vm-moment ${kindClass} is-expander`, type: "button", "data-moment": item.kind, "aria-expanded": log.open, "aria-controls": logId, "aria-label": `Agent log: ${item.text}`, onClick: () => log.onToggle() },
|
|
50
56
|
React.createElement("span", { className: log.open ? "vm-chev is-open" : "vm-chev", "data-log-chev": "" },
|
|
51
57
|
React.createElement(Glyph, { name: "chevron-right" })),
|
|
52
|
-
|
|
53
|
-
React.createElement("span", null, item.text)),
|
|
58
|
+
words),
|
|
54
59
|
link,
|
|
55
60
|
React.createElement("div", { className: "vm-log-clip", "data-log-clip": "", "data-open": log.open ? "true" : "false", inert: log.open ? undefined : true },
|
|
56
61
|
React.createElement(AgentLog, { id: logId, lines: log.lines }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MomentLine.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/MomentLine.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"MomentLine.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/MomentLine.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,21 +4,31 @@ export interface SurveyFace {
|
|
|
4
4
|
readonly label: string;
|
|
5
5
|
readonly pitch: string;
|
|
6
6
|
}
|
|
7
|
+
export interface SurveyChoosing {
|
|
8
|
+
readonly index: number;
|
|
9
|
+
readonly endsAtMs: number;
|
|
10
|
+
}
|
|
7
11
|
export interface CodeSurvey {
|
|
8
12
|
readonly id: string;
|
|
9
13
|
readonly faces: readonly SurveyFace[];
|
|
10
14
|
readonly picked?: number;
|
|
11
15
|
readonly onPick?: (index: number) => void;
|
|
16
|
+
readonly onChoose?: (index: number) => void;
|
|
17
|
+
readonly onCancel?: () => void;
|
|
18
|
+
readonly choosing?: SurveyChoosing;
|
|
12
19
|
readonly onShown?: (faces: number) => void;
|
|
13
20
|
}
|
|
21
|
+
export declare const SURVEY_COUNTDOWN_MS = 3000;
|
|
14
22
|
export declare const SURVEY_COPY: Readonly<{
|
|
15
|
-
readonly choosing: "
|
|
23
|
+
readonly choosing: "Pick a look for your app";
|
|
16
24
|
readonly aside: "Optional · the build goes on";
|
|
25
|
+
readonly counting: "Tap again to cancel";
|
|
17
26
|
readonly picked: "Building in this look";
|
|
18
|
-
readonly pick: "Build this one";
|
|
19
27
|
readonly region: "Steer the look";
|
|
20
28
|
}>;
|
|
21
|
-
export declare
|
|
29
|
+
export declare function surveyCountdownDigit(msLeft: number): number;
|
|
30
|
+
export declare function surveyTileLabel(face: SurveyFace, digit: number | undefined): string;
|
|
31
|
+
export declare const SURVEY_STRIP_CSS = "\n/* Its own container: the aside steps out when the strip itself is narrow, on any host. */\n[data-vibe-menu] .vm-survey { margin: 0 0 var(--space-14); container: vm-survey / inline-size; }\n/* Code mode's card is wide and its pinned top is capped: the strip keeps the card-sized tiles. */\n[data-vibe-menu] .vm-codemode .vm-survey { margin-bottom: 10px; max-width: 420px; }\n[data-vibe-menu] .vm-survey-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-8); margin: 0 0 var(--space-8); padding: 0 var(--space-2); }\n[data-vibe-menu] .vm-survey-title { font: 600 15px/1.3 var(--font-display); color: var(--ink); }\n[data-vibe-menu] .vm-survey-aside { font: 400 12px/1.3 var(--font-display); color: var(--muted); white-space: nowrap; }\n[data-vibe-menu] .vm-survey-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-8); }\n/* Three readings keep the four-up tile size: the missing tile's column stays empty. */\n[data-vibe-menu] .vm-survey-strip[data-count=\"3\"] { grid-template-columns: repeat(3, minmax(0, 1fr)); padding-right: calc((100% - 24px) / 4 + 8px); }\n[data-vibe-menu] .vm-survey-cell { min-width: 0; }\n[data-vibe-menu] .vm-survey-tile { position: relative; display: block; width: 100%; min-height: 44px; padding: 0; aspect-ratio: 1; border: var(--stroke-rule) solid var(--line-card); border-radius: var(--radius-switch); overflow: hidden; background: var(--card-bg); cursor: pointer; touch-action: manipulation; }\n[data-vibe-menu] .vm-survey-tile[data-on=\"true\"] { outline: var(--stroke-focus) solid var(--accent); outline-offset: 2px; }\n[data-vibe-menu] .vm-survey-tile[aria-disabled=\"true\"] { cursor: default; }\n[data-vibe-menu] .vm-survey[data-selected] .vm-survey-cell:not([data-on=\"true\"]) .vm-survey-tile { opacity: 0.55; }\n[data-vibe-menu] .vm-survey[data-picked] .vm-survey-cell:not([data-on=\"true\"]) .vm-survey-tile { opacity: 0.35; }\n[data-vibe-menu] .vm-survey-art { display: block; width: 100%; height: 100%; object-fit: cover; }\n/* The countdown: a small chip in the corner, so the look stays in full view. */\n[data-vibe-menu] .vm-survey-count { position: absolute; top: 6px; right: 6px; display: grid; place-items: center; width: 28px; height: 28px; border-radius: var(--radius-full); border: var(--stroke-rule) solid var(--line-card); background: var(--accent); color: var(--on-accent); font: 700 14px/1 var(--font-display); font-variant-numeric: tabular-nums; pointer-events: none; }\n[data-vibe-menu] .vm-survey-count b { font: inherit; animation: vm-survey-tick 240ms ease-out; }\n@keyframes vm-survey-tick { from { transform: scale(1.35); } to { transform: scale(1); } }\n@media (prefers-reduced-motion: reduce) { [data-vibe-menu] .vm-survey-count b { animation: none; } }\n[data-vibe-menu] .vm-survey-cap { margin-top: var(--space-6); padding: 0 var(--space-2); font: 700 13px/1.25 var(--font-display); color: var(--ink); }\n[data-vibe-menu] .vm-survey-foot { display: flex; align-items: center; gap: var(--space-12); margin-top: var(--space-10); padding: 0 var(--space-2); }\n[data-vibe-menu] .vm-survey-text { flex: 1 1 auto; min-width: 0; }\n[data-vibe-menu] .vm-survey-label { font: 700 14px/1.3 var(--font-display); color: var(--ink); }\n[data-vibe-menu] .vm-survey-pitch { margin-top: var(--space-2); font: 400 13px/1.4 var(--font-display); color: var(--muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n[data-vibe-menu] .vm-survey-live { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n/* The first build's picker: a two-by-two grid of large tiles, each with its name. */\n[data-vibe-menu] .vm-survey[data-presentation=\"filmstrip\"] { margin-top: var(--space-16); }\n[data-vibe-menu] .vm-survey[data-presentation=\"filmstrip\"] .vm-survey-head { margin-top: var(--space-12); margin-bottom: var(--space-12); }\n[data-vibe-menu] .vm-survey[data-presentation=\"filmstrip\"] .vm-survey-title { font-size: 17px; }\n[data-vibe-menu] .vm-survey[data-presentation=\"filmstrip\"] .vm-survey-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-12) var(--space-10); padding-right: 0; }\n@container vm-survey (max-width: 360px) { [data-vibe-menu] .vm-survey:not([data-presentation=\"filmstrip\"]) .vm-survey-aside { display: none; } }\n";
|
|
22
32
|
export declare function surveyMinLoaded(count: number): number;
|
|
23
33
|
export declare function SurveyStrip(props: {
|
|
24
34
|
readonly survey: CodeSurvey;
|
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
export const SURVEY_COUNTDOWN_MS = 3000;
|
|
2
3
|
export const SURVEY_COPY = Object.freeze({
|
|
3
|
-
choosing: "
|
|
4
|
+
choosing: "Pick a look for your app",
|
|
4
5
|
aside: "Optional · the build goes on",
|
|
6
|
+
counting: "Tap again to cancel",
|
|
5
7
|
picked: "Building in this look",
|
|
6
|
-
pick: "Build this one",
|
|
7
8
|
region: "Steer the look",
|
|
8
9
|
});
|
|
10
|
+
export function surveyCountdownDigit(msLeft) {
|
|
11
|
+
const steps = Math.round(SURVEY_COUNTDOWN_MS / 1000);
|
|
12
|
+
return Math.min(steps, Math.max(1, Math.ceil(msLeft / 1000)));
|
|
13
|
+
}
|
|
14
|
+
export function surveyTileLabel(face, digit) {
|
|
15
|
+
return digit === undefined
|
|
16
|
+
? `${face.label}: ${face.pitch}`
|
|
17
|
+
: `${face.label}: building this look in ${digit}. ${SURVEY_COPY.counting}.`;
|
|
18
|
+
}
|
|
9
19
|
export const SURVEY_STRIP_CSS = `
|
|
10
20
|
/* Its own container: the aside steps out when the strip itself is narrow, on any host. */
|
|
11
21
|
[data-vibe-menu] .vm-survey { margin: 0 0 var(--space-14); container: vm-survey / inline-size; }
|
|
@@ -17,53 +27,59 @@ export const SURVEY_STRIP_CSS = `
|
|
|
17
27
|
[data-vibe-menu] .vm-survey-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-8); }
|
|
18
28
|
/* Three readings keep the four-up tile size: the missing tile's column stays empty. */
|
|
19
29
|
[data-vibe-menu] .vm-survey-strip[data-count="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); padding-right: calc((100% - 24px) / 4 + 8px); }
|
|
20
|
-
[data-vibe-menu] .vm-survey-
|
|
30
|
+
[data-vibe-menu] .vm-survey-cell { min-width: 0; }
|
|
31
|
+
[data-vibe-menu] .vm-survey-tile { position: relative; display: block; width: 100%; min-height: 44px; padding: 0; aspect-ratio: 1; border: var(--stroke-rule) solid var(--line-card); border-radius: var(--radius-switch); overflow: hidden; background: var(--card-bg); cursor: pointer; touch-action: manipulation; }
|
|
21
32
|
[data-vibe-menu] .vm-survey-tile[data-on="true"] { outline: var(--stroke-focus) solid var(--accent); outline-offset: 2px; }
|
|
22
33
|
[data-vibe-menu] .vm-survey-tile[aria-disabled="true"] { cursor: default; }
|
|
23
|
-
[data-vibe-menu] .vm-survey[data-
|
|
34
|
+
[data-vibe-menu] .vm-survey[data-selected] .vm-survey-cell:not([data-on="true"]) .vm-survey-tile { opacity: 0.55; }
|
|
35
|
+
[data-vibe-menu] .vm-survey[data-picked] .vm-survey-cell:not([data-on="true"]) .vm-survey-tile { opacity: 0.35; }
|
|
24
36
|
[data-vibe-menu] .vm-survey-art { display: block; width: 100%; height: 100%; object-fit: cover; }
|
|
37
|
+
/* The countdown: a small chip in the corner, so the look stays in full view. */
|
|
38
|
+
[data-vibe-menu] .vm-survey-count { position: absolute; top: 6px; right: 6px; display: grid; place-items: center; width: 28px; height: 28px; border-radius: var(--radius-full); border: var(--stroke-rule) solid var(--line-card); background: var(--accent); color: var(--on-accent); font: 700 14px/1 var(--font-display); font-variant-numeric: tabular-nums; pointer-events: none; }
|
|
39
|
+
[data-vibe-menu] .vm-survey-count b { font: inherit; animation: vm-survey-tick 240ms ease-out; }
|
|
40
|
+
@keyframes vm-survey-tick { from { transform: scale(1.35); } to { transform: scale(1); } }
|
|
41
|
+
@media (prefers-reduced-motion: reduce) { [data-vibe-menu] .vm-survey-count b { animation: none; } }
|
|
42
|
+
[data-vibe-menu] .vm-survey-cap { margin-top: var(--space-6); padding: 0 var(--space-2); font: 700 13px/1.25 var(--font-display); color: var(--ink); }
|
|
25
43
|
[data-vibe-menu] .vm-survey-foot { display: flex; align-items: center; gap: var(--space-12); margin-top: var(--space-10); padding: 0 var(--space-2); }
|
|
26
44
|
[data-vibe-menu] .vm-survey-text { flex: 1 1 auto; min-width: 0; }
|
|
27
45
|
[data-vibe-menu] .vm-survey-label { font: 700 14px/1.3 var(--font-display); color: var(--ink); }
|
|
28
46
|
[data-vibe-menu] .vm-survey-pitch { margin-top: var(--space-2); font: 400 13px/1.4 var(--font-display); color: var(--muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
29
|
-
[data-vibe-menu] .vm-survey-
|
|
30
|
-
|
|
47
|
+
[data-vibe-menu] .vm-survey-live { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
|
48
|
+
/* The first build's picker: a two-by-two grid of large tiles, each with its name. */
|
|
31
49
|
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] { margin-top: var(--space-16); }
|
|
32
|
-
[data-vibe-menu] .vm-survey-guide { margin: 0 0 var(--space-12); font: 600 17px/1.3 var(--font-display); color: var(--ink); }
|
|
33
|
-
[data-vibe-menu] .vm-survey-preview { aspect-ratio: 1; overflow: hidden; border-radius: var(--radius-switch); background: var(--card-bg); border: var(--stroke-rule) solid var(--line-card); }
|
|
34
|
-
[data-vibe-menu] .vm-survey-preview canvas { width: 100%; height: 100%; object-fit: contain; display: block; }
|
|
35
50
|
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-head { margin-top: var(--space-12); margin-bottom: var(--space-12); }
|
|
36
|
-
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-
|
|
37
|
-
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-
|
|
38
|
-
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-pick { width: 100%; height: 48px; font-size: 16px; }
|
|
39
|
-
[data-vibe-menu] .vm-survey-direction { margin: var(--space-10) 0 0; font: 400 13px/1.4 var(--font-display); color: var(--muted); text-align: center; }
|
|
51
|
+
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-title { font-size: 17px; }
|
|
52
|
+
[data-vibe-menu] .vm-survey[data-presentation="filmstrip"] .vm-survey-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-12) var(--space-10); padding-right: 0; }
|
|
40
53
|
@container vm-survey (max-width: 360px) { [data-vibe-menu] .vm-survey:not([data-presentation="filmstrip"]) .vm-survey-aside { display: none; } }
|
|
41
54
|
`;
|
|
42
55
|
export function surveyMinLoaded(count) {
|
|
43
56
|
return Math.min(count, Math.max(3, count - 1));
|
|
44
57
|
}
|
|
45
|
-
function
|
|
46
|
-
const
|
|
58
|
+
function useCountdownDigit(endsAtMs) {
|
|
59
|
+
const [digit, setDigit] = React.useState(undefined);
|
|
47
60
|
React.useLayoutEffect(() => {
|
|
48
|
-
|
|
49
|
-
const target = canvas.current;
|
|
50
|
-
if (target === null || image === undefined || image.naturalWidth === 0)
|
|
61
|
+
if (endsAtMs === undefined)
|
|
51
62
|
return;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
let timer;
|
|
64
|
+
const tick = () => {
|
|
65
|
+
const left = endsAtMs - Date.now();
|
|
66
|
+
setDigit({ endsAtMs, digit: surveyCountdownDigit(left) });
|
|
67
|
+
if (left > 0)
|
|
68
|
+
timer = setTimeout(tick, left % 1000 || 1000);
|
|
69
|
+
};
|
|
70
|
+
tick();
|
|
71
|
+
return () => clearTimeout(timer);
|
|
72
|
+
}, [endsAtMs]);
|
|
73
|
+
if (endsAtMs === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
return digit?.endsAtMs === endsAtMs ? digit.digit : surveyCountdownDigit(SURVEY_COUNTDOWN_MS);
|
|
58
76
|
}
|
|
59
77
|
function SurveyStripBody(props) {
|
|
60
|
-
const { faces, picked, onPick, onShown } = props.survey;
|
|
78
|
+
const { faces, picked, onPick, onShown, onChoose, onCancel } = props.survey;
|
|
61
79
|
const filmstrip = props.presentation === "filmstrip";
|
|
62
|
-
const images = React.useRef(new Map());
|
|
63
80
|
const [loaded, setLoaded] = React.useState(() => new Set());
|
|
64
81
|
const [errored, setErrored] = React.useState(() => new Set());
|
|
65
82
|
const failed = new Set([...errored].filter((i) => !loaded.has(i)));
|
|
66
|
-
const [focus, setFocus] = React.useState(undefined);
|
|
67
83
|
const kept = faces.map((_, i) => i).filter((i) => !failed.has(i));
|
|
68
84
|
const settled = faces.every((_, i) => loaded.has(i) || failed.has(i));
|
|
69
85
|
const enough = kept.length >= surveyMinLoaded(faces.length) && (picked === undefined || !failed.has(picked));
|
|
@@ -74,39 +90,66 @@ function SurveyStripBody(props) {
|
|
|
74
90
|
if (visible)
|
|
75
91
|
onShownRef.current?.(kept.length);
|
|
76
92
|
}, [visible, kept.length]);
|
|
93
|
+
const hosted = onChoose !== undefined;
|
|
94
|
+
const [own, setOwn] = React.useState(undefined);
|
|
95
|
+
const onPickRef = React.useRef(onPick);
|
|
96
|
+
onPickRef.current = onPick;
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
if (hosted || own === undefined)
|
|
99
|
+
return;
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
setOwn(undefined);
|
|
102
|
+
onPickRef.current?.(own.index);
|
|
103
|
+
}, Math.max(0, own.endsAtMs - Date.now()));
|
|
104
|
+
return () => clearTimeout(timer);
|
|
105
|
+
}, [hosted, own]);
|
|
106
|
+
const chosen = picked !== undefined;
|
|
107
|
+
const counting = chosen ? undefined : hosted ? props.survey.choosing : own;
|
|
108
|
+
const digit = useCountdownDigit(counting?.endsAtMs);
|
|
77
109
|
if (!enough)
|
|
78
110
|
return null;
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const face = faces[
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
111
|
+
const ready = onPick !== undefined || hosted;
|
|
112
|
+
const selected = picked ?? counting?.index;
|
|
113
|
+
const face = selected === undefined ? undefined : faces[selected];
|
|
114
|
+
const tap = (i) => {
|
|
115
|
+
if (chosen || !ready)
|
|
116
|
+
return;
|
|
117
|
+
if (counting?.index === i) {
|
|
118
|
+
if (hosted)
|
|
119
|
+
onCancel?.();
|
|
120
|
+
else
|
|
121
|
+
setOwn(undefined);
|
|
122
|
+
}
|
|
123
|
+
else if (hosted)
|
|
124
|
+
onChoose(i);
|
|
125
|
+
else
|
|
126
|
+
setOwn({ index: i, endsAtMs: Date.now() + SURVEY_COUNTDOWN_MS });
|
|
127
|
+
};
|
|
128
|
+
const live = counting !== undefined && face !== undefined
|
|
129
|
+
? surveyTileLabel(face, digit)
|
|
130
|
+
: chosen && face !== undefined
|
|
131
|
+
? `${SURVEY_COPY.picked}: ${face.label}.`
|
|
132
|
+
: "";
|
|
133
|
+
return (React.createElement("section", { className: "vm-survey", "data-presentation": props.presentation, hidden: !visible, "data-testid": visible ? "survey-strip" : "survey-preload", "data-picked": chosen ? "" : undefined, "data-selected": selected === undefined ? undefined : "", "data-counting": counting === undefined ? undefined : "", "aria-label": SURVEY_COPY.region },
|
|
87
134
|
React.createElement("div", { className: "vm-survey-head" },
|
|
88
|
-
React.createElement("span", { className: "vm-survey-title" },
|
|
89
|
-
|
|
90
|
-
kept.indexOf(shown) + 1,
|
|
91
|
-
" / ",
|
|
92
|
-
kept.length)) : chosen ? null : (React.createElement("span", { className: "vm-survey-aside" }, SURVEY_COPY.aside))),
|
|
135
|
+
React.createElement("span", { className: "vm-survey-title" }, chosen ? SURVEY_COPY.picked : SURVEY_COPY.choosing),
|
|
136
|
+
chosen ? null : (React.createElement("span", { className: "vm-survey-aside" }, counting === undefined ? SURVEY_COPY.aside : SURVEY_COPY.counting))),
|
|
93
137
|
React.createElement("div", { className: "vm-survey-strip", role: "radiogroup", "aria-label": SURVEY_COPY.choosing, "data-count": kept.length }, kept.map((i) => {
|
|
94
138
|
const f = faces[i];
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
139
|
+
const on = selected === i;
|
|
140
|
+
const count = counting?.index === i ? digit : undefined;
|
|
141
|
+
return (React.createElement("div", { key: i, className: "vm-survey-cell", "data-on": on },
|
|
142
|
+
React.createElement("button", { type: "button", role: "radio", "aria-checked": on, "aria-label": surveyTileLabel(f, count), "aria-disabled": chosen || !ready, className: "vm-survey-tile", "data-on": on, onClick: () => tap(i) },
|
|
143
|
+
React.createElement("img", { className: "vm-survey-art", src: f.src, alt: "", draggable: false, onLoad: () => setLoaded((prev) => (prev.has(i) ? prev : new Set(prev).add(i))), onError: () => setErrored((prev) => (prev.has(i) ? prev : new Set(prev).add(i))) }),
|
|
144
|
+
count === undefined ? null : (React.createElement("span", { className: "vm-survey-count", "data-testid": "survey-countdown", "aria-hidden": "true" },
|
|
145
|
+
React.createElement("b", { key: count }, count)))),
|
|
146
|
+
filmstrip ? React.createElement("div", { className: "vm-survey-cap" }, f.label) : null));
|
|
103
147
|
})),
|
|
104
|
-
React.createElement("div", { className: "vm-survey-foot" },
|
|
105
|
-
|
|
106
|
-
React.createElement("div", { className: "vm-survey-label" }, face
|
|
107
|
-
React.createElement("div", { className: "vm-survey-pitch" }, face
|
|
108
|
-
|
|
109
|
-
filmstrip ? (React.createElement("p", { className: "vm-survey-direction", "aria-live": "polite" }, chosen ? "Your direction is queued for the agent." : "Your agent will apply this look.")) : null));
|
|
148
|
+
filmstrip || face === undefined ? null : (React.createElement("div", { className: "vm-survey-foot" },
|
|
149
|
+
React.createElement("div", { className: "vm-survey-text" },
|
|
150
|
+
React.createElement("div", { className: "vm-survey-label" }, face.label),
|
|
151
|
+
React.createElement("div", { className: "vm-survey-pitch" }, face.pitch)))),
|
|
152
|
+
React.createElement("span", { className: "vm-survey-live", role: "status", "aria-live": "polite" }, live)));
|
|
110
153
|
}
|
|
111
154
|
export function SurveyStrip(props) {
|
|
112
155
|
const srcs = props.survey.faces.map((f) => f.src);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SurveyStrip.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/SurveyStrip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SurveyStrip.js","sourceRoot":"","sources":["../../../../jsr/components/vibe-menu/parts/SurveyStrip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsE/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,0BAA0B;IACpC,KAAK,EAAE,8BAA8B;IACrC,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE,uBAAuB;IAC/B,MAAM,EAAE,gBAAgB;CAChB,CAAC,CAAC;AAGZ,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,KAAyB;IACzE,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;QAChC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,2BAA2B,KAAK,KAAK,WAAW,CAAC,QAAQ,GAAG,CAAC;AAChF,CAAC;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC/B,CAAC;AAIF,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAID,SAAS,iBAAiB,CAAC,QAA4B;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAoE,SAAS,CAAC,CAAC;IACvH,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;QACzB,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,IAAI,KAAgD,CAAC;QACrD,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1D,IAAI,IAAI,GAAG,CAAC;gBAAE,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACf,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,eAAe,CAAC,KAA2E;IAClG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,KAAK,WAAW,CAAC;IACrD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsB,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsB,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAGnF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAGnE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7G,MAAM,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QAGnB,IAAI,OAAO;YAAE,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAG3B,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAA6B,SAAS,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,MAAM,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QACxC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE;YACH,MAAM,CAAC,SAAS,CAAC,CAAC;YAClB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CACvC,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAQ,EAAE;QAC9B,IAAI,MAAM,IAAI,CAAC,KAAK;YAAE,OAAO;QAC7B,IAAI,QAAQ,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,MAAM;gBAAE,QAAQ,EAAE,EAAE,CAAC;;gBACpB,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,MAAM;YAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;;YAC1B,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,MAAM,IAAI,GACR,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAC1C,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAC9B,CAAC,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS;YAC5B,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG;YACzC,CAAC,CAAC,EAAE,CAAC;IACX,OAAO,CACL,iCACE,SAAS,EAAC,WAAW,uBACF,KAAK,CAAC,YAAY,EACrC,MAAM,EAAE,CAAC,OAAO,iBACH,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,iBAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,mBACrB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBACvC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,gBAC1C,WAAW,CAAC,MAAM;QAE9B,6BAAK,SAAS,EAAC,gBAAgB;YAC7B,8BAAM,SAAS,EAAC,iBAAiB,IAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAQ;YAC5F,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACf,8BAAM,SAAS,EAAC,iBAAiB,IAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAQ,CAC7G,CACG;QACN,6BAAK,SAAS,EAAC,iBAAiB,EAAC,IAAI,EAAC,YAAY,gBAAa,WAAW,CAAC,QAAQ,gBAAc,IAAI,CAAC,MAAM,IACzG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAe,CAAC;YACjC,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,OAAO,CACL,6BAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,gBAAgB,aAAU,EAAE;gBACjD,gCACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,kBACE,EAAE,gBACJ,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,mBACtB,MAAM,IAAI,CAAC,KAAK,EAC/B,SAAS,EAAC,gBAAgB,aACjB,EAAE,EACX,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAErB,6BACE,SAAS,EAAC,eAAe,EACzB,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,GAAG,EAAC,EAAE,EACN,SAAS,EAAE,KAAK,EAChB,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9E,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAChF;oBACD,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B,8BAAM,SAAS,EAAC,iBAAiB,iBAAa,kBAAkB,iBAAa,MAAM;wBACjF,2BAAG,GAAG,EAAE,KAAK,IAAG,KAAK,CAAK,CACrB,CACR,CACM;gBACR,SAAS,CAAC,CAAC,CAAC,6BAAK,SAAS,EAAC,eAAe,IAAE,CAAC,CAAC,KAAK,CAAO,CAAC,CAAC,CAAC,IAAI,CAC9D,CACP,CAAC;QACJ,CAAC,CAAC,CACE;QACL,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACxC,6BAAK,SAAS,EAAC,gBAAgB;YAC7B,6BAAK,SAAS,EAAC,gBAAgB;gBAC7B,6BAAK,SAAS,EAAC,iBAAiB,IAAE,IAAI,CAAC,KAAK,CAAO;gBACnD,6BAAK,SAAS,EAAC,iBAAiB,IAAE,IAAI,CAAC,KAAK,CAAO,CAC/C,CACF,CACP;QACD,8BAAM,SAAS,EAAC,gBAAgB,EAAC,IAAI,EAAC,QAAQ,eAAW,QAAQ,IAC9D,IAAI,CACA,CACC,CACX,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,WAAW,CAAC,KAG3B;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,oBAAC,eAAe,IAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,GAAI,CAAC;AACpI,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export declare function formatBuildElapsed(elapsedMs: number): string;
|
|
3
|
+
export type FacesInk = "contrast" | "current";
|
|
4
|
+
export interface FacesGlyphProps {
|
|
5
|
+
readonly size?: number;
|
|
6
|
+
readonly ink?: FacesInk;
|
|
7
|
+
readonly style?: React.CSSProperties;
|
|
8
|
+
}
|
|
9
|
+
export declare function FacesGlyph({ size, ink, style }: FacesGlyphProps): React.JSX.Element;
|
|
10
|
+
export interface ThinkingLineProps {
|
|
11
|
+
readonly ink?: FacesInk;
|
|
12
|
+
readonly complete?: boolean;
|
|
13
|
+
readonly verb?: string;
|
|
14
|
+
readonly elapsed?: string;
|
|
15
|
+
readonly wrapping?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function useElapsedText(startedAtMs: number | undefined, stoppedAtMs?: number): string | undefined;
|
|
18
|
+
export declare function LiveThinkingLine({ verb, startedAtMs, stoppedAtMs, ink, }: {
|
|
19
|
+
readonly verb?: string;
|
|
20
|
+
readonly startedAtMs: number | undefined;
|
|
21
|
+
readonly stoppedAtMs?: number;
|
|
22
|
+
readonly ink?: FacesInk;
|
|
23
|
+
}): React.JSX.Element;
|
|
24
|
+
export declare function ThinkingLine({ verb, elapsed, complete, wrapping, ink }: ThinkingLineProps): React.JSX.Element;
|