@silo-code/sdk 0.28.1 → 0.29.1

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 +8 -4
  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 +8 -4
  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,21 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from "react";
2
+ /**
3
+ * The ghost "+ Add…" action that sits flush under a {@link List} — visually
4
+ * a row, semantically a button. No fill at rest; `bg-hover` on hover.
5
+ *
6
+ * Styled purely via host-provided `.silo-add-row*` classes — no stylesheet
7
+ * import is needed in the extension.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <List aria-label="Folders">…</List>
12
+ * <AddRow onClick={addFolder}>Add Folder…</AddRow>
13
+ * ```
14
+ *
15
+ * @category Consumer Services
16
+ * @public
17
+ */
18
+ export declare function AddRow({ children, className, type, ...rest }: {
19
+ children?: ReactNode;
20
+ } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">): import("react").JSX.Element;
21
+ //# sourceMappingURL=AddRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddRow.d.ts","sourceRoot":"","sources":["../src/AddRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAqB7D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,IAAe,EACf,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,+BAW5D"}
package/dist/AddRow.js ADDED
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ function PlusIcon() {
3
+ return (_jsx("svg", { className: "silo-add-row-plus", width: "12", height: "12", viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M8 2v12M2 8h12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }));
4
+ }
5
+ /**
6
+ * The ghost "+ Add…" action that sits flush under a {@link List} — visually
7
+ * a row, semantically a button. No fill at rest; `bg-hover` on hover.
8
+ *
9
+ * Styled purely via host-provided `.silo-add-row*` classes — no stylesheet
10
+ * import is needed in the extension.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <List aria-label="Folders">…</List>
15
+ * <AddRow onClick={addFolder}>Add Folder…</AddRow>
16
+ * ```
17
+ *
18
+ * @category Consumer Services
19
+ * @public
20
+ */
21
+ export function AddRow({ children, className, type = "button", ...rest }) {
22
+ return (_jsxs("button", { type: type, className: className ? `silo-add-row ${className}` : "silo-add-row", ...rest, children: [_jsx(PlusIcon, {}), children] }));
23
+ }
24
+ //# sourceMappingURL=AddRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddRow.js","sourceRoot":"","sources":["../src/AddRow.tsx"],"names":[],"mappings":";AAEA,SAAS,QAAQ;IACf,OAAO,CACL,cACE,SAAS,EAAC,mBAAmB,EAC7B,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,iBACP,MAAM,YAElB,eACE,CAAC,EAAC,gBAAgB,EAClB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,GACrB,GACE,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EAGoD;IAC3D,OAAO,CACL,kBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAC,cAAc,KAC/D,IAAI,aAER,KAAC,QAAQ,KAAG,EACX,QAAQ,IACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ import { type BadgeTone } from "./badge-classes.js";
3
+ export type { BadgeTone };
4
+ /**
5
+ * A small pill for status or identity — on a {@link ListRow}'s trailing
6
+ * slot, in a {@link SettingRow}'s control slot, next to a title. An
7
+ * arbitrary `color` overrides `tone` for identity colors (e.g. workspace
8
+ * group swatches) via the `--badge-color` custom property.
9
+ *
10
+ * Styled purely via host-provided `.silo-badge*` classes — no stylesheet
11
+ * import is needed in the extension.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <Badge tone="ok">Installed</Badge>
16
+ * <Badge tone="warn">Update available</Badge>
17
+ * <Badge tone="accent">current</Badge>
18
+ * <Badge>primary</Badge>
19
+ * <Badge tone="outline">Silo</Badge>
20
+ * <Badge color="#e06c75">Frontend</Badge>
21
+ * ```
22
+ *
23
+ * @category Consumer Services
24
+ * @public
25
+ */
26
+ export declare function Badge({ tone, color, className, style, children, ...rest }: {
27
+ tone?: BadgeTone;
28
+ /** Arbitrary CSS color — overrides `tone` for identity colors. */
29
+ color?: string;
30
+ children?: ReactNode;
31
+ } & Omit<HTMLAttributes<HTMLSpanElement>, "children" | "color">): import("react").JSX.Element;
32
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../src/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAgB,EAChB,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,+BAe9D"}
package/dist/Badge.js ADDED
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { badgeClass } from "./badge-classes.js";
3
+ /**
4
+ * A small pill for status or identity — on a {@link ListRow}'s trailing
5
+ * slot, in a {@link SettingRow}'s control slot, next to a title. An
6
+ * arbitrary `color` overrides `tone` for identity colors (e.g. workspace
7
+ * group swatches) via the `--badge-color` custom property.
8
+ *
9
+ * Styled purely via host-provided `.silo-badge*` classes — no stylesheet
10
+ * import is needed in the extension.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <Badge tone="ok">Installed</Badge>
15
+ * <Badge tone="warn">Update available</Badge>
16
+ * <Badge tone="accent">current</Badge>
17
+ * <Badge>primary</Badge>
18
+ * <Badge tone="outline">Silo</Badge>
19
+ * <Badge color="#e06c75">Frontend</Badge>
20
+ * ```
21
+ *
22
+ * @category Consumer Services
23
+ * @public
24
+ */
25
+ export function Badge({ tone = "neutral", color, className, style, children, ...rest }) {
26
+ const classes = badgeClass(tone, color);
27
+ const mergedStyle = color != null
28
+ ? { ...style, ["--badge-color"]: color }
29
+ : style;
30
+ return (_jsx("span", { className: className ? `${classes} ${className}` : classes, style: mergedStyle, ...rest, children: children }));
31
+ }
32
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sourceRoot":"","sources":["../src/Badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAC;AAI7D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,GAAG,SAAS,EAChB,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EAMsD;IAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,WAAW,GACf,KAAK,IAAI,IAAI;QACX,CAAC,CAAE,EAAE,GAAG,KAAK,EAAE,CAAC,eAAyB,CAAC,EAAE,KAAK,EAAoB;QACrE,CAAC,CAAC,KAAK,CAAC;IACZ,OAAO,CACL,eACE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,EAC1D,KAAK,EAAE,WAAW,KACd,IAAI,YAEP,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from "react";
2
+ import { type ButtonSize, type ButtonVariant } from "./button-classes.js";
3
+ export type { ButtonSize, ButtonVariant };
4
+ /**
5
+ * The action button in three variants. In a modal footer the primary action
6
+ * sits rightmost with neutral actions to its left (see {@link ModalActions}).
7
+ *
8
+ * Styled purely via host-provided `.silo-button*` classes — no stylesheet
9
+ * import is needed in the extension.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <Button onClick={cancel}>Cancel</Button>
14
+ * <Button variant="primary" onClick={save}>Save</Button>
15
+ * <Button variant="danger" onClick={remove}>Delete</Button>
16
+ * <Button size="sm">Compact</Button>
17
+ * ```
18
+ *
19
+ * @category Consumer Services
20
+ * @public
21
+ */
22
+ export declare function Button({ variant, size, className, type, children, ...rest }: {
23
+ /** `primary` = the accent-filled main action; `danger` = destructive. */
24
+ variant?: ButtonVariant;
25
+ /** `sm` for inline/compact contexts (e.g. a footer `start` slot). */
26
+ size?: ButtonSize;
27
+ children?: ReactNode;
28
+ } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">): import("react").JSX.Element;
29
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAkB,EAClB,IAAe,EACf,SAAS,EACT,IAAe,EACf,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,yEAAyE;IACzE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,qEAAqE;IACrE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,+BAW5D"}
package/dist/Button.js ADDED
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { buttonClass, } from "./button-classes.js";
3
+ /**
4
+ * The action button in three variants. In a modal footer the primary action
5
+ * sits rightmost with neutral actions to its left (see {@link ModalActions}).
6
+ *
7
+ * Styled purely via host-provided `.silo-button*` classes — no stylesheet
8
+ * import is needed in the extension.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <Button onClick={cancel}>Cancel</Button>
13
+ * <Button variant="primary" onClick={save}>Save</Button>
14
+ * <Button variant="danger" onClick={remove}>Delete</Button>
15
+ * <Button size="sm">Compact</Button>
16
+ * ```
17
+ *
18
+ * @category Consumer Services
19
+ * @public
20
+ */
21
+ export function Button({ variant = "normal", size = "normal", className, type = "button", children, ...rest }) {
22
+ const classes = buttonClass(variant, size);
23
+ return (_jsx("button", { type: type, className: className ? `${classes} ${className}` : classes, ...rest, children: children }));
24
+ }
25
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAI1B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,MAAM,CAAC,EACrB,OAAO,GAAG,QAAQ,EAClB,IAAI,GAAG,QAAQ,EACf,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,GAAG,IAAI,EAOoD;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,CACL,iBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,KACtD,IAAI,YAEP,QAAQ,GACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * A quiet set-off box for explanatory copy — a hairline border around body
4
+ * text, no fill, no tone. Not a warning/error/info alert (there is
5
+ * deliberately no `tone`): status belongs to {@link Badge} tones and
6
+ * {@link EmptyState}.
7
+ *
8
+ * Styled purely via the host-provided `.silo-callout` class — no stylesheet
9
+ * import is needed in the extension.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <Callout>
14
+ * Opening a worktree adds it as another folder in this workspace — its
15
+ * files, terminals, and Git panel appear alongside your current ones.
16
+ * Closing a view leaves the worktree untouched on disk.
17
+ * </Callout>
18
+ * ```
19
+ *
20
+ * @category Consumer Services
21
+ * @public
22
+ */
23
+ export declare function Callout({ children }: {
24
+ children?: ReactNode;
25
+ }): import("react").JSX.Element;
26
+ //# sourceMappingURL=Callout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.d.ts","sourceRoot":"","sources":["../src/Callout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,+BAE7D"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * A quiet set-off box for explanatory copy — a hairline border around body
4
+ * text, no fill, no tone. Not a warning/error/info alert (there is
5
+ * deliberately no `tone`): status belongs to {@link Badge} tones and
6
+ * {@link EmptyState}.
7
+ *
8
+ * Styled purely via the host-provided `.silo-callout` class — no stylesheet
9
+ * import is needed in the extension.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <Callout>
14
+ * Opening a worktree adds it as another folder in this workspace — its
15
+ * files, terminals, and Git panel appear alongside your current ones.
16
+ * Closing a view leaves the worktree untouched on disk.
17
+ * </Callout>
18
+ * ```
19
+ *
20
+ * @category Consumer Services
21
+ * @public
22
+ */
23
+ export function Callout({ children }) {
24
+ return _jsx("div", { className: "silo-callout", children: children });
25
+ }
26
+ //# sourceMappingURL=Callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.js","sourceRoot":"","sources":["../src/Callout.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAA4B;IAC5D,OAAO,cAAK,SAAS,EAAC,cAAc,YAAE,QAAQ,GAAO,CAAC;AACxD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { InputHTMLAttributes } from "react";
2
+ /**
3
+ * A labeled checkbox row (15px box, accent check). The whole label is the
4
+ * click target.
5
+ *
6
+ * Styled purely via the host-provided `.silo-checkbox-row` class — no
7
+ * stylesheet import is needed in the extension.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <CheckboxRow
12
+ * label="Only monitor the checked-out branch"
13
+ * checked={onlyCheckedOut}
14
+ * onChange={setOnlyCheckedOut}
15
+ * />
16
+ * ```
17
+ *
18
+ * @category Consumer Services
19
+ * @public
20
+ */
21
+ export declare function CheckboxRow({ label, checked, onChange, disabled, className, ...rest }: {
22
+ label: string;
23
+ checked: boolean;
24
+ onChange: (checked: boolean) => void;
25
+ disabled?: boolean;
26
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "onChange" | "disabled" | "children">): import("react").JSX.Element;
27
+ //# sourceMappingURL=CheckboxRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxRow.d.ts","sourceRoot":"","sources":["../src/CheckboxRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CACN,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAC1D,+BAiBA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * A labeled checkbox row (15px box, accent check). The whole label is the
4
+ * click target.
5
+ *
6
+ * Styled purely via the host-provided `.silo-checkbox-row` class — no
7
+ * stylesheet import is needed in the extension.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <CheckboxRow
12
+ * label="Only monitor the checked-out branch"
13
+ * checked={onlyCheckedOut}
14
+ * onChange={setOnlyCheckedOut}
15
+ * />
16
+ * ```
17
+ *
18
+ * @category Consumer Services
19
+ * @public
20
+ */
21
+ export function CheckboxRow({ label, checked, onChange, disabled, className, ...rest }) {
22
+ return (_jsxs("label", { className: className ? `silo-checkbox-row ${className}` : "silo-checkbox-row", children: [_jsx("input", { type: "checkbox", checked: checked, disabled: disabled, onChange: (e) => onChange(e.target.checked), ...rest }), label] }));
23
+ }
24
+ //# sourceMappingURL=CheckboxRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxRow.js","sourceRoot":"","sources":["../src/CheckboxRow.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EASR;IACC,OAAO,CACL,iBACE,SAAS,EACP,SAAS,CAAC,CAAC,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC,CAAC,mBAAmB,aAGpE,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KACvC,IAAI,GACR,EACD,KAAK,IACA,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ReactNode } from "react";
2
+ import { type EmptyStateTone } from "./empty-state-classes.js";
3
+ export type { EmptyStateTone };
4
+ /**
5
+ * The big-icon + title + dim-description block a modal shows when a list is
6
+ * empty or everything is fine ("All workflows passing"). Renders flat in the
7
+ * modal body — no card, no shadow of its own.
8
+ *
9
+ * Styled purely via host-provided `.silo-empty-state*` classes — no
10
+ * stylesheet import is needed in the extension.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <EmptyState
15
+ * tone="ok"
16
+ * icon={<CheckIcon />}
17
+ * title="All workflows passing"
18
+ * description="No failures or active runs on this repo."
19
+ * />
20
+ *
21
+ * <EmptyState
22
+ * icon={<SearchIcon />}
23
+ * title="No matching branches"
24
+ * description="Try a different filter."
25
+ * />
26
+ * ```
27
+ *
28
+ * @category Consumer Services
29
+ * @public
30
+ */
31
+ export declare function EmptyState({ tone, icon, title, description, action, }: {
32
+ /** Colors the circled icon; `ok` = green ring for positive-empty. */
33
+ tone?: EmptyStateTone;
34
+ icon?: ReactNode;
35
+ title: string;
36
+ description?: string;
37
+ /** e.g. a `Button` ("Clear filter"). */
38
+ action?: ReactNode;
39
+ }): import("react").JSX.Element;
40
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAgB,EAChB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,MAAM,GACP,EAAE;IACD,qEAAqE;IACrE,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,+BAmBA"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { emptyStateIconDataTone, } from "./empty-state-classes.js";
3
+ /**
4
+ * The big-icon + title + dim-description block a modal shows when a list is
5
+ * empty or everything is fine ("All workflows passing"). Renders flat in the
6
+ * modal body — no card, no shadow of its own.
7
+ *
8
+ * Styled purely via host-provided `.silo-empty-state*` classes — no
9
+ * stylesheet import is needed in the extension.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <EmptyState
14
+ * tone="ok"
15
+ * icon={<CheckIcon />}
16
+ * title="All workflows passing"
17
+ * description="No failures or active runs on this repo."
18
+ * />
19
+ *
20
+ * <EmptyState
21
+ * icon={<SearchIcon />}
22
+ * title="No matching branches"
23
+ * description="Try a different filter."
24
+ * />
25
+ * ```
26
+ *
27
+ * @category Consumer Services
28
+ * @public
29
+ */
30
+ export function EmptyState({ tone = "neutral", icon, title, description, action, }) {
31
+ const dataTone = emptyStateIconDataTone(tone);
32
+ return (_jsxs("div", { className: "silo-empty-state", children: [icon != null && (_jsx("div", { className: "silo-empty-state-icon", ...(dataTone != null ? { "data-tone": dataTone } : {}), children: icon })), _jsx("div", { className: "silo-empty-state-title", children: title }), description != null && (_jsx("div", { className: "silo-empty-state-desc", children: description })), action] }));
33
+ }
34
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,sBAAsB,GAEvB,MAAM,uBAAuB,CAAC;AAI/B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,IAAI,GAAG,SAAS,EAChB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,MAAM,GASP;IACC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,aAC9B,IAAI,IAAI,IAAI,IAAI,CACf,cACE,SAAS,EAAC,uBAAuB,KAC7B,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAEtD,IAAI,GACD,CACP,EACD,cAAK,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAO,EACpD,WAAW,IAAI,IAAI,IAAI,CACtB,cAAK,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAO,CAC3D,EACA,MAAM,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from "react";
2
+ import { type IconButtonSize } from "./icon-button-classes.js";
3
+ export type { IconButtonSize };
4
+ /**
5
+ * A square icon-only button — the kit's one answer for ✕, ⋮, ↻, ✏️, and
6
+ * friends. `aria-label` is **required**: the icon is the only visual, so the
7
+ * label is the accessible name. Pair with {@link Tooltip} so sighted users
8
+ * get the same label on hover.
9
+ *
10
+ * Styled purely via host-provided `.silo-icon-button*` classes — no
11
+ * stylesheet import is needed in the extension.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <IconButton aria-label="Refresh" onClick={refresh}>
16
+ * <RefreshIcon />
17
+ * </IconButton>
18
+ *
19
+ * // compact — e.g. in a ListRow's trailing slot
20
+ * <IconButton size="sm" aria-label="Pin" onClick={pin}>
21
+ * <PinIcon />
22
+ * </IconButton>
23
+ * ```
24
+ *
25
+ * @category Consumer Services
26
+ * @public
27
+ */
28
+ export declare function IconButton({ size, className, type, children, "aria-label": ariaLabel, ...rest }: {
29
+ /** 32px standalone / 26px for tight or inline contexts. */
30
+ size?: IconButtonSize;
31
+ /** Required — the icon is the only visual. */
32
+ "aria-label": string;
33
+ children?: ReactNode;
34
+ } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "aria-label">): import("react").JSX.Element;
35
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../src/IconButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE7E,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAe,EACf,SAAS,EACT,IAAe,EACf,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,GAAG,IAAI,EACR,EAAE;IACD,2DAA2D;IAC3D,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,+BAY3E"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { iconButtonClass } from "./icon-button-classes.js";
3
+ /**
4
+ * A square icon-only button — the kit's one answer for ✕, ⋮, ↻, ✏️, and
5
+ * friends. `aria-label` is **required**: the icon is the only visual, so the
6
+ * label is the accessible name. Pair with {@link Tooltip} so sighted users
7
+ * get the same label on hover.
8
+ *
9
+ * Styled purely via host-provided `.silo-icon-button*` classes — no
10
+ * stylesheet import is needed in the extension.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <IconButton aria-label="Refresh" onClick={refresh}>
15
+ * <RefreshIcon />
16
+ * </IconButton>
17
+ *
18
+ * // compact — e.g. in a ListRow's trailing slot
19
+ * <IconButton size="sm" aria-label="Pin" onClick={pin}>
20
+ * <PinIcon />
21
+ * </IconButton>
22
+ * ```
23
+ *
24
+ * @category Consumer Services
25
+ * @public
26
+ */
27
+ export function IconButton({ size = "normal", className, type = "button", children, "aria-label": ariaLabel, ...rest }) {
28
+ const classes = iconButtonClass(size);
29
+ return (_jsx("button", { type: type, "aria-label": ariaLabel, className: className ? `${classes} ${className}` : classes, ...rest, children: children }));
30
+ }
31
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../src/IconButton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAuB,MAAM,uBAAuB,CAAC;AAI7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,IAAI,GAAG,QAAQ,EACf,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,GAAG,IAAI,EAOmE;IAC1E,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CACL,iBACE,IAAI,EAAE,IAAI,gBACE,SAAS,EACrB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,KACtD,IAAI,YAEP,QAAQ,GACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * Result of an {@link InlineEdit} `validate` callback.
4
+ *
5
+ * @category Core Types
6
+ * @public
7
+ */
8
+ export type InlineEditValidation = {
9
+ ok: true;
10
+ value: string;
11
+ } | {
12
+ ok: false;
13
+ error: string;
14
+ };
15
+ /**
16
+ * Click-to-edit a value in place — a static display with a pencil affordance
17
+ * that swaps to a field with explicit ✓ Save / ✗ Cancel buttons. Use it for
18
+ * values where committing an empty/invalid value would be visibly broken
19
+ * elsewhere; everything else in a modal should save as you type instead.
20
+ *
21
+ * **Escape is two-stage**: the first Esc cancels the edit; the next Esc
22
+ * closes the modal. The host coordinates this via the SDK's
23
+ * `setActiveInlineEditCancel` hook — do not add your own Escape handler.
24
+ *
25
+ * Styled purely via host-provided `.silo-inline-edit*` classes — no
26
+ * stylesheet import is needed in the extension.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <InlineEdit
31
+ * value={ws.name}
32
+ * onSave={(name) => ctx.workspaces.rename(ws.id, name)}
33
+ * validate={validateWorkspaceName}
34
+ * aria-label="Rename workspace"
35
+ * />
36
+ *
37
+ * <InlineEdit
38
+ * multiline
39
+ * value={description}
40
+ * onSave={setDescription}
41
+ * aria-label="Edit description"
42
+ * />
43
+ * ```
44
+ *
45
+ * @category Consumer Services
46
+ * @public
47
+ */
48
+ export declare function InlineEdit({ value, onSave, validate, multiline, "aria-label": ariaLabel, }: {
49
+ /** The committed value. */
50
+ value: string;
51
+ /**
52
+ * Called with the trimmed, validated value; not called if unchanged.
53
+ */
54
+ onSave: (value: string) => void;
55
+ /**
56
+ * Optional — failure shows the error inline and blocks the save.
57
+ */
58
+ validate?: (v: string) => InlineEditValidation;
59
+ /** Textarea-based editing. */
60
+ multiline?: boolean;
61
+ "aria-label": string;
62
+ }): ReactNode;
63
+ //# sourceMappingURL=InlineEdit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineEdit.d.ts","sourceRoot":"","sources":["../src/InlineEdit.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAWf;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAsDjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAiB,EACjB,YAAY,EAAE,SAAS,GACxB,EAAE;IACD,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,oBAAoB,CAAC;IAC/C,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,SAAS,CA8HZ"}