@crewlethq/ui 0.61.0 → 0.62.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/README.md CHANGED
@@ -205,6 +205,14 @@ places:
205
205
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
206
206
  when the content beneath it moves, and every panel anchored inside follows.
207
207
 
208
+ ## Changes in 0.62.0
209
+
210
+ **`ValueField`, a labelled value with the control its kind needs.** `FormField` with the control and the rules every form holding configuration values otherwise rewrites, in one component (`ValueField`, `ValueFieldKind`, `ValueFieldChoice`, `ValueFieldLabels`, `ValueFieldProps`). `kind` picks the control: `text`, `id`, `email` and `url` are a text field, `secret` a password field, `multiline` a `Textarea`, and `choice` and `handle` the `Select` listbox. A `secret` is masked unless its value is exactly one `${NAME}` reference, which reads as a name in the `reference` appearance. Typing `$` in a one-line field offers the names in `references`, ranked closest first and written in as a whole `${NAME}` (`onReferencesNeeded` is called as the list opens, so a caller can refresh it). A `url` wears an `https://` `InputAffix`, read as part of the value, which steps aside for `http://` and for a reference. `url`, `id` and `email` drop whitespace; no kind sets `type="email"`, so a reference is never refused by the browser. Required is the unmarked default: `required={false}` says "(optional)", and `markRequired` says "(required)" where it is news. A choice's `hint` is drawn under its option and joins the help line once chosen, and a stored answer the list no longer offers keeps a row of its own. `isReference` replaces the default `${NAME}` grammar, `mark` draws a logo before the label, `helperOnFocus` is passed to `FormField`, and `labels` replaces the list's name ("Secrets") and the choice placeholder ("Choose one").
211
+
212
+ **The completion helpers are exported with it**: `referenceAt`, `rankReferences`, `completeReference`, `isWholeReference`, `urlSchemeOf`, `REFERENCE_NAME_PATTERN` and the `ReferenceQuery` type, for a field that completes references in a control of its own.
213
+
214
+ **`Combobox` on a password field is a combobox only while its list is open.** HTML allows no ARIA role on `type="password"`, so a masked field carried an invalid `role="combobox"` (and `aria-autocomplete` and `aria-expanded`) at rest. It now takes those only while it has options to show. Every other field is unchanged.
215
+
208
216
  ## Changes in 0.58.0
209
217
 
210
218
  **`Spinner` turns at a calm pace, and its arc breathes.** It turned once per `--motion-duration-slow` (300ms), a transition step, so every running mark (a pending `Button`, `RunChip` while it thinks or works, a running step in `StepList`, `StepStateMark`) spun more than three times a second and read as alarm rather than as work. It now turns once a second (`--motion-duration-turn`, linear) while its arc eases between a quarter and three quarters of the ring on a slower cycle (`--motion-duration-sweep`, 1.5s), with soft ends. The stroke is still one 2px border in the current ink at every size (`em`, `xs`, `sm`, `md`); the arc is cut by a mask, so no side of the border is transparent any more. Under reduced motion it stops as before and keeps its open quarter. The arc's length is a registered custom property (`@property --crewlet-spinner-arc`); a browser without `@property` support steps between the two lengths rather than easing.
@@ -1,4 +1,4 @@
1
- export { Combobox } from '../chunk-VC2M2E7N.js';
1
+ export { Combobox } from '../chunk-PK2P2QH6.js';
2
2
  import '../chunk-7KHM2FZH.js';
3
3
  import '../chunk-TLIJG4TP.js';
4
4
  import '../chunk-PGCLHYVP.js';
@@ -1,5 +1,5 @@
1
- export { PrincipalPicker } from '../chunk-RPHQNXE5.js';
2
- import '../chunk-VC2M2E7N.js';
1
+ export { PrincipalPicker } from '../chunk-IOZFPFQS.js';
2
+ import '../chunk-PK2P2QH6.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
4
  import '../chunk-CI3VPIJN.js';
5
5
  import '../chunk-5AQBPHZD.js';
@@ -0,0 +1,117 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * What a value field holds, which decides its control and what it does to a
4
+ * value on its way through.
5
+ *
6
+ * - `text`: free text, spaces kept.
7
+ * - `multiline`: prose in a textarea, every space and newline kept, spell check on.
8
+ * - `secret`: a credential, masked unless the value is a whole reference.
9
+ * - `url`: an address, wearing an `https://` affix, whitespace dropped.
10
+ * - `id` and `email`: one token, whitespace dropped.
11
+ * - `choice` and `handle`: one of `choices`, picked from a listbox.
12
+ */
13
+ export type ValueFieldKind = 'text' | 'multiline' | 'secret' | 'url' | 'id' | 'choice' | 'handle' | 'email';
14
+ /** One option of a `choice` or `handle` field. */
15
+ export interface ValueFieldChoice {
16
+ value: string;
17
+ label: string;
18
+ /** A sentence saying what picking this one does: drawn under the option, and on the help line once chosen. */
19
+ hint?: string | undefined;
20
+ }
21
+ /** The words a value field draws itself. */
22
+ export interface ValueFieldLabels {
23
+ /** Names the completion list. "Secrets" by default. */
24
+ references: string;
25
+ /** The choice placeholder while nothing is chosen. "Choose one" by default. */
26
+ choose: string;
27
+ }
28
+ export interface ValueFieldProps {
29
+ label: string;
30
+ /** A mark drawn before the label, such as a third party's own logo. */
31
+ mark?: ReactNode;
32
+ kind?: ValueFieldKind | undefined;
33
+ value: string;
34
+ onChange: (value: string) => void;
35
+ /** Where the value comes from, or what shape it takes. */
36
+ help?: ReactNode;
37
+ /** Why the last value was refused. */
38
+ error?: ReactNode;
39
+ placeholder?: string | undefined;
40
+ /** What a `choice` or `handle` field offers; ignored by every other kind. */
41
+ choices?: readonly ValueFieldChoice[] | undefined;
42
+ disabled?: boolean | undefined;
43
+ /**
44
+ * Whether an answer is required. REQUIRED IS THE UNMARKED DEFAULT: `false`
45
+ * says "(optional)" beside the label, `true` sets `aria-required` and draws
46
+ * nothing unless `markRequired` says the requiredness is news. Most fields
47
+ * on a form are required, and marking them all is noise that teaches a
48
+ * reader to skip the note.
49
+ */
50
+ required?: boolean | undefined;
51
+ /**
52
+ * Says "(required)" beside the label, for a field whose requiredness is
53
+ * NEWS: one that appeared because of an answer above it. Read only with
54
+ * `required`.
55
+ */
56
+ markRequired?: boolean | undefined;
57
+ autoFocus?: boolean | undefined;
58
+ /**
59
+ * The stored entry names offered when somebody types `$`, completed into a
60
+ * whole `${NAME}`. NAMES ONLY: a value never reaches the field, so a list
61
+ * that could not be assembled leaves the field exactly as it was.
62
+ */
63
+ references?: readonly string[] | undefined;
64
+ /**
65
+ * Called as the completion list is about to open, so the caller can make
66
+ * sure the names are current. On the way in only, never per keystroke.
67
+ */
68
+ onReferencesNeeded?: (() => void) | undefined;
69
+ /**
70
+ * Whether a value is exactly one reference, which keeps a `secret` field
71
+ * readable and lets a `url` field's affix step aside. [isWholeReference]
72
+ * by default; a product with its own reference grammar passes it here.
73
+ */
74
+ isReference?: ((value: string) => boolean) | undefined;
75
+ /** How many lines a `multiline` field shows before it scrolls. Three by default. */
76
+ rows?: number | undefined;
77
+ /** Show the help line only while the field has focus. See [FormField]. */
78
+ helperOnFocus?: boolean | undefined;
79
+ labels?: Partial<ValueFieldLabels> | undefined;
80
+ className?: string | undefined;
81
+ }
82
+ /**
83
+ * A labelled value: [FormField] with the control a kind of value needs, and
84
+ * the rules every form holding such values otherwise rewrites.
85
+ *
86
+ * A SECRET FIELD IS A PASSWORD FIELD, and that is not decoration: `type` is
87
+ * what keeps the value out of an autofill store, out of a screenshot and out
88
+ * of the accessibility tree as text.
89
+ *
90
+ * A REFERENCE IS NOT A CREDENTIAL, so it is not masked. A secret whose value
91
+ * is wholly a `${NAME}` holds the NAME of a stored entry, and the reader has
92
+ * to be able to see which entry it points at. Typing over it masks again the
93
+ * moment it stops being a whole reference, so a credential is never on screen.
94
+ *
95
+ * TYPING `$` OFFERS THE STORED ENTRIES, from `references`, ranked closest
96
+ * first and written in as a whole `${NAME}` with the caret after it. Tab and
97
+ * Enter take the highlighted name, Escape closes the list and keeps what was
98
+ * typed, and a press outside closes only the list.
99
+ *
100
+ * A URL FIELD WEARS ITS SCHEME. An `https://` affix sits inside the box, is
101
+ * read once as part of the value, and is written into it. It steps aside for
102
+ * a value that carries `http://` and for one starting with `$` (a reference
103
+ * carries its own scheme once it resolves), and a pasted `https://` is not
104
+ * doubled onto it.
105
+ *
106
+ * A SINGLE TOKEN TAKES NO WHITESPACE. A `url`, `id` or `email` drops it as it
107
+ * is typed or pasted: a space around one is invisible in the box and fatal
108
+ * wherever it is used. No field asserts `type="email"`, because the browser
109
+ * would refuse a reference for having no "@" in it; `inputMode` still offers
110
+ * the right keyboard.
111
+ *
112
+ * A CHOICE IS THE LISTBOX, which can draw each choice's hint under it. The
113
+ * chosen one's hint also joins the help line, and a stored answer the list
114
+ * no longer offers keeps a row of its own rather than vanishing into a
115
+ * different selection.
116
+ */
117
+ export declare function ValueField({ label, mark, kind, value, onChange, help, error, placeholder, choices, disabled, required, markRequired, autoFocus, references, onReferencesNeeded, isReference, rows, helperOnFocus, labels, className, }: ValueFieldProps): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import '../Input/Input.css';
2
+ import '../VisuallyHidden/VisuallyHidden.css';
3
+ import '../HitArea/HitArea.css';
4
+ import '../Combobox/Combobox.css';
5
+ import '../Select/Select.css';
6
+ import './ValueField.css';
7
+ export { ValueField } from './ValueField.js';
8
+ export type { ValueFieldChoice, ValueFieldKind, ValueFieldLabels, ValueFieldProps } from './ValueField.js';
9
+ export { REFERENCE_NAME_PATTERN, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf, } from './references.js';
10
+ export type { ReferenceQuery } from './references.js';
@@ -0,0 +1,15 @@
1
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from '../chunk-OD3Z6QKN.js';
2
+ import '../chunk-XQZ6EWOE.js';
3
+ import '../chunk-PK2P2QH6.js';
4
+ import '../chunk-7KHM2FZH.js';
5
+ import '../chunk-TLIJG4TP.js';
6
+ import '../chunk-PGCLHYVP.js';
7
+ import '../chunk-PQADV6P6.js';
8
+ import '../chunk-2G355KDJ.js';
9
+ import '../chunk-OMV5W53A.js';
10
+ import '../chunk-2YTOOH3A.js';
11
+ import '../chunk-H5XTJ7GJ.js';
12
+ import '../chunk-2XWFWNDT.js';
13
+ import '../chunk-NUZHC6MM.js';
14
+ import '../chunk-UT6CW3C7.js';
15
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Completing a `${NAME}` reference from a list of stored entry names.
3
+ *
4
+ * A value field takes either a value or a reference to one, and the reference
5
+ * has to be typed exactly: a name off by a character resolves to nothing,
6
+ * which reads as configured on every surface while whatever it feeds refuses
7
+ * every use. These helpers are what lets a field offer the names it knows
8
+ * rather than leaving the reader to copy one across from another screen.
9
+ */
10
+ /** The shape of a reference's name: a letter or underscore, then letters, digits and underscores. */
11
+ export declare const REFERENCE_NAME_PATTERN = "[A-Za-z_][A-Za-z0-9_]*";
12
+ /**
13
+ * Whether a value is exactly one `${NAME}` reference, trimmed first.
14
+ *
15
+ * This is the default a [ValueField] asks when deciding whether a secret's
16
+ * value is a name (readable) or a credential (masked). A product whose
17
+ * reference grammar is stricter passes its own predicate as `isReference`.
18
+ */
19
+ export declare function isWholeReference(value: string): boolean;
20
+ /** Where a reference is being typed, and what has been typed of it. */
21
+ export interface ReferenceQuery {
22
+ /** Index of the `$` that opens it. */
23
+ start: number;
24
+ /** What follows the `$`, with any `{` stripped. */
25
+ query: string;
26
+ }
27
+ /**
28
+ * The `${...}` under the caret, or null.
29
+ *
30
+ * IT SCANS BACK FROM THE CARET rather than matching the whole value, because
31
+ * a field can hold a reference among other text and the one being edited is
32
+ * the one being completed. The scan stops at whitespace and at a `}`: the
33
+ * first because no name contains one, the second because a reference that is
34
+ * already closed is finished, and offering to complete it again would replace
35
+ * a name somebody had chosen.
36
+ */
37
+ export declare function referenceAt(value: string, caret: number): ReferenceQuery | null;
38
+ /**
39
+ * The names ordered by how closely they match what has been typed.
40
+ *
41
+ * Three tiers, in the order somebody means them: a name that STARTS with the
42
+ * query, then one that CONTAINS it, then one whose letters appear in order.
43
+ * Case is ignored, because a name is upper snake case and nobody holds shift
44
+ * to filter a list. An empty query keeps every name in the order given: the
45
+ * point of typing `$` alone is to see what there is.
46
+ */
47
+ export declare function rankReferences(names: readonly string[], query: string): string[];
48
+ /**
49
+ * The value with the chosen name written in as a whole `${NAME}`, and where
50
+ * the caret goes.
51
+ *
52
+ * CLOSED BRACES, always, and the caret lands after them: a reference resolves
53
+ * only when it is whole, and a half-written one is a literal that reaches its
54
+ * destination as the characters somebody typed.
55
+ */
56
+ export declare function completeReference(value: string, caret: number, at: ReferenceQuery, name: string): {
57
+ value: string;
58
+ caret: number;
59
+ };
60
+ /**
61
+ * The scheme a value already carries, `https://`, `http://` or empty.
62
+ *
63
+ * Matched without regard to case, because a pasted address is whatever the
64
+ * address bar had.
65
+ */
66
+ export declare function urlSchemeOf(value: string): '' | 'https://' | 'http://';
@@ -0,0 +1,13 @@
1
+ /*
2
+ * ValueField: a labelled value with the control its kind needs.
3
+ *
4
+ * The row is FormField's and every control is the package's own; what is
5
+ * drawn here is the mark a label may carry, such as a third party's logo,
6
+ * set on the label's line ahead of its words.
7
+ */
8
+
9
+ .crewlet-value-field__label {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ gap: var(--spacing-1);
13
+ }
@@ -1,4 +1,4 @@
1
- import { Combobox } from './chunk-VC2M2E7N.js';
1
+ import { Combobox } from './chunk-PK2P2QH6.js';
2
2
  import { PRINCIPAL_KINDS, PrincipalAvatar } from './chunk-CI3VPIJN.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './PrincipalPicker-7NNZTGUP.css';
@@ -0,0 +1,237 @@
1
+ import { Select } from './chunk-XQZ6EWOE.js';
2
+ import { Combobox } from './chunk-PK2P2QH6.js';
3
+ import { FormField, Textarea, InputAffix } from './chunk-TLIJG4TP.js';
4
+ import './Input-GMOWHZRG.css';
5
+ import './VisuallyHidden-AOEXU5EB.css';
6
+ import './HitArea-QUOS6ZDJ.css';
7
+ import './Combobox-GBCWXWEB.css';
8
+ import './Select-F526HLNR.css';
9
+ import './ValueField-EIBD6RYS.css';
10
+ import { useId, useRef, useState } from 'react';
11
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
12
+
13
+ // src/ValueField/references.ts
14
+ var REFERENCE_NAME_PATTERN = "[A-Za-z_][A-Za-z0-9_]*";
15
+ var WHOLE_REFERENCE = new RegExp(`^\\$\\{${REFERENCE_NAME_PATTERN}\\}$`);
16
+ function isWholeReference(value) {
17
+ return WHOLE_REFERENCE.test(value.trim());
18
+ }
19
+ function referenceAt(value, caret) {
20
+ const head = value.slice(0, caret);
21
+ for (let i = head.length - 1; i >= 0; i--) {
22
+ const ch = head.charAt(i);
23
+ if (ch === "$") {
24
+ const rest = head.slice(i + 1);
25
+ const name = rest.startsWith("{") ? rest.slice(1) : rest;
26
+ if (!/^[A-Za-z0-9_]*$/.test(name)) return null;
27
+ return { start: i, query: name };
28
+ }
29
+ if (/\s/.test(ch) || ch === "}") return null;
30
+ }
31
+ return null;
32
+ }
33
+ function rankReferences(names, query) {
34
+ const q = query.toLowerCase();
35
+ if (q === "") return [...names];
36
+ const scored = [];
37
+ names.forEach((name, index) => {
38
+ const lower = name.toLowerCase();
39
+ if (lower.startsWith(q)) scored.push({ name, tier: 0, index });
40
+ else if (lower.includes(q)) scored.push({ name, tier: 1, index });
41
+ else if (isSubsequence(lower, q)) scored.push({ name, tier: 2, index });
42
+ });
43
+ return scored.sort((a, b) => a.tier - b.tier || a.index - b.index).map((s) => s.name);
44
+ }
45
+ function isSubsequence(s, q) {
46
+ let at = 0;
47
+ for (const ch of q) {
48
+ at = s.indexOf(ch, at);
49
+ if (at < 0) return false;
50
+ at += 1;
51
+ }
52
+ return true;
53
+ }
54
+ function completeReference(value, caret, at, name) {
55
+ const written = "${" + name + "}";
56
+ const head = value.slice(0, at.start);
57
+ const tail = value.slice(caret).replace(/^\}/, "");
58
+ return { value: head + written + tail, caret: head.length + written.length };
59
+ }
60
+ function urlSchemeOf(value) {
61
+ const lower = value.toLowerCase();
62
+ if (lower.startsWith("https://")) return "https://";
63
+ if (lower.startsWith("http://")) return "http://";
64
+ return "";
65
+ }
66
+ var DEFAULT_LABELS = {
67
+ references: "Secrets",
68
+ choose: "Choose one"
69
+ };
70
+ function ValueField({
71
+ label,
72
+ mark,
73
+ kind = "text",
74
+ value,
75
+ onChange,
76
+ help,
77
+ error,
78
+ placeholder,
79
+ choices,
80
+ disabled,
81
+ required,
82
+ markRequired,
83
+ autoFocus,
84
+ references,
85
+ onReferencesNeeded,
86
+ isReference = isWholeReference,
87
+ rows = 3,
88
+ helperOnFocus,
89
+ labels,
90
+ className
91
+ }) {
92
+ const words = { ...DEFAULT_LABELS, ...labels };
93
+ const id = useId();
94
+ const affixId = `${id}-affix`;
95
+ const picker = kind === "choice" || kind === "handle";
96
+ const reference = isReference(value);
97
+ const masked = kind === "secret" && !reference;
98
+ const tight = kind === "url" || kind === "id" || kind === "email";
99
+ const own = kind === "url" ? urlSchemeOf(value) : "";
100
+ const referenceBase = own === "" && value.trimStart().startsWith("$");
101
+ const affix = kind === "url" && own !== "http://" && !referenceBase ? "https://" : "";
102
+ const shown = affix ? value.slice(own.length) : value;
103
+ const box = useRef(null);
104
+ const [typing, setTyping] = useState(null);
105
+ const offered = typing && references?.length ? rankReferences(references, typing.query) : [];
106
+ function reconsider(text, caretAt) {
107
+ if (affix) return;
108
+ const caret = masked || caretAt === null ? text.length : caretAt;
109
+ const next = referenceAt(text, caret);
110
+ if (next && !typing) onReferencesNeeded?.();
111
+ setTyping(next);
112
+ }
113
+ function reconsiderFrom(input) {
114
+ reconsider(input.value, masked ? null : input.selectionStart);
115
+ }
116
+ function choose(name) {
117
+ const input = box.current;
118
+ if (!input || !typing) return;
119
+ const caret = masked ? input.value.length : input.selectionStart ?? input.value.length;
120
+ const next = completeReference(input.value, caret, typing, name);
121
+ setTyping(null);
122
+ onChange(next.value);
123
+ queueMicrotask(() => {
124
+ input.setSelectionRange(next.caret, next.caret);
125
+ input.focus();
126
+ });
127
+ }
128
+ function changed(raw) {
129
+ const typed = tight ? raw.replace(/\s+/g, "") : raw;
130
+ let next = typed;
131
+ if (affix) {
132
+ const carried = urlSchemeOf(typed);
133
+ const escapes = carried === "http://" || own === "" && typed.trimStart().startsWith("$");
134
+ next = escapes ? typed : affix + typed.slice(carried.length);
135
+ }
136
+ onChange(next);
137
+ return next;
138
+ }
139
+ const options = picker ? choiceOptions(choices, value) : [];
140
+ const chosen = picker ? choices?.find((choice) => choice.value === value) : void 0;
141
+ const helper = chosen?.hint && help ? /* @__PURE__ */ jsxs(Fragment, { children: [
142
+ help,
143
+ " ",
144
+ chosen.hint
145
+ ] }) : chosen?.hint ?? help;
146
+ return /* @__PURE__ */ jsx(
147
+ FormField,
148
+ {
149
+ htmlFor: id,
150
+ className,
151
+ label: mark ? /* @__PURE__ */ jsxs("span", { className: "crewlet-value-field__label", children: [
152
+ mark,
153
+ label
154
+ ] }) : label,
155
+ optional: required === false,
156
+ requiredNews: required === true && markRequired === true,
157
+ helper,
158
+ helperOnFocus,
159
+ error,
160
+ describedBy: affix ? affixId : void 0,
161
+ children: (field) => picker ? /* @__PURE__ */ jsx(
162
+ Select,
163
+ {
164
+ id: field.id,
165
+ value,
166
+ onChange: (next) => onChange(String(next)),
167
+ options,
168
+ placeholder: words.choose,
169
+ disabled: disabled === true,
170
+ autoFocus,
171
+ error: field.invalid,
172
+ required: required === true,
173
+ "aria-describedby": field.describedBy
174
+ }
175
+ ) : kind === "multiline" ? /* @__PURE__ */ jsx(
176
+ Textarea,
177
+ {
178
+ id: field.id,
179
+ rows,
180
+ value,
181
+ placeholder,
182
+ disabled,
183
+ autoComplete: "off",
184
+ spellCheck: true,
185
+ autoFocus,
186
+ "aria-describedby": field.describedBy,
187
+ "aria-required": required === true || void 0,
188
+ error: field.invalid,
189
+ onChange: (event) => onChange(event.target.value)
190
+ }
191
+ ) : /* @__PURE__ */ jsx(
192
+ Combobox,
193
+ {
194
+ id: field.id,
195
+ ref: box,
196
+ appearance: reference ? "reference" : "default",
197
+ type: masked ? "password" : "text",
198
+ inputMode: kind === "email" ? "email" : kind === "url" ? "url" : void 0,
199
+ value: shown,
200
+ placeholder,
201
+ disabled,
202
+ autoFocus,
203
+ error: field.invalid,
204
+ "aria-describedby": field.describedBy,
205
+ "aria-required": required === true || void 0,
206
+ leading: affix ? /* @__PURE__ */ jsx(InputAffix, { text: affix, id: affixId }) : void 0,
207
+ label: words.references,
208
+ mono: true,
209
+ tabCommits: true,
210
+ options: offered.map((name) => ({ value: name })),
211
+ onCommit: (option) => choose(option.value),
212
+ open: offered.length > 0,
213
+ onOpenChange: (open) => {
214
+ if (!open) setTyping(null);
215
+ },
216
+ onValueChange: (raw) => {
217
+ const next = changed(raw);
218
+ reconsider(next, box.current?.selectionStart ?? null);
219
+ },
220
+ onKeyUp: (event) => reconsiderFrom(event.currentTarget),
221
+ onClick: (event) => reconsiderFrom(event.currentTarget),
222
+ onBlur: () => setTyping(null)
223
+ }
224
+ )
225
+ }
226
+ );
227
+ }
228
+ function choiceOptions(choices, value) {
229
+ const all = choices ?? [];
230
+ const rows = all.map((choice) => ({ value: choice.value, label: choice.label, description: choice.hint }));
231
+ if (value !== "" && !all.some((choice) => choice.value === value)) {
232
+ return [{ value, label: value }, ...rows];
233
+ }
234
+ return rows;
235
+ }
236
+
237
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf };
@@ -160,6 +160,7 @@ var Combobox = forwardRef(function Combobox2({
160
160
  ] })
161
161
  ] });
162
162
  }
163
+ const announcesRole = rest.type !== "password" || lists;
163
164
  return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-combobox", containerClassName), ref: listbox.anchorRef, children: [
164
165
  /* @__PURE__ */ jsx(
165
166
  Input,
@@ -169,9 +170,9 @@ var Combobox = forwardRef(function Combobox2({
169
170
  id: fieldId,
170
171
  className,
171
172
  value,
172
- role: "combobox",
173
- "aria-autocomplete": "list",
174
- "aria-expanded": lists,
173
+ role: announcesRole ? "combobox" : void 0,
174
+ "aria-autocomplete": announcesRole ? "list" : void 0,
175
+ "aria-expanded": announcesRole ? lists : void 0,
175
176
  "aria-controls": lists ? listbox.listId : void 0,
176
177
  "aria-activedescendant": lists && offered.length > 0 ? listbox.optionId(listbox.active) : void 0,
177
178
  autoComplete: "off",
@@ -219,6 +219,7 @@ export * from '../Tree/index.js';
219
219
  export * from '../TreeCanvas/index.js';
220
220
  export * from '../TreeGrid/index.js';
221
221
  export * from '../TypeSpecimen/index.js';
222
+ export * from '../ValueField/index.js';
222
223
  export * from '../VersionCompare/index.js';
223
224
  export * from '../VersionTimeline/index.js';
224
225
  export * from '../VisuallyHidden/index.js';
@@ -1,41 +1,42 @@
1
- import '../chunk-OXZKRUGM.js';
1
+ import '../chunk-UOTNQV6D.js';
2
+ export { VersionTimeline } from '../chunk-TUNEMQXF.js';
2
3
  export { WidgetFrame } from '../chunk-3DMPZZQ6.js';
3
4
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
4
5
  export { TreeCanvas } from '../chunk-5NJ4BIUA.js';
5
6
  export { TypeSpecimen } from '../chunk-JKAFEFFC.js';
6
7
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-NL72YZWF.js';
7
- export { VersionTimeline } from '../chunk-TUNEMQXF.js';
8
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from '../chunk-OD3Z6QKN.js';
9
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-53NTMTRM.js';
8
10
  export { ThemeToggle } from '../chunk-RLFPBRN4.js';
11
+ export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
9
12
  export { ThinkingIndicator } from '../chunk-E2MIUNUU.js';
10
13
  export { TileGrid } from '../chunk-Q6CQMS6R.js';
11
14
  export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from '../chunk-LND6XSXN.js';
12
15
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-SG2375ZY.js';
13
16
  export { ToastProvider, Toaster, toasterInsetStyle, useToast } from '../chunk-XQBLBJN4.js';
17
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-U4AXQI6U.js';
14
18
  export { TagsInput } from '../chunk-VSTD65SL.js';
15
19
  export { ThemeGallery } from '../chunk-ESUZ27TS.js';
16
20
  export { ThemeSwatch } from '../chunk-MNFU2RNT.js';
17
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-53NTMTRM.js';
18
- export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
19
- export { StatGroup } from '../chunk-OUD75UB2.js';
21
+ export { Statement } from '../chunk-MZJKPTA5.js';
20
22
  export { SuggestionList, SuggestionRow } from '../chunk-YBI7M2JH.js';
21
23
  export { Switcher } from '../chunk-ZRKUTFYE.js';
22
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-U4AXQI6U.js';
23
- export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-W2Q5DZJB.js';
24
+ export { SlideFilmstrip } from '../chunk-XLJPLCK6.js';
24
25
  export { SlideGrid } from '../chunk-3V5T5K5H.js';
25
26
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from '../chunk-CVDK3LDB.js';
26
27
  export { StatCard } from '../chunk-VO2PDDRE.js';
27
- export { Statement } from '../chunk-MZJKPTA5.js';
28
+ export { StatGroup } from '../chunk-OUD75UB2.js';
28
29
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-5PMFRAGL.js';
29
30
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-WXSGCYZO.js';
30
31
  export { TagGroup } from '../chunk-4U2D6BPR.js';
31
32
  export { matchesShortcut, useShortcut } from '../chunk-AYHIF6DH.js';
32
33
  import '../chunk-73GUXYYE.js';
33
- export { SlideFilmstrip } from '../chunk-XLJPLCK6.js';
34
+ export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-W2Q5DZJB.js';
34
35
  export { SegmentedMeter, segmentedMeterLabel } from '../chunk-4AK52VHB.js';
35
36
  export { SelectionBar } from '../chunk-6Z4JZHRB.js';
36
37
  export { SEND_BUTTON_LABELS, SendButton } from '../chunk-PBR5C5MX.js';
37
- export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
38
38
  export { SetupWizard } from '../chunk-T4THNJ6E.js';
39
+ export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
39
40
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-B5ZHJWAZ.js';
40
41
  export { Select } from '../chunk-XQZ6EWOE.js';
41
42
  export { ReviewList } from '../chunk-OJ2QULVH.js';
@@ -49,22 +50,22 @@ export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedF
49
50
  export { SearchTrigger } from '../chunk-YZR57QGE.js';
50
51
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-SHLP2BNA.js';
51
52
  export { NavGroup, NavItem, SidebarNav } from '../chunk-B53FUJ53.js';
53
+ export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
52
54
  export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from '../chunk-ZAJHGDAW.js';
53
- export { Prose } from '../chunk-DVVP27OD.js';
54
55
  export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-JE4FCRVL.js';
55
56
  export { RelatedRow } from '../chunk-MYJZCSMA.js';
56
57
  export { Text } from '../chunk-QP2P6GDQ.js';
57
58
  export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-OM6CPZB7.js';
58
59
  export { Table } from '../chunk-5DJMFRSZ.js';
60
+ export { PresenceStack } from '../chunk-FGRJXZUU.js';
61
+ export { PricingCard } from '../chunk-U3ILLCR2.js';
59
62
  export { PresenterView, formatStopwatch } from '../chunk-P5S2SPTK.js';
60
63
  export { SLIDE_NAV_LABELS, SlideNav } from '../chunk-DEAFAK3U.js';
61
64
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-RMEBFYL7.js';
62
- export { PresenceStack } from '../chunk-FGRJXZUU.js';
63
- export { PricingCard } from '../chunk-U3ILLCR2.js';
64
- export { PrincipalPicker } from '../chunk-RPHQNXE5.js';
65
+ export { PrincipalPicker } from '../chunk-IOZFPFQS.js';
65
66
  export { PropertyList } from '../chunk-VBYRA3W6.js';
66
67
  export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-PFXUEEHT.js';
67
- export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from '../chunk-Y56FM3K4.js';
68
+ export { Prose } from '../chunk-DVVP27OD.js';
68
69
  export { PageNote } from '../chunk-CV4NES3P.js';
69
70
  export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from '../chunk-VBO2GYWX.js';
70
71
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from '../chunk-EFIURN3U.js';
@@ -75,11 +76,11 @@ export { FactLine, ObjectHeader, SetByLine } from '../chunk-4MC2EEGO.js';
75
76
  export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-I43D5K6A.js';
76
77
  export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from '../chunk-NLI7OVO2.js';
77
78
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-YA3AWELW.js';
78
- export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
79
79
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-PGKETYGL.js';
80
80
  export { TreeGrid } from '../chunk-Q4DNAO3O.js';
81
81
  export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, layoutConnectors, layoutForest, placeGroups, treeAllExpandable, treeAncestors, treeCollapseOrAscend, treeExpandOrDescend, treeExpandTo, treeExpandable, treeFirst, treeFirstChild, treeItemAction, treeLast, treeLevel, treeNext, treeParent, treePosInSet, treePrevious, treeSetSize, treeStep, treeTypeAhead, treeVisible, typeAheadBuffer, useLayoutAnchor, useMeasuredSizes, useTreeState } from '../chunk-MY374UUD.js';
82
82
  export { OrgLabel } from '../chunk-ONQKKHON.js';
83
+ export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
83
84
  export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from '../chunk-BAKPMH3S.js';
84
85
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-VRPDQSXZ.js';
85
86
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-5G76O23M.js';
@@ -148,7 +149,7 @@ export { ColorSwatch } from '../chunk-KA2GAB3N.js';
148
149
  export { CopyButton, Copyable } from '../chunk-IOTN23FZ.js';
149
150
  export { useClipboard, writeClipboard } from '../chunk-STJ7QBC3.js';
150
151
  export { useOutcome } from '../chunk-DTIW4CHZ.js';
151
- export { Combobox } from '../chunk-VC2M2E7N.js';
152
+ export { Combobox } from '../chunk-PK2P2QH6.js';
152
153
  export { CommandPalette } from '../chunk-I74C4TM6.js';
153
154
  export { ConfirmModal, Modal } from '../chunk-KVWZDCTQ.js';
154
155
  export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from '../chunk-7KHM2FZH.js';
package/dist/index.js CHANGED
@@ -1,41 +1,42 @@
1
- import './chunk-OXZKRUGM.js';
1
+ import './chunk-UOTNQV6D.js';
2
+ export { VersionTimeline } from './chunk-TUNEMQXF.js';
2
3
  export { WidgetFrame } from './chunk-3DMPZZQ6.js';
3
4
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
4
5
  export { TreeCanvas } from './chunk-5NJ4BIUA.js';
5
6
  export { TypeSpecimen } from './chunk-JKAFEFFC.js';
6
7
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-NL72YZWF.js';
7
- export { VersionTimeline } from './chunk-TUNEMQXF.js';
8
+ export { REFERENCE_NAME_PATTERN, ValueField, completeReference, isWholeReference, rankReferences, referenceAt, urlSchemeOf } from './chunk-OD3Z6QKN.js';
9
+ export { DensitySwitcher, ThemeSwitcher } from './chunk-53NTMTRM.js';
8
10
  export { ThemeToggle } from './chunk-RLFPBRN4.js';
11
+ export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
9
12
  export { ThinkingIndicator } from './chunk-E2MIUNUU.js';
10
13
  export { TileGrid } from './chunk-Q6CQMS6R.js';
11
14
  export { TIME_RANGE_CUSTOM, TIME_RANGE_PICKER_LABELS, TimeRangePicker, timeRangeFieldKey, timeRangeProblem } from './chunk-LND6XSXN.js';
12
15
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-SG2375ZY.js';
13
16
  export { ToastProvider, Toaster, toasterInsetStyle, useToast } from './chunk-XQBLBJN4.js';
17
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-U4AXQI6U.js';
14
18
  export { TagsInput } from './chunk-VSTD65SL.js';
15
19
  export { ThemeGallery } from './chunk-ESUZ27TS.js';
16
20
  export { ThemeSwatch } from './chunk-MNFU2RNT.js';
17
- export { DensitySwitcher, ThemeSwitcher } from './chunk-53NTMTRM.js';
18
- export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
19
- export { StatGroup } from './chunk-OUD75UB2.js';
21
+ export { Statement } from './chunk-MZJKPTA5.js';
20
22
  export { SuggestionList, SuggestionRow } from './chunk-YBI7M2JH.js';
21
23
  export { Switcher } from './chunk-ZRKUTFYE.js';
22
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-U4AXQI6U.js';
23
- export { SLIDE_COMPARE_LABELS, SlideCompare } from './chunk-W2Q5DZJB.js';
24
+ export { SlideFilmstrip } from './chunk-XLJPLCK6.js';
24
25
  export { SlideGrid } from './chunk-3V5T5K5H.js';
25
26
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from './chunk-CVDK3LDB.js';
26
27
  export { StatCard } from './chunk-VO2PDDRE.js';
27
- export { Statement } from './chunk-MZJKPTA5.js';
28
+ export { StatGroup } from './chunk-OUD75UB2.js';
28
29
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from './chunk-5PMFRAGL.js';
29
30
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from './chunk-WXSGCYZO.js';
30
31
  export { TagGroup } from './chunk-4U2D6BPR.js';
31
32
  export { matchesShortcut, useShortcut } from './chunk-AYHIF6DH.js';
32
33
  import './chunk-73GUXYYE.js';
33
- export { SlideFilmstrip } from './chunk-XLJPLCK6.js';
34
+ export { SLIDE_COMPARE_LABELS, SlideCompare } from './chunk-W2Q5DZJB.js';
34
35
  export { SegmentedMeter, segmentedMeterLabel } from './chunk-4AK52VHB.js';
35
36
  export { SelectionBar } from './chunk-6Z4JZHRB.js';
36
37
  export { SEND_BUTTON_LABELS, SendButton } from './chunk-PBR5C5MX.js';
37
- export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
38
38
  export { SetupWizard } from './chunk-T4THNJ6E.js';
39
+ export { SettingsTable, SettingsTableRow } from './chunk-4RKTZSEW.js';
39
40
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from './chunk-B5ZHJWAZ.js';
40
41
  export { Select } from './chunk-XQZ6EWOE.js';
41
42
  export { ReviewList } from './chunk-OJ2QULVH.js';
@@ -49,22 +50,22 @@ export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedF
49
50
  export { SearchTrigger } from './chunk-YZR57QGE.js';
50
51
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from './chunk-SHLP2BNA.js';
51
52
  export { NavGroup, NavItem, SidebarNav } from './chunk-B53FUJ53.js';
53
+ export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
52
54
  export { ReadingPane, ReadingPaneByline, ReadingPaneLead, ReadingPaneOutcome, ReadingPaneQuote, ReadingPaneReasoning, ReadingPaneSection, ReadingPaneTitle } from './chunk-ZAJHGDAW.js';
53
- export { Prose } from './chunk-DVVP27OD.js';
54
55
  export { REFUSAL_CARD_LABELS, RefusalCard } from './chunk-JE4FCRVL.js';
55
56
  export { RelatedRow } from './chunk-MYJZCSMA.js';
56
57
  export { Text } from './chunk-QP2P6GDQ.js';
57
58
  export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from './chunk-OM6CPZB7.js';
58
59
  export { Table } from './chunk-5DJMFRSZ.js';
60
+ export { PresenceStack } from './chunk-FGRJXZUU.js';
61
+ export { PricingCard } from './chunk-U3ILLCR2.js';
59
62
  export { PresenterView, formatStopwatch } from './chunk-P5S2SPTK.js';
60
63
  export { SLIDE_NAV_LABELS, SlideNav } from './chunk-DEAFAK3U.js';
61
64
  export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from './chunk-RMEBFYL7.js';
62
- export { PresenceStack } from './chunk-FGRJXZUU.js';
63
- export { PricingCard } from './chunk-U3ILLCR2.js';
64
- export { PrincipalPicker } from './chunk-RPHQNXE5.js';
65
+ export { PrincipalPicker } from './chunk-IOZFPFQS.js';
65
66
  export { PropertyList } from './chunk-VBYRA3W6.js';
66
67
  export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from './chunk-PFXUEEHT.js';
67
- export { QR_DARK, QR_LIGHT, QR_QUIET_ZONE, QrCode, qrModulePath, qrModules } from './chunk-Y56FM3K4.js';
68
+ export { Prose } from './chunk-DVVP27OD.js';
68
69
  export { PageNote } from './chunk-CV4NES3P.js';
69
70
  export { PEEK_RAIL_LABELS, PEEK_RAIL_MAX_WIDTH, PEEK_RAIL_MIN_WIDTH, PEEK_RAIL_WIDTH, PeekHost, PeekNeighbours, PeekRail, isPlainPress, peekClickHandler, peekRowActivation, usePeekNeighbours, usePeekOrder, usePeekStep } from './chunk-VBO2GYWX.js';
70
71
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from './chunk-EFIURN3U.js';
@@ -75,11 +76,11 @@ export { FactLine, ObjectHeader, SetByLine } from './chunk-4MC2EEGO.js';
75
76
  export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from './chunk-I43D5K6A.js';
76
77
  export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip } from './chunk-NLI7OVO2.js';
77
78
  export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-YA3AWELW.js';
78
- export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
79
79
  export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-PGKETYGL.js';
80
80
  export { TreeGrid } from './chunk-Q4DNAO3O.js';
81
81
  export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, layoutConnectors, layoutForest, placeGroups, treeAllExpandable, treeAncestors, treeCollapseOrAscend, treeExpandOrDescend, treeExpandTo, treeExpandable, treeFirst, treeFirstChild, treeItemAction, treeLast, treeLevel, treeNext, treeParent, treePosInSet, treePrevious, treeSetSize, treeStep, treeTypeAhead, treeVisible, typeAheadBuffer, useLayoutAnchor, useMeasuredSizes, useTreeState } from './chunk-MY374UUD.js';
82
82
  export { OrgLabel } from './chunk-ONQKKHON.js';
83
+ export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
83
84
  export { MARKDOWN_CALLOUT_NAMES, MARKDOWN_CALLOUT_TONES, markdownBreaks, markdownClosesFence, markdownCodeText, markdownFenceOf, markdownHeadingOf, markdownInline, markdownLines, parseMarkdown, parseMarkdownSpans, safeHref } from './chunk-BAKPMH3S.js';
84
85
  export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from './chunk-VRPDQSXZ.js';
85
86
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-5G76O23M.js';
@@ -148,7 +149,7 @@ export { ColorSwatch } from './chunk-KA2GAB3N.js';
148
149
  export { CopyButton, Copyable } from './chunk-IOTN23FZ.js';
149
150
  export { useClipboard, writeClipboard } from './chunk-STJ7QBC3.js';
150
151
  export { useOutcome } from './chunk-DTIW4CHZ.js';
151
- export { Combobox } from './chunk-VC2M2E7N.js';
152
+ export { Combobox } from './chunk-PK2P2QH6.js';
152
153
  export { CommandPalette } from './chunk-I74C4TM6.js';
153
154
  export { ConfirmModal, Modal } from './chunk-KVWZDCTQ.js';
154
155
  export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
package/dist/styles.css CHANGED
@@ -38567,6 +38567,22 @@ svg.crewlet-time-window__tick {
38567
38567
  }
38568
38568
 
38569
38569
 
38570
+ /* ValueField-EIBD6RYS.css */
38571
+ /*
38572
+ * ValueField: a labelled value with the control its kind needs.
38573
+ *
38574
+ * The row is FormField's and every control is the package's own; what is
38575
+ * drawn here is the mark a label may carry, such as a third party's logo,
38576
+ * set on the label's line ahead of its words.
38577
+ */
38578
+
38579
+ .crewlet-value-field__label {
38580
+ display: inline-flex;
38581
+ align-items: center;
38582
+ gap: var(--spacing-1);
38583
+ }
38584
+
38585
+
38570
38586
  /* VersionCompare-UUZOPTQO.css */
38571
38587
  /* VersionCompare: a head naming the two versions with the lens switch at its
38572
38588
  end, then the changes or the two versions. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.61.0",
3
+ "version": "0.62.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.61.0",
46
- "@crewlethq/tokens": "0.61.0",
45
+ "@crewlethq/icons": "0.62.0",
46
+ "@crewlethq/tokens": "0.62.0",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",
File without changes