@hanzo/ui 8.27.78 → 8.27.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/gui/video-player.cjs +2 -0
- package/dist/backends/gui/video-player.d.ts.map +1 -1
- package/dist/backends/gui/video-player.js +2 -0
- package/dist/backends/gui/video-player.js.map +1 -1
- package/dist/gallery.html +2 -2
- package/dist/models/ModelPicker.cjs +73 -146
- package/dist/models/ModelPicker.d.ts.map +1 -1
- package/dist/models/ModelPicker.js +45 -151
- package/dist/models/ModelPicker.js.map +1 -1
- package/dist/models/ModelPickerMenu.cjs +165 -0
- package/dist/models/ModelPickerMenu.d.ts +35 -0
- package/dist/models/ModelPickerMenu.d.ts.map +1 -0
- package/dist/models/ModelPickerMenu.js +163 -0
- package/dist/models/ModelPickerMenu.js.map +1 -0
- package/dist/models/catalog.cjs +6 -23
- package/dist/models/catalog.d.ts +1 -8
- package/dist/models/catalog.d.ts.map +1 -1
- package/dist/models/catalog.js +3 -21
- package/dist/models/catalog.js.map +1 -1
- package/dist/models/research.cjs +25 -0
- package/dist/models/research.d.ts +15 -0
- package/dist/models/research.d.ts.map +1 -0
- package/dist/models/research.js +22 -0
- package/dist/models/research.js.map +1 -0
- package/dist/product/limits.cjs +8 -3
- package/dist/product/limits.d.ts +1 -1
- package/dist/product/limits.d.ts.map +1 -1
- package/dist/product/limits.js +8 -3
- package/dist/product/limits.js.map +1 -1
- package/dist/product/useLimits.cjs +12 -5
- package/dist/product/useLimits.d.ts.map +1 -1
- package/dist/product/useLimits.js +12 -5
- package/dist/product/useLimits.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
'use client';"use strict";
|
|
2
2
|
'use client';
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
exports.ModelPicker = ModelPicker;
|
|
5
38
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
@@ -17,15 +50,9 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
17
50
|
* it with the policy's refusal or from Enso, and the host shows that. Only a
|
|
18
51
|
* research preview, which nothing can call yet, is listed and never picked.
|
|
19
52
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* scrolls itself into view, so keyboard reach is the same as a full render.
|
|
24
|
-
*
|
|
25
|
-
* ARIA: the search field is the combobox and owns the cursor through
|
|
26
|
-
* `aria-activedescendant`; the list is a listbox whose options carry
|
|
27
|
-
* `aria-setsize` / `aria-posinset`, since most of them are not in the DOM.
|
|
28
|
-
* Group headings are presentation: the option's own label names the group.
|
|
53
|
+
* LAZY. The trigger is all a page carries until the picker is pointed at,
|
|
54
|
+
* focused or opened: the popover or sheet, the search, the virtualised list and
|
|
55
|
+
* its rows (`ModelPickerMenu`) load then, in their own chunk.
|
|
29
56
|
*
|
|
30
57
|
* On a phone it is a bottom sheet with rows sized for a thumb; elsewhere a
|
|
31
58
|
* popover. Styling is gui props and tokens only.
|
|
@@ -33,20 +60,16 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
33
60
|
const gui_1 = require("@hanzo/gui");
|
|
34
61
|
const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
|
|
35
62
|
const react_1 = require("react");
|
|
36
|
-
const popover_1 = require("../backends/gui/popover.cjs");
|
|
37
63
|
const press_1 = require("../backends/gui/press.cjs");
|
|
38
|
-
const sheet_1 = require("../backends/gui/sheet.cjs");
|
|
39
64
|
const slot_1 = require("../backends/gui/slot.cjs");
|
|
40
|
-
const chipSelect_logic_1 = require("../product/chipSelect.logic.cjs");
|
|
41
65
|
const catalog_1 = require("./catalog.cjs");
|
|
42
|
-
|
|
66
|
+
/** The open half, once loaded: every picker on the page shares it. */
|
|
67
|
+
let menu = null;
|
|
68
|
+
let pending = null;
|
|
69
|
+
const load = () => (pending ??= Promise.resolve().then(() => __importStar(require('./ModelPickerMenu.cjs'))).then((m) => (menu = m.ModelPickerMenu)));
|
|
43
70
|
/** Row height, px: a line of 13px type on a pointer, a thumb's reach on a phone. */
|
|
44
71
|
const ROW = 32;
|
|
45
72
|
const ROW_TOUCH = 44;
|
|
46
|
-
/** The list's ceiling in a popover, px. */
|
|
47
|
-
const LIST_H = 360;
|
|
48
|
-
const PANEL_W = 360;
|
|
49
|
-
const MOVES = new Set(['ArrowDown', 'ArrowUp', 'Home', 'End', 'PageDown', 'PageUp']);
|
|
50
73
|
function ModelPicker({ models, value, onChange, scope, limits, loading = false, error = null, disabled = false, quiet = false, size = 'md', placeholder = 'Choose a model', name = 'Model', open: openProp, onOpenChange, }) {
|
|
51
74
|
const [own, setOwn] = (0, react_1.useState)(false);
|
|
52
75
|
const open = openProp ?? own;
|
|
@@ -58,135 +81,46 @@ function ModelPicker({ models, value, onChange, scope, limits, loading = false,
|
|
|
58
81
|
const media = (0, gui_1.useMedia)();
|
|
59
82
|
const sheet = !media.sm;
|
|
60
83
|
const row = sheet ? ROW_TOUCH : ROW;
|
|
61
|
-
const [q, setQ] = (0, react_1.useState)('');
|
|
62
|
-
const [at, setAt] = (0, react_1.useState)(-1);
|
|
63
|
-
const [top, setTop] = (0, react_1.useState)(0);
|
|
64
|
-
const [viewH, setViewH] = (0, react_1.useState)(LIST_H);
|
|
65
84
|
const [triggerW, setTriggerW] = (0, react_1.useState)(0);
|
|
66
|
-
const list = (0, react_1.useRef)(null);
|
|
67
|
-
const field = (0, react_1.useRef)(null);
|
|
68
85
|
const trigger = (0, react_1.useRef)(null);
|
|
69
|
-
const id = (0, react_1.useId)();
|
|
70
|
-
const listId = `${id}-list`;
|
|
71
|
-
const optionId = (i) => `${id}-opt-${i}`;
|
|
72
|
-
const rows = (0, react_1.useMemo)(() => (0, picker_logic_1.pickerRows)(models, q, scope), [models, q, scope]);
|
|
73
|
-
const total = (0, react_1.useMemo)(() => (0, picker_logic_1.modelCount)(rows), [rows]);
|
|
74
|
-
const research = (0, react_1.useMemo)(() => catalog_1.RESEARCH.filter((r) => rows.some((x) => x.kind === 'model' && x.model.id === r.id)), [rows]);
|
|
75
|
-
// Position among the models alone, for aria-posinset.
|
|
76
|
-
const position = (0, react_1.useMemo)(() => {
|
|
77
|
-
const pos = [];
|
|
78
|
-
let n = 0;
|
|
79
|
-
for (const r of rows)
|
|
80
|
-
pos.push(r.kind === 'model' ? ++n : 0);
|
|
81
|
-
return pos;
|
|
82
|
-
}, [rows]);
|
|
83
86
|
const selected = value ? models.find((m) => m.id === value) : undefined;
|
|
84
87
|
const label = selected ? (0, catalog_1.modelName)(selected) : value || placeholder;
|
|
85
|
-
const scrollTo = (0, react_1.useCallback)((y) => {
|
|
86
|
-
list.current?.scrollTo?.({ y, animated: false });
|
|
87
|
-
setTop(y);
|
|
88
|
-
}, []);
|
|
89
|
-
// Opening starts from the top of an empty search, the cursor on the chosen
|
|
90
|
-
// model — scrolled to the middle of the list — or the first one.
|
|
91
|
-
(0, react_1.useEffect)(() => {
|
|
92
|
-
if (!open) {
|
|
93
|
-
setQ('');
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const all = (0, picker_logic_1.pickerRows)(models, '', scope);
|
|
97
|
-
const chosen = all.findIndex((r) => r.kind === 'model' && r.model.id === value);
|
|
98
|
-
const first = all.findIndex((_, i) => (0, picker_logic_1.restable)(all, i));
|
|
99
|
-
const i = chosen >= 0 ? chosen : first;
|
|
100
|
-
setAt(i);
|
|
101
|
-
const y = i >= 0 ? Math.max(0, i * row - viewH / 2 + row / 2) : 0;
|
|
102
|
-
// The list mounts with the panel; scroll once it is there.
|
|
103
|
-
requestAnimationFrame(() => scrollTo(y));
|
|
104
|
-
// Only on open: the cursor is the reader's after that.
|
|
105
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
106
|
-
}, [open]);
|
|
107
|
-
// A new search puts the cursor on its first match, at the top.
|
|
108
|
-
(0, react_1.useEffect)(() => {
|
|
109
|
-
if (!open)
|
|
110
|
-
return;
|
|
111
|
-
setAt(rows.findIndex((_, i) => (0, picker_logic_1.restable)(rows, i)));
|
|
112
|
-
scrollTo(0);
|
|
113
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
114
|
-
}, [q]);
|
|
115
|
-
const reveal = (0, react_1.useCallback)((i) => {
|
|
116
|
-
const y = (0, picker_logic_1.revealTop)(i, top, viewH, row);
|
|
117
|
-
if (y !== null)
|
|
118
|
-
scrollTo(y);
|
|
119
|
-
}, [top, viewH, row, scrollTo]);
|
|
120
88
|
const close = (0, react_1.useCallback)(() => {
|
|
121
89
|
setOpen(false);
|
|
122
90
|
queueMicrotask(() => trigger.current?.focus?.());
|
|
123
91
|
}, [setOpen]);
|
|
124
|
-
|
|
125
|
-
|
|
92
|
+
// The open half arrives on first pointing, focus or open; until then the
|
|
93
|
+
// trigger stands alone, drawn the same.
|
|
94
|
+
const [Live, setLive] = (0, react_1.useState)(() => menu);
|
|
95
|
+
const want = (0, react_1.useCallback)(() => {
|
|
96
|
+
if (Live)
|
|
126
97
|
return;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
if (e.key === 'Enter') {
|
|
143
|
-
e.preventDefault?.();
|
|
144
|
-
choose(rows[at]);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
if (e.key === 'Escape') {
|
|
148
|
-
e.preventDefault?.();
|
|
149
|
-
close();
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
const range = (0, picker_logic_1.visibleRange)(top, viewH, row, rows.length);
|
|
153
|
-
const shown = rows.slice(range.start, range.end);
|
|
154
|
-
const body = ((0, jsx_runtime_1.jsxs)(gui_1.YStack, { ...(0, slot_1.slot)('model-picker-body'), flex: sheet ? 1 : undefined, minH: 0, gap: "$1", children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-search'), height: sheet ? 40 : 32, px: "$2", gap: "$2", items: "center", rounded: "$2", borderWidth: 1, borderColor: "$rim", bg: "$background", focusWithinStyle: { borderColor: '$outlineColor' }, children: [(0, jsx_runtime_1.jsx)(lucide_icons_2_1.Search, { size: 14, color: "$soft", "aria-hidden": true }), (0, jsx_runtime_1.jsx)(gui_1.Input, { ref: field, ...(0, slot_1.slot)('model-picker-input'), unstyled: true, flex: 1, minW: 0, height: sheet ? 38 : 30, p: 0, borderWidth: 0, bg: "transparent", fontSize: sheet ? '$3' : '$2', color: "$ink", placeholderTextColor: "$soft", placeholder: "Search models", value: q, onChangeText: setQ, role: "combobox", "aria-label": "Search models", "aria-expanded": open, "aria-controls": listId, "aria-autocomplete": "list", "aria-activedescendant": at >= 0 && rows[at] ? optionId(at) : undefined, autoComplete: "off", spellCheck: false, onKeyDown: onField }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { ...(0, slot_1.slot)('model-picker-count'), size: "$1", color: "$soft", shrink: 0, "aria-live": "polite", children: loading && !models.length ? 'Loading' : `${total} ${total === 1 ? 'model' : 'models'}` })] }), error ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-error'), px: "$2", py: "$1.5", role: "alert", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$bad", children: error }) })) : null, (0, jsx_runtime_1.jsxs)(gui_1.ScrollView, { ref: list, height: sheet ? undefined : Math.min(LIST_H, Math.max(row * 3, rows.length * row)), flex: sheet ? 1 : undefined, showsVerticalScrollIndicator: true, scrollEventThrottle: 16, onScroll: (e) => setTop(e.nativeEvent?.contentOffset?.y ?? 0), onLayout: (e) => {
|
|
155
|
-
const h = e.nativeEvent?.layout?.height;
|
|
156
|
-
if (h)
|
|
157
|
-
setViewH(h);
|
|
158
|
-
}, children: [(0, jsx_runtime_1.jsxs)(gui_1.YStack, { ...(0, slot_1.slot)('model-picker-list'), id: listId, role: "listbox", "aria-label": name, height: rows.length * row, children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { height: range.start * row }), shown.map((r, k) => {
|
|
159
|
-
const i = range.start + k;
|
|
160
|
-
if (r.kind === 'group') {
|
|
161
|
-
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-group'), role: "presentation", height: row, px: "$2", gap: "$2", items: "flex-end", pb: "$1.5", children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$soft", fontWeight: "600", numberOfLines: 1, flex: 1, children: r.label }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$soft", fontVariant: ['tabular-nums'], children: r.count })] }, r.key));
|
|
162
|
-
}
|
|
163
|
-
const m = r.model;
|
|
164
|
-
const locked = !(0, picker_logic_1.pickable)(m);
|
|
165
|
-
const paused = !locked && (0, catalog_1.isPaused)(m, limits);
|
|
166
|
-
const picked = m.id === value;
|
|
167
|
-
const ctx = (0, catalog_1.formatContext)(m.context_window);
|
|
168
|
-
const title = (0, catalog_1.modelName)(m);
|
|
169
|
-
// A model that answers in something other than a conversation says
|
|
170
|
-
// what it does, so an unscoped list is honest about each row.
|
|
171
|
-
const kind = scope || (0, catalog_1.can)(m, 'chat') ? null : (0, catalog_1.capabilitiesOf)(m)[0];
|
|
172
|
-
// A model sold against another says by how much, from the two list prices;
|
|
173
|
-
// a router, the ceiling it bills up to.
|
|
174
|
-
const saving = (0, catalog_1.savingOf)(m, models);
|
|
175
|
-
const ceiling = (0, catalog_1.formatCeiling)(m);
|
|
176
|
-
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-option'), id: optionId(i), role: "option", "aria-selected": picked, "aria-disabled": locked || undefined, "aria-setsize": total, "aria-posinset": position[i], "aria-label": `${title}, ${(0, catalog_1.groupLabel)(m)}${paused ? ', paused' : ''}${locked ? ', research preview' : ''}`, "data-model": m.id, "data-class": m.class, "data-paused": paused || undefined, height: row, px: "$2", gap: "$2", items: "center", rounded: "$2", cursor: locked ? 'default' : 'pointer', bg: i === at ? '$raised' : 'transparent', onHoverIn: () => setAt(i), onPress: () => choose(r), children: [(0, jsx_runtime_1.jsx)(lucide_icons_2_1.Check, { size: 14, color: "$ink", shrink: 0, opacity: picked ? 1 : 0, "aria-hidden": true }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: sheet ? '$3' : '$2', color: "$ink", opacity: locked ? 0.5 : 1, numberOfLines: 1, flex: 1, minW: 0, children: title }), m.class === 'premium' ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$soft", shrink: 0, "aria-hidden": true, children: "\u2726" })) : null, locked || paused || saving || ceiling || kind || ctx ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$1", color: "$soft", shrink: 0, maxW: "60%", numberOfLines: 1, fontVariant: ['tabular-nums'], children: locked
|
|
177
|
-
? 'Research preview'
|
|
178
|
-
: paused
|
|
179
|
-
? 'Paused'
|
|
180
|
-
: saving
|
|
181
|
-
? (0, catalog_1.formatSaving)(saving)
|
|
182
|
-
: ceiling
|
|
183
|
-
? ceiling
|
|
184
|
-
: kind
|
|
185
|
-
? catalog_1.CAPABILITY_NAMES[kind]
|
|
186
|
-
: ctx })) : null] }, m.id));
|
|
187
|
-
})] }), rows.length === 0 && !error ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-empty'), px: "$2", py: "$2", role: "status", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$soft", children: loading ? 'Loading models…' : q ? `No models match “${q}”.` : 'No models to choose from.' }) })) : null] }), research.length ? ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, slot_1.slot)('model-picker-research'), px: "$2", py: "$1.5", gap: "$1.5", items: "center", flexWrap: "wrap", children: [(0, jsx_runtime_1.jsxs)(gui_1.SizableText, { size: "$1", color: "$soft", children: [research.map(catalog_1.modelName).join(', '), " ", research.length === 1 ? 'is' : 'are', " in research preview."] }), (0, jsx_runtime_1.jsx)(gui_1.Anchor, { href: research[0].request, target: "_blank", rel: "noopener noreferrer", size: "$1", color: "$ink", textDecorationLine: "underline", children: "Request access" })] })) : null] }));
|
|
98
|
+
void load().then((m) => setLive(() => m));
|
|
99
|
+
}, [Live]);
|
|
100
|
+
(0, react_1.useEffect)(() => {
|
|
101
|
+
if (open)
|
|
102
|
+
want();
|
|
103
|
+
}, [open, want]);
|
|
104
|
+
// The trigger is drawn again inside the popover once it arrives; one that
|
|
105
|
+
// held the focus keeps it. Its removal blurs it with nowhere to go, which is
|
|
106
|
+
// not the reader leaving.
|
|
107
|
+
const focused = (0, react_1.useRef)(false);
|
|
108
|
+
(0, react_1.useEffect)(() => {
|
|
109
|
+
if (Live && focused.current)
|
|
110
|
+
trigger.current?.focus?.();
|
|
111
|
+
}, [Live]);
|
|
188
112
|
const small = size === 'sm';
|
|
189
|
-
const button = ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ref: trigger, ...(0, slot_1.slot)('model-picker'), role: "button", tabIndex: disabled ? -1 : 0, "aria-label": `${name}: ${label}`, "aria-haspopup": "listbox", "aria-expanded": open, "aria-disabled": disabled || undefined, height: small ? 28 : 36, px: small ? '$2' : '$3', gap: "$2", items: "center", maxW: "100%", rounded: "$3", borderWidth: quiet ? 0 : 1, borderColor: "$borderColor", bg: quiet ? 'transparent' : '$background', cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : quiet ? { bg: '$hover' } : { borderColor: '$rim' }, pressStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: press_1.RING, onLayout: (e) => setTriggerW(e.nativeEvent?.layout?.width ?? 0),
|
|
113
|
+
const button = ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ref: trigger, ...(0, slot_1.slot)('model-picker'), role: "button", tabIndex: disabled ? -1 : 0, "aria-label": `${name}: ${label}`, "aria-haspopup": "listbox", "aria-expanded": open, "aria-disabled": disabled || undefined, height: small ? 28 : 36, px: small ? '$2' : '$3', gap: "$2", items: "center", maxW: "100%", rounded: "$3", borderWidth: quiet ? 0 : 1, borderColor: "$borderColor", bg: quiet ? 'transparent' : '$background', cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : quiet ? { bg: '$hover' } : { borderColor: '$rim' }, pressStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: press_1.RING, onLayout: (e) => setTriggerW(e.nativeEvent?.layout?.width ?? 0),
|
|
114
|
+
// The popover opens on press once it is here; before that, and on a phone, the press opens it.
|
|
115
|
+
onPress: disabled || (Live && !sheet) ? undefined : () => setOpen(true), onMouseEnter: disabled ? undefined : want, onFocus: disabled
|
|
116
|
+
? undefined
|
|
117
|
+
: () => {
|
|
118
|
+
focused.current = true;
|
|
119
|
+
want();
|
|
120
|
+
}, onBlur: (e) => {
|
|
121
|
+
if (e.relatedTarget)
|
|
122
|
+
focused.current = false;
|
|
123
|
+
}, onKeyDown: (e) => {
|
|
190
124
|
if (disabled)
|
|
191
125
|
return;
|
|
192
126
|
if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
@@ -194,15 +128,8 @@ function ModelPicker({ models, value, onChange, scope, limits, loading = false,
|
|
|
194
128
|
setOpen(true);
|
|
195
129
|
}
|
|
196
130
|
}, children: [(0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: small ? '$1' : '$2', color: quiet ? '$quiet' : '$ink', numberOfLines: 1, shrink: 1, minW: 0, children: label }), selected && !quiet ? ((0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: small ? '$1' : '$2', color: "$soft", numberOfLines: 1, shrink: 2, minW: 0, children: (0, catalog_1.groupLabel)(selected) })) : null, (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronsUpDown, { size: small ? 12 : 14, color: "$soft", shrink: 0, "aria-hidden": true })] }));
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}, onCloseAutoFocus: (e) => {
|
|
201
|
-
e.preventDefault();
|
|
202
|
-
trigger.current?.focus?.();
|
|
203
|
-
}, children: body }))] }), sheet ? ((0, jsx_runtime_1.jsx)(sheet_1.Sheet, { open: open, onOpenChange: (v) => (v ? setOpen(true) : close()), children: (0, jsx_runtime_1.jsxs)(sheet_1.SheetContent, { ...(0, slot_1.slot)('model-picker-sheet'), side: "bottom", height: "85%", maxH: "85%", p: "$3", gap: "$2", onOpenAutoFocus: (e) => {
|
|
204
|
-
e.preventDefault();
|
|
205
|
-
field.current?.focus();
|
|
206
|
-
}, children: [(0, jsx_runtime_1.jsx)(sheet_1.SheetTitle, { size: "$4", children: name }), body] }) })) : null] }));
|
|
131
|
+
if (!Live)
|
|
132
|
+
return button;
|
|
133
|
+
return ((0, jsx_runtime_1.jsx)(Live, { trigger: button, open: open, onOpen: () => setOpen(true), onClose: close, disabled: disabled, width: triggerW, focusTrigger: () => trigger.current?.focus?.(), models: models, value: value, onChange: onChange, scope: scope, limits: limits, loading: loading, error: error, name: name, sheet: sheet, row: row }));
|
|
207
134
|
}
|
|
208
135
|
exports.default = ModelPicker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../src/models/ModelPicker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../src/models/ModelPicker.tsx"],"names":[],"mappings":"AA6BA,OAAO,EAAyB,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAa5G,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,KAAK,EACL,MAAM,EACN,OAAe,EACf,KAAY,EACZ,QAAgB,EAChB,KAAa,EACb,IAAW,EACX,WAA8B,EAC9B,IAAc,EACd,IAAI,EAAE,QAAQ,EACd,YAAY,GACb,EAAE,gBAAgB,+BA6HlB;eAEc,WAAW"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
4
|
* ModelPicker — the one model picker every Hanzo surface uses: hanzo.ai chat
|
|
5
5
|
* and dev, and every playground tab in the console.
|
|
@@ -14,36 +14,26 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
14
14
|
* it with the policy's refusal or from Enso, and the host shows that. Only a
|
|
15
15
|
* research preview, which nothing can call yet, is listed and never picked.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* scrolls itself into view, so keyboard reach is the same as a full render.
|
|
21
|
-
*
|
|
22
|
-
* ARIA: the search field is the combobox and owns the cursor through
|
|
23
|
-
* `aria-activedescendant`; the list is a listbox whose options carry
|
|
24
|
-
* `aria-setsize` / `aria-posinset`, since most of them are not in the DOM.
|
|
25
|
-
* Group headings are presentation: the option's own label names the group.
|
|
17
|
+
* LAZY. The trigger is all a page carries until the picker is pointed at,
|
|
18
|
+
* focused or opened: the popover or sheet, the search, the virtualised list and
|
|
19
|
+
* its rows (`ModelPickerMenu`) load then, in their own chunk.
|
|
26
20
|
*
|
|
27
21
|
* On a phone it is a bottom sheet with rows sized for a thumb; elsewhere a
|
|
28
22
|
* popover. Styling is gui props and tokens only.
|
|
29
23
|
*/
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import { useCallback, useEffect,
|
|
33
|
-
import { Popover, PopoverContent, PopoverTrigger } from '../backends/gui/popover.js';
|
|
24
|
+
import { SizableText, XStack, useMedia } from '@hanzo/gui';
|
|
25
|
+
import { ChevronsUpDown } from '@hanzogui/lucide-icons-2';
|
|
26
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
34
27
|
import { RING } from '../backends/gui/press.js';
|
|
35
|
-
import { Sheet, SheetContent, SheetTitle } from '../backends/gui/sheet.js';
|
|
36
28
|
import { slot } from '../backends/gui/slot.js';
|
|
37
|
-
import {
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
import { groupLabel, modelName } from './catalog.js';
|
|
30
|
+
/** The open half, once loaded: every picker on the page shares it. */
|
|
31
|
+
let menu = null;
|
|
32
|
+
let pending = null;
|
|
33
|
+
const load = () => (pending ??= import('./ModelPickerMenu.js').then((m) => (menu = m.ModelPickerMenu)));
|
|
40
34
|
/** Row height, px: a line of 13px type on a pointer, a thumb's reach on a phone. */
|
|
41
35
|
const ROW = 32;
|
|
42
36
|
const ROW_TOUCH = 44;
|
|
43
|
-
/** The list's ceiling in a popover, px. */
|
|
44
|
-
const LIST_H = 360;
|
|
45
|
-
const PANEL_W = 360;
|
|
46
|
-
const MOVES = new Set(['ArrowDown', 'ArrowUp', 'Home', 'End', 'PageDown', 'PageUp']);
|
|
47
37
|
export function ModelPicker({ models, value, onChange, scope, limits, loading = false, error = null, disabled = false, quiet = false, size = 'md', placeholder = 'Choose a model', name = 'Model', open: openProp, onOpenChange, }) {
|
|
48
38
|
const [own, setOwn] = useState(false);
|
|
49
39
|
const open = openProp ?? own;
|
|
@@ -55,135 +45,46 @@ export function ModelPicker({ models, value, onChange, scope, limits, loading =
|
|
|
55
45
|
const media = useMedia();
|
|
56
46
|
const sheet = !media.sm;
|
|
57
47
|
const row = sheet ? ROW_TOUCH : ROW;
|
|
58
|
-
const [q, setQ] = useState('');
|
|
59
|
-
const [at, setAt] = useState(-1);
|
|
60
|
-
const [top, setTop] = useState(0);
|
|
61
|
-
const [viewH, setViewH] = useState(LIST_H);
|
|
62
48
|
const [triggerW, setTriggerW] = useState(0);
|
|
63
|
-
const list = useRef(null);
|
|
64
|
-
const field = useRef(null);
|
|
65
49
|
const trigger = useRef(null);
|
|
66
|
-
const id = useId();
|
|
67
|
-
const listId = `${id}-list`;
|
|
68
|
-
const optionId = (i) => `${id}-opt-${i}`;
|
|
69
|
-
const rows = useMemo(() => pickerRows(models, q, scope), [models, q, scope]);
|
|
70
|
-
const total = useMemo(() => modelCount(rows), [rows]);
|
|
71
|
-
const research = useMemo(() => RESEARCH.filter((r) => rows.some((x) => x.kind === 'model' && x.model.id === r.id)), [rows]);
|
|
72
|
-
// Position among the models alone, for aria-posinset.
|
|
73
|
-
const position = useMemo(() => {
|
|
74
|
-
const pos = [];
|
|
75
|
-
let n = 0;
|
|
76
|
-
for (const r of rows)
|
|
77
|
-
pos.push(r.kind === 'model' ? ++n : 0);
|
|
78
|
-
return pos;
|
|
79
|
-
}, [rows]);
|
|
80
50
|
const selected = value ? models.find((m) => m.id === value) : undefined;
|
|
81
51
|
const label = selected ? modelName(selected) : value || placeholder;
|
|
82
|
-
const scrollTo = useCallback((y) => {
|
|
83
|
-
list.current?.scrollTo?.({ y, animated: false });
|
|
84
|
-
setTop(y);
|
|
85
|
-
}, []);
|
|
86
|
-
// Opening starts from the top of an empty search, the cursor on the chosen
|
|
87
|
-
// model — scrolled to the middle of the list — or the first one.
|
|
88
|
-
useEffect(() => {
|
|
89
|
-
if (!open) {
|
|
90
|
-
setQ('');
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const all = pickerRows(models, '', scope);
|
|
94
|
-
const chosen = all.findIndex((r) => r.kind === 'model' && r.model.id === value);
|
|
95
|
-
const first = all.findIndex((_, i) => restable(all, i));
|
|
96
|
-
const i = chosen >= 0 ? chosen : first;
|
|
97
|
-
setAt(i);
|
|
98
|
-
const y = i >= 0 ? Math.max(0, i * row - viewH / 2 + row / 2) : 0;
|
|
99
|
-
// The list mounts with the panel; scroll once it is there.
|
|
100
|
-
requestAnimationFrame(() => scrollTo(y));
|
|
101
|
-
// Only on open: the cursor is the reader's after that.
|
|
102
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
103
|
-
}, [open]);
|
|
104
|
-
// A new search puts the cursor on its first match, at the top.
|
|
105
|
-
useEffect(() => {
|
|
106
|
-
if (!open)
|
|
107
|
-
return;
|
|
108
|
-
setAt(rows.findIndex((_, i) => restable(rows, i)));
|
|
109
|
-
scrollTo(0);
|
|
110
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
|
-
}, [q]);
|
|
112
|
-
const reveal = useCallback((i) => {
|
|
113
|
-
const y = revealTop(i, top, viewH, row);
|
|
114
|
-
if (y !== null)
|
|
115
|
-
scrollTo(y);
|
|
116
|
-
}, [top, viewH, row, scrollTo]);
|
|
117
52
|
const close = useCallback(() => {
|
|
118
53
|
setOpen(false);
|
|
119
54
|
queueMicrotask(() => trigger.current?.focus?.());
|
|
120
55
|
}, [setOpen]);
|
|
121
|
-
|
|
122
|
-
|
|
56
|
+
// The open half arrives on first pointing, focus or open; until then the
|
|
57
|
+
// trigger stands alone, drawn the same.
|
|
58
|
+
const [Live, setLive] = useState(() => menu);
|
|
59
|
+
const want = useCallback(() => {
|
|
60
|
+
if (Live)
|
|
123
61
|
return;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
if (e.key === 'Enter') {
|
|
140
|
-
e.preventDefault?.();
|
|
141
|
-
choose(rows[at]);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
if (e.key === 'Escape') {
|
|
145
|
-
e.preventDefault?.();
|
|
146
|
-
close();
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
const range = visibleRange(top, viewH, row, rows.length);
|
|
150
|
-
const shown = rows.slice(range.start, range.end);
|
|
151
|
-
const body = (_jsxs(YStack, { ...slot('model-picker-body'), flex: sheet ? 1 : undefined, minH: 0, gap: "$1", children: [_jsxs(XStack, { ...slot('model-picker-search'), height: sheet ? 40 : 32, px: "$2", gap: "$2", items: "center", rounded: "$2", borderWidth: 1, borderColor: "$rim", bg: "$background", focusWithinStyle: { borderColor: '$outlineColor' }, children: [_jsx(Search, { size: 14, color: "$soft", "aria-hidden": true }), _jsx(GuiInput, { ref: field, ...slot('model-picker-input'), unstyled: true, flex: 1, minW: 0, height: sheet ? 38 : 30, p: 0, borderWidth: 0, bg: "transparent", fontSize: sheet ? '$3' : '$2', color: "$ink", placeholderTextColor: "$soft", placeholder: "Search models", value: q, onChangeText: setQ, role: "combobox", "aria-label": "Search models", "aria-expanded": open, "aria-controls": listId, "aria-autocomplete": "list", "aria-activedescendant": at >= 0 && rows[at] ? optionId(at) : undefined, autoComplete: "off", spellCheck: false, onKeyDown: onField }), _jsx(SizableText, { ...slot('model-picker-count'), size: "$1", color: "$soft", shrink: 0, "aria-live": "polite", children: loading && !models.length ? 'Loading' : `${total} ${total === 1 ? 'model' : 'models'}` })] }), error ? (_jsx(XStack, { ...slot('model-picker-error'), px: "$2", py: "$1.5", role: "alert", children: _jsx(SizableText, { size: "$2", color: "$bad", children: error }) })) : null, _jsxs(ScrollView, { ref: list, height: sheet ? undefined : Math.min(LIST_H, Math.max(row * 3, rows.length * row)), flex: sheet ? 1 : undefined, showsVerticalScrollIndicator: true, scrollEventThrottle: 16, onScroll: (e) => setTop(e.nativeEvent?.contentOffset?.y ?? 0), onLayout: (e) => {
|
|
152
|
-
const h = e.nativeEvent?.layout?.height;
|
|
153
|
-
if (h)
|
|
154
|
-
setViewH(h);
|
|
155
|
-
}, children: [_jsxs(YStack, { ...slot('model-picker-list'), id: listId, role: "listbox", "aria-label": name, height: rows.length * row, children: [_jsx(YStack, { height: range.start * row }), shown.map((r, k) => {
|
|
156
|
-
const i = range.start + k;
|
|
157
|
-
if (r.kind === 'group') {
|
|
158
|
-
return (_jsxs(XStack, { ...slot('model-picker-group'), role: "presentation", height: row, px: "$2", gap: "$2", items: "flex-end", pb: "$1.5", children: [_jsx(SizableText, { size: "$1", color: "$soft", fontWeight: "600", numberOfLines: 1, flex: 1, children: r.label }), _jsx(SizableText, { size: "$1", color: "$soft", fontVariant: ['tabular-nums'], children: r.count })] }, r.key));
|
|
159
|
-
}
|
|
160
|
-
const m = r.model;
|
|
161
|
-
const locked = !pickable(m);
|
|
162
|
-
const paused = !locked && isPaused(m, limits);
|
|
163
|
-
const picked = m.id === value;
|
|
164
|
-
const ctx = formatContext(m.context_window);
|
|
165
|
-
const title = modelName(m);
|
|
166
|
-
// A model that answers in something other than a conversation says
|
|
167
|
-
// what it does, so an unscoped list is honest about each row.
|
|
168
|
-
const kind = scope || can(m, 'chat') ? null : capabilitiesOf(m)[0];
|
|
169
|
-
// A model sold against another says by how much, from the two list prices;
|
|
170
|
-
// a router, the ceiling it bills up to.
|
|
171
|
-
const saving = savingOf(m, models);
|
|
172
|
-
const ceiling = formatCeiling(m);
|
|
173
|
-
return (_jsxs(XStack, { ...slot('model-picker-option'), id: optionId(i), role: "option", "aria-selected": picked, "aria-disabled": locked || undefined, "aria-setsize": total, "aria-posinset": position[i], "aria-label": `${title}, ${groupLabel(m)}${paused ? ', paused' : ''}${locked ? ', research preview' : ''}`, "data-model": m.id, "data-class": m.class, "data-paused": paused || undefined, height: row, px: "$2", gap: "$2", items: "center", rounded: "$2", cursor: locked ? 'default' : 'pointer', bg: i === at ? '$raised' : 'transparent', onHoverIn: () => setAt(i), onPress: () => choose(r), children: [_jsx(Check, { size: 14, color: "$ink", shrink: 0, opacity: picked ? 1 : 0, "aria-hidden": true }), _jsx(SizableText, { size: sheet ? '$3' : '$2', color: "$ink", opacity: locked ? 0.5 : 1, numberOfLines: 1, flex: 1, minW: 0, children: title }), m.class === 'premium' ? (_jsx(SizableText, { size: "$1", color: "$soft", shrink: 0, "aria-hidden": true, children: "\u2726" })) : null, locked || paused || saving || ceiling || kind || ctx ? (_jsx(SizableText, { size: "$1", color: "$soft", shrink: 0, maxW: "60%", numberOfLines: 1, fontVariant: ['tabular-nums'], children: locked
|
|
174
|
-
? 'Research preview'
|
|
175
|
-
: paused
|
|
176
|
-
? 'Paused'
|
|
177
|
-
: saving
|
|
178
|
-
? formatSaving(saving)
|
|
179
|
-
: ceiling
|
|
180
|
-
? ceiling
|
|
181
|
-
: kind
|
|
182
|
-
? CAPABILITY_NAMES[kind]
|
|
183
|
-
: ctx })) : null] }, m.id));
|
|
184
|
-
})] }), rows.length === 0 && !error ? (_jsx(XStack, { ...slot('model-picker-empty'), px: "$2", py: "$2", role: "status", children: _jsx(SizableText, { size: "$2", color: "$soft", children: loading ? 'Loading models…' : q ? `No models match “${q}”.` : 'No models to choose from.' }) })) : null] }), research.length ? (_jsxs(XStack, { ...slot('model-picker-research'), px: "$2", py: "$1.5", gap: "$1.5", items: "center", flexWrap: "wrap", children: [_jsxs(SizableText, { size: "$1", color: "$soft", children: [research.map(modelName).join(', '), " ", research.length === 1 ? 'is' : 'are', " in research preview."] }), _jsx(Anchor, { href: research[0].request, target: "_blank", rel: "noopener noreferrer", size: "$1", color: "$ink", textDecorationLine: "underline", children: "Request access" })] })) : null] }));
|
|
62
|
+
void load().then((m) => setLive(() => m));
|
|
63
|
+
}, [Live]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (open)
|
|
66
|
+
want();
|
|
67
|
+
}, [open, want]);
|
|
68
|
+
// The trigger is drawn again inside the popover once it arrives; one that
|
|
69
|
+
// held the focus keeps it. Its removal blurs it with nowhere to go, which is
|
|
70
|
+
// not the reader leaving.
|
|
71
|
+
const focused = useRef(false);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (Live && focused.current)
|
|
74
|
+
trigger.current?.focus?.();
|
|
75
|
+
}, [Live]);
|
|
185
76
|
const small = size === 'sm';
|
|
186
|
-
const button = (_jsxs(XStack, { ref: trigger, ...slot('model-picker'), role: "button", tabIndex: disabled ? -1 : 0, "aria-label": `${name}: ${label}`, "aria-haspopup": "listbox", "aria-expanded": open, "aria-disabled": disabled || undefined, height: small ? 28 : 36, px: small ? '$2' : '$3', gap: "$2", items: "center", maxW: "100%", rounded: "$3", borderWidth: quiet ? 0 : 1, borderColor: "$borderColor", bg: quiet ? 'transparent' : '$background', cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : quiet ? { bg: '$hover' } : { borderColor: '$rim' }, pressStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: RING, onLayout: (e) => setTriggerW(e.nativeEvent?.layout?.width ?? 0),
|
|
77
|
+
const button = (_jsxs(XStack, { ref: trigger, ...slot('model-picker'), role: "button", tabIndex: disabled ? -1 : 0, "aria-label": `${name}: ${label}`, "aria-haspopup": "listbox", "aria-expanded": open, "aria-disabled": disabled || undefined, height: small ? 28 : 36, px: small ? '$2' : '$3', gap: "$2", items: "center", maxW: "100%", rounded: "$3", borderWidth: quiet ? 0 : 1, borderColor: "$borderColor", bg: quiet ? 'transparent' : '$background', cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : quiet ? { bg: '$hover' } : { borderColor: '$rim' }, pressStyle: disabled ? undefined : { bg: '$hover' }, focusVisibleStyle: RING, onLayout: (e) => setTriggerW(e.nativeEvent?.layout?.width ?? 0),
|
|
78
|
+
// The popover opens on press once it is here; before that, and on a phone, the press opens it.
|
|
79
|
+
onPress: disabled || (Live && !sheet) ? undefined : () => setOpen(true), onMouseEnter: disabled ? undefined : want, onFocus: disabled
|
|
80
|
+
? undefined
|
|
81
|
+
: () => {
|
|
82
|
+
focused.current = true;
|
|
83
|
+
want();
|
|
84
|
+
}, onBlur: (e) => {
|
|
85
|
+
if (e.relatedTarget)
|
|
86
|
+
focused.current = false;
|
|
87
|
+
}, onKeyDown: (e) => {
|
|
187
88
|
if (disabled)
|
|
188
89
|
return;
|
|
189
90
|
if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
@@ -191,16 +92,9 @@ export function ModelPicker({ models, value, onChange, scope, limits, loading =
|
|
|
191
92
|
setOpen(true);
|
|
192
93
|
}
|
|
193
94
|
}, children: [_jsx(SizableText, { size: small ? '$1' : '$2', color: quiet ? '$quiet' : '$ink', numberOfLines: 1, shrink: 1, minW: 0, children: label }), selected && !quiet ? (_jsx(SizableText, { size: small ? '$1' : '$2', color: "$soft", numberOfLines: 1, shrink: 2, minW: 0, children: groupLabel(selected) })) : null, _jsx(ChevronsUpDown, { size: small ? 12 : 14, color: "$soft", shrink: 0, "aria-hidden": true })] }));
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}, onCloseAutoFocus: (e) => {
|
|
198
|
-
e.preventDefault();
|
|
199
|
-
trigger.current?.focus?.();
|
|
200
|
-
}, children: body }))] }), sheet ? (_jsx(Sheet, { open: open, onOpenChange: (v) => (v ? setOpen(true) : close()), children: _jsxs(SheetContent, { ...slot('model-picker-sheet'), side: "bottom", height: "85%", maxH: "85%", p: "$3", gap: "$2", onOpenAutoFocus: (e) => {
|
|
201
|
-
e.preventDefault();
|
|
202
|
-
field.current?.focus();
|
|
203
|
-
}, children: [_jsx(SheetTitle, { size: "$4", children: name }), body] }) })) : null] }));
|
|
95
|
+
if (!Live)
|
|
96
|
+
return button;
|
|
97
|
+
return (_jsx(Live, { trigger: button, open: open, onOpen: () => setOpen(true), onClose: close, disabled: disabled, width: triggerW, focusTrigger: () => trigger.current?.focus?.(), models: models, value: value, onChange: onChange, scope: scope, limits: limits, loading: loading, error: error, name: name, sheet: sheet, row: row }));
|
|
204
98
|
}
|
|
205
99
|
export default ModelPicker;
|
|
206
100
|
//# sourceMappingURL=ModelPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelPicker.js","sourceRoot":"","sources":["../../src/models/ModelPicker.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ModelPicker.js","sourceRoot":"","sources":["../../src/models/ModelPicker.tsx"],"names":[],"mappings":"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"}
|