@silo-code/sdk 0.28.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AddRow.d.ts +21 -0
- package/dist/AddRow.d.ts.map +1 -0
- package/dist/AddRow.js +24 -0
- package/dist/AddRow.js.map +1 -0
- package/dist/Badge.d.ts +32 -0
- package/dist/Badge.d.ts.map +1 -0
- package/dist/Badge.js +32 -0
- package/dist/Badge.js.map +1 -0
- package/dist/Button.d.ts +29 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Button.js +25 -0
- package/dist/Button.js.map +1 -0
- package/dist/Callout.d.ts +26 -0
- package/dist/Callout.d.ts.map +1 -0
- package/dist/Callout.js +26 -0
- package/dist/Callout.js.map +1 -0
- package/dist/CheckboxRow.d.ts +27 -0
- package/dist/CheckboxRow.d.ts.map +1 -0
- package/dist/CheckboxRow.js +24 -0
- package/dist/CheckboxRow.js.map +1 -0
- package/dist/EmptyState.d.ts +40 -0
- package/dist/EmptyState.d.ts.map +1 -0
- package/dist/EmptyState.js +34 -0
- package/dist/EmptyState.js.map +1 -0
- package/dist/IconButton.d.ts +35 -0
- package/dist/IconButton.d.ts.map +1 -0
- package/dist/IconButton.js +31 -0
- package/dist/IconButton.js.map +1 -0
- package/dist/InlineEdit.d.ts +63 -0
- package/dist/InlineEdit.d.ts.map +1 -0
- package/dist/InlineEdit.js +121 -0
- package/dist/InlineEdit.js.map +1 -0
- package/dist/Input.d.ts +26 -0
- package/dist/Input.d.ts.map +1 -0
- package/dist/Input.js +28 -0
- package/dist/Input.js.map +1 -0
- package/dist/List.d.ts +74 -0
- package/dist/List.d.ts.map +1 -0
- package/dist/List.js +104 -0
- package/dist/List.js.map +1 -0
- package/dist/ModalActions.d.ts +40 -0
- package/dist/ModalActions.d.ts.map +1 -0
- package/dist/ModalActions.js +36 -0
- package/dist/ModalActions.js.map +1 -0
- package/dist/RadioGroup.d.ts +55 -0
- package/dist/RadioGroup.d.ts.map +1 -0
- package/dist/RadioGroup.js +60 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/SearchInput.d.ts +30 -0
- package/dist/SearchInput.d.ts.map +1 -0
- package/dist/SearchInput.js +36 -0
- package/dist/SearchInput.js.map +1 -0
- package/dist/Section.d.ts +35 -0
- package/dist/Section.d.ts.map +1 -0
- package/dist/Section.js +31 -0
- package/dist/Section.js.map +1 -0
- package/dist/SegmentedTabs.d.ts +41 -0
- package/dist/SegmentedTabs.d.ts.map +1 -0
- package/dist/SegmentedTabs.js +33 -0
- package/dist/SegmentedTabs.js.map +1 -0
- package/dist/Select.d.ts +23 -0
- package/dist/Select.d.ts.map +1 -0
- package/dist/Select.js +23 -0
- package/dist/Select.js.map +1 -0
- package/dist/SettingRow.d.ts +33 -0
- package/dist/SettingRow.d.ts.map +1 -0
- package/dist/SettingRow.js +30 -0
- package/dist/SettingRow.js.map +1 -0
- package/dist/Switch.d.ts +32 -0
- package/dist/Switch.d.ts.map +1 -0
- package/dist/Switch.js +31 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Tabs.d.ts +59 -0
- package/dist/Tabs.d.ts.map +1 -0
- package/dist/Tabs.js +51 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Textarea.d.ts +22 -0
- package/dist/Textarea.d.ts.map +1 -0
- package/dist/Textarea.js +25 -0
- package/dist/Textarea.js.map +1 -0
- package/dist/badge-classes.d.ts +15 -0
- package/dist/badge-classes.d.ts.map +1 -0
- package/dist/badge-classes.js +12 -0
- package/dist/badge-classes.js.map +1 -0
- package/dist/button-classes.d.ts +20 -0
- package/dist/button-classes.d.ts.map +1 -0
- package/dist/button-classes.js +16 -0
- package/dist/button-classes.js.map +1 -0
- package/dist/empty-state-classes.d.ts +12 -0
- package/dist/empty-state-classes.d.ts.map +1 -0
- package/dist/empty-state-classes.js +8 -0
- package/dist/empty-state-classes.js.map +1 -0
- package/dist/icon-button-classes.d.ts +15 -0
- package/dist/icon-button-classes.d.ts.map +1 -0
- package/dist/icon-button-classes.js +12 -0
- package/dist/icon-button-classes.js.map +1 -0
- package/dist/index.d.ts +33 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -4
- package/dist/index.js.map +1 -1
- package/dist/inline-edit-classes.d.ts +12 -0
- package/dist/inline-edit-classes.d.ts.map +1 -0
- package/dist/inline-edit-classes.js +18 -0
- package/dist/inline-edit-classes.js.map +1 -0
- package/dist/inline-edit-controller.d.ts +20 -0
- package/dist/inline-edit-controller.d.ts.map +1 -0
- package/dist/inline-edit-controller.js +52 -0
- package/dist/inline-edit-controller.js.map +1 -0
- package/dist/input-classes.d.ts +8 -0
- package/dist/input-classes.d.ts.map +1 -0
- package/dist/input-classes.js +10 -0
- package/dist/input-classes.js.map +1 -0
- package/dist/list-classes.d.ts +19 -0
- package/dist/list-classes.d.ts.map +1 -0
- package/dist/list-classes.js +16 -0
- package/dist/list-classes.js.map +1 -0
- package/dist/radio-card-classes.d.ts +8 -0
- package/dist/radio-card-classes.d.ts.map +1 -0
- package/dist/radio-card-classes.js +10 -0
- package/dist/radio-card-classes.js.map +1 -0
- package/dist/search-input-classes.d.ts +8 -0
- package/dist/search-input-classes.d.ts.map +1 -0
- package/dist/search-input-classes.js +10 -0
- package/dist/search-input-classes.js.map +1 -0
- package/dist/segmented-tabs-classes.d.ts +8 -0
- package/dist/segmented-tabs-classes.d.ts.map +1 -0
- package/dist/segmented-tabs-classes.js +10 -0
- package/dist/segmented-tabs-classes.js.map +1 -0
- package/dist/switch-classes.d.ts +8 -0
- package/dist/switch-classes.d.ts.map +1 -0
- package/dist/switch-classes.js +10 -0
- package/dist/switch-classes.js.map +1 -0
- package/dist/tabs-classes.d.ts +8 -0
- package/dist/tabs-classes.d.ts.map +1 -0
- package/dist/tabs-classes.js +10 -0
- package/dist/tabs-classes.js.map +1 -0
- package/package.json +1 -1
- package/src/AddRow.tsx +56 -0
- package/src/Badge.tsx +55 -0
- package/src/Button.tsx +52 -0
- package/src/Callout.tsx +26 -0
- package/src/CheckboxRow.tsx +54 -0
- package/src/EmptyState.tsx +69 -0
- package/src/IconButton.tsx +55 -0
- package/src/InlineEdit.tsx +260 -0
- package/src/Input.tsx +39 -0
- package/src/List.tsx +240 -0
- package/src/ModalActions.tsx +52 -0
- package/src/RadioGroup.tsx +101 -0
- package/src/SearchInput.tsx +98 -0
- package/src/Section.tsx +49 -0
- package/src/SegmentedTabs.tsx +70 -0
- package/src/Select.tsx +36 -0
- package/src/SettingRow.tsx +47 -0
- package/src/Switch.tsx +63 -0
- package/src/Tabs.tsx +89 -0
- package/src/Textarea.tsx +33 -0
- package/src/badge-classes.test.ts +20 -0
- package/src/badge-classes.ts +27 -0
- package/src/button-classes.test.ts +24 -0
- package/src/button-classes.ts +32 -0
- package/src/empty-state-classes.test.ts +13 -0
- package/src/empty-state-classes.ts +17 -0
- package/src/icon-button-classes.test.ts +13 -0
- package/src/icon-button-classes.ts +19 -0
- package/src/index.ts +45 -4
- package/src/inline-edit-classes.test.ts +27 -0
- package/src/inline-edit-classes.ts +18 -0
- package/src/inline-edit-controller.ts +53 -0
- package/src/input-classes.test.ts +13 -0
- package/src/input-classes.ts +9 -0
- package/src/list-classes.test.ts +23 -0
- package/src/list-classes.ts +26 -0
- package/src/radio-card-classes.test.ts +12 -0
- package/src/radio-card-classes.ts +9 -0
- package/src/search-input-classes.test.ts +12 -0
- package/src/search-input-classes.ts +9 -0
- package/src/segmented-tabs-classes.test.ts +12 -0
- package/src/segmented-tabs-classes.ts +9 -0
- package/src/switch-classes.test.ts +9 -0
- package/src/switch-classes.ts +9 -0
- package/src/tabs-classes.test.ts +12 -0
- package/src/tabs-classes.ts +9 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useLayoutEffect, useRef, useState, } from "react";
|
|
3
|
+
import { IconButton } from "./IconButton.js";
|
|
4
|
+
import { Input } from "./Input.js";
|
|
5
|
+
import { Textarea } from "./Textarea.js";
|
|
6
|
+
import { Tooltip } from "./Tooltip.js";
|
|
7
|
+
import { inlineEditDisplayClass, inlineEditRowClass, } from "./inline-edit-classes.js";
|
|
8
|
+
import { setActiveInlineEditCancel } from "./inline-edit-controller.js";
|
|
9
|
+
function PencilIcon() {
|
|
10
|
+
return (_jsx("svg", { width: "13", height: "13", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M11.1 2.4a1.4 1.4 0 0 1 2 2L5.5 12l-2.8.8.8-2.8 7.6-7.6z", stroke: "currentColor", strokeWidth: "1.2", strokeLinejoin: "round" }) }));
|
|
11
|
+
}
|
|
12
|
+
function CheckIcon() {
|
|
13
|
+
return (_jsx("svg", { width: "13", height: "13", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M3 8.5l3 3 7-7", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }) }));
|
|
14
|
+
}
|
|
15
|
+
function XIcon() {
|
|
16
|
+
return (_jsx("svg", { width: "13", height: "13", viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M4 4l8 8M12 4l-8 8", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round" }) }));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Click-to-edit a value in place — a static display with a pencil affordance
|
|
20
|
+
* that swaps to a field with explicit ✓ Save / ✗ Cancel buttons. Use it for
|
|
21
|
+
* values where committing an empty/invalid value would be visibly broken
|
|
22
|
+
* elsewhere; everything else in a modal should save as you type instead.
|
|
23
|
+
*
|
|
24
|
+
* **Escape is two-stage**: the first Esc cancels the edit; the next Esc
|
|
25
|
+
* closes the modal. The host coordinates this via the SDK's
|
|
26
|
+
* `setActiveInlineEditCancel` hook — do not add your own Escape handler.
|
|
27
|
+
*
|
|
28
|
+
* Styled purely via host-provided `.silo-inline-edit*` classes — no
|
|
29
|
+
* stylesheet import is needed in the extension.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <InlineEdit
|
|
34
|
+
* value={ws.name}
|
|
35
|
+
* onSave={(name) => ctx.workspaces.rename(ws.id, name)}
|
|
36
|
+
* validate={validateWorkspaceName}
|
|
37
|
+
* aria-label="Rename workspace"
|
|
38
|
+
* />
|
|
39
|
+
*
|
|
40
|
+
* <InlineEdit
|
|
41
|
+
* multiline
|
|
42
|
+
* value={description}
|
|
43
|
+
* onSave={setDescription}
|
|
44
|
+
* aria-label="Edit description"
|
|
45
|
+
* />
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @category Consumer Services
|
|
49
|
+
* @public
|
|
50
|
+
*/
|
|
51
|
+
export function InlineEdit({ value, onSave, validate, multiline = false, "aria-label": ariaLabel, }) {
|
|
52
|
+
// null = not editing; a string = the staged edit-mode value.
|
|
53
|
+
const [draft, setDraft] = useState(null);
|
|
54
|
+
const [error, setError] = useState(null);
|
|
55
|
+
const inputRef = useRef(null);
|
|
56
|
+
const textareaRef = useRef(null);
|
|
57
|
+
const editing = draft !== null;
|
|
58
|
+
function cancel() {
|
|
59
|
+
setDraft(null);
|
|
60
|
+
setError(null);
|
|
61
|
+
}
|
|
62
|
+
function save() {
|
|
63
|
+
const raw = draft ?? "";
|
|
64
|
+
const result = validate
|
|
65
|
+
? validate(raw)
|
|
66
|
+
: { ok: true, value: raw.trim() };
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
setError(result.error);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (result.value !== value)
|
|
72
|
+
onSave(result.value);
|
|
73
|
+
setDraft(null);
|
|
74
|
+
setError(null);
|
|
75
|
+
}
|
|
76
|
+
useLayoutEffect(() => {
|
|
77
|
+
if (!editing)
|
|
78
|
+
return;
|
|
79
|
+
const el = multiline ? textareaRef.current : inputRef.current;
|
|
80
|
+
if (!el)
|
|
81
|
+
return;
|
|
82
|
+
el.focus();
|
|
83
|
+
el.select();
|
|
84
|
+
}, [editing, multiline]);
|
|
85
|
+
// Register with the host's two-stage Escape yield while editing.
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (!editing)
|
|
88
|
+
return;
|
|
89
|
+
setActiveInlineEditCancel(cancel);
|
|
90
|
+
return () => setActiveInlineEditCancel(null);
|
|
91
|
+
}, [editing]);
|
|
92
|
+
function onFieldKeyDown(e) {
|
|
93
|
+
if (multiline) {
|
|
94
|
+
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
save();
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (e.key === "Enter") {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
save();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (!editing) {
|
|
106
|
+
return (_jsx("div", { className: "silo-inline-edit", children: _jsxs("div", { className: inlineEditDisplayClass(multiline), children: [_jsx("span", { className: "silo-inline-edit-value", children: value }), _jsx(Tooltip, { content: "Edit", children: _jsx(IconButton, { size: "sm", "aria-label": ariaLabel, onClick: () => {
|
|
107
|
+
setDraft(value);
|
|
108
|
+
setError(null);
|
|
109
|
+
}, children: _jsx(PencilIcon, {}) }) })] }) }));
|
|
110
|
+
}
|
|
111
|
+
return (_jsxs("div", { className: "silo-inline-edit", children: [_jsxs("div", { className: inlineEditRowClass(multiline), children: [multiline ? (_jsx(Textarea, { ref: textareaRef, value: draft ?? "", "aria-label": ariaLabel, onChange: (e) => {
|
|
112
|
+
setDraft(e.target.value);
|
|
113
|
+
if (error)
|
|
114
|
+
setError(null);
|
|
115
|
+
}, onKeyDown: onFieldKeyDown, autoCapitalize: "off", autoCorrect: "off", spellCheck: false })) : (_jsx(Input, { ref: inputRef, value: draft ?? "", "aria-label": ariaLabel, onChange: (e) => {
|
|
116
|
+
setDraft(e.target.value);
|
|
117
|
+
if (error)
|
|
118
|
+
setError(null);
|
|
119
|
+
}, onKeyDown: onFieldKeyDown, autoCapitalize: "off", autoCorrect: "off", spellCheck: false })), _jsx(Tooltip, { content: "Save", children: _jsx(IconButton, { size: "sm", "aria-label": "Save", onClick: save, children: _jsx(CheckIcon, {}) }) }), _jsx(Tooltip, { content: "Cancel", children: _jsx(IconButton, { size: "sm", "aria-label": "Cancel", onClick: cancel, children: _jsx(XIcon, {}) }) })] }), error && _jsx("span", { className: "silo-inline-edit-error", children: error })] }));
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=InlineEdit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEdit.js","sourceRoot":"","sources":["../src/InlineEdit.tsx"],"names":[],"mappings":"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"}
|
package/dist/Input.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type InputHTMLAttributes } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* The single text-input treatment used across modal content: input-bg,
|
|
4
|
+
* 6×8px padding, small radius, the shared focus ring.
|
|
5
|
+
*
|
|
6
|
+
* Styled purely via host-provided `.silo-input*` classes — no stylesheet
|
|
7
|
+
* import is needed in the extension.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <Input
|
|
12
|
+
* value={name}
|
|
13
|
+
* onChange={(e) => setName(e.target.value)}
|
|
14
|
+
* placeholder="Workspace name"
|
|
15
|
+
* />
|
|
16
|
+
* <Input block />
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @category Consumer Services
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export declare const Input: import("react").ForwardRefExoticComponent<{
|
|
23
|
+
/** Stretch to the container width. */
|
|
24
|
+
block?: boolean;
|
|
25
|
+
} & InputHTMLAttributes<HTMLInputElement> & import("react").RefAttributes<HTMLInputElement>>;
|
|
26
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,KAAK;IAGd,sCAAsC;YAC9B,OAAO;4FAWjB,CAAC"}
|
package/dist/Input.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { inputClass } from "./input-classes.js";
|
|
4
|
+
/**
|
|
5
|
+
* The single text-input treatment used across modal content: input-bg,
|
|
6
|
+
* 6×8px padding, small radius, the shared focus ring.
|
|
7
|
+
*
|
|
8
|
+
* Styled purely via host-provided `.silo-input*` classes — no stylesheet
|
|
9
|
+
* import is needed in the extension.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <Input
|
|
14
|
+
* value={name}
|
|
15
|
+
* onChange={(e) => setName(e.target.value)}
|
|
16
|
+
* placeholder="Workspace name"
|
|
17
|
+
* />
|
|
18
|
+
* <Input block />
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @category Consumer Services
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export const Input = forwardRef(function Input({ block = false, className, ...rest }, ref) {
|
|
25
|
+
const classes = inputClass(block);
|
|
26
|
+
return (_jsx("input", { ref: ref, className: className ? `${classes} ${className}` : classes, ...rest }));
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAM7B,SAAS,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG;IACzD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,CACL,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,KACtD,IAAI,GACR,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/List.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type ListRowTruncate } from "./list-classes.js";
|
|
3
|
+
export type { ListRowTruncate };
|
|
4
|
+
/**
|
|
5
|
+
* A full-width listbox of selectable rows. One tab stop; ↑/↓ move the focus
|
|
6
|
+
* ring, Space/Enter select. Pair with {@link ListRow} children.
|
|
7
|
+
*
|
|
8
|
+
* Styled purely via the host-provided `.silo-list` class — no stylesheet
|
|
9
|
+
* import is needed in the extension.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <List aria-label="Workspace folders">
|
|
14
|
+
* <ListRow
|
|
15
|
+
* selected={folder.primary}
|
|
16
|
+
* leading={<FolderIcon />}
|
|
17
|
+
* trailing={<Badge tone="accent">primary</Badge>}
|
|
18
|
+
* onSelect={() => choose(folder)}
|
|
19
|
+
* >
|
|
20
|
+
* {folder.path}
|
|
21
|
+
* </ListRow>
|
|
22
|
+
* </List>
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @category Consumer Services
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export declare function List({ "aria-label": ariaLabel, onActivate, children, }: {
|
|
29
|
+
/** Required — it's a listbox. */
|
|
30
|
+
"aria-label": string;
|
|
31
|
+
/** Enter / double-click on a row. */
|
|
32
|
+
onActivate?: (index: number) => void;
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
/**
|
|
36
|
+
* One row inside a {@link List}. Stretches full-width; long text truncates
|
|
37
|
+
* (use `truncate="start"` for paths). `trailing` content never shrinks.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <ListRow
|
|
42
|
+
* selected={folder.primary}
|
|
43
|
+
* leading={<FolderIcon />}
|
|
44
|
+
* trailing={<Badge tone="accent">primary</Badge>}
|
|
45
|
+
* truncate="start"
|
|
46
|
+
* onSelect={() => choose(folder)}
|
|
47
|
+
* >
|
|
48
|
+
* {folder.path}
|
|
49
|
+
* </ListRow>
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @category Consumer Services
|
|
53
|
+
* @public
|
|
54
|
+
*/
|
|
55
|
+
export interface ListRowProps {
|
|
56
|
+
selected?: boolean;
|
|
57
|
+
/** Icon slot (dimmed, fixed). */
|
|
58
|
+
leading?: ReactNode;
|
|
59
|
+
/** Badge(s) and/or `IconButton size="sm"`(s). */
|
|
60
|
+
trailing?: ReactNode;
|
|
61
|
+
/** Default `"end"`. Use `"start"` for paths. */
|
|
62
|
+
truncate?: ListRowTruncate;
|
|
63
|
+
/** Click / Space select. */
|
|
64
|
+
onSelect?: () => void;
|
|
65
|
+
/** Enter / double-click. */
|
|
66
|
+
onActivate?: () => void;
|
|
67
|
+
children?: ReactNode;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @category Consumer Services
|
|
71
|
+
* @public
|
|
72
|
+
*/
|
|
73
|
+
export declare function ListRow(props: ListRowProps): import("react").JSX.Element;
|
|
74
|
+
//# sourceMappingURL=List.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../src/List.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAEf,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,eAAe,EAAE,CAAC;AAehC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,IAAI,CAAC,EACnB,YAAY,EAAE,SAAS,EACvB,UAAU,EACV,QAAQ,GACT,EAAE;IACD,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAiCA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAgG1C"}
|
package/dist/List.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Children, cloneElement, createContext, isValidElement, useContext, } from "react";
|
|
3
|
+
import { useFocusGroup } from "./use-focus-group.js";
|
|
4
|
+
import { listRowDataSelected, listRowNameTruncate, } from "./list-classes.js";
|
|
5
|
+
const ListContext = createContext(null);
|
|
6
|
+
/**
|
|
7
|
+
* A full-width listbox of selectable rows. One tab stop; ↑/↓ move the focus
|
|
8
|
+
* ring, Space/Enter select. Pair with {@link ListRow} children.
|
|
9
|
+
*
|
|
10
|
+
* Styled purely via the host-provided `.silo-list` class — no stylesheet
|
|
11
|
+
* import is needed in the extension.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <List aria-label="Workspace folders">
|
|
16
|
+
* <ListRow
|
|
17
|
+
* selected={folder.primary}
|
|
18
|
+
* leading={<FolderIcon />}
|
|
19
|
+
* trailing={<Badge tone="accent">primary</Badge>}
|
|
20
|
+
* onSelect={() => choose(folder)}
|
|
21
|
+
* >
|
|
22
|
+
* {folder.path}
|
|
23
|
+
* </ListRow>
|
|
24
|
+
* </List>
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @category Consumer Services
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export function List({ "aria-label": ariaLabel, onActivate, children, }) {
|
|
31
|
+
const rows = Children.toArray(children).filter(isValidElement);
|
|
32
|
+
const selectedIndex = rows.findIndex((row) => row.props.selected);
|
|
33
|
+
const group = useFocusGroup({
|
|
34
|
+
count: rows.length,
|
|
35
|
+
start: selectedIndex >= 0 ? selectedIndex : 0,
|
|
36
|
+
// Space/Enter both select (RFC 0016). Enter-only activation is layered
|
|
37
|
+
// on in ListRow's own keydown after the focus-group handler runs.
|
|
38
|
+
onActivate: (index) => {
|
|
39
|
+
rows[index]?.props.onSelect?.();
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return (_jsx(ListContext.Provider, { value: { onActivate }, children: _jsx("div", { role: "listbox", "aria-label": ariaLabel, className: "silo-list", ...group.containerProps, children: rows.map((row, index) => cloneElement(row, {
|
|
43
|
+
key: row.key ?? index,
|
|
44
|
+
__listIndex: index,
|
|
45
|
+
__focusProps: group.getItemProps(index),
|
|
46
|
+
})) }) }));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @category Consumer Services
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export function ListRow(props) {
|
|
53
|
+
// List injects focus-group props via cloneElement; keep them off the public
|
|
54
|
+
// signature so they stay out of the generated API reference.
|
|
55
|
+
const { selected = false, leading, trailing, truncate = "end", onSelect, onActivate, children, __listIndex, __focusProps, } = props;
|
|
56
|
+
const list = useContext(ListContext);
|
|
57
|
+
const dataSelected = listRowDataSelected(selected);
|
|
58
|
+
const truncateAttr = listRowNameTruncate(truncate);
|
|
59
|
+
const focusProps = __focusProps;
|
|
60
|
+
const { ref, onKeyDown: focusKeyDown, onFocus, onPointerDown, tabIndex, "data-focus-item": dataFocusItem, "data-focus-visible": dataFocusVisible, } = focusProps ?? {
|
|
61
|
+
ref: undefined,
|
|
62
|
+
onKeyDown: undefined,
|
|
63
|
+
onFocus: undefined,
|
|
64
|
+
onPointerDown: undefined,
|
|
65
|
+
tabIndex: -1,
|
|
66
|
+
"data-focus-item": "",
|
|
67
|
+
"data-focus-visible": undefined,
|
|
68
|
+
};
|
|
69
|
+
function fireActivate() {
|
|
70
|
+
onActivate?.();
|
|
71
|
+
if (__listIndex != null)
|
|
72
|
+
list?.onActivate?.(__listIndex);
|
|
73
|
+
}
|
|
74
|
+
const rowProps = {
|
|
75
|
+
role: "option",
|
|
76
|
+
"aria-selected": selected,
|
|
77
|
+
className: "silo-list-row",
|
|
78
|
+
tabIndex,
|
|
79
|
+
ref: ref,
|
|
80
|
+
onFocus,
|
|
81
|
+
onPointerDown,
|
|
82
|
+
"data-focus-item": dataFocusItem,
|
|
83
|
+
...(dataFocusVisible != null
|
|
84
|
+
? { "data-focus-visible": dataFocusVisible }
|
|
85
|
+
: {}),
|
|
86
|
+
...(dataSelected != null ? { "data-selected": dataSelected } : {}),
|
|
87
|
+
onClick: () => {
|
|
88
|
+
onSelect?.();
|
|
89
|
+
},
|
|
90
|
+
onDoubleClick: () => {
|
|
91
|
+
fireActivate();
|
|
92
|
+
},
|
|
93
|
+
onKeyDown: (e) => {
|
|
94
|
+
focusKeyDown?.(e);
|
|
95
|
+
if (e.key === "Enter")
|
|
96
|
+
fireActivate();
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
return (_jsxs("div", { ...rowProps, children: [leading != null && (_jsx("span", { className: "silo-list-row-leading", children: leading })), _jsx("span", { className: "silo-list-row-name", ...(truncateAttr != null ? { "data-truncate": truncateAttr } : {}), children: children }), trailing != null && (_jsx("span", { className: "silo-list-row-trailing", onClick: (e) => {
|
|
100
|
+
// Trailing IconButtons own their clicks — don't select the row.
|
|
101
|
+
e.stopPropagation();
|
|
102
|
+
}, children: trailing }))] }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=List.js.map
|
package/dist/List.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.js","sourceRoot":"","sources":["../src/List.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* The right-aligned footer row for a modal's action buttons — a thin
|
|
4
|
+
* `.silo-modal-actions` wrapper so every modal's footer lines up without each
|
|
5
|
+
* caller re-specifying the flex row. Optional `start` slot pins meta text or
|
|
6
|
+
* a secondary action on the left.
|
|
7
|
+
*
|
|
8
|
+
* Styled purely via host-provided `.silo-modal-actions*` classes — no
|
|
9
|
+
* stylesheet import is needed in the extension.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <ModalActions>
|
|
14
|
+
* <Button onClick={close}>Cancel</Button>
|
|
15
|
+
* <Button variant="primary" onClick={save}>Create</Button>
|
|
16
|
+
* </ModalActions>
|
|
17
|
+
*
|
|
18
|
+
* <ModalActions start="6 sessions · 6 procs">
|
|
19
|
+
* <Button>Go to Terminal</Button>
|
|
20
|
+
* <Button variant="danger">End Task</Button>
|
|
21
|
+
* </ModalActions>
|
|
22
|
+
*
|
|
23
|
+
* <ModalActions
|
|
24
|
+
* start={<Button size="sm" onClick={create}>+ Create branch</Button>}
|
|
25
|
+
* >
|
|
26
|
+
* <Button onClick={fetch}>Fetch</Button>
|
|
27
|
+
* </ModalActions>
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category Consumer Services
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare function ModalActions({ start, children, }: {
|
|
34
|
+
/**
|
|
35
|
+
* Optional left-pinned slot for meta text or a secondary action.
|
|
36
|
+
*/
|
|
37
|
+
start?: ReactNode;
|
|
38
|
+
children?: ReactNode;
|
|
39
|
+
}): import("react").JSX.Element;
|
|
40
|
+
//# sourceMappingURL=ModalActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalActions.d.ts","sourceRoot":"","sources":["../src/ModalActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACT,EAAE;IACD;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BASA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The right-aligned footer row for a modal's action buttons — a thin
|
|
4
|
+
* `.silo-modal-actions` wrapper so every modal's footer lines up without each
|
|
5
|
+
* caller re-specifying the flex row. Optional `start` slot pins meta text or
|
|
6
|
+
* a secondary action on the left.
|
|
7
|
+
*
|
|
8
|
+
* Styled purely via host-provided `.silo-modal-actions*` classes — no
|
|
9
|
+
* stylesheet import is needed in the extension.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <ModalActions>
|
|
14
|
+
* <Button onClick={close}>Cancel</Button>
|
|
15
|
+
* <Button variant="primary" onClick={save}>Create</Button>
|
|
16
|
+
* </ModalActions>
|
|
17
|
+
*
|
|
18
|
+
* <ModalActions start="6 sessions · 6 procs">
|
|
19
|
+
* <Button>Go to Terminal</Button>
|
|
20
|
+
* <Button variant="danger">End Task</Button>
|
|
21
|
+
* </ModalActions>
|
|
22
|
+
*
|
|
23
|
+
* <ModalActions
|
|
24
|
+
* start={<Button size="sm" onClick={create}>+ Create branch</Button>}
|
|
25
|
+
* >
|
|
26
|
+
* <Button onClick={fetch}>Fetch</Button>
|
|
27
|
+
* </ModalActions>
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category Consumer Services
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export function ModalActions({ start, children, }) {
|
|
34
|
+
return (_jsxs("div", { className: "silo-modal-actions", children: [start != null && start !== false && (_jsx("div", { className: "silo-modal-actions-start", children: start })), children] }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ModalActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalActions.js","sourceRoot":"","sources":["../src/ModalActions.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GAOT;IACC,OAAO,CACL,eAAK,SAAS,EAAC,oBAAoB,aAChC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,CACnC,cAAK,SAAS,EAAC,0BAA0B,YAAE,KAAK,GAAO,CACxD,EACA,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Stacked option cards — each a full-width click target with a radio dot, a
|
|
4
|
+
* bold title, and a dim description. Wrap {@link RadioCard} children; the
|
|
5
|
+
* selected card gets an accent border and a faint accent tint. Native tab
|
|
6
|
+
* stops per card — no arrow-key roving.
|
|
7
|
+
*
|
|
8
|
+
* Styled purely via host-provided `.silo-radio-card*` classes — no
|
|
9
|
+
* stylesheet import is needed in the extension.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <RadioGroup value={mode} onChange={setMode}>
|
|
14
|
+
* <RadioCard
|
|
15
|
+
* value="clear"
|
|
16
|
+
* title="Clear the finished indicator"
|
|
17
|
+
* description="Viewing the terminal acknowledges the run — the green check disappears."
|
|
18
|
+
* />
|
|
19
|
+
* <RadioCard
|
|
20
|
+
* value="keep"
|
|
21
|
+
* title="Keep it until the next run"
|
|
22
|
+
* description="Viewing changes nothing."
|
|
23
|
+
* />
|
|
24
|
+
* </RadioGroup>
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @category Consumer Services
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export declare function RadioGroup({ value, onChange, children, }: {
|
|
31
|
+
value: string;
|
|
32
|
+
onChange: (value: string) => void;
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
/**
|
|
36
|
+
* One option inside a {@link RadioGroup}. The whole card is the click target.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```tsx
|
|
40
|
+
* <RadioCard
|
|
41
|
+
* value="clear"
|
|
42
|
+
* title="Clear the finished indicator"
|
|
43
|
+
* description="Viewing the terminal acknowledges the run."
|
|
44
|
+
* />
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @category Consumer Services
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
export declare function RadioCard({ value, title, description, }: {
|
|
51
|
+
value: string;
|
|
52
|
+
title: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
}): import("react").JSX.Element;
|
|
55
|
+
//# sourceMappingURL=RadioGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../src/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQlE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAMA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,+BAyBA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
import { radioCardDataSelected } from "./radio-card-classes.js";
|
|
4
|
+
const RadioGroupContext = createContext(null);
|
|
5
|
+
/**
|
|
6
|
+
* Stacked option cards — each a full-width click target with a radio dot, a
|
|
7
|
+
* bold title, and a dim description. Wrap {@link RadioCard} children; the
|
|
8
|
+
* selected card gets an accent border and a faint accent tint. Native tab
|
|
9
|
+
* stops per card — no arrow-key roving.
|
|
10
|
+
*
|
|
11
|
+
* Styled purely via host-provided `.silo-radio-card*` classes — no
|
|
12
|
+
* stylesheet import is needed in the extension.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <RadioGroup value={mode} onChange={setMode}>
|
|
17
|
+
* <RadioCard
|
|
18
|
+
* value="clear"
|
|
19
|
+
* title="Clear the finished indicator"
|
|
20
|
+
* description="Viewing the terminal acknowledges the run — the green check disappears."
|
|
21
|
+
* />
|
|
22
|
+
* <RadioCard
|
|
23
|
+
* value="keep"
|
|
24
|
+
* title="Keep it until the next run"
|
|
25
|
+
* description="Viewing changes nothing."
|
|
26
|
+
* />
|
|
27
|
+
* </RadioGroup>
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category Consumer Services
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export function RadioGroup({ value, onChange, children, }) {
|
|
34
|
+
return (_jsx(RadioGroupContext.Provider, { value: { value, onChange }, children: children }));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One option inside a {@link RadioGroup}. The whole card is the click target.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <RadioCard
|
|
42
|
+
* value="clear"
|
|
43
|
+
* title="Clear the finished indicator"
|
|
44
|
+
* description="Viewing the terminal acknowledges the run."
|
|
45
|
+
* />
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @category Consumer Services
|
|
49
|
+
* @public
|
|
50
|
+
*/
|
|
51
|
+
export function RadioCard({ value, title, description, }) {
|
|
52
|
+
const group = useContext(RadioGroupContext);
|
|
53
|
+
if (!group) {
|
|
54
|
+
throw new Error("RadioCard must be used inside a RadioGroup");
|
|
55
|
+
}
|
|
56
|
+
const selected = group.value === value;
|
|
57
|
+
const dataSelected = radioCardDataSelected(selected);
|
|
58
|
+
return (_jsxs("button", { type: "button", role: "radio", "aria-checked": selected, className: "silo-radio-card", ...(dataSelected != null ? { "data-selected": dataSelected } : {}), onClick: () => group.onChange(value), children: [_jsx("span", { className: "silo-radio-card-dot", "aria-hidden": "true" }), _jsxs("span", { children: [_jsx("span", { className: "silo-radio-card-title", children: title }), description != null && (_jsx("span", { className: "silo-radio-card-desc", children: description }))] })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sourceRoot":"","sources":["../src/RadioGroup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,iBAAiB,GAAG,aAAa,CAG7B,IAAI,CAAC,CAAC;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAQ,GAKT;IACC,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YACnD,QAAQ,GACkB,CAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,WAAW,GAKZ;IACC,MAAM,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC;IACvC,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,kBACE,QAAQ,EACtB,SAAS,EAAC,iBAAiB,KACvB,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACnE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAEpC,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,GAAG,EAC3D,2BACE,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAQ,EACrD,WAAW,IAAI,IAAI,IAAI,CACtB,eAAM,SAAS,EAAC,sBAAsB,YAAE,WAAW,GAAQ,CAC5D,IACI,IACA,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* The filter-as-you-type field: leading search icon, and a clear ✕ that
|
|
4
|
+
* appears once there's a value (and stays a real tab stop). Pair with
|
|
5
|
+
* {@link List} for the standard picker pattern.
|
|
6
|
+
*
|
|
7
|
+
* Styled purely via host-provided `.silo-search-input*` classes — no
|
|
8
|
+
* stylesheet import is needed in the extension.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <SearchInput
|
|
13
|
+
* value={query}
|
|
14
|
+
* onValueChange={setQuery}
|
|
15
|
+
* placeholder="Filter branches…"
|
|
16
|
+
* />
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @category Consumer Services
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export declare function SearchInput({ value, onValueChange, placeholder, autoFocus, onClear, }: {
|
|
23
|
+
value: string;
|
|
24
|
+
onValueChange: (value: string) => void;
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
autoFocus?: boolean;
|
|
27
|
+
/** Extra hook when ✕ clears the field. */
|
|
28
|
+
onClear?: () => void;
|
|
29
|
+
}): ReactNode;
|
|
30
|
+
//# sourceMappingURL=SearchInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../src/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAqCvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,GAAG,SAAS,CA2BZ"}
|