@hanzo/ui 8.27.15 → 8.27.16

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 (178) hide show
  1. package/NOTICE +19 -0
  2. package/dist/agents/Attachments.cjs +29 -0
  3. package/dist/agents/Attachments.d.ts +31 -0
  4. package/dist/agents/Attachments.d.ts.map +1 -0
  5. package/dist/agents/Attachments.js +27 -0
  6. package/dist/agents/Attachments.js.map +1 -0
  7. package/dist/agents/Choice.cjs +47 -0
  8. package/dist/agents/Choice.d.ts +34 -0
  9. package/dist/agents/Choice.d.ts.map +1 -0
  10. package/dist/agents/Choice.js +44 -0
  11. package/dist/agents/Choice.js.map +1 -0
  12. package/dist/agents/Console.cjs +106 -0
  13. package/dist/agents/Console.d.ts +54 -0
  14. package/dist/agents/Console.d.ts.map +1 -0
  15. package/dist/agents/Console.js +104 -0
  16. package/dist/agents/Console.js.map +1 -0
  17. package/dist/agents/Feedback.cjs +50 -0
  18. package/dist/agents/Feedback.d.ts +25 -0
  19. package/dist/agents/Feedback.d.ts.map +1 -0
  20. package/dist/agents/Feedback.js +48 -0
  21. package/dist/agents/Feedback.js.map +1 -0
  22. package/dist/agents/FileTabs.cjs +63 -0
  23. package/dist/agents/FileTabs.d.ts +45 -0
  24. package/dist/agents/FileTabs.d.ts.map +1 -0
  25. package/dist/agents/FileTabs.js +61 -0
  26. package/dist/agents/FileTabs.js.map +1 -0
  27. package/dist/agents/FileTree.cjs +160 -0
  28. package/dist/agents/FileTree.d.ts +41 -0
  29. package/dist/agents/FileTree.d.ts.map +1 -0
  30. package/dist/agents/FileTree.js +157 -0
  31. package/dist/agents/FileTree.js.map +1 -0
  32. package/dist/agents/PreviewFrame.cjs +108 -0
  33. package/dist/agents/PreviewFrame.d.ts +78 -0
  34. package/dist/agents/PreviewFrame.d.ts.map +1 -0
  35. package/dist/agents/PreviewFrame.js +105 -0
  36. package/dist/agents/PreviewFrame.js.map +1 -0
  37. package/dist/agents/Suggestions.cjs +29 -0
  38. package/dist/agents/Suggestions.d.ts +28 -0
  39. package/dist/agents/Suggestions.d.ts.map +1 -0
  40. package/dist/agents/Suggestions.js +26 -0
  41. package/dist/agents/Suggestions.js.map +1 -0
  42. package/dist/agents/Workspace.cjs +103 -0
  43. package/dist/agents/Workspace.d.ts +104 -0
  44. package/dist/agents/Workspace.d.ts.map +1 -0
  45. package/dist/agents/Workspace.js +98 -0
  46. package/dist/agents/Workspace.js.map +1 -0
  47. package/dist/agents/bridge.cjs +201 -0
  48. package/dist/agents/bridge.d.ts +102 -0
  49. package/dist/agents/bridge.d.ts.map +1 -0
  50. package/dist/agents/bridge.js +197 -0
  51. package/dist/agents/bridge.js.map +1 -0
  52. package/dist/agents/index.cjs +64 -1
  53. package/dist/agents/index.d.ts +23 -0
  54. package/dist/agents/index.d.ts.map +1 -1
  55. package/dist/agents/index.js +23 -0
  56. package/dist/agents/index.js.map +1 -1
  57. package/dist/agents/log.cjs +75 -0
  58. package/dist/agents/log.d.ts +58 -0
  59. package/dist/agents/log.d.ts.map +1 -0
  60. package/dist/agents/log.js +65 -0
  61. package/dist/agents/log.js.map +1 -0
  62. package/dist/agents/tree.cjs +238 -0
  63. package/dist/agents/tree.d.ts +99 -0
  64. package/dist/agents/tree.d.ts.map +1 -0
  65. package/dist/agents/tree.js +226 -0
  66. package/dist/agents/tree.js.map +1 -0
  67. package/dist/backends/gui/3d-card.d.ts +6 -6
  68. package/dist/backends/gui/3d-marquee.d.ts +7 -8
  69. package/dist/backends/gui/3d-marquee.d.ts.map +1 -1
  70. package/dist/backends/gui/3d-pin.d.ts +1 -1
  71. package/dist/backends/gui/alert.d.ts +3 -3
  72. package/dist/backends/gui/android.d.ts +1 -1
  73. package/dist/backends/gui/animated-testimonials.d.ts +1 -1
  74. package/dist/backends/gui/animated-tooltip.d.ts +1 -1
  75. package/dist/backends/gui/announcement.d.ts +1 -1
  76. package/dist/backends/gui/banner.d.ts +1 -1
  77. package/dist/backends/gui/button.d.ts +1 -1
  78. package/dist/backends/gui/card.d.ts +7 -7
  79. package/dist/backends/gui/code-editor.cjs +2 -2
  80. package/dist/backends/gui/code-editor.d.ts +7 -1
  81. package/dist/backends/gui/code-editor.d.ts.map +1 -1
  82. package/dist/backends/gui/code-editor.js +2 -2
  83. package/dist/backends/gui/code-editor.js.map +1 -1
  84. package/dist/backends/gui/command.d.ts +5 -5
  85. package/dist/backends/gui/command.d.ts.map +1 -1
  86. package/dist/backends/gui/context-menu.d.ts +14 -14
  87. package/dist/backends/gui/context-menu.d.ts.map +1 -1
  88. package/dist/backends/gui/credit-card.d.ts +1 -1
  89. package/dist/backends/gui/desktop.d.ts +1 -1
  90. package/dist/backends/gui/dock.d.ts +3 -3
  91. package/dist/backends/gui/dropdown-menu.d.ts +16 -16
  92. package/dist/backends/gui/dropdown-menu.d.ts.map +1 -1
  93. package/dist/backends/gui/empty.d.ts +6 -6
  94. package/dist/backends/gui/field.d.ts +3 -3
  95. package/dist/backends/gui/gantt.d.ts +1 -1
  96. package/dist/backends/gui/grid-pattern.d.ts +1 -2
  97. package/dist/backends/gui/grid-pattern.d.ts.map +1 -1
  98. package/dist/backends/gui/image-zoom.d.ts +1 -1
  99. package/dist/backends/gui/iphone-15-pro.d.ts +1 -1
  100. package/dist/backends/gui/item.d.ts +9 -9
  101. package/dist/backends/gui/list.d.ts +2 -2
  102. package/dist/backends/gui/macos-dock.d.ts +2 -2
  103. package/dist/backends/gui/magnetic.d.ts +1 -1
  104. package/dist/backends/gui/marquee.d.ts +1 -15
  105. package/dist/backends/gui/marquee.d.ts.map +1 -1
  106. package/dist/backends/gui/menu-dock.d.ts +1 -1
  107. package/dist/backends/gui/menubar.d.ts +15 -15
  108. package/dist/backends/gui/menubar.d.ts.map +1 -1
  109. package/dist/backends/gui/message-dock.d.ts +1 -1
  110. package/dist/backends/gui/motion-highlight.d.ts +1 -12
  111. package/dist/backends/gui/motion-highlight.d.ts.map +1 -1
  112. package/dist/backends/gui/pagination.d.ts +4 -4
  113. package/dist/backends/gui/qr-code.d.ts +1 -2
  114. package/dist/backends/gui/qr-code.d.ts.map +1 -1
  115. package/dist/backends/gui/scroll-area.d.ts +3 -14
  116. package/dist/backends/gui/scroll-area.d.ts.map +1 -1
  117. package/dist/backends/gui/sheet.d.ts +3 -3
  118. package/dist/backends/gui/sheet.d.ts.map +1 -1
  119. package/dist/backends/gui/status.d.ts +1 -1
  120. package/dist/backends/gui/table.d.ts +8 -8
  121. package/dist/backends/gui/toaster.d.ts +1 -15
  122. package/dist/backends/gui/toaster.d.ts.map +1 -1
  123. package/dist/backends/gui/toggle.d.ts +1 -1
  124. package/dist/backends/gui/video-player.d.ts +1 -1
  125. package/dist/chat/Composer.cjs +60 -9
  126. package/dist/chat/Composer.d.ts +42 -2
  127. package/dist/chat/Composer.d.ts.map +1 -1
  128. package/dist/chat/Composer.js +61 -11
  129. package/dist/chat/Composer.js.map +1 -1
  130. package/dist/chat/EmptyPrompt.cjs +27 -0
  131. package/dist/chat/EmptyPrompt.d.ts +30 -0
  132. package/dist/chat/EmptyPrompt.d.ts.map +1 -0
  133. package/dist/chat/EmptyPrompt.js +24 -0
  134. package/dist/chat/EmptyPrompt.js.map +1 -0
  135. package/dist/chat/SessionRail.cjs +97 -0
  136. package/dist/chat/SessionRail.d.ts +97 -0
  137. package/dist/chat/SessionRail.d.ts.map +1 -0
  138. package/dist/chat/SessionRail.js +94 -0
  139. package/dist/chat/SessionRail.js.map +1 -0
  140. package/dist/chat/Thread.d.ts +2 -8
  141. package/dist/chat/Thread.d.ts.map +1 -1
  142. package/dist/chat/index.cjs +8 -1
  143. package/dist/chat/index.d.ts +3 -1
  144. package/dist/chat/index.d.ts.map +1 -1
  145. package/dist/chat/index.js +3 -1
  146. package/dist/chat/index.js.map +1 -1
  147. package/dist/gallery.cjs +28 -1
  148. package/dist/gallery.d.ts.map +1 -1
  149. package/dist/gallery.html +71 -3
  150. package/dist/gallery.js +30 -3
  151. package/dist/gallery.js.map +1 -1
  152. package/dist/product/BranchSelect.cjs +27 -0
  153. package/dist/product/BranchSelect.d.ts +27 -0
  154. package/dist/product/BranchSelect.d.ts.map +1 -0
  155. package/dist/product/BranchSelect.js +23 -0
  156. package/dist/product/BranchSelect.js.map +1 -0
  157. package/dist/product/ChipSelect.cjs +267 -0
  158. package/dist/product/ChipSelect.d.ts +71 -0
  159. package/dist/product/ChipSelect.d.ts.map +1 -0
  160. package/dist/product/ChipSelect.js +265 -0
  161. package/dist/product/ChipSelect.js.map +1 -0
  162. package/dist/product/RepoSelect.cjs +75 -0
  163. package/dist/product/RepoSelect.d.ts +63 -0
  164. package/dist/product/RepoSelect.d.ts.map +1 -0
  165. package/dist/product/RepoSelect.js +69 -0
  166. package/dist/product/RepoSelect.js.map +1 -0
  167. package/dist/product/chipSelect.logic.cjs +147 -0
  168. package/dist/product/chipSelect.logic.d.ts +92 -0
  169. package/dist/product/chipSelect.logic.d.ts.map +1 -0
  170. package/dist/product/chipSelect.logic.js +138 -0
  171. package/dist/product/chipSelect.logic.js.map +1 -0
  172. package/dist/product/index.cjs +23 -1
  173. package/dist/product/index.d.ts +4 -0
  174. package/dist/product/index.d.ts.map +1 -1
  175. package/dist/product/index.js +7 -0
  176. package/dist/product/index.js.map +1 -1
  177. package/dist/styles.css +68 -0
  178. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChipSelect.d.ts","sourceRoot":"","sources":["../../src/product/ChipSelect.tsx"],"names":[],"mappings":"AA4BA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAId,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEd,MAAM,oBAAoB,CAAA;AAE3B,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEtE,4EAA4E;AAC5E,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAA;AAEtG,oFAAoF;AACpF,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,QAAQ;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC1B,qDAAqD;IACrD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,QAAQ;IACjD,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC3B,oDAAoD;IACpD,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB,qCAAqC;IACrC,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,CAAA;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,SAAS,CAAA;IACf;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACtB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC;AA8FD,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAAE,EAC7C,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,MAAa,EACb,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,IAAI,EAAE,OAAe,EACrB,MAAM,EACN,OAAO,EAAE,WAAmB,EAC5B,KAAK,EAAE,SAAgB,EACvB,KAAW,EACX,WAAuB,EACvB,KAAqB,EACrB,MAAM,EACN,GAAG,EACH,MAAM,EACN,SAAuB,EACvB,KAAW,EACX,MAAY,EACZ,QAAgB,EAChB,KAAa,EACb,IAAI,EAAE,QAAQ,EACd,YAAY,GACb,EAAE,eAAe,CAAC,CAAC,CAAC,+BAoZpB"}
@@ -0,0 +1,265 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * ChipSelect — a small chip that opens a searchable list, UPWARD by default.
5
+ *
6
+ * The shape a composer's context row needs: `☁ Default` · `</> cloud` ·
7
+ * `⑂ main`, each a chip, each a choice over a list too long to show whole.
8
+ * The panel opens above the chip (a composer sits at the bottom of the pane),
9
+ * the chosen row is pinned first with a check, the list scrolls, a footer can
10
+ * explain what is missing, and the search sits at the BOTTOM — next to the chip
11
+ * the reader just pressed, which is where their eyes already are.
12
+ *
13
+ * DATA IS A LOADER OR A LIST, NEVER AN API. `load(q, after)` answers one page at
14
+ * a time and the component pages it: a debounced search starts over, reaching
15
+ * the end of the list asks for the page after. Or `items` is the whole list and
16
+ * the search is applied here. Nothing in this file knows what a repository is.
17
+ *
18
+ * The pieces with the rules in them — paging, pinning, the cursor — are pure and
19
+ * live in `chipSelect.logic.ts`, tested without a DOM. Portalling, dismissal
20
+ * and focus trapping are the package `Popover`'s, not reimplemented here.
21
+ *
22
+ * ARIA: the chip is a button that opens a listbox; the search field is the
23
+ * combobox and owns the cursor through `aria-activedescendant`, so focus never
24
+ * leaves the field while the arrow keys move through the rows. `aria-selected`
25
+ * marks the chosen row. Closing returns focus to the chip.
26
+ */
27
+ import { Input as GuiInput, ScrollView, SizableText, XStack, YStack } from '@hanzo/gui';
28
+ import { Check, Search } from '@hanzogui/lucide-icons-2';
29
+ import { useCallback, useEffect, useId, useMemo, useRef, useState, } from 'react';
30
+ import { Popover, PopoverContent, PopoverTrigger } from '../backends/gui/popover.js';
31
+ import { slot, tip } from '../backends/gui/slot.js';
32
+ import { frame, merge, move, narrow, near, pin, wants, } from './chipSelect.logic.js';
33
+ /** One row's height, px — a line of 13px type with room to breathe. */
34
+ const ROW_H = 24;
35
+ /** The chip: 24px, a hairline, the raised fill. */
36
+ const CHIP_H = 24;
37
+ /** The keyboard focus ring every control in the package draws. */
38
+ const RING = { outlineColor: '$outlineColor', outlineWidth: 2, outlineStyle: 'solid' };
39
+ const MOVES = new Set(['ArrowDown', 'ArrowUp', 'Home', 'End', 'PageDown', 'PageUp']);
40
+ /** Text a keystroke types, or null for a key that types nothing. */
41
+ const typed = (e) => e.key && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey ? e.key : null;
42
+ /**
43
+ * Pages of a loader, for one search at a time.
44
+ *
45
+ * Every request carries the search generation it was made for, and an answer
46
+ * for any older generation is dropped — so a slow page for "clo" can never land
47
+ * under the results for "cloud".
48
+ */
49
+ function usePages(load, q, delay, on) {
50
+ const [state, setState] = useState({ rows: [], next: null, loading: false, error: null });
51
+ const generation = useRef(0);
52
+ const busy = useRef(false);
53
+ // The loader is read at call time, not taken as a dependency: a host that
54
+ // passes an inline function hands over a new one every render, and keying the
55
+ // fetch on its identity would refetch on every render.
56
+ const loader = useRef(load);
57
+ loader.current = load;
58
+ const search = useRef(q);
59
+ search.current = q;
60
+ const fetch = useCallback((after, gen) => {
61
+ const read = loader.current;
62
+ if (!read)
63
+ return;
64
+ busy.current = true;
65
+ setState((s) => ({ ...s, loading: true, error: null }));
66
+ read(search.current, after).then((page) => {
67
+ if (gen !== generation.current)
68
+ return;
69
+ busy.current = false;
70
+ setState((s) => ({
71
+ rows: after ? merge(s.rows, page.items) : merge([], page.items),
72
+ next: page.next ?? null,
73
+ loading: false,
74
+ error: null,
75
+ }));
76
+ }, (err) => {
77
+ if (gen !== generation.current)
78
+ return;
79
+ busy.current = false;
80
+ setState((s) => ({
81
+ ...s,
82
+ loading: false,
83
+ error: err instanceof Error && err.message ? err.message : 'Could not load the list.',
84
+ }));
85
+ });
86
+ }, []);
87
+ const live = Boolean(load);
88
+ // A new search, or opening: start over after the debounce. The first page of
89
+ // an empty search is asked for at once — there is nothing typed to wait for.
90
+ useEffect(() => {
91
+ if (!on || !live)
92
+ return;
93
+ const gen = ++generation.current;
94
+ busy.current = false;
95
+ const wait = q.trim() ? delay : 0;
96
+ const timer = setTimeout(() => fetch(null, gen), wait);
97
+ return () => clearTimeout(timer);
98
+ }, [on, live, q, delay, fetch]);
99
+ const more = useCallback(() => {
100
+ if (busy.current || !state.next)
101
+ return;
102
+ fetch(state.next, generation.current);
103
+ }, [fetch, state.next]);
104
+ const retry = useCallback(() => fetch(null, ++generation.current), [fetch]);
105
+ return { ...state, more, retry };
106
+ }
107
+ export function ChipSelect({ label, icon, name, chosen = null, onChange, load, items, more: hasMore = false, onMore, loading: loadingProp = false, error: errorProp = null, delay = 200, placeholder = 'Search…', empty = 'No matches.', footer, cta, action, placement = 'top-start', width = 320, height = 276, disabled = false, quiet = false, open: openProp, onOpenChange, }) {
108
+ const [own, setOwn] = useState(false);
109
+ const open = openProp ?? own;
110
+ const setOpen = useCallback((next) => {
111
+ if (openProp === undefined)
112
+ setOwn(next);
113
+ onOpenChange?.(next);
114
+ }, [openProp, onOpenChange]);
115
+ const [q, setQ] = useState('');
116
+ const [at, setAt] = useState(-1);
117
+ const chip = useRef(null);
118
+ const field = useRef(null);
119
+ const list = useRef(null);
120
+ const id = useId();
121
+ const listId = `${id}-list`;
122
+ const hintId = `${id}-hint`;
123
+ const optionId = (i) => `${id}-opt-${i}`;
124
+ const pages = usePages(load, q, delay, open);
125
+ // Sized once per open, from what is known then — see `frame`.
126
+ const [tall, setTall] = useState(height);
127
+ useEffect(() => {
128
+ if (open)
129
+ setTall(frame({ pending: Boolean(load) || loadingProp, count: (items?.length ?? 0) + (chosen ? 1 : 0), row: ROW_H, ceiling: height }));
130
+ // Only at open: a panel that resized while open would leave its placement.
131
+ // eslint-disable-next-line react-hooks/exhaustive-deps
132
+ }, [open]);
133
+ // What is drawn: the loader's rows as answered, or the given list narrowed
134
+ // here — then the chosen row pinned on top while the search could match it.
135
+ const rows = useMemo(() => {
136
+ const base = load ? pages.rows : narrow(items ?? [], q);
137
+ return pin(base, chosen, q);
138
+ }, [load, pages.rows, items, q, chosen]);
139
+ const next = load ? pages.next : hasMore ? 'more' : null;
140
+ const loading = load ? pages.loading : loadingProp;
141
+ const error = load ? pages.error : errorProp;
142
+ const askMore = load ? pages.more : () => onMore?.();
143
+ // Opening lands the cursor on the chosen row (pinned at 0) or the first one.
144
+ useEffect(() => {
145
+ if (open)
146
+ setAt(rows.length ? 0 : -1);
147
+ // Only on open and on a new search — never as rows page in under the cursor.
148
+ // eslint-disable-next-line react-hooks/exhaustive-deps
149
+ }, [open, q]);
150
+ // A loader's first page arrives after the open: the cursor lands on its first
151
+ // row then, or Enter would have nothing under it.
152
+ useEffect(() => {
153
+ if (open && at < 0 && rows.length)
154
+ setAt(0);
155
+ }, [open, at, rows.length]);
156
+ // A closed panel forgets its search, so the next open starts from the top.
157
+ useEffect(() => {
158
+ if (!open)
159
+ setQ('');
160
+ }, [open]);
161
+ // Keep the row under the cursor in view as it moves.
162
+ useEffect(() => {
163
+ if (!open || at < 0)
164
+ return;
165
+ const el = typeof document !== 'undefined' ? document.getElementById(optionId(at)) : null;
166
+ el?.scrollIntoView?.({ block: 'nearest' });
167
+ // eslint-disable-next-line react-hooks/exhaustive-deps
168
+ }, [at, open]);
169
+ const close = useCallback(() => {
170
+ setOpen(false);
171
+ // Back to the chip the panel came from, so the keyboard is where it was.
172
+ queueMicrotask(() => chip.current?.focus?.());
173
+ }, [setOpen]);
174
+ const choose = useCallback((item) => {
175
+ if (!item || item.disabled)
176
+ return;
177
+ onChange(item);
178
+ close();
179
+ }, [onChange, close]);
180
+ const onField = (e) => {
181
+ const key = e?.key;
182
+ if (MOVES.has(key)) {
183
+ // Home and End belong to the caret while there is text to move through.
184
+ if ((key === 'Home' || key === 'End') && q)
185
+ return;
186
+ e.preventDefault?.();
187
+ const to = move(key, at, rows.length, (i) => Boolean(rows[i]?.disabled));
188
+ setAt(to);
189
+ if (wants({ next, loading, at: to, count: rows.length }))
190
+ askMore();
191
+ return;
192
+ }
193
+ if (key === 'Enter') {
194
+ e.preventDefault?.();
195
+ const item = rows[at];
196
+ if (!item)
197
+ return;
198
+ if ((e.ctrlKey || e.metaKey) && action && (!action.when || action.when(item))) {
199
+ action.onPress(item);
200
+ close();
201
+ return;
202
+ }
203
+ choose(item);
204
+ return;
205
+ }
206
+ if (key === 'Escape') {
207
+ e.preventDefault?.();
208
+ close();
209
+ }
210
+ };
211
+ const onChip = (e) => {
212
+ if (disabled)
213
+ return;
214
+ const key = e?.key;
215
+ if (key === 'Enter' || key === ' ' || key === 'ArrowUp' || key === 'ArrowDown') {
216
+ e.preventDefault?.();
217
+ setOpen(!open || key === 'ArrowUp' || key === 'ArrowDown');
218
+ return;
219
+ }
220
+ // Typing on the chip is typing into the search: open and carry the key.
221
+ const ch = typed(e);
222
+ if (ch && !open) {
223
+ e.preventDefault?.();
224
+ setOpen(true);
225
+ setQ(ch);
226
+ }
227
+ };
228
+ const onScroll = (e) => {
229
+ const n = e?.nativeEvent;
230
+ const top = n?.contentOffset?.y ?? 0;
231
+ const box = n?.layoutMeasurement?.height ?? 0;
232
+ const content = n?.contentSize?.height ?? 0;
233
+ if (next && !loading && near(top, box, content))
234
+ askMore();
235
+ };
236
+ const shown = (item) => Boolean(action && (!action.when || action.when(item)));
237
+ return (_jsxs(Popover, { open: open, onOpenChange: (v) => (v ? setOpen(true) : close()), placement: placement, allowFlip: true, stayInFrame: true, children: [_jsx(PopoverTrigger, { asChild: true, disabled: disabled, children: _jsxs(XStack, { ref: chip, ...slot('chip-select'), ...tip(name), role: "button", tabIndex: disabled ? -1 : 0, "aria-label": `${name}: ${label}`, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listId : undefined, "aria-disabled": disabled || undefined, height: CHIP_H, px: "$2", gap: "$1.5", items: "center", shrink: 0, rounded: "$2", borderWidth: quiet ? 0 : 1, borderColor: "$borderColor", bg: quiet ? 'transparent' : '$raised', cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : quiet ? { bg: '$hover' } : { borderColor: '$rim' }, pressStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: RING,
238
+ // The chip is a small target by design; the hit area is not.
239
+ hitSlop: { top: 10, bottom: 10, left: 4, right: 4 }, onKeyDown: onChip, children: [icon ? (_jsx(XStack, { shrink: 0, items: "center", "aria-hidden": true, children: icon })) : null, _jsx(SizableText, { size: "$2", color: quiet ? '$quiet' : '$ink', numberOfLines: 1, maxW: 200, children: label })] }) }), _jsxs(PopoverContent, { ...slot('chip-select-panel'), sideOffset: 8, width: width, maxW: "92vw", p: "$1", gap: "$0",
240
+ // Gui's popover content centres its children; a list and a field span
241
+ // the panel.
242
+ items: "stretch", bg: "$hover", borderColor: "$rim", rounded: "$3", elevation: "$4", trapFocus: true, onOpenAutoFocus: (e) => {
243
+ // The search field, not the first focusable thing in the panel — which
244
+ // would be a footer link.
245
+ e.preventDefault();
246
+ field.current?.focus();
247
+ }, onCloseAutoFocus: (e) => {
248
+ e.preventDefault();
249
+ chip.current?.focus?.();
250
+ }, children: [cta ? (_jsx(YStack, { ...slot('chip-select-cta'), px: "$2", py: "$2", children: cta })) : null, _jsxs(ScrollView, { ref: list, height: tall, showsVerticalScrollIndicator: true, scrollEventThrottle: 64, onScroll: onScroll, children: [_jsx(YStack, { ...slot('chip-select-list'), id: listId, role: "listbox", "aria-label": name, gap: "$0", children: rows.map((item, i) => {
251
+ const on = i === at;
252
+ const picked = chosen?.id === item.id;
253
+ return (_jsxs(XStack, { ...slot('chip-select-option'), id: optionId(i), role: "option", "aria-selected": picked, "aria-disabled": item.disabled || undefined, "aria-describedby": action && shown(item) ? hintId : undefined, height: ROW_H, px: "$2", gap: "$2", items: "center", rounded: "$2", cursor: item.disabled ? 'default' : 'pointer', opacity: item.disabled ? 0.5 : 1, bg: on ? '$raised' : 'transparent', onHoverIn: () => setAt(i), onPress: () => choose(item), children: [_jsx(SizableText, { size: "$2", color: "$ink", numberOfLines: 1, flex: 1, minW: 0, children: item.label }), item.hint ? (_jsx(SizableText, { size: "$1", color: "$soft", numberOfLines: 1, shrink: 0, children: item.hint })) : null, action && on && shown(item) ? (_jsx(XStack, { ...slot('chip-select-action'), "aria-hidden": true, px: "$1.5", height: 18, items: "center", rounded: "$2", borderWidth: 1, borderColor: "$rim", shrink: 0, hoverStyle: { bg: '$hover' }, onPress: (e) => {
254
+ e?.stopPropagation?.();
255
+ action.onPress(item);
256
+ close();
257
+ }, children: _jsx(SizableText, { size: "$1", color: "$quiet", children: action.label }) })) : null, picked ? _jsx(Check, { size: 14, color: "$ink", "aria-hidden": true }) : null] }, item.id));
258
+ }) }), error ? (_jsxs(XStack, { ...slot('chip-select-error'), px: "$2", py: "$1.5", gap: "$2", items: "center", role: "alert", children: [_jsx(SizableText, { size: "$2", color: "$bad", flex: 1, children: error }), load ? (_jsx(SizableText, { size: "$2", color: "$ink", textDecorationLine: "underline", cursor: "pointer", role: "button", tabIndex: 0, onPress: pages.retry, onKeyDown: (e) => {
259
+ if (e?.key !== 'Enter' && e?.key !== ' ')
260
+ return;
261
+ e.preventDefault?.();
262
+ pages.retry();
263
+ }, children: "Retry" })) : null] })) : loading ? (_jsx(XStack, { ...slot('chip-select-loading'), px: "$2", height: ROW_H, items: "center", role: "status", children: _jsx(SizableText, { size: "$2", color: "$soft", children: rows.length ? 'Loading more…' : 'Loading…' }) })) : rows.length === 0 ? (_jsx(XStack, { ...slot('chip-select-empty'), px: "$2", py: "$1.5", items: "center", role: "status", children: typeof empty === 'string' ? (_jsx(SizableText, { size: "$2", color: "$soft", children: empty })) : (empty) })) : null] }), action ? (_jsx(SizableText, { id: hintId, position: "absolute", width: 1, height: 1, overflow: "hidden", opacity: 0, children: `Ctrl+Enter: ${action.label}` })) : null, footer ? (_jsx(YStack, { ...slot('chip-select-footer'), mx: -4, mt: "$1", px: "$3", py: "$2", gap: "$0.5", borderTopWidth: 1, borderColor: "$borderColor", children: footer })) : null, _jsxs(XStack, { ...slot('chip-select-search'), mt: "$1", height: 26, px: "$2", gap: "$1.5", items: "center", rounded: "$2", borderWidth: 1, borderColor: "$rim", bg: "$background", focusWithinStyle: { borderColor: '$outlineColor' }, children: [_jsx(Search, { size: 12, color: "$soft", "aria-hidden": true }), _jsx(GuiInput, { ref: field, ...slot('chip-select-input'), unstyled: true, flex: 1, minW: 0, height: 24, p: 0, borderWidth: 0, bg: "transparent", fontSize: "$2", color: "$ink", placeholderTextColor: "$soft", placeholder: placeholder, value: q, onChangeText: setQ, role: "combobox", "aria-label": placeholder, "aria-expanded": open, "aria-controls": listId, "aria-autocomplete": "list", "aria-activedescendant": at >= 0 && rows[at] ? optionId(at) : undefined, autoComplete: "off", spellCheck: false, onKeyDown: onField })] })] })] }));
264
+ }
265
+ //# sourceMappingURL=ChipSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChipSelect.js","sourceRoot":"","sources":["../../src/product/ChipSelect.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.followable = exports.address = void 0;
5
+ exports.FooterLink = FooterLink;
6
+ exports.RepoSelect = RepoSelect;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ /**
9
+ * RepoSelect — which repository a run works in, as a composer chip.
10
+ *
11
+ * A `ChipSelect` over `owner/name`, and nothing more: the rows come from the
12
+ * host's loader, the troubleshooting link is the host's, and the "connect"
13
+ * prompt is the host's to show. There is no git host baked in here — the same
14
+ * chip lists GitHub, a forge, or anything that can answer "repositories
15
+ * matching this, after that cursor".
16
+ *
17
+ * The chip shows the short name (`cloud`), the list shows the whole address
18
+ * (`hanzo-inc/cloud`), because on the chip the context is already the
19
+ * composer and in the list two owners can share a name.
20
+ */
21
+ const gui_1 = require("@hanzo/gui");
22
+ const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
23
+ const react_1 = require("react");
24
+ const ChipSelect_1 = require("./ChipSelect.cjs");
25
+ /** `owner/name`, from whichever the host has. */
26
+ const address = (repo) => repo.full_name || `${repo.owner}/${repo.name}`;
27
+ exports.address = address;
28
+ const item = (repo) => ({
29
+ id: (0, exports.address)(repo),
30
+ label: (0, exports.address)(repo),
31
+ hint: repo.private ? 'private' : undefined,
32
+ repo,
33
+ });
34
+ /**
35
+ * Whether an address may be followed from here: a path on this origin, or
36
+ * http(s). A `javascript:` or `data:` address handed in as "where to
37
+ * troubleshoot" would run in the page, so it is not drawn as a link at all.
38
+ */
39
+ const followable = (href) => !/[\s\u0000-\u001f\u007f\\]/.test(href) && (/^\/(?![\/\\])/.test(href) || /^https?:\/\//i.test(href));
40
+ exports.followable = followable;
41
+ /** A link in the footer: underlined, quiet, and a real control either way. */
42
+ function FooterLink({ label, href, onPress }) {
43
+ const link = href && (0, exports.followable)(href) ? href : undefined;
44
+ if (!link && !onPress)
45
+ return null;
46
+ return ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { 'data-slot': 'chip-select-link', size: "$1", color: "$soft", textDecorationLine: "underline", cursor: "pointer", hoverStyle: { color: '$ink' }, ...(link
47
+ ? // A real anchor: it opens in a new tab on a middle click, it is
48
+ // announced as a link, and Enter follows it with no handler here.
49
+ { render: 'a', href: link, onPress }
50
+ : {
51
+ role: 'link',
52
+ tabIndex: 0,
53
+ onPress,
54
+ onKeyDown: (e) => {
55
+ if (e?.key !== 'Enter')
56
+ return;
57
+ e.preventDefault?.();
58
+ onPress?.();
59
+ },
60
+ }), children: label }));
61
+ }
62
+ function RepoSelect({ value = null, onChange, load, troubleshoot, note = 'Not all repositories are shown. Type to search.', connect, action, placeholder = 'Repository', placement, disabled, open, onOpenChange, }) {
63
+ const pages = (0, react_1.useCallback)(async (q, after) => {
64
+ const page = await load(q, after);
65
+ return { items: page.repos.map(item), next: page.next ?? null };
66
+ }, [load]);
67
+ const act = action
68
+ ? {
69
+ label: action.label,
70
+ onPress: (i) => action.onPress(i.repo),
71
+ when: action.when ? (i) => action.when(i.repo) : undefined,
72
+ }
73
+ : undefined;
74
+ return ((0, jsx_runtime_1.jsx)(ChipSelect_1.ChipSelect, { name: "Repository", icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Code, { size: 12, color: "$soft" }), label: value ? value.name : placeholder, chosen: value ? item(value) : null, onChange: (i) => onChange(i.repo), load: pages, placeholder: "Search repositories\u2026", empty: "No repositories match.", cta: connect, action: act, placement: placement, disabled: disabled, open: open, onOpenChange: onOpenChange, footer: note || troubleshoot ? ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$0.5", children: [note ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$soft", children: note })) : null, troubleshoot ? (0, jsx_runtime_1.jsx)(FooterLink, { ...troubleshoot }) : null] })) : undefined }));
75
+ }
@@ -0,0 +1,63 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type ChipPlacement } from './ChipSelect.js';
3
+ import type { ChipItem } from './chipSelect.logic.js';
4
+ /** A repository, in the fields a chooser needs. Hosts pass their own rows. */
5
+ export interface Repo {
6
+ owner: string;
7
+ name: string;
8
+ /** `owner/name`, when the host already has it. */
9
+ full_name?: string;
10
+ private?: boolean;
11
+ default_branch?: string;
12
+ }
13
+ /** A repository as the list carries it: keyed by its address, labelled with it. */
14
+ export type RepoItem = ChipItem & {
15
+ repo: Repo;
16
+ };
17
+ /** One page of repositories — the host's API, in the shape the chip reads. */
18
+ export type RepoLoad = (q: string, after?: string | null) => Promise<{
19
+ repos: Repo[];
20
+ next?: string | null;
21
+ }>;
22
+ /** A link out of the panel: an address, or a press the host handles. */
23
+ export interface RepoLink {
24
+ label: string;
25
+ href?: string;
26
+ onPress?: () => void;
27
+ }
28
+ export interface RepoSelectProps {
29
+ /** The chosen repository. */
30
+ value?: Repo | null;
31
+ onChange: (repo: Repo) => void;
32
+ load: RepoLoad;
33
+ /** "Troubleshoot GitHub connection" — where to go when a repository is missing. */
34
+ troubleshoot?: RepoLink;
35
+ /** Why the list is partial. Say it plainly; it is the first thing read under the list. */
36
+ note?: string;
37
+ /** Shown above the list — e.g. a "Connect GitHub" button while nothing is connected. */
38
+ connect?: ReactNode;
39
+ /** A second thing a row can do — "Add to project". */
40
+ action?: {
41
+ label: string;
42
+ onPress: (repo: Repo) => void;
43
+ when?: (repo: Repo) => boolean;
44
+ };
45
+ /** The chip's text with nothing chosen. */
46
+ placeholder?: string;
47
+ placement?: ChipPlacement;
48
+ disabled?: boolean;
49
+ open?: boolean;
50
+ onOpenChange?: (open: boolean) => void;
51
+ }
52
+ /** `owner/name`, from whichever the host has. */
53
+ export declare const address: (repo: Repo) => string;
54
+ /**
55
+ * Whether an address may be followed from here: a path on this origin, or
56
+ * http(s). A `javascript:` or `data:` address handed in as "where to
57
+ * troubleshoot" would run in the page, so it is not drawn as a link at all.
58
+ */
59
+ export declare const followable: (href: string) => boolean;
60
+ /** A link in the footer: underlined, quiet, and a real control either way. */
61
+ export declare function FooterLink({ label, href, onPress }: RepoLink): import("react").JSX.Element | null;
62
+ export declare function RepoSelect({ value, onChange, load, troubleshoot, note, connect, action, placeholder, placement, disabled, open, onOpenChange, }: RepoSelectProps): import("react").JSX.Element;
63
+ //# sourceMappingURL=RepoSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepoSelect.d.ts","sourceRoot":"","sources":["../../src/product/RepoSelect.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,oBAAoB,CAAA;AAE5D,8EAA8E;AAC9E,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AAEhD,8EAA8E;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAA;AAE7G,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,mFAAmF;IACnF,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wFAAwF;IACxF,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAA;KAAE,CAAA;IACzF,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC;AAED,iDAAiD;AACjD,eAAO,MAAM,OAAO,SAAU,IAAI,KAAG,MAAwD,CAAA;AAS7F;;;;GAIG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,OAC6D,CAAA;AAEvG,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,sCA6B5D;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAY,EACZ,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,IAAwD,EACxD,OAAO,EACP,MAAM,EACN,WAA0B,EAC1B,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,YAAY,GACb,EAAE,eAAe,+BA+CjB"}
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * RepoSelect — which repository a run works in, as a composer chip.
5
+ *
6
+ * A `ChipSelect` over `owner/name`, and nothing more: the rows come from the
7
+ * host's loader, the troubleshooting link is the host's, and the "connect"
8
+ * prompt is the host's to show. There is no git host baked in here — the same
9
+ * chip lists GitHub, a forge, or anything that can answer "repositories
10
+ * matching this, after that cursor".
11
+ *
12
+ * The chip shows the short name (`cloud`), the list shows the whole address
13
+ * (`hanzo-inc/cloud`), because on the chip the context is already the
14
+ * composer and in the list two owners can share a name.
15
+ */
16
+ import { SizableText, YStack } from '@hanzo/gui';
17
+ import { Code } from '@hanzogui/lucide-icons-2';
18
+ import { useCallback } from 'react';
19
+ import { ChipSelect } from './ChipSelect.js';
20
+ /** `owner/name`, from whichever the host has. */
21
+ export const address = (repo) => repo.full_name || `${repo.owner}/${repo.name}`;
22
+ const item = (repo) => ({
23
+ id: address(repo),
24
+ label: address(repo),
25
+ hint: repo.private ? 'private' : undefined,
26
+ repo,
27
+ });
28
+ /**
29
+ * Whether an address may be followed from here: a path on this origin, or
30
+ * http(s). A `javascript:` or `data:` address handed in as "where to
31
+ * troubleshoot" would run in the page, so it is not drawn as a link at all.
32
+ */
33
+ export const followable = (href) => !/[\s\u0000-\u001f\u007f\\]/.test(href) && (/^\/(?![\/\\])/.test(href) || /^https?:\/\//i.test(href));
34
+ /** A link in the footer: underlined, quiet, and a real control either way. */
35
+ export function FooterLink({ label, href, onPress }) {
36
+ const link = href && followable(href) ? href : undefined;
37
+ if (!link && !onPress)
38
+ return null;
39
+ return (_jsx(SizableText, { 'data-slot': 'chip-select-link', size: "$1", color: "$soft", textDecorationLine: "underline", cursor: "pointer", hoverStyle: { color: '$ink' }, ...(link
40
+ ? // A real anchor: it opens in a new tab on a middle click, it is
41
+ // announced as a link, and Enter follows it with no handler here.
42
+ { render: 'a', href: link, onPress }
43
+ : {
44
+ role: 'link',
45
+ tabIndex: 0,
46
+ onPress,
47
+ onKeyDown: (e) => {
48
+ if (e?.key !== 'Enter')
49
+ return;
50
+ e.preventDefault?.();
51
+ onPress?.();
52
+ },
53
+ }), children: label }));
54
+ }
55
+ export function RepoSelect({ value = null, onChange, load, troubleshoot, note = 'Not all repositories are shown. Type to search.', connect, action, placeholder = 'Repository', placement, disabled, open, onOpenChange, }) {
56
+ const pages = useCallback(async (q, after) => {
57
+ const page = await load(q, after);
58
+ return { items: page.repos.map(item), next: page.next ?? null };
59
+ }, [load]);
60
+ const act = action
61
+ ? {
62
+ label: action.label,
63
+ onPress: (i) => action.onPress(i.repo),
64
+ when: action.when ? (i) => action.when(i.repo) : undefined,
65
+ }
66
+ : undefined;
67
+ return (_jsx(ChipSelect, { name: "Repository", icon: _jsx(Code, { size: 12, color: "$soft" }), label: value ? value.name : placeholder, chosen: value ? item(value) : null, onChange: (i) => onChange(i.repo), load: pages, placeholder: "Search repositories\u2026", empty: "No repositories match.", cta: connect, action: act, placement: placement, disabled: disabled, open: open, onOpenChange: onOpenChange, footer: note || troubleshoot ? (_jsxs(YStack, { gap: "$0.5", children: [note ? (_jsx(SizableText, { size: "$1", color: "$soft", children: note })) : null, troubleshoot ? _jsx(FooterLink, { ...troubleshoot }) : null] })) : undefined }));
68
+ }
69
+ //# sourceMappingURL=RepoSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepoSelect.js","sourceRoot":"","sources":["../../src/product/RepoSelect.tsx"],"names":[],"mappings":"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"}