@uisatin/ui 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +67 -2
- package/chunk-2HKBZFIK.js +339 -0
- package/chunk-2HKBZFIK.js.map +1 -0
- package/chunk-2YEWSJD7.js +95 -0
- package/chunk-2YEWSJD7.js.map +1 -0
- package/chunk-3DINAQLL.js +153 -0
- package/chunk-3DINAQLL.js.map +1 -0
- package/chunk-3ERGAHKA.js +179 -0
- package/chunk-3ERGAHKA.js.map +1 -0
- package/chunk-6C7CGJX2.js +86 -0
- package/chunk-6C7CGJX2.js.map +1 -0
- package/chunk-6YXUBP27.js +474 -0
- package/chunk-6YXUBP27.js.map +1 -0
- package/chunk-72OCFAPT.js +175 -0
- package/chunk-72OCFAPT.js.map +1 -0
- package/chunk-7TXHCRAG.js +51 -0
- package/chunk-7TXHCRAG.js.map +1 -0
- package/chunk-A5XEM3GF.js +260 -0
- package/chunk-A5XEM3GF.js.map +1 -0
- package/chunk-AN2RNJLR.js +79 -0
- package/chunk-AN2RNJLR.js.map +1 -0
- package/chunk-B2K45IUR.js +36 -0
- package/chunk-B2K45IUR.js.map +1 -0
- package/chunk-B6V4VSGH.js +82 -0
- package/chunk-B6V4VSGH.js.map +1 -0
- package/chunk-BKZBWPUH.js +59 -0
- package/chunk-BKZBWPUH.js.map +1 -0
- package/chunk-BNTPPZCK.js +220 -0
- package/chunk-BNTPPZCK.js.map +1 -0
- package/chunk-BNZVTLHV.js +98 -0
- package/chunk-BNZVTLHV.js.map +1 -0
- package/chunk-CL2II6BX.js +89 -0
- package/chunk-CL2II6BX.js.map +1 -0
- package/chunk-DETGJAIC.js +147 -0
- package/chunk-DETGJAIC.js.map +1 -0
- package/chunk-DO3TBNSC.js +130 -0
- package/chunk-DO3TBNSC.js.map +1 -0
- package/chunk-ESC5JCVQ.js +90 -0
- package/chunk-ESC5JCVQ.js.map +1 -0
- package/chunk-FDKIX4DC.js +55 -0
- package/chunk-FDKIX4DC.js.map +1 -0
- package/chunk-GICKPMJU.js +239 -0
- package/chunk-GICKPMJU.js.map +1 -0
- package/chunk-GQA24FYG.js +57 -0
- package/chunk-GQA24FYG.js.map +1 -0
- package/chunk-H4NU7NPO.js +264 -0
- package/chunk-H4NU7NPO.js.map +1 -0
- package/chunk-H63FYCMY.js +11 -0
- package/chunk-H63FYCMY.js.map +1 -0
- package/chunk-HL42K2NH.js +76 -0
- package/chunk-HL42K2NH.js.map +1 -0
- package/chunk-HNQUX43Z.js +109 -0
- package/chunk-HNQUX43Z.js.map +1 -0
- package/chunk-HRKPV66B.js +32 -0
- package/chunk-HRKPV66B.js.map +1 -0
- package/chunk-J3NSDRVH.js +83 -0
- package/chunk-J3NSDRVH.js.map +1 -0
- package/chunk-JPNWHWAQ.js +151 -0
- package/chunk-JPNWHWAQ.js.map +1 -0
- package/chunk-KNUWZNFV.js +240 -0
- package/chunk-KNUWZNFV.js.map +1 -0
- package/chunk-L6NCCSIP.js +213 -0
- package/chunk-L6NCCSIP.js.map +1 -0
- package/chunk-LLHTVIM3.js +50 -0
- package/chunk-LLHTVIM3.js.map +1 -0
- package/chunk-LW3TRU5W.js +131 -0
- package/chunk-LW3TRU5W.js.map +1 -0
- package/chunk-LZMKSFCF.js +79 -0
- package/chunk-LZMKSFCF.js.map +1 -0
- package/chunk-MR3JDI7E.js +122 -0
- package/chunk-MR3JDI7E.js.map +1 -0
- package/chunk-NN6PKJWS.js +44 -0
- package/chunk-NN6PKJWS.js.map +1 -0
- package/chunk-NSRTTYQ4.js +252 -0
- package/chunk-NSRTTYQ4.js.map +1 -0
- package/chunk-O7F3CIDV.js +45 -0
- package/chunk-O7F3CIDV.js.map +1 -0
- package/chunk-P4O6TGDR.js +166 -0
- package/chunk-P4O6TGDR.js.map +1 -0
- package/chunk-PF3YBUKT.js +81 -0
- package/chunk-PF3YBUKT.js.map +1 -0
- package/chunk-PVOLDO4G.js +47 -0
- package/chunk-PVOLDO4G.js.map +1 -0
- package/chunk-QS4N4MNP.js +215 -0
- package/chunk-QS4N4MNP.js.map +1 -0
- package/chunk-QUF2IPOZ.js +98 -0
- package/chunk-QUF2IPOZ.js.map +1 -0
- package/chunk-RTJ76X5U.js +126 -0
- package/chunk-RTJ76X5U.js.map +1 -0
- package/chunk-SH6NG6VN.js +40 -0
- package/chunk-SH6NG6VN.js.map +1 -0
- package/chunk-SHDFUXYV.js +195 -0
- package/chunk-SHDFUXYV.js.map +1 -0
- package/chunk-TKO44NDI.js +84 -0
- package/chunk-TKO44NDI.js.map +1 -0
- package/chunk-TOMSU4S4.js +149 -0
- package/chunk-TOMSU4S4.js.map +1 -0
- package/chunk-TVLGZGYN.js +59 -0
- package/chunk-TVLGZGYN.js.map +1 -0
- package/chunk-TX3H3QMA.js +520 -0
- package/chunk-TX3H3QMA.js.map +1 -0
- package/chunk-UBNHSZSE.js +88 -0
- package/chunk-UBNHSZSE.js.map +1 -0
- package/chunk-UC3ZJWOD.js +73 -0
- package/chunk-UC3ZJWOD.js.map +1 -0
- package/chunk-UGRSWP6U.js +69 -0
- package/chunk-UGRSWP6U.js.map +1 -0
- package/chunk-VAGIAREV.js +214 -0
- package/chunk-VAGIAREV.js.map +1 -0
- package/chunk-WTMZT3IT.js +105 -0
- package/chunk-WTMZT3IT.js.map +1 -0
- package/chunk-WX6BP5ZP.js +39 -0
- package/chunk-WX6BP5ZP.js.map +1 -0
- package/chunk-X3PQANZO.js +255 -0
- package/chunk-X3PQANZO.js.map +1 -0
- package/chunk-XILQ7GXE.js +66 -0
- package/chunk-XILQ7GXE.js.map +1 -0
- package/chunk-XL75JRUA.js +130 -0
- package/chunk-XL75JRUA.js.map +1 -0
- package/chunk-XZNHT6MO.js +348 -0
- package/chunk-XZNHT6MO.js.map +1 -0
- package/chunk-Y5AYU7PK.js +44 -0
- package/chunk-Y5AYU7PK.js.map +1 -0
- package/chunk-YG7JOOLJ.js +28 -0
- package/chunk-YG7JOOLJ.js.map +1 -0
- package/chunk-YPJYW624.js +195 -0
- package/chunk-YPJYW624.js.map +1 -0
- package/chunk-YPNKBE5X.js +104 -0
- package/chunk-YPNKBE5X.js.map +1 -0
- package/components/accordion.d.ts +27 -0
- package/components/accordion.js +4 -0
- package/components/accordion.js.map +1 -0
- package/components/agent-loading.d.ts +65 -0
- package/components/agent-loading.js +4 -0
- package/components/agent-loading.js.map +1 -0
- package/components/agent-picker.d.ts +82 -0
- package/components/agent-picker.js +5 -0
- package/components/agent-picker.js.map +1 -0
- package/components/agent-suggestion.d.ts +69 -0
- package/components/agent-suggestion.js +6 -0
- package/components/agent-suggestion.js.map +1 -0
- package/components/announcement-bar.d.ts +39 -0
- package/components/announcement-bar.js +6 -0
- package/components/announcement-bar.js.map +1 -0
- package/components/attachment.d.ts +73 -0
- package/components/attachment.js +5 -0
- package/components/attachment.js.map +1 -0
- package/components/avatar.d.ts +34 -0
- package/components/avatar.js +6 -0
- package/components/avatar.js.map +1 -0
- package/components/badge.d.ts +19 -0
- package/components/badge.js +4 -0
- package/components/badge.js.map +1 -0
- package/components/banner.d.ts +54 -0
- package/components/banner.js +5 -0
- package/components/banner.js.map +1 -0
- package/components/bar-chart.d.ts +32 -0
- package/components/bar-chart.js +11 -0
- package/components/bar-chart.js.map +1 -0
- package/components/breadcrumb.d.ts +32 -0
- package/components/breadcrumb.js +6 -0
- package/components/breadcrumb.js.map +1 -0
- package/components/button.d.ts +32 -0
- package/components/button.js +4 -0
- package/components/button.js.map +1 -0
- package/components/card.d.ts +28 -0
- package/components/card.js +5 -0
- package/components/card.js.map +1 -0
- package/components/channel-chart.d.ts +14 -0
- package/components/channel-chart.js +11 -0
- package/components/channel-chart.js.map +1 -0
- package/components/chart.d.ts +88 -0
- package/components/chart.js +10 -0
- package/components/chart.js.map +1 -0
- package/components/checkbox.d.ts +17 -0
- package/components/checkbox.js +4 -0
- package/components/checkbox.js.map +1 -0
- package/components/chip.d.ts +54 -0
- package/components/chip.js +4 -0
- package/components/chip.js.map +1 -0
- package/components/citations.d.ts +37 -0
- package/components/citations.js +5 -0
- package/components/citations.js.map +1 -0
- package/components/code-block.d.ts +13 -0
- package/components/code-block.js +5 -0
- package/components/code-block.js.map +1 -0
- package/components/combobox.d.ts +58 -0
- package/components/combobox.js +10 -0
- package/components/combobox.js.map +1 -0
- package/components/command-menu.d.ts +54 -0
- package/components/command-menu.js +6 -0
- package/components/command-menu.js.map +1 -0
- package/components/context-menu.d.ts +46 -0
- package/components/context-menu.js +6 -0
- package/components/context-menu.js.map +1 -0
- package/components/cookie-consent.d.ts +26 -0
- package/components/cookie-consent.js +5 -0
- package/components/cookie-consent.js.map +1 -0
- package/components/date-picker.d.ts +112 -0
- package/components/date-picker.js +9 -0
- package/components/date-picker.js.map +1 -0
- package/components/decision-card.d.ts +65 -0
- package/components/decision-card.js +7 -0
- package/components/decision-card.js.map +1 -0
- package/components/dialog.d.ts +68 -0
- package/components/dialog.js +5 -0
- package/components/dialog.js.map +1 -0
- package/components/donut-chart.d.ts +20 -0
- package/components/donut-chart.js +11 -0
- package/components/donut-chart.js.map +1 -0
- package/components/dot.d.ts +21 -0
- package/components/dot.js +4 -0
- package/components/dot.js.map +1 -0
- package/components/dropdown.d.ts +74 -0
- package/components/dropdown.js +5 -0
- package/components/dropdown.js.map +1 -0
- package/components/empty-state.d.ts +25 -0
- package/components/empty-state.js +4 -0
- package/components/empty-state.js.map +1 -0
- package/components/file-upload.d.ts +78 -0
- package/components/file-upload.js +7 -0
- package/components/file-upload.js.map +1 -0
- package/components/floating.d.ts +30 -0
- package/components/floating.js +3 -0
- package/components/floating.js.map +1 -0
- package/components/form-field.d.ts +35 -0
- package/components/form-field.js +4 -0
- package/components/form-field.js.map +1 -0
- package/components/hover-card.d.ts +30 -0
- package/components/hover-card.js +4 -0
- package/components/hover-card.js.map +1 -0
- package/components/input-otp.d.ts +49 -0
- package/components/input-otp.js +8 -0
- package/components/input-otp.js.map +1 -0
- package/components/input.d.ts +28 -0
- package/components/input.js +5 -0
- package/components/input.js.map +1 -0
- package/components/kbd.d.ts +37 -0
- package/components/kbd.js +4 -0
- package/components/kbd.js.map +1 -0
- package/components/line-chart.d.ts +29 -0
- package/components/line-chart.js +12 -0
- package/components/line-chart.js.map +1 -0
- package/components/message-actions.d.ts +24 -0
- package/components/message-actions.js +5 -0
- package/components/message-actions.js.map +1 -0
- package/components/message.d.ts +40 -0
- package/components/message.js +8 -0
- package/components/message.js.map +1 -0
- package/components/number-input.d.ts +33 -0
- package/components/number-input.js +8 -0
- package/components/number-input.js.map +1 -0
- package/components/pagination.d.ts +45 -0
- package/components/pagination.js +6 -0
- package/components/pagination.js.map +1 -0
- package/components/popover.d.ts +44 -0
- package/components/popover.js +4 -0
- package/components/popover.js.map +1 -0
- package/components/progress.d.ts +24 -0
- package/components/progress.js +4 -0
- package/components/progress.js.map +1 -0
- package/components/prompt-bar.d.ts +63 -0
- package/components/prompt-bar.js +6 -0
- package/components/prompt-bar.js.map +1 -0
- package/components/radio.d.ts +27 -0
- package/components/radio.js +4 -0
- package/components/radio.js.map +1 -0
- package/components/search-bar.d.ts +20 -0
- package/components/search-bar.js +5 -0
- package/components/search-bar.js.map +1 -0
- package/components/segmented-control.d.ts +32 -0
- package/components/segmented-control.js +5 -0
- package/components/segmented-control.js.map +1 -0
- package/components/select.d.ts +97 -0
- package/components/select.js +7 -0
- package/components/select.js.map +1 -0
- package/components/sheet.d.ts +37 -0
- package/components/sheet.js +6 -0
- package/components/sheet.js.map +1 -0
- package/components/sidebar.d.ts +52 -0
- package/components/sidebar.js +4 -0
- package/components/sidebar.js.map +1 -0
- package/components/skeleton.d.ts +18 -0
- package/components/skeleton.js +4 -0
- package/components/skeleton.js.map +1 -0
- package/components/slider.d.ts +57 -0
- package/components/slider.js +8 -0
- package/components/slider.js.map +1 -0
- package/components/sliding-indicator.d.ts +23 -0
- package/components/sliding-indicator.js +3 -0
- package/components/sliding-indicator.js.map +1 -0
- package/components/streaming-text.d.ts +33 -0
- package/components/streaming-text.js +4 -0
- package/components/streaming-text.js.map +1 -0
- package/components/switch.d.ts +15 -0
- package/components/switch.js +4 -0
- package/components/switch.js.map +1 -0
- package/components/table.d.ts +57 -0
- package/components/table.js +5 -0
- package/components/table.js.map +1 -0
- package/components/tabs.d.ts +45 -0
- package/components/tabs.js +5 -0
- package/components/tabs.js.map +1 -0
- package/components/textarea.d.ts +30 -0
- package/components/textarea.js +5 -0
- package/components/textarea.js.map +1 -0
- package/components/thinking.d.ts +64 -0
- package/components/thinking.js +5 -0
- package/components/thinking.js.map +1 -0
- package/components/toast.d.ts +71 -0
- package/components/toast.js +5 -0
- package/components/toast.js.map +1 -0
- package/components/toggle.d.ts +30 -0
- package/components/toggle.js +4 -0
- package/components/toggle.js.map +1 -0
- package/components/tooltip.d.ts +35 -0
- package/components/tooltip.js +5 -0
- package/components/tooltip.js.map +1 -0
- package/index.d.ts +64 -0
- package/index.js +230 -0
- package/index.js.map +1 -0
- package/lib/utils.d.ts +3 -0
- package/lib/utils.js +3 -0
- package/lib/utils.js.map +1 -0
- package/package.json +54 -4
- package/styles.css +2 -0
- package/theme/create-theme.d.ts +44 -0
- package/theme/index.d.ts +1 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Progress } from './chunk-7TXHCRAG.js';
|
|
2
|
+
import { Badge } from './chunk-O7F3CIDV.js';
|
|
3
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { ArrowRight } from 'iconoir-react';
|
|
6
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function AgentSuggestion({
|
|
9
|
+
kind,
|
|
10
|
+
icon,
|
|
11
|
+
meta,
|
|
12
|
+
title,
|
|
13
|
+
description,
|
|
14
|
+
actions,
|
|
15
|
+
children,
|
|
16
|
+
className,
|
|
17
|
+
...props
|
|
18
|
+
}) {
|
|
19
|
+
const titleId = React.useId();
|
|
20
|
+
return /* @__PURE__ */ jsxs(
|
|
21
|
+
"section",
|
|
22
|
+
{
|
|
23
|
+
"data-slot": "agent-suggestion",
|
|
24
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
25
|
+
className: cn(
|
|
26
|
+
"flex w-full max-w-[400px] flex-col gap-3 rounded-xl border border-border-subtle bg-bg-card p-3 text-text-default [box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-h-6 items-center gap-1.5", children: [
|
|
32
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children: /* @__PURE__ */ jsxs(
|
|
33
|
+
Badge,
|
|
34
|
+
{
|
|
35
|
+
size: "lg",
|
|
36
|
+
tone: "neutral",
|
|
37
|
+
variant: "outline",
|
|
38
|
+
className: "max-w-full [&_img]:size-3.5 [&_img]:shrink-0",
|
|
39
|
+
children: [
|
|
40
|
+
icon,
|
|
41
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: kind })
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
) }),
|
|
45
|
+
meta && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: meta })
|
|
46
|
+
] }),
|
|
47
|
+
(title || description) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
48
|
+
title && /* @__PURE__ */ jsx("div", { id: titleId, className: "text-base leading-[14px] font-medium tracking-normal text-text-default", children: title }),
|
|
49
|
+
description && /* @__PURE__ */ jsx("div", { className: "text-base text-text-muted", children: description })
|
|
50
|
+
] }),
|
|
51
|
+
children,
|
|
52
|
+
actions && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-end gap-2 pt-1", children: actions })
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
function AgentSuggestionQuote({
|
|
58
|
+
from,
|
|
59
|
+
avatar,
|
|
60
|
+
children,
|
|
61
|
+
className
|
|
62
|
+
}) {
|
|
63
|
+
return /* @__PURE__ */ jsxs("blockquote", { "data-slot": "agent-suggestion-quote", className: cn("m-0 flex flex-col gap-1 rounded-lg bg-bg-muted px-3 py-2", className), children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
65
|
+
avatar,
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs leading-3 font-medium tracking-normal text-text-default", children: from })
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsx("p", { className: "m-0 text-base text-text-muted", children })
|
|
69
|
+
] });
|
|
70
|
+
}
|
|
71
|
+
function AgentSuggestionMetric({
|
|
72
|
+
value,
|
|
73
|
+
unit,
|
|
74
|
+
used,
|
|
75
|
+
max,
|
|
76
|
+
className
|
|
77
|
+
}) {
|
|
78
|
+
return /* @__PURE__ */ jsxs("div", { "data-slot": "agent-suggestion-metric", className: cn("flex flex-col gap-2", className), children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
|
|
80
|
+
/* @__PURE__ */ jsx("span", { className: "text-2xl leading-[1.5] font-medium tabular-nums", children: value }),
|
|
81
|
+
unit && /* @__PURE__ */ jsx("span", { className: "text-base text-text-muted", children: unit })
|
|
82
|
+
] }),
|
|
83
|
+
used != null && max != null && /* @__PURE__ */ jsx(
|
|
84
|
+
Progress,
|
|
85
|
+
{
|
|
86
|
+
value: used,
|
|
87
|
+
max,
|
|
88
|
+
showValue: false,
|
|
89
|
+
"aria-label": typeof unit === "string" ? unit : void 0,
|
|
90
|
+
className: "[&_[role=progressbar]]:h-1.5"
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
] });
|
|
94
|
+
}
|
|
95
|
+
function AgentSuggestionDiff({ before, after, className }) {
|
|
96
|
+
return /* @__PURE__ */ jsxs("div", { "data-slot": "agent-suggestion-diff", className: cn("flex flex-col gap-1 text-base", className), children: [
|
|
97
|
+
/* @__PURE__ */ jsxs("del", { className: "rounded-lg bg-bg-muted px-2 py-1.5 text-text-muted", children: [
|
|
98
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Remove: " }),
|
|
99
|
+
before
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsxs("ins", { className: "rounded-lg bg-status-green-bg px-2 py-1.5 text-status-green-fg no-underline", children: [
|
|
102
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Add: " }),
|
|
103
|
+
after
|
|
104
|
+
] })
|
|
105
|
+
] });
|
|
106
|
+
}
|
|
107
|
+
function AgentSuggestionChanges({ changes, className }) {
|
|
108
|
+
return /* @__PURE__ */ jsx("dl", { "data-slot": "agent-suggestion-changes", className: cn("m-0 flex flex-col gap-2 text-base", className), children: changes.map((c, i) => /* @__PURE__ */ jsxs("div", { className: "flex min-h-[21px] items-center gap-2", children: [
|
|
109
|
+
/* @__PURE__ */ jsx("dt", { className: "w-[88px] shrink-0 text-text-muted", children: c.field }),
|
|
110
|
+
/* @__PURE__ */ jsxs("dd", { className: "m-0 flex min-w-0 items-center gap-2", children: [
|
|
111
|
+
c.from != null && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
112
|
+
/* @__PURE__ */ jsx("del", { className: "text-text-subtle", children: c.from }),
|
|
113
|
+
/* @__PURE__ */ jsx(ArrowRight, { "aria-hidden": true, className: "size-4 shrink-0 text-text-subtle [stroke-width:1.875]" })
|
|
114
|
+
] }),
|
|
115
|
+
typeof c.to === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium text-text-default", children: c.to }) : c.to
|
|
116
|
+
] })
|
|
117
|
+
] }, i)) });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AgentSuggestion, AgentSuggestionChanges, AgentSuggestionDiff, AgentSuggestionMetric, AgentSuggestionQuote };
|
|
121
|
+
//# sourceMappingURL=chunk-MR3JDI7E.js.map
|
|
122
|
+
//# sourceMappingURL=chunk-MR3JDI7E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/agent-suggestion.tsx"],"names":[],"mappings":"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","file":"chunk-MR3JDI7E.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ArrowRight } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Badge } from './badge'\nimport { Progress } from './progress'\n\n/**\n * AgentSuggestion, 1:1 with the uiKit `AgentSuggestion` set (🆕 agent suggestions, 4126:3903):\n * something the agent has prepared and the user only approves — an email, a reply, a meeting,\n * tasks, an insight, an edit or a CRM update.\n *\n * A bg/card card, border/subtle, radius-xl, shadow-sm, 12px in and 12px between its parts:\n *\n * - the kind row: what it is, as a neutral Large Outline Badge (white, border/default) with a 14px icon\n * or app logo (`kind`, `icon`), and on the right who or what it concerns (`meta`: avatars, a\n * small Badge with the source);\n * - `title` in Label/lg (14/14 medium) and `description` in Body/lg text/muted, 8px apart;\n * - `children`: whatever the suggestion needs (time slots, tasks, a diff, changed fields);\n * - `actions`, right-aligned 8px apart, 4px further down: a secondary or tertiary button and the\n * primary one that carries it out.\n *\n * The parts below cover the usual bodies: `AgentSuggestionQuote` (the message being answered),\n * `AgentSuggestionMetric` (a number against a limit), `AgentSuggestionDiff` (old text → new) and\n * `AgentSuggestionChanges` (fields from → to).\n */\nexport interface AgentSuggestionProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n /** What kind of suggestion: \"Email suggestion\", \"Next steps\", \"CRM update\". */\n kind: React.ReactNode\n /** A 14px icon or app logo before the kind. */\n icon?: React.ReactNode\n /** Right of the kind: avatars of the people it concerns, or a small Badge with the source. */\n meta?: React.ReactNode\n title?: React.ReactNode\n description?: React.ReactNode\n /** Buttons, right-aligned: the alternative first, the primary action last. */\n actions?: React.ReactNode\n}\n\nexport function AgentSuggestion({\n kind,\n icon,\n meta,\n title,\n description,\n actions,\n children,\n className,\n ...props\n}: AgentSuggestionProps) {\n const titleId = React.useId()\n return (\n <section\n data-slot=\"agent-suggestion\"\n aria-labelledby={title ? titleId : undefined}\n className={cn(\n 'flex w-full max-w-[400px] flex-col gap-3 rounded-xl border border-border-subtle bg-bg-card p-3 text-text-default [box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n className,\n )}\n {...props}\n >\n <div className=\"flex min-h-6 items-center gap-1.5\">\n <div className=\"flex min-w-0 flex-1\">\n <Badge\n size=\"lg\"\n tone=\"neutral\"\n variant=\"outline\"\n className=\"max-w-full [&_img]:size-3.5 [&_img]:shrink-0\"\n >\n {icon}\n <span className=\"truncate\">{kind}</span>\n </Badge>\n </div>\n {meta && <div className=\"flex shrink-0 items-center\">{meta}</div>}\n </div>\n\n {(title || description) && (\n <div className=\"flex flex-col gap-2\">\n {title && (\n <div id={titleId} className=\"text-base leading-[14px] font-medium tracking-normal text-text-default\">\n {title}\n </div>\n )}\n {description && <div className=\"text-base text-text-muted\">{description}</div>}\n </div>\n )}\n\n {children}\n\n {actions && <div className=\"flex flex-wrap items-center justify-end gap-2 pt-1\">{actions}</div>}\n </section>\n )\n}\n\n/** The message the suggestion answers: who sent it and what they wrote, on bg/muted. */\nexport function AgentSuggestionQuote({\n from,\n avatar,\n children,\n className,\n}: {\n /** The sender's name. */\n from: React.ReactNode\n /** A 20px Avatar. */\n avatar?: React.ReactNode\n children: React.ReactNode\n className?: string\n}) {\n return (\n <blockquote data-slot=\"agent-suggestion-quote\" className={cn('m-0 flex flex-col gap-1 rounded-lg bg-bg-muted px-3 py-2', className)}>\n <div className=\"flex items-center gap-1.5\">\n {avatar}\n <span className=\"text-xs leading-3 font-medium tracking-normal text-text-default\">{from}</span>\n </div>\n <p className=\"m-0 text-base text-text-muted\">{children}</p>\n </blockquote>\n )\n}\n\n/** A number against its limit: the value in Display/sm, its unit, and a 6px bar of how much is used. */\nexport function AgentSuggestionMetric({\n value,\n unit,\n used,\n max,\n className,\n}: {\n /** As shown: \"47 / 50\". */\n value: React.ReactNode\n unit?: React.ReactNode\n /** With `max`, draws the bar. */\n used?: number\n max?: number\n className?: string\n}) {\n return (\n <div data-slot=\"agent-suggestion-metric\" className={cn('flex flex-col gap-2', className)}>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-2xl leading-[1.5] font-medium tabular-nums\">{value}</span>\n {unit && <span className=\"text-base text-text-muted\">{unit}</span>}\n </div>\n {used != null && max != null && (\n <Progress\n value={used}\n max={max}\n showValue={false}\n aria-label={typeof unit === 'string' ? unit : undefined}\n className=\"[&_[role=progressbar]]:h-1.5\"\n />\n )}\n </div>\n )\n}\n\n/** Old text struck through on bg/muted, the new text in status/green below it. */\nexport function AgentSuggestionDiff({ before, after, className }: { before: React.ReactNode; after: React.ReactNode; className?: string }) {\n return (\n <div data-slot=\"agent-suggestion-diff\" className={cn('flex flex-col gap-1 text-base', className)}>\n <del className=\"rounded-lg bg-bg-muted px-2 py-1.5 text-text-muted\">\n <span className=\"sr-only\">Remove: </span>\n {before}\n </del>\n <ins className=\"rounded-lg bg-status-green-bg px-2 py-1.5 text-status-green-fg no-underline\">\n <span className=\"sr-only\">Add: </span>\n {after}\n </ins>\n </div>\n )\n}\n\nexport interface AgentSuggestionChange {\n field: React.ReactNode\n from?: React.ReactNode\n /** A string reads as Body/md Strong; pass a Badge for a stage or status. */\n to: React.ReactNode\n}\n\n/** Fields the agent will change: name, the old value struck through, an arrow and the new one. */\nexport function AgentSuggestionChanges({ changes, className }: { changes: AgentSuggestionChange[]; className?: string }) {\n return (\n <dl data-slot=\"agent-suggestion-changes\" className={cn('m-0 flex flex-col gap-2 text-base', className)}>\n {changes.map((c, i) => (\n <div key={i} className=\"flex min-h-[21px] items-center gap-2\">\n <dt className=\"w-[88px] shrink-0 text-text-muted\">{c.field}</dt>\n <dd className=\"m-0 flex min-w-0 items-center gap-2\">\n {c.from != null && (\n <>\n <del className=\"text-text-subtle\">{c.from}</del>\n <ArrowRight aria-hidden className=\"size-4 shrink-0 text-text-subtle [stroke-width:1.875]\" />\n </>\n )}\n {typeof c.to === 'string' ? <span className=\"font-medium text-text-default\">{c.to}</span> : c.to}\n </dd>\n </div>\n ))}\n </dl>\n )\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Button } from './chunk-HNQUX43Z.js';
|
|
2
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function CookieConsent({
|
|
7
|
+
children = "We use essential cookies to run this site. With your OK, we'd also use optional ones to remember settings and learn what helps.",
|
|
8
|
+
onAccept,
|
|
9
|
+
onReject,
|
|
10
|
+
onCustomize,
|
|
11
|
+
acceptLabel = "Accept all",
|
|
12
|
+
rejectLabel = "Reject all",
|
|
13
|
+
customizeLabel = "Customize",
|
|
14
|
+
floating = false,
|
|
15
|
+
className,
|
|
16
|
+
"aria-label": ariaLabel = "Cookie consent",
|
|
17
|
+
...props
|
|
18
|
+
}) {
|
|
19
|
+
return /* @__PURE__ */ jsxs(
|
|
20
|
+
"section",
|
|
21
|
+
{
|
|
22
|
+
"data-slot": "cookie-consent",
|
|
23
|
+
"aria-label": ariaLabel,
|
|
24
|
+
className: cn(
|
|
25
|
+
"flex w-fit max-w-full flex-wrap items-center gap-x-5 gap-y-3 rounded-3xl border border-border-subtle bg-bg-popover px-5 py-4 [box-shadow:0_1px_3px_0_var(--effect-shadow-ambient),0_16px_40px_-12px_var(--effect-shadow-lg)]",
|
|
26
|
+
floating && "fixed inset-x-4 bottom-4 z-50 mx-auto max-w-[calc(100vw-32px)]",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx("p", { className: "m-0 w-[280px] max-w-full min-w-0 shrink text-base text-text-muted", children }),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [
|
|
33
|
+
onCustomize && /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "lg", shape: "rounded", className: "text-text-muted", onClick: onCustomize, children: customizeLabel }),
|
|
34
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "lg", shape: "rounded", onClick: onReject, children: rejectLabel }),
|
|
35
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", shape: "rounded", onClick: onAccept, children: acceptLabel })
|
|
36
|
+
] })
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { CookieConsent };
|
|
43
|
+
//# sourceMappingURL=chunk-NN6PKJWS.js.map
|
|
44
|
+
//# sourceMappingURL=chunk-NN6PKJWS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/cookie-consent.tsx"],"names":[],"mappings":";;;;;AA+BO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA,GAAW,iIAAA;AAAA,EACX,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,WAAA,GAAc,YAAA;AAAA,EACd,cAAA,GAAiB,WAAA;AAAA,EACjB,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,cAAc,SAAA,GAAY,gBAAA;AAAA,EAC1B,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,YAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,8NAAA;AAAA,QACA,QAAA,IAAY,gEAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mEAAA,EAAqE,QAAA,EAAS,CAAA;AAAA,wBAC3F,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,WAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,UAAA,EAAW,IAAA,EAAK,IAAA,EAAK,KAAA,EAAM,SAAA,EAAU,SAAA,EAAU,iBAAA,EAAkB,OAAA,EAAS,WAAA,EACvF,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,0BAEF,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAK,KAAA,EAAM,SAAA,EAAU,OAAA,EAAS,QAAA,EAC5D,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,MAAK,KAAA,EAAM,SAAA,EAAU,OAAA,EAAS,QAAA,EAC1D,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-NN6PKJWS.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\n/**\n * CookieConsent: what the site stores and the three answers, in one floating card at the\n * bottom of the page. bg/popover, border/subtle, radius-3xl, the shadcn lg shadow; 20 × 16 in.\n *\n * The message (Body/lg, text/muted) is kept to a narrow column so it reads in three short\n * lines; the actions sit to its right: Customize as a tertiary button in text/muted, then\n * Reject all as a rounded secondary button and Accept all as the rounded primary one. Below 640px the actions wrap under the message.\n *\n * `floating` pins it 16px above the bottom of the viewport, centred; leave it off to place the\n * card yourself. It is a labelled region, not a modal: the page stays usable behind it.\n */\nexport interface CookieConsentProps extends Omit<React.ComponentProps<'section'>, 'children'> {\n /** What the site stores and why. */\n children?: React.ReactNode\n onAccept?: () => void\n onReject?: () => void\n /** Shows Customize; open your settings from here. */\n onCustomize?: () => void\n acceptLabel?: string\n rejectLabel?: string\n customizeLabel?: string\n /** Fixed to the bottom of the viewport, centred, 16px up. */\n floating?: boolean\n}\n\nexport function CookieConsent({\n children = \"We use essential cookies to run this site. With your OK, we'd also use optional ones to remember settings and learn what helps.\",\n onAccept,\n onReject,\n onCustomize,\n acceptLabel = 'Accept all',\n rejectLabel = 'Reject all',\n customizeLabel = 'Customize',\n floating = false,\n className,\n 'aria-label': ariaLabel = 'Cookie consent',\n ...props\n}: CookieConsentProps) {\n return (\n <section\n data-slot=\"cookie-consent\"\n aria-label={ariaLabel}\n className={cn(\n 'flex w-fit max-w-full flex-wrap items-center gap-x-5 gap-y-3 rounded-3xl border border-border-subtle bg-bg-popover px-5 py-4 [box-shadow:0_1px_3px_0_var(--effect-shadow-ambient),0_16px_40px_-12px_var(--effect-shadow-lg)]',\n floating && 'fixed inset-x-4 bottom-4 z-50 mx-auto max-w-[calc(100vw-32px)]',\n className,\n )}\n {...props}\n >\n <p className=\"m-0 w-[280px] max-w-full min-w-0 shrink text-base text-text-muted\">{children}</p>\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {onCustomize && (\n <Button variant=\"tertiary\" size=\"lg\" shape=\"rounded\" className=\"text-text-muted\" onClick={onCustomize}>\n {customizeLabel}\n </Button>\n )}\n <Button variant=\"secondary\" size=\"lg\" shape=\"rounded\" onClick={onReject}>\n {rejectLabel}\n </Button>\n <Button variant=\"primary\" size=\"lg\" shape=\"rounded\" onClick={onAccept}>\n {acceptLabel}\n </Button>\n </div>\n </section>\n )\n}\n"]}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { Chip } from './chunk-3ERGAHKA.js';
|
|
2
|
+
import { useFieldChrome, FieldChrome, SelectChevron } from './chunk-72OCFAPT.js';
|
|
3
|
+
import { MenuItemContent, menuItemClass, menuSurfaceClass } from './chunk-3DINAQLL.js';
|
|
4
|
+
import { Button } from './chunk-HNQUX43Z.js';
|
|
5
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { Popover } from 'radix-ui';
|
|
8
|
+
import { Search } from 'iconoir-react';
|
|
9
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var matches = (o, q) => {
|
|
12
|
+
const t = q.trim().toLowerCase();
|
|
13
|
+
if (!t) return true;
|
|
14
|
+
return o.label.toLowerCase().includes(t) || typeof o.description === "string" && o.description.toLowerCase().includes(t);
|
|
15
|
+
};
|
|
16
|
+
function Combobox({
|
|
17
|
+
options,
|
|
18
|
+
value,
|
|
19
|
+
defaultValue = [],
|
|
20
|
+
onValueChange,
|
|
21
|
+
multiple = false,
|
|
22
|
+
footer = false,
|
|
23
|
+
placeholder = "Select\u2026",
|
|
24
|
+
searchPlaceholder = "Search\u2026",
|
|
25
|
+
emptyText = "No results",
|
|
26
|
+
applyLabel = "Apply",
|
|
27
|
+
cancelLabel = "Cancel",
|
|
28
|
+
clearLabel = "Clear",
|
|
29
|
+
label,
|
|
30
|
+
hint,
|
|
31
|
+
error,
|
|
32
|
+
size = "md",
|
|
33
|
+
leadingIcon,
|
|
34
|
+
disabled,
|
|
35
|
+
id,
|
|
36
|
+
open: openProp,
|
|
37
|
+
defaultOpen = false,
|
|
38
|
+
onOpenChange,
|
|
39
|
+
container,
|
|
40
|
+
onOpenAutoFocus,
|
|
41
|
+
onInteractOutside,
|
|
42
|
+
wrapperClassName,
|
|
43
|
+
className,
|
|
44
|
+
...props
|
|
45
|
+
}) {
|
|
46
|
+
const chrome = useFieldChrome({ id, disabled, error, hint });
|
|
47
|
+
const listId = `${chrome.controlId}-list`;
|
|
48
|
+
const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
|
|
49
|
+
const applied = value ?? uncontrolledValue;
|
|
50
|
+
const commit = (next) => {
|
|
51
|
+
if (value == null) setUncontrolledValue(next);
|
|
52
|
+
onValueChange?.(next);
|
|
53
|
+
};
|
|
54
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
|
|
55
|
+
const open = openProp ?? uncontrolledOpen;
|
|
56
|
+
const [pending, setPending] = React.useState(applied);
|
|
57
|
+
const picks = footer ? pending : applied;
|
|
58
|
+
const [query, setQuery] = React.useState("");
|
|
59
|
+
const [active, setActive] = React.useState(0);
|
|
60
|
+
const setOpen = (next) => {
|
|
61
|
+
if (next) {
|
|
62
|
+
setPending(applied);
|
|
63
|
+
setQuery("");
|
|
64
|
+
setActive(0);
|
|
65
|
+
}
|
|
66
|
+
if (openProp == null) setUncontrolledOpen(next);
|
|
67
|
+
onOpenChange?.(next);
|
|
68
|
+
};
|
|
69
|
+
const shown = options.filter((o) => matches(o, query));
|
|
70
|
+
const pick = (v) => {
|
|
71
|
+
const next = multiple ? picks.includes(v) ? picks.filter((x) => x !== v) : [...picks, v] : picks[0] === v && footer ? [] : [v];
|
|
72
|
+
if (footer) return setPending(next);
|
|
73
|
+
commit(next);
|
|
74
|
+
if (!multiple) setOpen(false);
|
|
75
|
+
};
|
|
76
|
+
const apply = () => {
|
|
77
|
+
commit(pending);
|
|
78
|
+
setOpen(false);
|
|
79
|
+
};
|
|
80
|
+
const chosen = applied.map((v) => options.find((o) => o.value === v)).filter(Boolean);
|
|
81
|
+
const chips = multiple && chosen.length > 0;
|
|
82
|
+
const triggerText = !multiple && chosen[0] ? chosen[0].label : chips ? null : placeholder;
|
|
83
|
+
const lead = leadingIcon ?? (!multiple ? chosen[0]?.icon : void 0);
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
FieldChrome,
|
|
86
|
+
{
|
|
87
|
+
label,
|
|
88
|
+
chrome,
|
|
89
|
+
className: wrapperClassName,
|
|
90
|
+
action: label && multiple && chosen.length > 1 ? /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "xs", disabled: chrome.disabled, onClick: () => commit([]), children: clearLabel }) : void 0,
|
|
91
|
+
children: /* @__PURE__ */ jsxs(Popover.Root, { open, onOpenChange: setOpen, children: [
|
|
92
|
+
/* @__PURE__ */ jsx(Popover.Anchor, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
"data-slot": "combobox-field",
|
|
96
|
+
"data-size": size,
|
|
97
|
+
"data-multiple": chips || void 0,
|
|
98
|
+
"data-leading": lead ? true : void 0,
|
|
99
|
+
"data-filled": chosen.length ? true : void 0,
|
|
100
|
+
"data-invalid": chrome.invalid || void 0,
|
|
101
|
+
"data-disabled": chrome.disabled || void 0,
|
|
102
|
+
"data-state": open ? "open" : "closed",
|
|
103
|
+
className: cn("satin-field satin-select satin-combobox relative", className),
|
|
104
|
+
children: [
|
|
105
|
+
/* @__PURE__ */ jsx(
|
|
106
|
+
Popover.Trigger,
|
|
107
|
+
{
|
|
108
|
+
id: chrome.controlId,
|
|
109
|
+
"data-slot": "combobox-trigger",
|
|
110
|
+
disabled: chrome.disabled,
|
|
111
|
+
"aria-invalid": chrome.invalid || void 0,
|
|
112
|
+
"aria-describedby": chrome.describedBy,
|
|
113
|
+
"aria-label": props["aria-label"],
|
|
114
|
+
"aria-haspopup": "listbox",
|
|
115
|
+
className: "absolute inset-0 cursor-pointer rounded-[inherit] outline-none focus-visible:ring-0 disabled:cursor-not-allowed",
|
|
116
|
+
children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: chosen.length ? chosen.map((o) => o.label).join(", ") : placeholder })
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
lead && /* @__PURE__ */ jsx("span", { className: "satin-field-icon satin-combobox-icon pointer-events-none", "aria-hidden": true, children: lead }),
|
|
120
|
+
/* @__PURE__ */ jsxs("div", { className: "pointer-events-none flex min-w-0 flex-1 flex-wrap items-center gap-1 *:pointer-events-auto", children: [
|
|
121
|
+
chips && chosen.map((o) => /* @__PURE__ */ jsx(
|
|
122
|
+
Chip,
|
|
123
|
+
{
|
|
124
|
+
size: "sm",
|
|
125
|
+
variant: "outline",
|
|
126
|
+
disabled: chrome.disabled,
|
|
127
|
+
removeLabel: `Remove ${o.label}`,
|
|
128
|
+
onRemove: () => commit(applied.filter((v) => v !== o.value)),
|
|
129
|
+
className: "relative",
|
|
130
|
+
children: o.label
|
|
131
|
+
},
|
|
132
|
+
o.value
|
|
133
|
+
)),
|
|
134
|
+
triggerText && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("pointer-events-none! min-w-0 flex-1 truncate", chosen.length ? "text-text-default" : "text-text-muted"), children: triggerText }),
|
|
135
|
+
!label && chips && chosen.length > 1 && /* @__PURE__ */ jsx(
|
|
136
|
+
Button,
|
|
137
|
+
{
|
|
138
|
+
variant: "tertiary",
|
|
139
|
+
size: "xs",
|
|
140
|
+
disabled: chrome.disabled,
|
|
141
|
+
className: "relative ml-auto",
|
|
142
|
+
onClick: () => commit([]),
|
|
143
|
+
children: clearLabel
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
] }),
|
|
147
|
+
/* @__PURE__ */ jsx(SelectChevron, { className: "satin-combobox-icon pointer-events-none" })
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
) }),
|
|
151
|
+
/* @__PURE__ */ jsx(Popover.Portal, { container, children: /* @__PURE__ */ jsxs(
|
|
152
|
+
Popover.Content,
|
|
153
|
+
{
|
|
154
|
+
"data-slot": "combobox",
|
|
155
|
+
side: "bottom",
|
|
156
|
+
align: "start",
|
|
157
|
+
sideOffset: 4,
|
|
158
|
+
collisionPadding: 8,
|
|
159
|
+
onOpenAutoFocus,
|
|
160
|
+
onInteractOutside,
|
|
161
|
+
className: cn(
|
|
162
|
+
"pointer-events-auto z-50 flex w-(--radix-popover-trigger-width) min-w-60 max-w-[520px] flex-col overflow-hidden",
|
|
163
|
+
menuSurfaceClass,
|
|
164
|
+
"origin-(--radix-popover-content-transform-origin) outline-none",
|
|
165
|
+
"data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]"
|
|
166
|
+
),
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ jsxs("label", { className: "flex h-9 shrink-0 items-center gap-2 border-b border-border-subtle px-3 text-text-muted", children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Search, { "aria-hidden": true, className: "size-4 shrink-0 [stroke-width:1.875]" }),
|
|
170
|
+
/* @__PURE__ */ jsx(
|
|
171
|
+
"input",
|
|
172
|
+
{
|
|
173
|
+
role: "combobox",
|
|
174
|
+
"aria-expanded": true,
|
|
175
|
+
"aria-controls": listId,
|
|
176
|
+
"aria-autocomplete": "list",
|
|
177
|
+
"aria-activedescendant": shown[active] ? `${listId}-${shown[active].value}` : void 0,
|
|
178
|
+
"aria-label": searchPlaceholder,
|
|
179
|
+
value: query,
|
|
180
|
+
placeholder: searchPlaceholder,
|
|
181
|
+
onChange: (e) => {
|
|
182
|
+
setQuery(e.target.value);
|
|
183
|
+
setActive(0);
|
|
184
|
+
},
|
|
185
|
+
onKeyDown: (e) => {
|
|
186
|
+
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
187
|
+
e.preventDefault();
|
|
188
|
+
const step = e.key === "ArrowDown" ? 1 : -1;
|
|
189
|
+
setActive((a) => shown.length ? (a + step + shown.length) % shown.length : 0);
|
|
190
|
+
} else if (e.key === "Enter" && shown[active]) {
|
|
191
|
+
e.preventDefault();
|
|
192
|
+
if (!shown[active].disabled) pick(shown[active].value);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
className: "min-w-0 flex-1 bg-transparent text-base leading-[21px] text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0"
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
] }),
|
|
199
|
+
/* @__PURE__ */ jsx(
|
|
200
|
+
"div",
|
|
201
|
+
{
|
|
202
|
+
id: listId,
|
|
203
|
+
role: "listbox",
|
|
204
|
+
"aria-multiselectable": multiple || void 0,
|
|
205
|
+
className: "flex max-h-60 flex-col gap-0.5 overflow-y-auto p-1",
|
|
206
|
+
children: shown.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-3 py-6 text-center text-sm text-text-muted", children: emptyText }) : shown.map((o, i) => {
|
|
207
|
+
const picked = picks.includes(o.value);
|
|
208
|
+
return /* @__PURE__ */ jsx(
|
|
209
|
+
"div",
|
|
210
|
+
{
|
|
211
|
+
id: `${listId}-${o.value}`,
|
|
212
|
+
role: "option",
|
|
213
|
+
"aria-selected": picked,
|
|
214
|
+
"aria-disabled": o.disabled || void 0,
|
|
215
|
+
"data-highlighted": i === active ? "" : void 0,
|
|
216
|
+
"data-disabled": o.disabled ? "" : void 0,
|
|
217
|
+
onPointerMove: () => setActive(i),
|
|
218
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
219
|
+
onClick: () => !o.disabled && pick(o.value),
|
|
220
|
+
className: cn(menuItemClass, picked && "bg-bg-selected"),
|
|
221
|
+
children: /* @__PURE__ */ jsx(
|
|
222
|
+
MenuItemContent,
|
|
223
|
+
{
|
|
224
|
+
label: o.label,
|
|
225
|
+
description: o.description,
|
|
226
|
+
icon: o.icon,
|
|
227
|
+
layout: "inline",
|
|
228
|
+
shortcut: o.shortcut,
|
|
229
|
+
selected: picked
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
},
|
|
233
|
+
o.value
|
|
234
|
+
);
|
|
235
|
+
})
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
footer && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center justify-end gap-2 border-t border-border-subtle p-2", children: [
|
|
239
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: () => setOpen(false), children: cancelLabel }),
|
|
240
|
+
/* @__PURE__ */ jsx(Button, { disabled: pending.length === 0, onClick: apply, children: applyLabel })
|
|
241
|
+
] })
|
|
242
|
+
]
|
|
243
|
+
}
|
|
244
|
+
) })
|
|
245
|
+
] })
|
|
246
|
+
}
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export { Combobox };
|
|
251
|
+
//# sourceMappingURL=chunk-NSRTTYQ4.js.map
|
|
252
|
+
//# sourceMappingURL=chunk-NSRTTYQ4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/combobox.tsx"],"names":["PopoverPrimitive"],"mappings":";;;;;;;;;;AAmEA,IAAM,OAAA,GAAU,CAAC,CAAA,EAAiB,CAAA,KAAc;AAC9C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/B,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,EAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IAAM,OAAO,CAAA,CAAE,WAAA,KAAgB,YAAY,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA;AAC1H,CAAA;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAe,EAAC;AAAA,EAChB,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,cAAA;AAAA,EACd,iBAAA,GAAoB,cAAA;AAAA,EACpB,SAAA,GAAY,YAAA;AAAA,EACZ,UAAA,GAAa,OAAA;AAAA,EACb,WAAA,GAAc,QAAA;AAAA,EACd,UAAA,GAAa,OAAA;AAAA,EACb,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,WAAA;AAAA,EACA,QAAA;AAAA,EACA,EAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,SAAS,cAAA,CAAe,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,KAAA,CAAA;AAElC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,eAAS,YAAY,CAAA;AAC7E,EAAA,MAAM,UAAU,KAAA,IAAS,iBAAA;AACzB,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAmB;AACjC,IAAA,IAAI,KAAA,IAAS,IAAA,EAAM,oBAAA,CAAqB,IAAI,CAAA;AAC5C,IAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,eAAS,WAAW,CAAA;AAC1E,EAAA,MAAM,OAAO,QAAA,IAAY,gBAAA;AAGzB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAmB,OAAO,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,GAAU,OAAA;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,CAAC,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAkB;AACjC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,SAAA,CAAU,CAAC,CAAA;AAAA,IACb;AACA,IAAA,IAAI,QAAA,IAAY,IAAA,EAAM,mBAAA,CAAoB,IAAI,CAAA;AAC9C,IAAA,YAAA,GAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAC,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAc;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,GAAY,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,GAAI,CAAC,GAAG,KAAA,EAAO,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,IAAK,MAAA,GAAS,EAAC,GAAI,CAAC,CAAC,CAAA;AAC/H,IAAA,IAAI,MAAA,EAAQ,OAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,IAAI,CAAC,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9B,CAAA;AACA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,MAAA,CAAO,OAAO,CAAA;AACd,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,CAAC,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,MAAA,CAAO,MAAA,GAAS,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,IAAY,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,IAAA,GAAO,WAAA;AAE9E,EAAA,MAAM,OAAO,WAAA,KAAgB,CAAC,WAAW,MAAA,CAAO,CAAC,GAAG,IAAA,GAAO,MAAA,CAAA;AAE3D,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,gBAAA;AAAA,MACX,MAAA,EACE,SAAS,QAAA,IAAY,MAAA,CAAO,SAAS,CAAA,mBACnC,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,UAAA,EAAW,IAAA,EAAK,MAAK,QAAA,EAAU,MAAA,CAAO,UAAU,OAAA,EAAS,MAAM,OAAO,EAAE,CAAA,EACrF,QAAA,EAAA,UAAA,EACH,CAAA,GACE,MAAA;AAAA,MAGN,+BAACA,OAAA,CAAiB,IAAA,EAAjB,EAAsB,IAAA,EAAY,cAAc,OAAA,EAC/C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAACA,OAAA,CAAiB,MAAA,EAAjB,EAAwB,OAAA,EAAO,IAAA,EAC9B,QAAA,kBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,gBAAA;AAAA,YACV,WAAA,EAAW,IAAA;AAAA,YACX,iBAAe,KAAA,IAAS,MAAA;AAAA,YACxB,cAAA,EAAc,OAAO,IAAA,GAAO,MAAA;AAAA,YAC5B,aAAA,EAAa,MAAA,CAAO,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,YACpC,cAAA,EAAc,OAAO,OAAA,IAAW,MAAA;AAAA,YAChC,eAAA,EAAe,OAAO,QAAA,IAAY,MAAA;AAAA,YAClC,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,YAC5B,SAAA,EAAW,EAAA,CAAG,kDAAA,EAAoD,SAAS,CAAA;AAAA,YAI3E,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACA,OAAA,CAAiB,OAAA;AAAA,gBAAjB;AAAA,kBACC,IAAI,MAAA,CAAO,SAAA;AAAA,kBACX,WAAA,EAAU,kBAAA;AAAA,kBACV,UAAU,MAAA,CAAO,QAAA;AAAA,kBACjB,cAAA,EAAc,OAAO,OAAA,IAAW,MAAA;AAAA,kBAChC,oBAAkB,MAAA,CAAO,WAAA;AAAA,kBACzB,YAAA,EAAY,MAAM,YAAY,CAAA;AAAA,kBAC9B,eAAA,EAAc,SAAA;AAAA,kBACd,SAAA,EAAU,iHAAA;AAAA,kBAEV,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,MAAA,CAAO,SAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,IAAI,WAAA,EAAY;AAAA;AAAA,eACjG;AAAA,cACC,wBACC,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0DAAA,EAA2D,aAAA,EAAW,MACnF,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,8BAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,KAAA,IACC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACV,GAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,SAAA;AAAA,oBACR,UAAU,MAAA,CAAO,QAAA;AAAA,oBACjB,WAAA,EAAa,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,oBAC9B,QAAA,EAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,oBAC3D,SAAA,EAAU,UAAA;AAAA,oBAET,QAAA,EAAA,CAAA,CAAE;AAAA,mBAAA;AAAA,kBARE,CAAA,CAAE;AAAA,iBAUV,CAAA;AAAA,gBACF,WAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,EAAA,CAAG,8CAAA,EAAgD,MAAA,CAAO,MAAA,GAAS,mBAAA,GAAsB,iBAAiB,GACpI,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,gBAGD,CAAC,KAAA,IAAS,KAAA,IAAS,MAAA,CAAO,SAAS,CAAA,oBAClC,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,UAAA;AAAA,oBACR,IAAA,EAAK,IAAA;AAAA,oBACL,UAAU,MAAA,CAAO,QAAA;AAAA,oBACjB,SAAA,EAAU,kBAAA;AAAA,oBACV,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,CAAA;AAAA,oBAEvB,QAAA,EAAA;AAAA;AAAA;AACH,eAAA,EAEJ,CAAA;AAAA,8BACA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,yCAAA,EAA0C;AAAA;AAAA;AAAA,SACrE,EACF,CAAA;AAAA,wBAEA,GAAA,CAACA,OAAA,CAAiB,MAAA,EAAjB,EAAwB,SAAA,EACvB,QAAA,kBAAA,IAAA;AAAA,UAACA,OAAA,CAAiB,OAAA;AAAA,UAAjB;AAAA,YACC,WAAA,EAAU,UAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,OAAA;AAAA,YACN,UAAA,EAAY,CAAA;AAAA,YACZ,gBAAA,EAAkB,CAAA;AAAA,YAClB,eAAA;AAAA,YACA,iBAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,iHAAA;AAAA,cACA,gBAAA;AAAA,cACA,gEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,yFAAA,EACf,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAO,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,gCACrE,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,eAAA,EAAa,IAAA;AAAA,oBACb,eAAA,EAAe,MAAA;AAAA,oBACf,mBAAA,EAAkB,MAAA;AAAA,oBAClB,uBAAA,EAAuB,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,MAAA;AAAA,oBAC5E,YAAA,EAAY,iBAAA;AAAA,oBACZ,KAAA,EAAO,KAAA;AAAA,oBACP,WAAA,EAAa,iBAAA;AAAA,oBACb,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,sBAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB,sBAAA,SAAA,CAAU,CAAC,CAAA;AAAA,oBACb,CAAA;AAAA,oBACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,sBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAChD,wBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,wBAAA,MAAM,IAAA,GAAO,CAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,CAAA,GAAI,EAAA;AACzC,wBAAA,SAAA,CAAU,CAAC,CAAA,KAAO,KAAA,CAAM,MAAA,GAAA,CAAU,CAAA,GAAI,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,GAAS,CAAE,CAAA;AAAA,sBAChF,WAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,MAAM,CAAA,EAAG;AAC7C,wBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,wBAAA,IAAI,CAAC,MAAM,MAAM,CAAA,CAAE,UAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,CAAA;AAAA,sBACvD;AAAA,oBACF,CAAA;AAAA,oBACA,SAAA,EAAU;AAAA;AAAA;AACZ,eAAA,EACF,CAAA;AAAA,8BAEA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,MAAA;AAAA,kBACJ,IAAA,EAAK,SAAA;AAAA,kBACL,wBAAsB,QAAA,IAAY,MAAA;AAAA,kBAClC,SAAA,EAAU,oDAAA;AAAA,kBAET,QAAA,EAAA,KAAA,CAAM,MAAA,KAAW,CAAA,mBAChB,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EAAiD,QAAA,EAAA,SAAA,EAAU,CAAA,GAExE,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAClB,oBAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AACrC,oBAAA,uBACE,GAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBAEC,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAAA,wBACxB,IAAA,EAAK,QAAA;AAAA,wBACL,eAAA,EAAe,MAAA;AAAA,wBACf,eAAA,EAAe,EAAE,QAAA,IAAY,MAAA;AAAA,wBAC7B,kBAAA,EAAkB,CAAA,KAAM,MAAA,GAAS,EAAA,GAAK,MAAA;AAAA,wBACtC,eAAA,EAAe,CAAA,CAAE,QAAA,GAAW,EAAA,GAAK,MAAA;AAAA,wBACjC,aAAA,EAAe,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,wBAEhC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,wBACrC,SAAS,MAAM,CAAC,EAAE,QAAA,IAAY,IAAA,CAAK,EAAE,KAAK,CAAA;AAAA,wBAC1C,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,MAAA,IAAU,gBAAgB,CAAA;AAAA,wBAEvD,QAAA,kBAAA,GAAA;AAAA,0BAAC,eAAA;AAAA,0BAAA;AAAA,4BACC,OAAO,CAAA,CAAE,KAAA;AAAA,4BACT,aAAa,CAAA,CAAE,WAAA;AAAA,4BACf,MAAM,CAAA,CAAE,IAAA;AAAA,4BACR,MAAA,EAAO,QAAA;AAAA,4BACP,UAAU,CAAA,CAAE,QAAA;AAAA,4BACZ,QAAA,EAAU;AAAA;AAAA;AACZ,uBAAA;AAAA,sBApBK,CAAA,CAAE;AAAA,qBAqBT;AAAA,kBAEJ,CAAC;AAAA;AAAA,eAEL;AAAA,cAEC,MAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,WAAA,EAAY,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,GACrD,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,gCACA,GAAA,CAAC,UAAO,QAAA,EAAU,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAA,EAAS,OAC9C,QAAA,EAAA,UAAA,EACH;AAAA,eAAA,EACF;AAAA;AAAA;AAAA,SAEJ,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"chunk-NSRTTYQ4.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Popover as PopoverPrimitive } from 'radix-ui'\nimport { Search } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { Chip } from './chip'\nimport { MenuItemContent, menuItemClass, menuSurfaceClass } from './dropdown'\nimport { FieldChrome, SelectChevron, useFieldChrome, type SelectOption } from './select'\n\n/**\n * Combobox, 1:1 with the uiKit `Combobox` set (4023:3549): Select's field, opening a searchable\n * list. The panel is the menu surface at the field's width (240 at least): a 36px search row\n * (16px icon, 14px query, 12px in) over a border/subtle rule, then the matching options as\n * inline menu rows 2px apart in 4px of padding.\n *\n * Single: a pick fills the field with its label and closes the list. Multiple: each pick\n * toggles and the list stays open; the field shows the picks as small outline chips, 4px\n * apart, each with its own remove button, and grows a row at a time as they wrap. The chips sit\n * 3px from the field's edge, so their labels start where a value's text would. With more than\n * one pick, Clear (the xs tertiary button) shows on the label's line at the field's right edge.\n *\n * `footer` adds Cancel (secondary) and Apply (primary) under a border/subtle rule, 8px in: picks\n * then wait for Apply, which stays disabled until something is picked; Cancel or Escape drops\n * them.\n *\n * Typing filters by label and description. Arrow keys move the highlight, Enter picks it, the\n * pointer highlights what it is over. The query field is a `combobox` that owns the `listbox`.\n */\nexport interface ComboboxProps {\n options: SelectOption[]\n /** The applied picks. */\n value?: string[]\n defaultValue?: string[]\n onValueChange?: (value: string[]) => void\n multiple?: boolean\n /** Cancel and Apply under the list; picks apply only with Apply. */\n footer?: boolean\n placeholder?: string\n searchPlaceholder?: string\n /** Shown when nothing matches the query. */\n emptyText?: React.ReactNode\n applyLabel?: string\n cancelLabel?: string\n clearLabel?: string\n label?: React.ReactNode\n hint?: React.ReactNode\n error?: React.ReactNode | boolean\n size?: 'sm' | 'md' | 'lg'\n leadingIcon?: React.ReactNode\n disabled?: boolean\n id?: string\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Portal target. Defaults to `document.body`. */\n container?: HTMLElement | null\n /** Keep focus where it is when the panel opens (inline previews). */\n onOpenAutoFocus?: (event: Event) => void\n /** A press outside the panel; `preventDefault()` keeps it open. */\n onInteractOutside?: (event: Event) => void\n 'aria-label'?: string\n wrapperClassName?: string\n className?: string\n}\n\nconst matches = (o: SelectOption, q: string) => {\n const t = q.trim().toLowerCase()\n if (!t) return true\n return o.label.toLowerCase().includes(t) || (typeof o.description === 'string' && o.description.toLowerCase().includes(t))\n}\n\nexport function Combobox({\n options,\n value,\n defaultValue = [],\n onValueChange,\n multiple = false,\n footer = false,\n placeholder = 'Select…',\n searchPlaceholder = 'Search…',\n emptyText = 'No results',\n applyLabel = 'Apply',\n cancelLabel = 'Cancel',\n clearLabel = 'Clear',\n label,\n hint,\n error,\n size = 'md',\n leadingIcon,\n disabled,\n id,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n container,\n onOpenAutoFocus,\n onInteractOutside,\n wrapperClassName,\n className,\n ...props\n}: ComboboxProps) {\n const chrome = useFieldChrome({ id, disabled, error, hint })\n const listId = `${chrome.controlId}-list`\n\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const applied = value ?? uncontrolledValue\n const commit = (next: string[]) => {\n if (value == null) setUncontrolledValue(next)\n onValueChange?.(next)\n }\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const open = openProp ?? uncontrolledOpen\n\n // With a footer, picks wait here for Apply; without one they apply at once.\n const [pending, setPending] = React.useState<string[]>(applied)\n const picks = footer ? pending : applied\n const [query, setQuery] = React.useState('')\n const [active, setActive] = React.useState(0)\n\n const setOpen = (next: boolean) => {\n if (next) {\n setPending(applied)\n setQuery('')\n setActive(0)\n }\n if (openProp == null) setUncontrolledOpen(next)\n onOpenChange?.(next)\n }\n\n const shown = options.filter((o) => matches(o, query))\n const pick = (v: string) => {\n const next = multiple ? (picks.includes(v) ? picks.filter((x) => x !== v) : [...picks, v]) : picks[0] === v && footer ? [] : [v]\n if (footer) return setPending(next)\n commit(next)\n if (!multiple) setOpen(false)\n }\n const apply = () => {\n commit(pending)\n setOpen(false)\n }\n\n const chosen = applied.map((v) => options.find((o) => o.value === v)).filter(Boolean) as SelectOption[]\n const chips = multiple && chosen.length > 0\n const triggerText = !multiple && chosen[0] ? chosen[0].label : chips ? null : placeholder\n // As in Select: left out, a single pick's own icon leads the field.\n const lead = leadingIcon ?? (!multiple ? chosen[0]?.icon : undefined)\n\n return (\n <FieldChrome\n label={label}\n chrome={chrome}\n className={wrapperClassName}\n action={\n label && multiple && chosen.length > 1 ? (\n <Button variant=\"tertiary\" size=\"xs\" disabled={chrome.disabled} onClick={() => commit([])}>\n {clearLabel}\n </Button>\n ) : undefined\n }\n >\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <PopoverPrimitive.Anchor asChild>\n <div\n data-slot=\"combobox-field\"\n data-size={size}\n data-multiple={chips || undefined}\n data-leading={lead ? true : undefined}\n data-filled={chosen.length ? true : undefined}\n data-invalid={chrome.invalid || undefined}\n data-disabled={chrome.disabled || undefined}\n data-state={open ? 'open' : 'closed'}\n className={cn('satin-field satin-select satin-combobox relative', className)}\n >\n {/* The trigger covers the whole field under the chips, so a click anywhere but a\n chip's remove button or Clear opens the list, and it takes no room in the rows. */}\n <PopoverPrimitive.Trigger\n id={chrome.controlId}\n data-slot=\"combobox-trigger\"\n disabled={chrome.disabled}\n aria-invalid={chrome.invalid || undefined}\n aria-describedby={chrome.describedBy}\n aria-label={props['aria-label']}\n aria-haspopup=\"listbox\"\n className=\"absolute inset-0 cursor-pointer rounded-[inherit] outline-none focus-visible:ring-0 disabled:cursor-not-allowed\"\n >\n <span className=\"sr-only\">{chosen.length ? chosen.map((o) => o.label).join(', ') : placeholder}</span>\n </PopoverPrimitive.Trigger>\n {lead && (\n <span className=\"satin-field-icon satin-combobox-icon pointer-events-none\" aria-hidden>\n {lead}\n </span>\n )}\n <div className=\"pointer-events-none flex min-w-0 flex-1 flex-wrap items-center gap-1 *:pointer-events-auto\">\n {chips &&\n chosen.map((o) => (\n <Chip\n key={o.value}\n size=\"sm\"\n variant=\"outline\"\n disabled={chrome.disabled}\n removeLabel={`Remove ${o.label}`}\n onRemove={() => commit(applied.filter((v) => v !== o.value))}\n className=\"relative\"\n >\n {o.label}\n </Chip>\n ))}\n {triggerText && (\n <span aria-hidden className={cn('pointer-events-none! min-w-0 flex-1 truncate', chosen.length ? 'text-text-default' : 'text-text-muted')}>\n {triggerText}\n </span>\n )}\n {/* Without a label there is no line above the field for Clear: it follows the chips. */}\n {!label && chips && chosen.length > 1 && (\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n disabled={chrome.disabled}\n className=\"relative ml-auto\"\n onClick={() => commit([])}\n >\n {clearLabel}\n </Button>\n )}\n </div>\n <SelectChevron className=\"satin-combobox-icon pointer-events-none\" />\n </div>\n </PopoverPrimitive.Anchor>\n\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n data-slot=\"combobox\"\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n onOpenAutoFocus={onOpenAutoFocus}\n onInteractOutside={onInteractOutside}\n className={cn(\n 'pointer-events-auto z-50 flex w-(--radix-popover-trigger-width) min-w-60 max-w-[520px] flex-col overflow-hidden',\n menuSurfaceClass,\n 'origin-(--radix-popover-content-transform-origin) outline-none',\n 'data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n )}\n >\n <label className=\"flex h-9 shrink-0 items-center gap-2 border-b border-border-subtle px-3 text-text-muted\">\n <Search aria-hidden className=\"size-4 shrink-0 [stroke-width:1.875]\" />\n <input\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={shown[active] ? `${listId}-${shown[active].value}` : undefined}\n aria-label={searchPlaceholder}\n value={query}\n placeholder={searchPlaceholder}\n onChange={(e) => {\n setQuery(e.target.value)\n setActive(0)\n }}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n const step = e.key === 'ArrowDown' ? 1 : -1\n setActive((a) => (shown.length ? (a + step + shown.length) % shown.length : 0))\n } else if (e.key === 'Enter' && shown[active]) {\n e.preventDefault()\n if (!shown[active].disabled) pick(shown[active].value)\n }\n }}\n className=\"min-w-0 flex-1 bg-transparent text-base leading-[21px] text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0\"\n />\n </label>\n\n <div\n id={listId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n className=\"flex max-h-60 flex-col gap-0.5 overflow-y-auto p-1\"\n >\n {shown.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-text-muted\">{emptyText}</p>\n ) : (\n shown.map((o, i) => {\n const picked = picks.includes(o.value)\n return (\n <div\n key={o.value}\n id={`${listId}-${o.value}`}\n role=\"option\"\n aria-selected={picked}\n aria-disabled={o.disabled || undefined}\n data-highlighted={i === active ? '' : undefined}\n data-disabled={o.disabled ? '' : undefined}\n onPointerMove={() => setActive(i)}\n // Keep focus in the query field.\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => !o.disabled && pick(o.value)}\n className={cn(menuItemClass, picked && 'bg-bg-selected')}\n >\n <MenuItemContent\n label={o.label}\n description={o.description}\n icon={o.icon}\n layout=\"inline\"\n shortcut={o.shortcut}\n selected={picked}\n />\n </div>\n )\n })\n )}\n </div>\n\n {footer && (\n <div className=\"flex shrink-0 items-center justify-end gap-2 border-t border-border-subtle p-2\">\n <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n {cancelLabel}\n </Button>\n <Button disabled={pending.length === 0} onClick={apply}>\n {applyLabel}\n </Button>\n </div>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </FieldChrome>\n )\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var badgeVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"inline-flex shrink-0 items-center gap-1 text-sm leading-4 font-medium tracking-normal whitespace-nowrap text-tone-fg",
|
|
9
|
+
"[&_svg]:pointer-events-none [&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
|
|
10
|
+
],
|
|
11
|
+
{
|
|
12
|
+
variants: {
|
|
13
|
+
size: {
|
|
14
|
+
lg: "px-2 py-1",
|
|
15
|
+
sm: "px-1.5 py-0.5"
|
|
16
|
+
},
|
|
17
|
+
variant: {
|
|
18
|
+
soft: "bg-tone-bg",
|
|
19
|
+
plain: "bg-transparent",
|
|
20
|
+
// White (bg/card) inside a 1px border/default edge, drawn inset so the size stays put.
|
|
21
|
+
outline: "bg-bg-card [box-shadow:inset_0_0_0_1px_var(--border-default)]"
|
|
22
|
+
},
|
|
23
|
+
shape: {
|
|
24
|
+
default: "rounded-sm",
|
|
25
|
+
rounded: "rounded-pill"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: { size: "lg", variant: "soft", shape: "default" }
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
function Badge({ className, tone = "neutral", size, variant, shape, ...props }) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"span",
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "badge",
|
|
36
|
+
"data-tone": tone,
|
|
37
|
+
className: cn(badgeVariants({ size, variant, shape }), className),
|
|
38
|
+
...props
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { Badge, badgeVariants };
|
|
44
|
+
//# sourceMappingURL=chunk-O7F3CIDV.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-O7F3CIDV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/badge.tsx"],"names":[],"mappings":";;;;;AAcA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB;AAAA,IACE,sHAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,WAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,gBAAA;AAAA;AAAA,QAEP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,iBAAiB,EAAE,IAAA,EAAM,MAAM,OAAA,EAAS,MAAA,EAAQ,OAAO,SAAA;AAAU;AAErE;AAMO,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,IAAA,GAAO,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,GAAG,KAAA,EAAM,EAAe;AACjG,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA;AAAA,MAC/D,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-O7F3CIDV.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\nexport type BadgeTone = 'neutral' | 'brand' | 'sky' | 'green' | 'amber' | 'red' | 'fuchsia' | 'plum'\n\n/**\n * Badge, 1:1 with the uiKit `Badge` set (988:20203): eight tones, Large (8 × 4 padding, 24\n * high) or Small (6 × 2, 20 high), Soft (tone fill), Plain (no fill) or Outline (bg/card with a border/default edge), radius-sm or full.\n * Label medium 13/16, icon 14px in the tone colour, 4px apart. No border, no shadow.\n * The tone comes from `data-tone`, which repoints the `tone/*` tokens.\n */\nconst badgeVariants = cva(\n [\n 'inline-flex shrink-0 items-center gap-1 text-sm leading-4 font-medium tracking-normal whitespace-nowrap text-tone-fg',\n '[&_svg]:pointer-events-none [&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n size: {\n lg: 'px-2 py-1',\n sm: 'px-1.5 py-0.5',\n },\n variant: {\n soft: 'bg-tone-bg',\n plain: 'bg-transparent',\n // White (bg/card) inside a 1px border/default edge, drawn inset so the size stays put.\n outline: 'bg-bg-card [box-shadow:inset_0_0_0_1px_var(--border-default)]',\n },\n shape: {\n default: 'rounded-sm',\n rounded: 'rounded-pill',\n },\n },\n defaultVariants: { size: 'lg', variant: 'soft', shape: 'default' },\n },\n)\n\nexport interface BadgeProps extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n tone?: BadgeTone\n}\n\nexport function Badge({ className, tone = 'neutral', size, variant, shape, ...props }: BadgeProps) {\n return (\n <span\n data-slot=\"badge\"\n data-tone={tone}\n className={cn(badgeVariants({ size, variant, shape }), className)}\n {...props}\n />\n )\n}\n\nexport { badgeVariants }\n"]}
|