@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 +8 -0
- package/dist/Combobox/index.js +1 -1
- package/dist/PrincipalPicker/index.js +2 -2
- package/dist/ValueField/ValueField.d.ts +117 -0
- package/dist/ValueField/index.d.ts +10 -0
- package/dist/ValueField/index.js +15 -0
- package/dist/ValueField/references.d.ts +66 -0
- package/dist/ValueField-EIBD6RYS.css +13 -0
- package/dist/{chunk-RPHQNXE5.js → chunk-IOZFPFQS.js} +1 -1
- package/dist/chunk-OD3Z6QKN.js +237 -0
- package/dist/{chunk-VC2M2E7N.js → chunk-PK2P2QH6.js} +4 -3
- package/dist/generated/index.d.ts +1 -0
- package/dist/generated/index.js +18 -17
- package/dist/index.js +18 -17
- package/dist/styles.css +16 -0
- package/package.json +3 -3
- /package/dist/{chunk-OXZKRUGM.js → chunk-UOTNQV6D.js} +0 -0
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.
|
package/dist/Combobox/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { PrincipalPicker } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
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
|
+
}
|
|
@@ -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';
|
package/dist/generated/index.js
CHANGED
|
@@ -1,41 +1,42 @@
|
|
|
1
|
-
import '../chunk-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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-
|
|
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-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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-
|
|
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.
|
|
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.
|
|
46
|
-
"@crewlethq/tokens": "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
|