@nocoo/basalt 2.2.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/ai/COMPATIBILITY.md +11 -1
- package/ai/DESIGN.md +398 -0
- package/ai/INTEGRATION.md +255 -129
- package/ai/RECIPES.md +51 -26
- package/ai/USAGE.md +4 -4
- package/ai/registry.json +3018 -271
- package/dist/charts/config.d.ts +11 -11
- package/dist/charts/config.js +4 -4
- package/dist/charts/config.js.map +1 -1
- package/dist/charts/date-navigation.js +10 -10
- package/dist/charts/date-navigation.js.map +1 -1
- package/dist/charts/donut.js +1 -1
- package/dist/charts/donut.js.map +1 -1
- package/dist/charts/frame.d.ts +1 -1
- package/dist/charts/frame.js +4 -4
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/gauge.js +5 -5
- package/dist/charts/gauge.js.map +1 -1
- package/dist/charts/heatmap-calendar.js +11 -11
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +8 -8
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/item-list.js +1 -1
- package/dist/charts/item-list.js.map +1 -1
- package/dist/charts/legend.js +19 -19
- package/dist/charts/legend.js.map +1 -1
- package/dist/charts/palette.js +2 -2
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/slot-bar.js +2 -2
- package/dist/charts/slot-bar.js.map +1 -1
- package/dist/charts/sparkline.js +38 -23
- package/dist/charts/sparkline.js.map +1 -1
- package/dist/charts/stat-card.d.ts +2 -2
- package/dist/charts/stat-card.js +61 -58
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/charts/timeline.js +18 -9
- package/dist/charts/timeline.js.map +1 -1
- package/dist/charts/tooltip.js +16 -16
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -1
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.js +4 -4
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/app-header.js +8 -8
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +1 -1
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/approval-card.d.ts +13 -0
- package/dist/components/approval-card.js +161 -0
- package/dist/components/approval-card.js.map +1 -0
- package/dist/components/avatar.d.ts +12 -0
- package/dist/components/avatar.js +39 -18
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.js +8 -8
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.d.ts +2 -2
- package/dist/components/banner.js +9 -8
- package/dist/components/banner.js.map +1 -1
- package/dist/components/basalt-mark.js +1 -1
- package/dist/components/basalt-mark.js.map +1 -1
- package/dist/components/battery-meter.js +5 -5
- package/dist/components/battery-meter.js.map +1 -1
- package/dist/components/breadcrumbs.js +6 -6
- package/dist/components/breadcrumbs.js.map +1 -1
- package/dist/components/button.js +10 -10
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +4 -3
- package/dist/components/chat-bubble.js.map +1 -1
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/chat-composer.js +126 -60
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js +6 -6
- package/dist/components/chat-header.js.map +1 -1
- package/dist/components/chat-inbox.js +34 -30
- package/dist/components/chat-inbox.js.map +1 -1
- package/dist/components/chat-markdown.d.ts +8 -0
- package/dist/components/chat-markdown.js +122 -0
- package/dist/components/chat-markdown.js.map +1 -0
- package/dist/components/chat-message.d.ts +26 -0
- package/dist/components/chat-message.js +145 -0
- package/dist/components/chat-message.js.map +1 -0
- package/dist/components/checkbox.js +11 -11
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/clipboard-text.js +3 -3
- package/dist/components/clipboard-text.js.map +1 -1
- package/dist/components/code.d.ts +22 -20
- package/dist/components/code.js +94 -32
- package/dist/components/code.js.map +1 -1
- package/dist/components/collapsible.js +8 -4
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/command-palette.js +73 -47
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/context-cards.d.ts +15 -0
- package/dist/components/context-cards.js +148 -0
- package/dist/components/context-cards.js.map +1 -0
- package/dist/components/context-menu.d.ts +1 -1
- package/dist/components/context-menu.js +18 -14
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.d.ts +14 -2
- package/dist/components/data-table.js +185 -135
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +13 -13
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -1
- package/dist/components/delete-resource.js.map +1 -1
- package/dist/components/description-list.js +3 -3
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog.d.ts +2 -2
- package/dist/components/dialog.js +8 -8
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/diff-table.d.ts +15 -0
- package/dist/components/diff-table.js +151 -0
- package/dist/components/diff-table.js.map +1 -0
- package/dist/components/dock.js +2 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +23 -18
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +63 -58
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/empty.js +6 -6
- package/dist/components/empty.js.map +1 -1
- package/dist/components/fab.js +1 -1
- package/dist/components/fab.js.map +1 -1
- package/dist/components/field.js +3 -3
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-dropzone.js +7 -7
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +6 -6
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/flow.js +4 -3
- package/dist/components/flow.js.map +1 -1
- package/dist/components/grid.d.ts +3 -1
- package/dist/components/grid.js +15 -8
- package/dist/components/grid.js.map +1 -1
- package/dist/components/hover-card.js +1 -1
- package/dist/components/hover-card.js.map +1 -1
- package/dist/components/icon-picker.d.ts +8 -2
- package/dist/components/icon-picker.js +75 -47
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +6 -6
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +3 -3
- package/dist/components/input-area.js.map +1 -1
- package/dist/components/input-group.js +5 -5
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +4 -4
- package/dist/components/input.js.map +1 -1
- package/dist/components/label.js +3 -3
- package/dist/components/label.js.map +1 -1
- package/dist/components/layer-card.d.ts +9 -4
- package/dist/components/layer-card.js +72 -67
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/loader.d.ts +16 -10
- package/dist/components/loader.js +46 -53
- package/dist/components/loader.js.map +1 -1
- package/dist/components/loading-screen.js +3 -3
- package/dist/components/loading-screen.js.map +1 -1
- package/dist/components/menu-bar.js +32 -27
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/meter.d.ts +5 -5
- package/dist/components/meter.js +25 -12
- package/dist/components/meter.js.map +1 -1
- package/dist/components/multi-select.js +66 -62
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/navigation-menu.d.ts +2 -2
- package/dist/components/navigation-menu.js +22 -8
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/overlay.js +2 -2
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.d.ts +3 -1
- package/dist/components/page-header.js +12 -12
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/pagination.js +3 -3
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/popover.js +18 -23
- package/dist/components/popover.js.map +1 -1
- package/dist/components/prompt-bar.d.ts +16 -0
- package/dist/components/prompt-bar.js +49 -0
- package/dist/components/prompt-bar.js.map +1 -0
- package/dist/components/radio.js +9 -9
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.d.ts +13 -0
- package/dist/components/recommendation-card.js +123 -0
- package/dist/components/recommendation-card.js.map +1 -0
- package/dist/components/resource-list.js +1 -1
- package/dist/components/resource-list.js.map +1 -1
- package/dist/components/responsive-master-detail.js +4 -4
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +3 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.d.ts +5 -3
- package/dist/components/section-rule.js +12 -12
- package/dist/components/section-rule.js.map +1 -1
- package/dist/components/segment-control.js +3 -3
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +47 -32
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +17 -19
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/sheet.d.ts +4 -4
- package/dist/components/sheet.js +11 -10
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/sidebar.js +149 -137
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.d.ts +1 -1
- package/dist/components/skeleton-line.js +2 -2
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/slider.js +2 -2
- package/dist/components/slider.js.map +1 -1
- package/dist/components/stat-strip.js +5 -4
- package/dist/components/stat-strip.js.map +1 -1
- package/dist/components/switch.js +6 -6
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table-of-contents.js +5 -5
- package/dist/components/table-of-contents.js.map +1 -1
- package/dist/components/table-pager.js +2 -2
- package/dist/components/table-pager.js.map +1 -1
- package/dist/components/table.d.ts +39 -2
- package/dist/components/table.js +48 -17
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +7 -6
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.d.ts +10 -10
- package/dist/components/tag-badge.js +11 -11
- package/dist/components/tag-badge.js.map +1 -1
- package/dist/components/tag-color-picker.d.ts +8 -1
- package/dist/components/tag-color-picker.js +33 -25
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js +5 -5
- package/dist/components/text.js.map +1 -1
- package/dist/components/theme-toggle.js +1 -1
- package/dist/components/theme-toggle.js.map +1 -1
- package/dist/components/thinking.d.ts +16 -0
- package/dist/components/thinking.js +85 -0
- package/dist/components/thinking.js.map +1 -0
- package/dist/components/toast.js +25 -20
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +6 -5
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.js +6 -6
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tool-chips.d.ts +12 -0
- package/dist/components/tool-chips.js +138 -0
- package/dist/components/tool-chips.js.map +1 -0
- package/dist/components/toolbar.js +3 -3
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/typeahead-field.js +59 -56
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +15 -14
- package/dist/components/upload-queue.js.map +1 -1
- package/dist/models/agent-feedback.d.ts +44 -0
- package/dist/models/agent-feedback.js +28 -0
- package/dist/models/agent-feedback.js.map +1 -0
- package/dist/models/avatar.d.ts +2 -0
- package/dist/models/avatar.js +15 -0
- package/dist/models/avatar.js.map +1 -0
- package/dist/models/code.d.ts +6 -0
- package/dist/models/code.js +24 -0
- package/dist/models/code.js.map +1 -0
- package/dist/models/context-cards.d.ts +13 -0
- package/dist/models/context-cards.js +17 -0
- package/dist/models/context-cards.js.map +1 -0
- package/dist/models/diff-table.d.ts +12 -0
- package/dist/models/diff-table.js +9 -0
- package/dist/models/diff-table.js.map +1 -0
- package/dist/models/recommendation.d.ts +26 -0
- package/dist/models/recommendation.js +23 -0
- package/dist/models/recommendation.js.map +1 -0
- package/dist/styles/base.css +14 -2
- package/dist/styles/standalone.css +1901 -943
- package/dist/styles/tailwind.css +180 -13
- package/dist/styles/tokens.css +681 -20
- package/dist/utils/cn.js +25 -4
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/control-surface.d.ts +1 -1
- package/dist/utils/control-surface.js +1 -1
- package/dist/utils/control-surface.js.map +1 -1
- package/dist/utils/navigation.d.ts +3 -0
- package/dist/utils/navigation.js +8 -0
- package/dist/utils/navigation.js.map +1 -0
- package/dist/utils/selection-indicator.d.ts +1 -1
- package/dist/utils/selection-indicator.js +49 -72
- package/dist/utils/selection-indicator.js.map +1 -1
- package/dist/utils/use-hover-highlight.d.ts +4 -0
- package/dist/utils/use-hover-highlight.js +82 -0
- package/dist/utils/use-hover-highlight.js.map +1 -0
- package/dist/viewmodels/use-approval-card.d.ts +20 -0
- package/dist/viewmodels/use-approval-card.js +83 -0
- package/dist/viewmodels/use-approval-card.js.map +1 -0
- package/dist/viewmodels/use-chat-composer.d.ts +16 -0
- package/dist/viewmodels/use-chat-composer.js +34 -0
- package/dist/viewmodels/use-chat-composer.js.map +1 -0
- package/dist/viewmodels/use-chat-message.d.ts +16 -0
- package/dist/viewmodels/use-chat-message.js +26 -0
- package/dist/viewmodels/use-chat-message.js.map +1 -0
- package/dist/viewmodels/use-code-block.d.ts +8 -0
- package/dist/viewmodels/use-code-block.js +38 -0
- package/dist/viewmodels/use-code-block.js.map +1 -0
- package/dist/viewmodels/use-context-cards.d.ts +17 -0
- package/dist/viewmodels/use-context-cards.js +18 -0
- package/dist/viewmodels/use-context-cards.js.map +1 -0
- package/dist/viewmodels/use-diff-table.d.ts +16 -0
- package/dist/viewmodels/use-diff-table.js +42 -0
- package/dist/viewmodels/use-diff-table.js.map +1 -0
- package/dist/viewmodels/use-loader.d.ts +4 -0
- package/dist/viewmodels/use-loader.js +22 -0
- package/dist/viewmodels/use-loader.js.map +1 -0
- package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
- package/dist/viewmodels/use-recommendation-card.js +41 -0
- package/dist/viewmodels/use-recommendation-card.js.map +1 -0
- package/dist/viewmodels/use-thinking.d.ts +13 -0
- package/dist/viewmodels/use-thinking.js +18 -0
- package/dist/viewmodels/use-thinking.js.map +1 -0
- package/dist/viewmodels/use-tool-chips.d.ts +10 -0
- package/dist/viewmodels/use-tool-chips.js +20 -0
- package/dist/viewmodels/use-tool-chips.js.map +1 -0
- package/package.json +28 -26
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
3
|
import { overlayItemClass as t, overlayPanelClass as n } from "./overlay.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
4
|
+
import { useHoverHighlight as r } from "../utils/use-hover-highlight.js";
|
|
5
|
+
import { Input as i } from "./input.js";
|
|
6
|
+
import { useEffect as a, useId as o, useRef as s, useState as c } from "react";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
|
+
import * as d from "@radix-ui/react-popover";
|
|
8
9
|
//#region src/components/typeahead-field.tsx
|
|
9
|
-
function
|
|
10
|
-
let [D, O] =
|
|
11
|
-
|
|
12
|
-
let H =
|
|
10
|
+
function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v, placeholder: y = "Select…", disabled: b = !1, loading: x = !1, size: S = "default", className: C, id: w, allowFreeform: T, "aria-label": E, "aria-describedby": ee, "aria-invalid": te, onBlur: ne, ...re }) {
|
|
11
|
+
let [D, O] = c(g), k = h ?? D, [A, j] = c(p(f, k)), [M, N] = c(h), [P, F] = c(!1), [I, L] = c(null), R = o(), z = s(null), ie = r(), B = s(!1), V = s(null);
|
|
12
|
+
h !== M && (N(h), h === void 0 ? M !== void 0 && (O(M), j(p(f, M))) : j(p(f, h)));
|
|
13
|
+
let H = p(f, k), [U, W] = c(H);
|
|
13
14
|
H !== U && (W(H), (!P || A === U) && j(H));
|
|
14
|
-
let G =
|
|
15
|
-
defaultValue:
|
|
16
|
-
items:
|
|
17
|
-
value:
|
|
15
|
+
let G = s({
|
|
16
|
+
defaultValue: g,
|
|
17
|
+
items: f,
|
|
18
|
+
value: h
|
|
18
19
|
});
|
|
19
|
-
|
|
20
|
+
a(() => {
|
|
20
21
|
G.current = {
|
|
21
|
-
defaultValue:
|
|
22
|
-
items:
|
|
23
|
-
value:
|
|
22
|
+
defaultValue: g,
|
|
23
|
+
items: f,
|
|
24
|
+
value: h
|
|
24
25
|
};
|
|
25
|
-
}),
|
|
26
|
+
}), a(() => {
|
|
26
27
|
let e = z.current?.form;
|
|
27
28
|
if (!e) return;
|
|
28
29
|
let t = !1, n = /* @__PURE__ */ new Set(), r = (e) => {
|
|
29
30
|
let r = setTimeout(() => {
|
|
30
31
|
if (n.delete(r), t || e.defaultPrevented) return;
|
|
31
32
|
let i = G.current;
|
|
32
|
-
i.value === void 0 ? (O(i.defaultValue), j(
|
|
33
|
+
i.value === void 0 ? (O(i.defaultValue), j(p(i.items, i.defaultValue))) : j(p(i.items, i.value)), F(!1), L(null);
|
|
33
34
|
}, 0);
|
|
34
35
|
n.add(r);
|
|
35
36
|
};
|
|
@@ -39,8 +40,8 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
|
|
|
39
40
|
n.clear(), e.removeEventListener("reset", r);
|
|
40
41
|
};
|
|
41
42
|
}, []);
|
|
42
|
-
let K = f
|
|
43
|
-
|
|
43
|
+
let K = m(f, A, !T), q = I === null || K.length === 0 ? null : Math.min(I, K.length - 1), J = q === null ? void 0 : K[q], Y = P && K.length > 0, X = b || x;
|
|
44
|
+
a(() => {
|
|
44
45
|
if (!Y || q === null) return;
|
|
45
46
|
let e = document.getElementById(`${R}-opt-${q}`);
|
|
46
47
|
typeof e?.scrollIntoView == "function" && e.scrollIntoView({ block: "nearest" });
|
|
@@ -48,81 +49,81 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
|
|
|
48
49
|
q,
|
|
49
50
|
R,
|
|
50
51
|
Y
|
|
51
|
-
]),
|
|
52
|
+
]), a(() => {
|
|
52
53
|
if (!P) return;
|
|
53
|
-
let e = f
|
|
54
|
+
let e = m(f, A, !T).length;
|
|
54
55
|
L((t) => t === null || e === 0 ? null : Math.min(t, e - 1));
|
|
55
56
|
}, [
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
T,
|
|
58
|
+
f,
|
|
58
59
|
P,
|
|
59
60
|
A
|
|
60
61
|
]);
|
|
61
62
|
function Z(e, t, n = !0) {
|
|
62
|
-
|
|
63
|
+
h === void 0 ? (O(e), j(t)) : j(p(f, h)), F(!1), L(null), _?.(e), n && z.current && document.activeElement !== z.current && (B.current = !0, z.current.focus());
|
|
63
64
|
}
|
|
64
65
|
function Q(e, t = !0) {
|
|
65
66
|
e.disabled || Z(e.value, e.label, t);
|
|
66
67
|
}
|
|
67
68
|
function $(e, t = !0) {
|
|
68
|
-
let n = e.trim(), r =
|
|
69
|
+
let n = e.trim(), r = f.find((e) => !e.disabled && (e.label.toLowerCase() === n.toLowerCase() || e.value === n));
|
|
69
70
|
if (r) {
|
|
70
71
|
Q(r, t);
|
|
71
72
|
return;
|
|
72
73
|
}
|
|
73
74
|
Z(n, n, t);
|
|
74
75
|
}
|
|
75
|
-
return
|
|
76
|
+
return a(() => {
|
|
76
77
|
if (!P) return;
|
|
77
78
|
let e = (e) => {
|
|
78
|
-
e.key !== "Escape" || e.isComposing || (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation(), F(!1), j(
|
|
79
|
+
e.key !== "Escape" || e.isComposing || (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation(), F(!1), j(p(f, k)), L(null));
|
|
79
80
|
};
|
|
80
81
|
return window.addEventListener("keydown", e, !0), document.addEventListener("keydown", e, !0), () => {
|
|
81
82
|
window.removeEventListener("keydown", e, !0), document.removeEventListener("keydown", e, !0);
|
|
82
83
|
};
|
|
83
84
|
}, [
|
|
84
|
-
|
|
85
|
+
f,
|
|
85
86
|
P,
|
|
86
87
|
k
|
|
87
|
-
]), /* @__PURE__ */
|
|
88
|
+
]), /* @__PURE__ */ l(d.Root, {
|
|
88
89
|
open: Y,
|
|
89
90
|
onOpenChange: (e) => {
|
|
90
|
-
e || (F(!1), L(null),
|
|
91
|
+
e || (F(!1), L(null), T || j(p(f, k)));
|
|
91
92
|
},
|
|
92
|
-
children: /* @__PURE__ */
|
|
93
|
-
...
|
|
94
|
-
className: e("relative w-full",
|
|
93
|
+
children: /* @__PURE__ */ u("div", {
|
|
94
|
+
...re,
|
|
95
|
+
className: e("relative w-full", C),
|
|
95
96
|
onBlur: (e) => {
|
|
96
97
|
ne?.(e);
|
|
97
98
|
let t = e.relatedTarget, n = document.getElementById(R);
|
|
98
99
|
if (!e.currentTarget.contains(t) && !n?.contains(t)) {
|
|
99
|
-
if (
|
|
100
|
-
if (A.trim() !==
|
|
100
|
+
if (T) {
|
|
101
|
+
if (A.trim() !== p(f, k)) {
|
|
101
102
|
$(A, !1);
|
|
102
103
|
return;
|
|
103
104
|
}
|
|
104
|
-
} else j(
|
|
105
|
+
} else j(p(f, k));
|
|
105
106
|
F(!1), L(null);
|
|
106
107
|
}
|
|
107
108
|
},
|
|
108
109
|
children: [
|
|
109
|
-
|
|
110
|
+
v ? /* @__PURE__ */ l("input", {
|
|
110
111
|
type: "hidden",
|
|
111
|
-
name:
|
|
112
|
+
name: v,
|
|
112
113
|
value: k,
|
|
113
114
|
disabled: X
|
|
114
115
|
}) : null,
|
|
115
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ l(d.Anchor, {
|
|
116
117
|
asChild: !0,
|
|
117
|
-
children: /* @__PURE__ */
|
|
118
|
+
children: /* @__PURE__ */ l(i, {
|
|
118
119
|
ref: z,
|
|
119
|
-
id:
|
|
120
|
+
id: w,
|
|
120
121
|
value: A,
|
|
121
122
|
disabled: X,
|
|
122
|
-
size:
|
|
123
|
-
"aria-busy":
|
|
123
|
+
size: S,
|
|
124
|
+
"aria-busy": x || void 0,
|
|
124
125
|
"aria-invalid": te,
|
|
125
|
-
"aria-describedby":
|
|
126
|
+
"aria-describedby": ee,
|
|
126
127
|
onChange: (e) => {
|
|
127
128
|
j(e.target.value), F(!0), L(null);
|
|
128
129
|
},
|
|
@@ -161,20 +162,21 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
|
|
|
161
162
|
e.preventDefault(), Q(J);
|
|
162
163
|
return;
|
|
163
164
|
}
|
|
164
|
-
|
|
165
|
+
T && A.trim() !== p(f, k) && (e.preventDefault(), $(A));
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
},
|
|
168
|
-
placeholder:
|
|
169
|
+
placeholder: y,
|
|
169
170
|
role: "combobox",
|
|
170
|
-
"aria-label":
|
|
171
|
+
"aria-label": E ?? (w ? void 0 : y),
|
|
171
172
|
"aria-expanded": Y,
|
|
172
173
|
"aria-autocomplete": "list",
|
|
173
174
|
"aria-controls": Y ? R : void 0,
|
|
174
175
|
"aria-activedescendant": Y && J && q !== null ? `${R}-opt-${q}` : void 0
|
|
175
176
|
})
|
|
176
177
|
}),
|
|
177
|
-
|
|
178
|
+
/* @__PURE__ */ l(d.Portal, { children: /* @__PURE__ */ l(d.Content, {
|
|
179
|
+
ref: ie,
|
|
178
180
|
side: "bottom",
|
|
179
181
|
sideOffset: 4,
|
|
180
182
|
align: "start",
|
|
@@ -198,16 +200,17 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
|
|
|
198
200
|
},
|
|
199
201
|
id: R,
|
|
200
202
|
role: "listbox",
|
|
201
|
-
className: n("w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto"),
|
|
202
|
-
children: K.map((n, r) => /* @__PURE__ */
|
|
203
|
+
className: n("basalt-hover-list w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto"),
|
|
204
|
+
children: K.map((n, r) => /* @__PURE__ */ l("button", {
|
|
203
205
|
type: "button",
|
|
204
206
|
id: `${R}-opt-${r}`,
|
|
205
207
|
role: "option",
|
|
208
|
+
"data-basalt-hover-item": "",
|
|
206
209
|
tabIndex: -1,
|
|
207
210
|
disabled: n.disabled,
|
|
208
211
|
"aria-disabled": n.disabled || void 0,
|
|
209
212
|
"aria-selected": r === q,
|
|
210
|
-
className: e(t(
|
|
213
|
+
className: e(t(), n.disabled && "opacity-50"),
|
|
211
214
|
onPointerMove: (e) => {
|
|
212
215
|
if (n.disabled) return;
|
|
213
216
|
let { clientX: t, clientY: i } = e;
|
|
@@ -220,19 +223,19 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
|
|
|
220
223
|
onClick: () => Q(n),
|
|
221
224
|
children: n.label
|
|
222
225
|
}, `${R}-opt-${r}`))
|
|
223
|
-
}) })
|
|
226
|
+
}) })
|
|
224
227
|
]
|
|
225
228
|
})
|
|
226
229
|
});
|
|
227
230
|
}
|
|
228
|
-
function
|
|
231
|
+
function p(e, t) {
|
|
229
232
|
return e.find((e) => e.value === t)?.label ?? t;
|
|
230
233
|
}
|
|
231
|
-
function
|
|
234
|
+
function m(e, t, n) {
|
|
232
235
|
let r = t.trim().toLowerCase();
|
|
233
236
|
return r === "" ? n ? e : [] : e.filter((e) => e.label.toLowerCase().includes(r));
|
|
234
237
|
}
|
|
235
238
|
//#endregion
|
|
236
|
-
export {
|
|
239
|
+
export { f as TypeaheadField };
|
|
237
240
|
|
|
238
241
|
//# sourceMappingURL=typeahead-field.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead-field.js","names":["PopoverPrimitive","TypeaheadField","ariaLabel","ariaDescribedBy","ariaInvalid","rest","uncontrolled","setUncontrolled","useState","defaultValue","selected","value","query","setQuery","displayOf","items","prevValue","setPrevValue","open","setOpen","active","setActive","listId","useId","inputRef","useRef","skipFocusOpen","lastPointerPos","selectedDisplay","prevDisplay","setPrevDisplay","latestConfigRef","useEffect","form","disposed","timers","onReset","timer","event","cfg","filtered","filterItems","allowFreeform","activeIndex","activeItem","listOpen","busy","disabled","loading","optionElement","nextLen","current","commitValue","next","display","onValueChange","restoreFocus","commitItem","item","commitFreeform","trimmed","text","match","onKey","nextOpen","cn","className","related","listbox","name","Input","id","placeholder","evt","target","overlayPanelClass","index","overlayItemClass","clientX","clientY","needle","showAllWhenEmpty"],"sources":["../../src/components/typeahead-field.tsx"],"sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { type ComponentPropsWithoutRef, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Input, type InputSize } from \"./input\";\nimport { OVERLAY_GAP, overlayItemClass, overlayPanelClass } from \"./overlay\";\n\nexport type TypeaheadItem = {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n};\n\nexport function TypeaheadField({\n\titems,\n\tvalue,\n\tdefaultValue = \"\",\n\tonValueChange,\n\tname,\n\tplaceholder = \"Select…\",\n\tdisabled = false,\n\tloading = false,\n\tsize = \"default\",\n\tclassName,\n\tid,\n\tallowFreeform,\n\t\"aria-label\": ariaLabel,\n\t\"aria-describedby\": ariaDescribedBy,\n\t\"aria-invalid\": ariaInvalid,\n\tonBlur,\n\t...rest\n}: {\n\titems: TypeaheadItem[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tname?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsize?: InputSize;\n\tclassName?: string;\n\tid?: string;\n\tallowFreeform: boolean;\n\t\"aria-label\"?: string;\n\t\"aria-describedby\"?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n} & Omit<ComponentPropsWithoutRef<\"div\">, \"children\" | \"defaultValue\" | \"onChange\">) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultValue);\n\tconst selected = value ?? uncontrolled;\n\tconst [query, setQuery] = useState(displayOf(items, selected));\n\tconst [prevValue, setPrevValue] = useState(value);\n\tconst [open, setOpen] = useState(false);\n\tconst [active, setActive] = useState<number | null>(null);\n\tconst listId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst skipFocusOpen = useRef(false);\n\tconst lastPointerPos = useRef<{ x: number; y: number } | null>(null);\n\tif (value !== prevValue) {\n\t\tsetPrevValue(value);\n\t\tif (value !== undefined) {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t} else if (prevValue !== undefined) {\n\t\t\tsetUncontrolled(prevValue);\n\t\t\tsetQuery(displayOf(items, prevValue));\n\t\t}\n\t}\n\tconst selectedDisplay = displayOf(items, selected);\n\tconst [prevDisplay, setPrevDisplay] = useState(selectedDisplay);\n\tif (selectedDisplay !== prevDisplay) {\n\t\tsetPrevDisplay(selectedDisplay);\n\t\tif (!open || query === prevDisplay) {\n\t\t\tsetQuery(selectedDisplay);\n\t\t}\n\t}\n\tconst latestConfigRef = useRef({\n\t\tdefaultValue,\n\t\titems,\n\t\tvalue,\n\t});\n\tuseEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\titems,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\tconst node = inputRef.current;\n\t\tconst form = node?.form;\n\t\tif (!form) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue);\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.defaultValue));\n\t\t\t\t} else {\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.value));\n\t\t\t\t}\n\t\t\t\tsetOpen(false);\n\t\t\t\tsetActive(null);\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tform.addEventListener(\"reset\", onReset);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tform.removeEventListener(\"reset\", onReset);\n\t\t};\n\t}, []);\n\tconst filtered = filterItems(items, query, !allowFreeform);\n\tconst activeIndex =\n\t\tactive === null || filtered.length === 0 ? null : Math.min(active, filtered.length - 1);\n\tconst activeItem = activeIndex === null ? undefined : filtered[activeIndex];\n\tconst listOpen = open && filtered.length > 0;\n\tconst busy = disabled || loading;\n\n\tuseEffect(() => {\n\t\tif (!listOpen || activeIndex === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionElement = document.getElementById(`${listId}-opt-${activeIndex}`);\n\t\tif (typeof optionElement?.scrollIntoView === \"function\") {\n\t\t\toptionElement.scrollIntoView({ block: \"nearest\" });\n\t\t}\n\t}, [activeIndex, listId, listOpen]);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst nextLen = filterItems(items, query, !allowFreeform).length;\n\t\tsetActive((current) => {\n\t\t\tif (current === null || nextLen === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn Math.min(current, nextLen - 1);\n\t\t});\n\t}, [allowFreeform, items, open, query]);\n\n\tfunction commitValue(next: string, display: string, restoreFocus = true) {\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t\tsetQuery(display);\n\t\t} else {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t}\n\t\tsetOpen(false);\n\t\tsetActive(null);\n\t\tonValueChange?.(next);\n\t\tif (restoreFocus && inputRef.current && document.activeElement !== inputRef.current) {\n\t\t\tskipFocusOpen.current = true;\n\t\t\tinputRef.current.focus();\n\t\t}\n\t}\n\n\tfunction commitItem(item: TypeaheadItem, restoreFocus = true) {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(item.value, item.label, restoreFocus);\n\t}\n\n\tfunction commitFreeform(text: string, restoreFocus = true) {\n\t\tconst trimmed = text.trim();\n\t\tconst match = items.find(\n\t\t\t(item) =>\n\t\t\t\t!item.disabled &&\n\t\t\t\t(item.label.toLowerCase() === trimmed.toLowerCase() || item.value === trimmed),\n\t\t);\n\t\tif (match) {\n\t\t\tcommitItem(match, restoreFocus);\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(trimmed, trimmed, restoreFocus);\n\t}\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\" || event.isComposing) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tsetOpen(false);\n\t\t\tsetQuery(displayOf(items, selected));\n\t\t\tsetActive(null);\n\t\t};\n\t\twindow.addEventListener(\"keydown\", onKey, true);\n\t\tdocument.addEventListener(\"keydown\", onKey, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", onKey, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKey, true);\n\t\t};\n\t}, [items, open, selected]);\n\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\topen={listOpen}\n\t\t\tonOpenChange={(nextOpen) => {\n\t\t\t\tif (!nextOpen) {\n\t\t\t\t\tsetOpen(false);\n\t\t\t\t\tsetActive(null);\n\t\t\t\t\tif (!allowFreeform) {\n\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\t{...rest}\n\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\tonBlur={(event) => {\n\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\tconst related = event.relatedTarget as Node | null;\n\t\t\t\t\tconst listbox = document.getElementById(listId);\n\t\t\t\t\tif (!event.currentTarget.contains(related) && !listbox?.contains(related)) {\n\t\t\t\t\t\tif (allowFreeform) {\n\t\t\t\t\t\t\tif (query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\tcommitFreeform(query, false);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{name ? <input type=\"hidden\" name={name} value={selected} disabled={busy} /> : null}\n\t\t\t\t<PopoverPrimitive.Anchor asChild>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tsetQuery(event.target.value);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (skipFocusOpen.current) {\n\t\t\t\t\t\t\t\tskipFocusOpen.current = false;\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!open) {\n\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing || event.key === \"Process\") {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) => (current === null ? 0 : (current + 1) % filtered.length));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) =>\n\t\t\t\t\t\t\t\t\tcurrent === null\n\t\t\t\t\t\t\t\t\t\t? filtered.length - 1\n\t\t\t\t\t\t\t\t\t\t: (current - 1 + filtered.length) % filtered.length,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tif (open && activeItem) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitItem(activeItem);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (allowFreeform && query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitFreeform(query);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-label={ariaLabel ?? (id ? undefined : placeholder)}\n\t\t\t\t\t\taria-expanded={listOpen}\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-controls={listOpen ? listId : undefined}\n\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\tlistOpen && activeItem && activeIndex !== null\n\t\t\t\t\t\t\t\t? `${listId}-opt-${activeIndex}`\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</PopoverPrimitive.Anchor>\n\t\t\t\t{listOpen ? (\n\t\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\t\tside=\"bottom\"\n\t\t\t\t\t\t\tsideOffset={OVERLAY_GAP}\n\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\t\tlastPointerPos.current.x === event.clientX &&\n\t\t\t\t\t\t\t\t\tlastPointerPos.current.y === event.clientY\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlastPointerPos.current = { x: event.clientX, y: event.clientY };\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonEscapeKeyDown={(e) => {\n\t\t\t\t\t\t\t\tconst evt = e as unknown as {\n\t\t\t\t\t\t\t\t\tisComposing?: boolean;\n\t\t\t\t\t\t\t\t\tnativeEvent?: { isComposing?: boolean };\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tif (evt.isComposing || evt.nativeEvent?.isComposing) {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\t\tonCloseAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\t\tonInteractOutside={(e) => {\n\t\t\t\t\t\t\t\tconst target = e.target as Node | null;\n\t\t\t\t\t\t\t\tif (inputRef.current?.contains(target)) {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tid={listId}\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\tclassName={overlayPanelClass(\n\t\t\t\t\t\t\t\t\"w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{filtered.map((item, index) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tkey={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\t\tid={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\t\taria-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\toverlayItemClass(\"hover:bg-basalt-accent\"),\n\t\t\t\t\t\t\t\t\t\tindex === activeIndex && \"bg-basalt-accent\",\n\t\t\t\t\t\t\t\t\t\titem.disabled && \"opacity-50\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tconst { clientX, clientY } = event;\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.x === clientX &&\n\t\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.y === clientY\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current = { x: clientX, y: clientY };\n\t\t\t\t\t\t\t\t\t\tsetActive(index);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\t\tonClick={() => commitItem(item)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</PopoverPrimitive.Root>\n\t);\n}\n\nfunction displayOf(items: TypeaheadItem[], value: string) {\n\treturn items.find((item) => item.value === value)?.label ?? value;\n}\n\nfunction filterItems(items: TypeaheadItem[], query: string, showAllWhenEmpty: boolean) {\n\tconst needle = query.trim().toLowerCase();\n\tif (needle === \"\") {\n\t\treturn showAllWhenEmpty ? items : [];\n\t}\n\treturn items.filter((item) => item.label.toLowerCase().includes(needle));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typeahead-field.js","names":["PopoverPrimitive","TypeaheadField","ariaLabel","ariaDescribedBy","ariaInvalid","rest","uncontrolled","setUncontrolled","useState","defaultValue","selected","value","query","setQuery","displayOf","items","prevValue","setPrevValue","open","setOpen","active","setActive","listId","useId","inputRef","useRef","highlightRef","useHoverHighlight","skipFocusOpen","lastPointerPos","selectedDisplay","prevDisplay","setPrevDisplay","latestConfigRef","useEffect","form","disposed","timers","onReset","timer","event","cfg","filtered","filterItems","allowFreeform","activeIndex","activeItem","listOpen","busy","disabled","loading","optionElement","nextLen","current","commitValue","next","display","onValueChange","restoreFocus","commitItem","item","commitFreeform","trimmed","text","match","onKey","nextOpen","cn","className","related","listbox","name","Input","id","placeholder","evt","target","overlayPanelClass","index","overlayItemClass","clientX","clientY","needle","showAllWhenEmpty"],"sources":["../../src/components/typeahead-field.tsx"],"sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { type ComponentPropsWithoutRef, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { useHoverHighlight } from \"../utils/use-hover-highlight\";\nimport { Input, type InputSize } from \"./input\";\nimport { OVERLAY_GAP, overlayItemClass, overlayPanelClass } from \"./overlay\";\n\nexport type TypeaheadItem = {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n};\n\nexport function TypeaheadField({\n\titems,\n\tvalue,\n\tdefaultValue = \"\",\n\tonValueChange,\n\tname,\n\tplaceholder = \"Select…\",\n\tdisabled = false,\n\tloading = false,\n\tsize = \"default\",\n\tclassName,\n\tid,\n\tallowFreeform,\n\t\"aria-label\": ariaLabel,\n\t\"aria-describedby\": ariaDescribedBy,\n\t\"aria-invalid\": ariaInvalid,\n\tonBlur,\n\t...rest\n}: {\n\titems: TypeaheadItem[];\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonValueChange?: (value: string) => void;\n\tname?: string;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tloading?: boolean;\n\tsize?: InputSize;\n\tclassName?: string;\n\tid?: string;\n\tallowFreeform: boolean;\n\t\"aria-label\"?: string;\n\t\"aria-describedby\"?: string;\n\t\"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\";\n} & Omit<ComponentPropsWithoutRef<\"div\">, \"children\" | \"defaultValue\" | \"onChange\">) {\n\tconst [uncontrolled, setUncontrolled] = useState(defaultValue);\n\tconst selected = value ?? uncontrolled;\n\tconst [query, setQuery] = useState(displayOf(items, selected));\n\tconst [prevValue, setPrevValue] = useState(value);\n\tconst [open, setOpen] = useState(false);\n\tconst [active, setActive] = useState<number | null>(null);\n\tconst listId = useId();\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst highlightRef = useHoverHighlight();\n\tconst skipFocusOpen = useRef(false);\n\tconst lastPointerPos = useRef<{ x: number; y: number } | null>(null);\n\tif (value !== prevValue) {\n\t\tsetPrevValue(value);\n\t\tif (value !== undefined) {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t} else if (prevValue !== undefined) {\n\t\t\tsetUncontrolled(prevValue);\n\t\t\tsetQuery(displayOf(items, prevValue));\n\t\t}\n\t}\n\tconst selectedDisplay = displayOf(items, selected);\n\tconst [prevDisplay, setPrevDisplay] = useState(selectedDisplay);\n\tif (selectedDisplay !== prevDisplay) {\n\t\tsetPrevDisplay(selectedDisplay);\n\t\tif (!open || query === prevDisplay) {\n\t\t\tsetQuery(selectedDisplay);\n\t\t}\n\t}\n\tconst latestConfigRef = useRef({\n\t\tdefaultValue,\n\t\titems,\n\t\tvalue,\n\t});\n\tuseEffect(() => {\n\t\tlatestConfigRef.current = {\n\t\t\tdefaultValue,\n\t\t\titems,\n\t\t\tvalue,\n\t\t};\n\t});\n\n\tuseEffect(() => {\n\t\tconst node = inputRef.current;\n\t\tconst form = node?.form;\n\t\tif (!form) {\n\t\t\treturn;\n\t\t}\n\t\tlet disposed = false;\n\t\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\t\tconst onReset = (event: Event) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\ttimers.delete(timer);\n\t\t\t\tif (disposed || event.defaultPrevented) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst cfg = latestConfigRef.current;\n\t\t\t\tif (cfg.value === undefined) {\n\t\t\t\t\tsetUncontrolled(cfg.defaultValue);\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.defaultValue));\n\t\t\t\t} else {\n\t\t\t\t\tsetQuery(displayOf(cfg.items, cfg.value));\n\t\t\t\t}\n\t\t\t\tsetOpen(false);\n\t\t\t\tsetActive(null);\n\t\t\t}, 0);\n\t\t\ttimers.add(timer);\n\t\t};\n\t\tform.addEventListener(\"reset\", onReset);\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tfor (const timer of timers) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t}\n\t\t\ttimers.clear();\n\t\t\tform.removeEventListener(\"reset\", onReset);\n\t\t};\n\t}, []);\n\tconst filtered = filterItems(items, query, !allowFreeform);\n\tconst activeIndex =\n\t\tactive === null || filtered.length === 0 ? null : Math.min(active, filtered.length - 1);\n\tconst activeItem = activeIndex === null ? undefined : filtered[activeIndex];\n\tconst listOpen = open && filtered.length > 0;\n\tconst busy = disabled || loading;\n\n\tuseEffect(() => {\n\t\tif (!listOpen || activeIndex === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionElement = document.getElementById(`${listId}-opt-${activeIndex}`);\n\t\tif (typeof optionElement?.scrollIntoView === \"function\") {\n\t\t\toptionElement.scrollIntoView({ block: \"nearest\" });\n\t\t}\n\t}, [activeIndex, listId, listOpen]);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst nextLen = filterItems(items, query, !allowFreeform).length;\n\t\tsetActive((current) => {\n\t\t\tif (current === null || nextLen === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn Math.min(current, nextLen - 1);\n\t\t});\n\t}, [allowFreeform, items, open, query]);\n\n\tfunction commitValue(next: string, display: string, restoreFocus = true) {\n\t\tif (value === undefined) {\n\t\t\tsetUncontrolled(next);\n\t\t\tsetQuery(display);\n\t\t} else {\n\t\t\tsetQuery(displayOf(items, value));\n\t\t}\n\t\tsetOpen(false);\n\t\tsetActive(null);\n\t\tonValueChange?.(next);\n\t\tif (restoreFocus && inputRef.current && document.activeElement !== inputRef.current) {\n\t\t\tskipFocusOpen.current = true;\n\t\t\tinputRef.current.focus();\n\t\t}\n\t}\n\n\tfunction commitItem(item: TypeaheadItem, restoreFocus = true) {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(item.value, item.label, restoreFocus);\n\t}\n\n\tfunction commitFreeform(text: string, restoreFocus = true) {\n\t\tconst trimmed = text.trim();\n\t\tconst match = items.find(\n\t\t\t(item) =>\n\t\t\t\t!item.disabled &&\n\t\t\t\t(item.label.toLowerCase() === trimmed.toLowerCase() || item.value === trimmed),\n\t\t);\n\t\tif (match) {\n\t\t\tcommitItem(match, restoreFocus);\n\t\t\treturn;\n\t\t}\n\t\tcommitValue(trimmed, trimmed, restoreFocus);\n\t}\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst onKey = (event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\" || event.isComposing) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tsetOpen(false);\n\t\t\tsetQuery(displayOf(items, selected));\n\t\t\tsetActive(null);\n\t\t};\n\t\twindow.addEventListener(\"keydown\", onKey, true);\n\t\tdocument.addEventListener(\"keydown\", onKey, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"keydown\", onKey, true);\n\t\t\tdocument.removeEventListener(\"keydown\", onKey, true);\n\t\t};\n\t}, [items, open, selected]);\n\n\treturn (\n\t\t<PopoverPrimitive.Root\n\t\t\topen={listOpen}\n\t\t\tonOpenChange={(nextOpen) => {\n\t\t\t\tif (!nextOpen) {\n\t\t\t\t\tsetOpen(false);\n\t\t\t\t\tsetActive(null);\n\t\t\t\t\tif (!allowFreeform) {\n\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\t{...rest}\n\t\t\t\tclassName={cn(\"relative w-full\", className)}\n\t\t\t\tonBlur={(event) => {\n\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\tconst related = event.relatedTarget as Node | null;\n\t\t\t\t\tconst listbox = document.getElementById(listId);\n\t\t\t\t\tif (!event.currentTarget.contains(related) && !listbox?.contains(related)) {\n\t\t\t\t\t\tif (allowFreeform) {\n\t\t\t\t\t\t\tif (query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\tcommitFreeform(query, false);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetQuery(displayOf(items, selected));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{name ? <input type=\"hidden\" name={name} value={selected} disabled={busy} /> : null}\n\t\t\t\t<PopoverPrimitive.Anchor asChild>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tsetQuery(event.target.value);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (skipFocusOpen.current) {\n\t\t\t\t\t\t\t\tskipFocusOpen.current = false;\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (busy) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!open) {\n\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\tif (event.nativeEvent.isComposing || event.key === \"Process\") {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowDown\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) => (current === null ? 0 : (current + 1) % filtered.length));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"ArrowUp\") {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\t\t\tsetActive(null);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetActive((current) =>\n\t\t\t\t\t\t\t\t\tcurrent === null\n\t\t\t\t\t\t\t\t\t\t? filtered.length - 1\n\t\t\t\t\t\t\t\t\t\t: (current - 1 + filtered.length) % filtered.length,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (event.key === \"Enter\") {\n\t\t\t\t\t\t\t\tif (open && activeItem) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitItem(activeItem);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (allowFreeform && query.trim() !== displayOf(items, selected)) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcommitFreeform(query);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\taria-label={ariaLabel ?? (id ? undefined : placeholder)}\n\t\t\t\t\t\taria-expanded={listOpen}\n\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\taria-controls={listOpen ? listId : undefined}\n\t\t\t\t\t\taria-activedescendant={\n\t\t\t\t\t\t\tlistOpen && activeItem && activeIndex !== null\n\t\t\t\t\t\t\t\t? `${listId}-opt-${activeIndex}`\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</PopoverPrimitive.Anchor>\n\t\t\t\t<PopoverPrimitive.Portal>\n\t\t\t\t\t<PopoverPrimitive.Content\n\t\t\t\t\t\tref={highlightRef}\n\t\t\t\t\t\tside=\"bottom\"\n\t\t\t\t\t\tsideOffset={OVERLAY_GAP}\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tavoidCollisions\n\t\t\t\t\t\tcollisionPadding={8}\n\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.x === event.clientX &&\n\t\t\t\t\t\t\t\tlastPointerPos.current.y === event.clientY\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastPointerPos.current = { x: event.clientX, y: event.clientY };\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonEscapeKeyDown={(e) => {\n\t\t\t\t\t\t\tconst evt = e as unknown as {\n\t\t\t\t\t\t\t\tisComposing?: boolean;\n\t\t\t\t\t\t\t\tnativeEvent?: { isComposing?: boolean };\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (evt.isComposing || evt.nativeEvent?.isComposing) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonOpenAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonCloseAutoFocus={(e) => e.preventDefault()}\n\t\t\t\t\t\tonInteractOutside={(e) => {\n\t\t\t\t\t\t\tconst target = e.target as Node | null;\n\t\t\t\t\t\t\tif (inputRef.current?.contains(target)) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tid={listId}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\tclassName={overlayPanelClass(\n\t\t\t\t\t\t\t\"basalt-hover-list w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filtered.map((item, index) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\tid={`${listId}-opt-${index}`}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\taria-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\tclassName={cn(overlayItemClass(), item.disabled && \"opacity-50\")}\n\t\t\t\t\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst { clientX, clientY } = event;\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.x === clientX &&\n\t\t\t\t\t\t\t\t\t\tlastPointerPos.current.y === clientY\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlastPointerPos.current = { x: clientX, y: clientY };\n\t\t\t\t\t\t\t\t\tsetActive(index);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\t\t\t\tonClick={() => commitItem(item)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</PopoverPrimitive.Content>\n\t\t\t\t</PopoverPrimitive.Portal>\n\t\t\t</div>\n\t\t</PopoverPrimitive.Root>\n\t);\n}\n\nfunction displayOf(items: TypeaheadItem[], value: string) {\n\treturn items.find((item) => item.value === value)?.label ?? value;\n}\n\nfunction filterItems(items: TypeaheadItem[], query: string, showAllWhenEmpty: boolean) {\n\tconst needle = query.trim().toLowerCase();\n\tif (needle === \"\") {\n\t\treturn showAllWhenEmpty ? items : [];\n\t}\n\treturn items.filter((item) => item.label.toLowerCase().includes(needle));\n}\n"],"mappings":"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"}
|
|
@@ -21,24 +21,25 @@ function d({ file: d, onCancel: f, onRetry: p, onRemove: m, labels: h, className
|
|
|
21
21
|
...h
|
|
22
22
|
}, v = typeof d.progress == "number" && Number.isFinite(d.progress) ? Math.max(0, Math.min(100, d.progress)) : void 0, y = d.status === "queued" || d.status === "uploading";
|
|
23
23
|
return /* @__PURE__ */ l("div", {
|
|
24
|
-
|
|
24
|
+
"data-basalt-surface": "",
|
|
25
|
+
className: e(t, "flex min-w-0 items-start gap-basalt-space-lg rounded-basalt-lg border border-basalt-border p-basalt-card-sm", g),
|
|
25
26
|
children: [
|
|
26
27
|
/* @__PURE__ */ c("span", {
|
|
27
|
-
className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-basalt-md bg-basalt-accent",
|
|
28
|
+
className: "flex size-basalt-10 shrink-0 items-center justify-center overflow-hidden rounded-basalt-md bg-basalt-accent",
|
|
28
29
|
children: d.preview ?? /* @__PURE__ */ c(i, {
|
|
29
|
-
className: "size-5 text-basalt-muted-foreground",
|
|
30
|
+
className: "size-basalt-5 text-basalt-muted-foreground",
|
|
30
31
|
"aria-hidden": "true"
|
|
31
32
|
})
|
|
32
33
|
}),
|
|
33
34
|
/* @__PURE__ */ l("div", {
|
|
34
|
-
className: "min-w-0 flex-1 space-y-
|
|
35
|
+
className: "min-w-0 flex-1 space-y-basalt-space-sm",
|
|
35
36
|
children: [
|
|
36
37
|
/* @__PURE__ */ c("p", {
|
|
37
|
-
className: "break-words text-
|
|
38
|
+
className: "break-words text-basalt-base font-medium",
|
|
38
39
|
children: d.name
|
|
39
40
|
}),
|
|
40
41
|
/* @__PURE__ */ l("p", {
|
|
41
|
-
className: "text-
|
|
42
|
+
className: "text-basalt-sm text-basalt-muted-foreground",
|
|
42
43
|
children: [d.size !== void 0 && `${Math.ceil(d.size / 1024).toLocaleString()} KB · `, _[d.status]]
|
|
43
44
|
}),
|
|
44
45
|
d.status === "uploading" && /* @__PURE__ */ c("div", {
|
|
@@ -47,24 +48,24 @@ function d({ file: d, onCancel: f, onRetry: p, onRemove: m, labels: h, className
|
|
|
47
48
|
"aria-valuemin": 0,
|
|
48
49
|
"aria-valuemax": 100,
|
|
49
50
|
"aria-valuenow": v,
|
|
50
|
-
className: "h-
|
|
51
|
+
className: "h-basalt-1_5 overflow-hidden rounded-basalt-full bg-basalt-accent",
|
|
51
52
|
children: /* @__PURE__ */ c("div", {
|
|
52
53
|
style: { width: v === void 0 ? "40%" : `${v}%` },
|
|
53
|
-
className: e("h-full rounded-full bg-basalt-primary", v === void 0 && "animate-pulse motion-reduce:animate-none")
|
|
54
|
+
className: e("h-full rounded-basalt-full bg-basalt-primary", v === void 0 && "animate-pulse motion-reduce:animate-none")
|
|
54
55
|
})
|
|
55
56
|
}),
|
|
56
57
|
d.status === "error" && d.error && /* @__PURE__ */ c("p", {
|
|
57
58
|
role: "alert",
|
|
58
|
-
className: "break-words text-
|
|
59
|
+
className: "break-words text-basalt-sm text-basalt-destructive",
|
|
59
60
|
children: d.error
|
|
60
61
|
})
|
|
61
62
|
]
|
|
62
63
|
}),
|
|
63
64
|
/* @__PURE__ */ l("div", {
|
|
64
|
-
className: "flex shrink-0 items-center gap-
|
|
65
|
+
className: "flex shrink-0 items-center gap-basalt-space-sm",
|
|
65
66
|
children: [
|
|
66
67
|
d.status === "success" && /* @__PURE__ */ c(r, {
|
|
67
|
-
className: "size-
|
|
68
|
+
className: "size-basalt-icon-lg text-basalt-success",
|
|
68
69
|
"aria-hidden": "true"
|
|
69
70
|
}),
|
|
70
71
|
y && f && /* @__PURE__ */ c(n, {
|
|
@@ -95,14 +96,14 @@ function d({ file: d, onCancel: f, onRetry: p, onRemove: m, labels: h, className
|
|
|
95
96
|
}
|
|
96
97
|
function f({ label: n, files: r, emptyLabel: i = "No files selected.", className: a, ...o }) {
|
|
97
98
|
return /* @__PURE__ */ c("div", {
|
|
98
|
-
className: e(t, "min-w-0 space-y-
|
|
99
|
+
className: e(t, "min-w-0 space-y-basalt-space-lg", a),
|
|
99
100
|
children: r.length === 0 ? /* @__PURE__ */ c("p", {
|
|
100
101
|
role: "status",
|
|
101
|
-
className: "text-
|
|
102
|
+
className: "text-basalt-base text-basalt-muted-foreground",
|
|
102
103
|
children: i
|
|
103
104
|
}) : /* @__PURE__ */ c("ul", {
|
|
104
105
|
"aria-label": n,
|
|
105
|
-
className: "m-0 list-none space-y-
|
|
106
|
+
className: "m-0 list-none space-y-basalt-space-lg p-0",
|
|
106
107
|
children: r.map((e) => /* @__PURE__ */ c("li", { children: /* @__PURE__ */ c(d, {
|
|
107
108
|
file: e,
|
|
108
109
|
...o
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-queue.js","names":["DEFAULT_LABELS","UploadItem","text","labels","progress","file","active","cn","BASALT_UI_CLASS","className","FileText","Check","onCancel","Button","X","onRetry","RotateCcw","onRemove","Trash2","UploadQueue","actions","files","emptyLabel","label"],"sources":["../../src/components/upload-queue.tsx"],"sourcesContent":["import { Check, FileText, RotateCcw, Trash2, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Button } from \"./button\";\n\nexport interface UploadFile {\n\t/** Stable queue identifier. */\n\tid: string;\n\t/** Display filename. */\n\tname: string;\n\t/** Optional size in bytes. */\n\tsize?: number;\n\t/** Application-owned transport state. */\n\tstatus: \"queued\" | \"uploading\" | \"success\" | \"error\" | \"cancelled\";\n\t/** Progress percentage; omitted means indeterminate. */\n\tprogress?: number;\n\t/** Application's error message. */\n\terror?: string;\n\t/** Optional image/icon. The caller creates and revokes any object URLs. */\n\tpreview?: ReactNode;\n}\nexport interface UploadLabels {\n\tqueued?: string;\n\tuploading?: string;\n\tsuccess?: string;\n\terror?: string;\n\tcancelled?: string;\n\tcancel?: string;\n\tretry?: string;\n\tremove?: string;\n}\nconst DEFAULT_LABELS = {\n\tqueued: \"Queued\",\n\tuploading: \"Uploading\",\n\tsuccess: \"Uploaded\",\n\terror: \"Upload failed\",\n\tcancelled: \"Cancelled\",\n\tcancel: \"Cancel\",\n\tretry: \"Retry\",\n\tremove: \"Remove\",\n};\n\nexport interface UploadItemProps {\n\t/** Current queue entry. The component does not start a network request. */\n\tfile: UploadFile;\n\t/** Cancel a queued or uploading entry. */\n\tonCancel?: (id: string) => void;\n\t/** Retry a failed or cancelled entry. */\n\tonRetry?: (id: string) => void;\n\t/** Remove an entry that is not currently uploading. */\n\tonRemove?: (id: string) => void;\n\t/** Localized statuses and action labels. */\n\tlabels?: UploadLabels;\n\t/** Additional root classes. */\n\tclassName?: string;\n}\n\nexport function UploadItem({\n\tfile,\n\tonCancel,\n\tonRetry,\n\tonRemove,\n\tlabels,\n\tclassName,\n}: UploadItemProps) {\n\tconst text = { ...DEFAULT_LABELS, ...labels };\n\tconst progress =\n\t\ttypeof file.progress === \"number\" && Number.isFinite(file.progress)\n\t\t\t? Math.max(0, Math.min(100, file.progress))\n\t\t\t: undefined;\n\tconst active = file.status === \"queued\" || file.status === \"uploading\";\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex min-w-0 items-start gap-
|
|
1
|
+
{"version":3,"file":"upload-queue.js","names":["DEFAULT_LABELS","UploadItem","text","labels","progress","file","active","cn","BASALT_UI_CLASS","className","FileText","Check","onCancel","Button","X","onRetry","RotateCcw","onRemove","Trash2","UploadQueue","actions","files","emptyLabel","label"],"sources":["../../src/components/upload-queue.tsx"],"sourcesContent":["import { Check, FileText, RotateCcw, Trash2, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Button } from \"./button\";\n\nexport interface UploadFile {\n\t/** Stable queue identifier. */\n\tid: string;\n\t/** Display filename. */\n\tname: string;\n\t/** Optional size in bytes. */\n\tsize?: number;\n\t/** Application-owned transport state. */\n\tstatus: \"queued\" | \"uploading\" | \"success\" | \"error\" | \"cancelled\";\n\t/** Progress percentage; omitted means indeterminate. */\n\tprogress?: number;\n\t/** Application's error message. */\n\terror?: string;\n\t/** Optional image/icon. The caller creates and revokes any object URLs. */\n\tpreview?: ReactNode;\n}\nexport interface UploadLabels {\n\tqueued?: string;\n\tuploading?: string;\n\tsuccess?: string;\n\terror?: string;\n\tcancelled?: string;\n\tcancel?: string;\n\tretry?: string;\n\tremove?: string;\n}\nconst DEFAULT_LABELS = {\n\tqueued: \"Queued\",\n\tuploading: \"Uploading\",\n\tsuccess: \"Uploaded\",\n\terror: \"Upload failed\",\n\tcancelled: \"Cancelled\",\n\tcancel: \"Cancel\",\n\tretry: \"Retry\",\n\tremove: \"Remove\",\n};\n\nexport interface UploadItemProps {\n\t/** Current queue entry. The component does not start a network request. */\n\tfile: UploadFile;\n\t/** Cancel a queued or uploading entry. */\n\tonCancel?: (id: string) => void;\n\t/** Retry a failed or cancelled entry. */\n\tonRetry?: (id: string) => void;\n\t/** Remove an entry that is not currently uploading. */\n\tonRemove?: (id: string) => void;\n\t/** Localized statuses and action labels. */\n\tlabels?: UploadLabels;\n\t/** Additional root classes. */\n\tclassName?: string;\n}\n\nexport function UploadItem({\n\tfile,\n\tonCancel,\n\tonRetry,\n\tonRemove,\n\tlabels,\n\tclassName,\n}: UploadItemProps) {\n\tconst text = { ...DEFAULT_LABELS, ...labels };\n\tconst progress =\n\t\ttypeof file.progress === \"number\" && Number.isFinite(file.progress)\n\t\t\t? Math.max(0, Math.min(100, file.progress))\n\t\t\t: undefined;\n\tconst active = file.status === \"queued\" || file.status === \"uploading\";\n\treturn (\n\t\t<div\n\t\t\tdata-basalt-surface=\"\"\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex min-w-0 items-start gap-basalt-space-lg rounded-basalt-lg border border-basalt-border p-basalt-card-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"flex size-basalt-10 shrink-0 items-center justify-center overflow-hidden rounded-basalt-md bg-basalt-accent\">\n\t\t\t\t{file.preview ?? (\n\t\t\t\t\t<FileText className=\"size-basalt-5 text-basalt-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t)}\n\t\t\t</span>\n\t\t\t<div className=\"min-w-0 flex-1 space-y-basalt-space-sm\">\n\t\t\t\t<p className=\"break-words text-basalt-base font-medium\">{file.name}</p>\n\t\t\t\t<p className=\"text-basalt-sm text-basalt-muted-foreground\">\n\t\t\t\t\t{file.size !== undefined && `${Math.ceil(file.size / 1024).toLocaleString()} KB · `}\n\t\t\t\t\t{text[file.status]}\n\t\t\t\t</p>\n\t\t\t\t{file.status === \"uploading\" && (\n\t\t\t\t\t<div\n\t\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\t\taria-label={file.name}\n\t\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\t\taria-valuenow={progress}\n\t\t\t\t\t\tclassName=\"h-basalt-1_5 overflow-hidden rounded-basalt-full bg-basalt-accent\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{ width: progress === undefined ? \"40%\" : `${progress}%` }}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-full rounded-basalt-full bg-basalt-primary\",\n\t\t\t\t\t\t\t\tprogress === undefined && \"animate-pulse motion-reduce:animate-none\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{file.status === \"error\" && file.error && (\n\t\t\t\t\t<p role=\"alert\" className=\"break-words text-basalt-sm text-basalt-destructive\">\n\t\t\t\t\t\t{file.error}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex shrink-0 items-center gap-basalt-space-sm\">\n\t\t\t\t{file.status === \"success\" && (\n\t\t\t\t\t<Check className=\"size-basalt-icon-lg text-basalt-success\" aria-hidden=\"true\" />\n\t\t\t\t)}\n\t\t\t\t{active && onCancel && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\taria-label={`${text.cancel} ${file.name}`}\n\t\t\t\t\t\tonClick={() => onCancel(file.id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<X />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{(file.status === \"error\" || file.status === \"cancelled\") && onRetry && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\taria-label={`${text.retry} ${file.name}`}\n\t\t\t\t\t\tonClick={() => onRetry(file.id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RotateCcw />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t{file.status !== \"uploading\" && onRemove && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\taria-label={`${text.remove} ${file.name}`}\n\t\t\t\t\t\tonClick={() => onRemove(file.id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport interface UploadQueueProps extends Omit<UploadItemProps, \"file\"> {\n\t/** Accessible queue name. */\n\tlabel: string;\n\t/** Application-owned queue entries. */\n\tfiles: readonly UploadFile[];\n\t/** Empty queue text. @default \"No files selected.\" */\n\temptyLabel?: string;\n}\n\nexport function UploadQueue({\n\tlabel,\n\tfiles,\n\temptyLabel = \"No files selected.\",\n\tclassName,\n\t...actions\n}: UploadQueueProps) {\n\treturn (\n\t\t<div className={cn(BASALT_UI_CLASS, \"min-w-0 space-y-basalt-space-lg\", className)}>\n\t\t\t{files.length === 0 ? (\n\t\t\t\t<p role=\"status\" className=\"text-basalt-base text-basalt-muted-foreground\">\n\t\t\t\t\t{emptyLabel}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul aria-label={label} className=\"m-0 list-none space-y-basalt-space-lg p-0\">\n\t\t\t\t\t{files.map((file) => (\n\t\t\t\t\t\t<li key={file.id}>\n\t\t\t\t\t\t\t<UploadItem file={file} {...actions} />\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type AgentStepStatus = "pending" | "running" | "complete" | "error";
|
|
2
|
+
export type ThinkingStep = {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
detail?: string;
|
|
6
|
+
status: AgentStepStatus;
|
|
7
|
+
};
|
|
8
|
+
export type ThinkingVariant = "steps" | "reasoning" | "search" | "coding";
|
|
9
|
+
export type ToolStep = ThinkingStep & {
|
|
10
|
+
kind: "think" | "read" | "write" | "run";
|
|
11
|
+
target?: string;
|
|
12
|
+
};
|
|
13
|
+
export type ToolDiff = {
|
|
14
|
+
file: string;
|
|
15
|
+
added: number;
|
|
16
|
+
removed: number;
|
|
17
|
+
content?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function summarizeSteps(steps: readonly ThinkingStep[]): {
|
|
20
|
+
completed: number;
|
|
21
|
+
total: number;
|
|
22
|
+
status: AgentStepStatus;
|
|
23
|
+
};
|
|
24
|
+
export type ApprovalQuestion = {
|
|
25
|
+
id: string;
|
|
26
|
+
label: string;
|
|
27
|
+
type: "single" | "multiple";
|
|
28
|
+
options: readonly {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
}[];
|
|
33
|
+
/** Required questions cannot be skipped. @default true */
|
|
34
|
+
required?: boolean;
|
|
35
|
+
allowCustom?: boolean;
|
|
36
|
+
};
|
|
37
|
+
export type ApprovalAnswer = {
|
|
38
|
+
selected: string[];
|
|
39
|
+
custom?: string;
|
|
40
|
+
skipped?: boolean;
|
|
41
|
+
};
|
|
42
|
+
export type ApprovalAnswers = Record<string, ApprovalAnswer>;
|
|
43
|
+
export declare function validApprovalAnswer(question: ApprovalQuestion, answer: ApprovalAnswer | undefined): boolean;
|
|
44
|
+
export declare function approvalSnapshot(questions: readonly ApprovalQuestion[], answers: ApprovalAnswers): ApprovalAnswers;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/models/agent-feedback.ts
|
|
3
|
+
function e(e) {
|
|
4
|
+
let t = e.filter((e) => e.status === "complete").length, n = e.some((e) => e.status === "error") ? "error" : e.some((e) => e.status === "running") ? "running" : e.length > 0 && t === e.length ? "complete" : "pending";
|
|
5
|
+
return {
|
|
6
|
+
completed: t,
|
|
7
|
+
total: e.length,
|
|
8
|
+
status: n
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function t(e, t) {
|
|
12
|
+
let n = t?.selected.filter((t) => e.options.some((e) => e.id === t && !e.disabled)) ?? [], r = e.allowCustom ? t?.custom?.trim() ?? "" : "";
|
|
13
|
+
return (e.type === "multiple" || n.length <= 1) && (n.length > 0 || r.length > 0 || e.required === !1 && t?.skipped === !0);
|
|
14
|
+
}
|
|
15
|
+
function n(e, t) {
|
|
16
|
+
return Object.fromEntries(e.map((e) => {
|
|
17
|
+
let n = t[e.id], r = n?.selected.filter((t) => e.options.some((e) => e.id === t && !e.disabled)) ?? [];
|
|
18
|
+
return [e.id, {
|
|
19
|
+
selected: e.type === "single" ? r.slice(0, 1) : r,
|
|
20
|
+
...e.allowCustom ? { custom: n?.custom?.trim() ?? "" } : {},
|
|
21
|
+
...n?.skipped ? { skipped: !0 } : {}
|
|
22
|
+
}];
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { n as approvalSnapshot, e as summarizeSteps, t as validApprovalAnswer };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=agent-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-feedback.js","names":["summarizeSteps","completed","steps","step","status","validApprovalAnswer","selected","answer","question","option","id","custom","approvalSnapshot","questions","answers"],"sources":["../../src/models/agent-feedback.ts"],"sourcesContent":["export type AgentStepStatus = \"pending\" | \"running\" | \"complete\" | \"error\";\nexport type ThinkingStep = { id: string; label: string; detail?: string; status: AgentStepStatus };\nexport type ThinkingVariant = \"steps\" | \"reasoning\" | \"search\" | \"coding\";\nexport type ToolStep = ThinkingStep & { kind: \"think\" | \"read\" | \"write\" | \"run\"; target?: string };\nexport type ToolDiff = { file: string; added: number; removed: number; content?: string };\n\nexport function summarizeSteps(steps: readonly ThinkingStep[]) {\n\tconst completed = steps.filter((step) => step.status === \"complete\").length;\n\tconst status: AgentStepStatus = steps.some((step) => step.status === \"error\")\n\t\t? \"error\"\n\t\t: steps.some((step) => step.status === \"running\")\n\t\t\t? \"running\"\n\t\t\t: steps.length > 0 && completed === steps.length\n\t\t\t\t? \"complete\"\n\t\t\t\t: \"pending\";\n\treturn { completed, total: steps.length, status };\n}\n\nexport type ApprovalQuestion = {\n\tid: string;\n\tlabel: string;\n\ttype: \"single\" | \"multiple\";\n\toptions: readonly { id: string; label: string; disabled?: boolean }[];\n\t/** Required questions cannot be skipped. @default true */\n\trequired?: boolean;\n\tallowCustom?: boolean;\n};\nexport type ApprovalAnswer = { selected: string[]; custom?: string; skipped?: boolean };\nexport type ApprovalAnswers = Record<string, ApprovalAnswer>;\n\nexport function validApprovalAnswer(\n\tquestion: ApprovalQuestion,\n\tanswer: ApprovalAnswer | undefined,\n) {\n\tconst selected =\n\t\tanswer?.selected.filter((id) =>\n\t\t\tquestion.options.some((option) => option.id === id && !option.disabled),\n\t\t) ?? [];\n\tconst custom = question.allowCustom ? (answer?.custom?.trim() ?? \"\") : \"\";\n\treturn (\n\t\t(question.type === \"multiple\" || selected.length <= 1) &&\n\t\t(selected.length > 0 ||\n\t\t\tcustom.length > 0 ||\n\t\t\t(question.required === false && answer?.skipped === true))\n\t);\n}\n\nexport function approvalSnapshot(\n\tquestions: readonly ApprovalQuestion[],\n\tanswers: ApprovalAnswers,\n): ApprovalAnswers {\n\treturn Object.fromEntries(\n\t\tquestions.map((question) => {\n\t\t\tconst answer = answers[question.id];\n\t\t\tconst selected =\n\t\t\t\tanswer?.selected.filter((id) =>\n\t\t\t\t\tquestion.options.some((option) => option.id === id && !option.disabled),\n\t\t\t\t) ?? [];\n\t\t\treturn [\n\t\t\t\tquestion.id,\n\t\t\t\t{\n\t\t\t\t\tselected: question.type === \"single\" ? selected.slice(0, 1) : selected,\n\t\t\t\t\t...(question.allowCustom ? { custom: answer?.custom?.trim() ?? \"\" } : {}),\n\t\t\t\t\t...(answer?.skipped ? { skipped: true } : {}),\n\t\t\t\t},\n\t\t\t];\n\t\t}),\n\t);\n}\n"],"mappings":";;AAMA,SAAgBA,EAAe,GAAgC;CAC9D,IAAMC,IAAYC,EAAM,QAAQ,MAASC,EAAK,WAAW,UAAU,CAAC,CAAC,QAC/DC,IAA0BF,EAAM,MAAM,MAASC,EAAK,WAAW,OAAO,IACzE,UACAD,EAAM,MAAM,MAASC,EAAK,WAAW,SAAS,IAC7C,YACAD,EAAM,SAAS,KAAKD,MAAcC,EAAM,SACvC,aACA;CACL,OAAO;EAAE;EAAW,OAAOA,EAAM;EAAQ;CAAO;AACjD;AAcA,SAAgBG,EACf,GACA,GACC;CACD,IAAMC,IACLC,GAAQ,SAAS,QAAQ,MACxBC,EAAS,QAAQ,MAAM,MAAWC,EAAO,OAAOC,KAAM,CAACD,EAAO,QAAQ,CACvE,KAAK,CAAC,GACDE,IAASH,EAAS,cAAeD,GAAQ,QAAQ,KAAK,KAAK,KAAM;CACvE,QACEC,EAAS,SAAS,cAAcF,EAAS,UAAU,OACnDA,EAAS,SAAS,KAClBK,EAAO,SAAS,KACfH,EAAS,aAAa,MAASD,GAAQ,YAAY;AAEvD;AAEA,SAAgBK,EACf,GACA,GACkB;CAClB,OAAO,OAAO,YACbC,EAAU,KAAK,MAAa;EAC3B,IAAMN,IAASO,EAAQN,EAAS,KAC1BF,IACLC,GAAQ,SAAS,QAAQ,MACxBC,EAAS,QAAQ,MAAM,MAAWC,EAAO,OAAOC,KAAM,CAACD,EAAO,QAAQ,CACvE,KAAK,CAAC;EACP,OAAO,CACND,EAAS,IACT;GACC,UAAUA,EAAS,SAAS,WAAWF,EAAS,MAAM,GAAG,CAAC,IAAIA;GAC9D,GAAIE,EAAS,cAAc,EAAE,QAAQD,GAAQ,QAAQ,KAAK,KAAK,GAAG,IAAI,CAAC;GACvE,GAAIA,GAAQ,UAAU,EAAE,SAAS,GAAK,IAAI,CAAC;EAC5C,CACD;CACD,CAAC,CACF;AACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/models/avatar.ts
|
|
3
|
+
function e(e) {
|
|
4
|
+
let t = e.trim().split(/[\s—–-]+/u).filter(Boolean), n = t.length > 1 ? [Array.from(t[0])[0], Array.from(t[1])[0]] : Array.from(t[0] ?? "").slice(0, 2);
|
|
5
|
+
return Array.from(n.join("").toLocaleUpperCase("en-US")).slice(0, 2).join("") || "?";
|
|
6
|
+
}
|
|
7
|
+
function t(e) {
|
|
8
|
+
let t = 2166136261;
|
|
9
|
+
for (let n of e) t = Math.imul(t ^ (n.codePointAt(0) ?? 0), 16777619);
|
|
10
|
+
return (t >>> 0) % 6;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { t as avatarColorIndex, e as avatarInitials };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","names":["avatarInitials","words","name","letters","avatarColorIndex","hash","char","key"],"sources":["../../src/models/avatar.ts"],"sourcesContent":["export function avatarInitials(name: string): string {\n\tconst words = name\n\t\t.trim()\n\t\t.split(/[\\s—–-]+/u)\n\t\t.filter(Boolean);\n\tconst letters =\n\t\twords.length > 1\n\t\t\t? [Array.from(words[0])[0], Array.from(words[1])[0]]\n\t\t\t: Array.from(words[0] ?? \"\").slice(0, 2);\n\treturn Array.from(letters.join(\"\").toLocaleUpperCase(\"en-US\")).slice(0, 2).join(\"\") || \"?\";\n}\n\nexport function avatarColorIndex(key: string): number {\n\tlet hash = 2166136261;\n\tfor (const char of key) hash = Math.imul(hash ^ (char.codePointAt(0) ?? 0), 16777619);\n\treturn (hash >>> 0) % 6;\n}\n"],"mappings":";;AAAA,SAAgBA,EAAe,GAAsB;CACpD,IAAMC,IAAQC,EACZ,KAAK,CAAC,CACN,MAAM,WAAW,CAAC,CAClB,OAAO,OAAO,GACVC,IACLF,EAAM,SAAS,IACZ,CAAC,MAAM,KAAKA,EAAM,EAAE,CAAC,CAAC,IAAI,MAAM,KAAKA,EAAM,EAAE,CAAC,CAAC,EAAE,IACjD,MAAM,KAAKA,EAAM,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;CACzC,OAAO,MAAM,KAAKE,EAAQ,KAAK,EAAE,CAAC,CAAC,kBAAkB,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK;AACxF;AAEA,SAAgBC,EAAiB,GAAqB;CACrD,IAAIC,IAAO;CACX,KAAK,IAAMC,KAAQC,GAAK,IAAO,KAAK,KAAKF,KAAQC,EAAK,YAAY,CAAC,KAAK,IAAI,QAAQ;CACpF,QAAQD,MAAS,KAAK;AACvB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
//#region src/models/code.ts
|
|
3
|
+
var e = /(\/\/[^\n]*)|("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`[^`]*`)|\b(import|from|export|default|async|await|function|return|const|let|var|type|interface|as|if|else|throw|new|typeof|null|true|false|undefined)\b|(\b\d+\b)|(<\/?[A-Za-z][\w.-]*)/g;
|
|
4
|
+
function t(t, n) {
|
|
5
|
+
let r = [], i = 0;
|
|
6
|
+
if (n) for (let n of t.matchAll(e)) {
|
|
7
|
+
let e = n.index;
|
|
8
|
+
e > i && r.push({ text: t.slice(i, e) }), r.push({
|
|
9
|
+
text: n[0],
|
|
10
|
+
className: n[1] ? "text-basalt-muted-foreground" : n[2] ? "text-basalt-chart-5" : n[4] ? "text-basalt-chart-4" : "text-basalt-primary"
|
|
11
|
+
}), i = e + n[0].length;
|
|
12
|
+
}
|
|
13
|
+
i < t.length && r.push({ text: t.slice(i) });
|
|
14
|
+
let a = [[]];
|
|
15
|
+
for (let e of r) for (let [t, n] of e.text.split(/\r\n|\r|\n/).entries()) t > 0 && a.push([]), n && a[a.length - 1].push({
|
|
16
|
+
text: n,
|
|
17
|
+
className: e.className
|
|
18
|
+
});
|
|
19
|
+
return a;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { t as codeLines };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=code.js.map
|