@silo-code/sdk 0.28.0 → 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.
Files changed (186) hide show
  1. package/dist/AddRow.d.ts +21 -0
  2. package/dist/AddRow.d.ts.map +1 -0
  3. package/dist/AddRow.js +24 -0
  4. package/dist/AddRow.js.map +1 -0
  5. package/dist/Badge.d.ts +32 -0
  6. package/dist/Badge.d.ts.map +1 -0
  7. package/dist/Badge.js +32 -0
  8. package/dist/Badge.js.map +1 -0
  9. package/dist/Button.d.ts +29 -0
  10. package/dist/Button.d.ts.map +1 -0
  11. package/dist/Button.js +25 -0
  12. package/dist/Button.js.map +1 -0
  13. package/dist/Callout.d.ts +26 -0
  14. package/dist/Callout.d.ts.map +1 -0
  15. package/dist/Callout.js +26 -0
  16. package/dist/Callout.js.map +1 -0
  17. package/dist/CheckboxRow.d.ts +27 -0
  18. package/dist/CheckboxRow.d.ts.map +1 -0
  19. package/dist/CheckboxRow.js +24 -0
  20. package/dist/CheckboxRow.js.map +1 -0
  21. package/dist/EmptyState.d.ts +40 -0
  22. package/dist/EmptyState.d.ts.map +1 -0
  23. package/dist/EmptyState.js +34 -0
  24. package/dist/EmptyState.js.map +1 -0
  25. package/dist/IconButton.d.ts +35 -0
  26. package/dist/IconButton.d.ts.map +1 -0
  27. package/dist/IconButton.js +31 -0
  28. package/dist/IconButton.js.map +1 -0
  29. package/dist/InlineEdit.d.ts +63 -0
  30. package/dist/InlineEdit.d.ts.map +1 -0
  31. package/dist/InlineEdit.js +121 -0
  32. package/dist/InlineEdit.js.map +1 -0
  33. package/dist/Input.d.ts +26 -0
  34. package/dist/Input.d.ts.map +1 -0
  35. package/dist/Input.js +28 -0
  36. package/dist/Input.js.map +1 -0
  37. package/dist/List.d.ts +74 -0
  38. package/dist/List.d.ts.map +1 -0
  39. package/dist/List.js +104 -0
  40. package/dist/List.js.map +1 -0
  41. package/dist/ModalActions.d.ts +40 -0
  42. package/dist/ModalActions.d.ts.map +1 -0
  43. package/dist/ModalActions.js +36 -0
  44. package/dist/ModalActions.js.map +1 -0
  45. package/dist/RadioGroup.d.ts +55 -0
  46. package/dist/RadioGroup.d.ts.map +1 -0
  47. package/dist/RadioGroup.js +60 -0
  48. package/dist/RadioGroup.js.map +1 -0
  49. package/dist/SearchInput.d.ts +30 -0
  50. package/dist/SearchInput.d.ts.map +1 -0
  51. package/dist/SearchInput.js +36 -0
  52. package/dist/SearchInput.js.map +1 -0
  53. package/dist/Section.d.ts +35 -0
  54. package/dist/Section.d.ts.map +1 -0
  55. package/dist/Section.js +31 -0
  56. package/dist/Section.js.map +1 -0
  57. package/dist/SegmentedTabs.d.ts +41 -0
  58. package/dist/SegmentedTabs.d.ts.map +1 -0
  59. package/dist/SegmentedTabs.js +33 -0
  60. package/dist/SegmentedTabs.js.map +1 -0
  61. package/dist/Select.d.ts +23 -0
  62. package/dist/Select.d.ts.map +1 -0
  63. package/dist/Select.js +23 -0
  64. package/dist/Select.js.map +1 -0
  65. package/dist/SettingRow.d.ts +33 -0
  66. package/dist/SettingRow.d.ts.map +1 -0
  67. package/dist/SettingRow.js +30 -0
  68. package/dist/SettingRow.js.map +1 -0
  69. package/dist/Switch.d.ts +32 -0
  70. package/dist/Switch.d.ts.map +1 -0
  71. package/dist/Switch.js +31 -0
  72. package/dist/Switch.js.map +1 -0
  73. package/dist/Tabs.d.ts +59 -0
  74. package/dist/Tabs.d.ts.map +1 -0
  75. package/dist/Tabs.js +51 -0
  76. package/dist/Tabs.js.map +1 -0
  77. package/dist/Textarea.d.ts +22 -0
  78. package/dist/Textarea.d.ts.map +1 -0
  79. package/dist/Textarea.js +25 -0
  80. package/dist/Textarea.js.map +1 -0
  81. package/dist/badge-classes.d.ts +15 -0
  82. package/dist/badge-classes.d.ts.map +1 -0
  83. package/dist/badge-classes.js +12 -0
  84. package/dist/badge-classes.js.map +1 -0
  85. package/dist/button-classes.d.ts +20 -0
  86. package/dist/button-classes.d.ts.map +1 -0
  87. package/dist/button-classes.js +16 -0
  88. package/dist/button-classes.js.map +1 -0
  89. package/dist/editor-service.d.ts +9 -3
  90. package/dist/editor-service.d.ts.map +1 -1
  91. package/dist/empty-state-classes.d.ts +12 -0
  92. package/dist/empty-state-classes.d.ts.map +1 -0
  93. package/dist/empty-state-classes.js +8 -0
  94. package/dist/empty-state-classes.js.map +1 -0
  95. package/dist/icon-button-classes.d.ts +15 -0
  96. package/dist/icon-button-classes.d.ts.map +1 -0
  97. package/dist/icon-button-classes.js +12 -0
  98. package/dist/icon-button-classes.js.map +1 -0
  99. package/dist/index.d.ts +33 -4
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +31 -4
  102. package/dist/index.js.map +1 -1
  103. package/dist/inline-edit-classes.d.ts +12 -0
  104. package/dist/inline-edit-classes.d.ts.map +1 -0
  105. package/dist/inline-edit-classes.js +18 -0
  106. package/dist/inline-edit-classes.js.map +1 -0
  107. package/dist/inline-edit-controller.d.ts +20 -0
  108. package/dist/inline-edit-controller.d.ts.map +1 -0
  109. package/dist/inline-edit-controller.js +52 -0
  110. package/dist/inline-edit-controller.js.map +1 -0
  111. package/dist/input-classes.d.ts +8 -0
  112. package/dist/input-classes.d.ts.map +1 -0
  113. package/dist/input-classes.js +10 -0
  114. package/dist/input-classes.js.map +1 -0
  115. package/dist/list-classes.d.ts +19 -0
  116. package/dist/list-classes.d.ts.map +1 -0
  117. package/dist/list-classes.js +16 -0
  118. package/dist/list-classes.js.map +1 -0
  119. package/dist/radio-card-classes.d.ts +8 -0
  120. package/dist/radio-card-classes.d.ts.map +1 -0
  121. package/dist/radio-card-classes.js +10 -0
  122. package/dist/radio-card-classes.js.map +1 -0
  123. package/dist/search-input-classes.d.ts +8 -0
  124. package/dist/search-input-classes.d.ts.map +1 -0
  125. package/dist/search-input-classes.js +10 -0
  126. package/dist/search-input-classes.js.map +1 -0
  127. package/dist/segmented-tabs-classes.d.ts +8 -0
  128. package/dist/segmented-tabs-classes.d.ts.map +1 -0
  129. package/dist/segmented-tabs-classes.js +10 -0
  130. package/dist/segmented-tabs-classes.js.map +1 -0
  131. package/dist/switch-classes.d.ts +8 -0
  132. package/dist/switch-classes.d.ts.map +1 -0
  133. package/dist/switch-classes.js +10 -0
  134. package/dist/switch-classes.js.map +1 -0
  135. package/dist/tabs-classes.d.ts +8 -0
  136. package/dist/tabs-classes.d.ts.map +1 -0
  137. package/dist/tabs-classes.js +10 -0
  138. package/dist/tabs-classes.js.map +1 -0
  139. package/package.json +1 -1
  140. package/src/AddRow.tsx +56 -0
  141. package/src/Badge.tsx +55 -0
  142. package/src/Button.tsx +52 -0
  143. package/src/Callout.tsx +26 -0
  144. package/src/CheckboxRow.tsx +54 -0
  145. package/src/EmptyState.tsx +69 -0
  146. package/src/IconButton.tsx +55 -0
  147. package/src/InlineEdit.tsx +260 -0
  148. package/src/Input.tsx +39 -0
  149. package/src/List.tsx +240 -0
  150. package/src/ModalActions.tsx +52 -0
  151. package/src/RadioGroup.tsx +101 -0
  152. package/src/SearchInput.tsx +98 -0
  153. package/src/Section.tsx +49 -0
  154. package/src/SegmentedTabs.tsx +70 -0
  155. package/src/Select.tsx +36 -0
  156. package/src/SettingRow.tsx +47 -0
  157. package/src/Switch.tsx +63 -0
  158. package/src/Tabs.tsx +89 -0
  159. package/src/Textarea.tsx +33 -0
  160. package/src/badge-classes.test.ts +20 -0
  161. package/src/badge-classes.ts +27 -0
  162. package/src/button-classes.test.ts +24 -0
  163. package/src/button-classes.ts +32 -0
  164. package/src/editor-service.ts +9 -3
  165. package/src/empty-state-classes.test.ts +13 -0
  166. package/src/empty-state-classes.ts +17 -0
  167. package/src/icon-button-classes.test.ts +13 -0
  168. package/src/icon-button-classes.ts +19 -0
  169. package/src/index.ts +45 -4
  170. package/src/inline-edit-classes.test.ts +27 -0
  171. package/src/inline-edit-classes.ts +18 -0
  172. package/src/inline-edit-controller.ts +53 -0
  173. package/src/input-classes.test.ts +13 -0
  174. package/src/input-classes.ts +9 -0
  175. package/src/list-classes.test.ts +23 -0
  176. package/src/list-classes.ts +26 -0
  177. package/src/radio-card-classes.test.ts +12 -0
  178. package/src/radio-card-classes.ts +9 -0
  179. package/src/search-input-classes.test.ts +12 -0
  180. package/src/search-input-classes.ts +9 -0
  181. package/src/segmented-tabs-classes.test.ts +12 -0
  182. package/src/segmented-tabs-classes.ts +9 -0
  183. package/src/switch-classes.test.ts +9 -0
  184. package/src/switch-classes.ts +9 -0
  185. package/src/tabs-classes.test.ts +12 -0
  186. 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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"}
@@ -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
@@ -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"}