@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,153 @@
|
|
|
1
|
+
import { KbdGroup } from './chunk-BKZBWPUH.js';
|
|
2
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
import { DropdownMenu as DropdownMenu$1 } from 'radix-ui';
|
|
5
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var menuSurfaceClass = cn(
|
|
8
|
+
"rounded-xl border border-border-subtle bg-bg-popover",
|
|
9
|
+
"[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]"
|
|
10
|
+
);
|
|
11
|
+
var menuGroupClass = "flex flex-col gap-1 not-last:after:block not-last:after:h-px not-last:after:bg-bg-muted";
|
|
12
|
+
var menuGroupLabelClass = "flex h-6 items-center px-3 text-xs leading-3 tracking-normal text-text-subtle";
|
|
13
|
+
function DropdownMenu({
|
|
14
|
+
trigger,
|
|
15
|
+
children,
|
|
16
|
+
open,
|
|
17
|
+
defaultOpen,
|
|
18
|
+
onOpenChange,
|
|
19
|
+
modal = true,
|
|
20
|
+
side = "bottom",
|
|
21
|
+
align = "start",
|
|
22
|
+
sideOffset = 8,
|
|
23
|
+
container,
|
|
24
|
+
onFocusOutside,
|
|
25
|
+
className,
|
|
26
|
+
...props
|
|
27
|
+
}) {
|
|
28
|
+
return /* @__PURE__ */ jsxs(DropdownMenu$1.Root, { open, defaultOpen, onOpenChange, modal, children: [
|
|
29
|
+
/* @__PURE__ */ jsx(DropdownMenu$1.Trigger, { asChild: true, children: trigger }),
|
|
30
|
+
/* @__PURE__ */ jsx(DropdownMenu$1.Portal, { container, children: /* @__PURE__ */ jsx(
|
|
31
|
+
DropdownMenu$1.Content,
|
|
32
|
+
{
|
|
33
|
+
"data-slot": "dropdown-menu",
|
|
34
|
+
"aria-label": props["aria-label"],
|
|
35
|
+
side,
|
|
36
|
+
align,
|
|
37
|
+
sideOffset,
|
|
38
|
+
collisionPadding: 8,
|
|
39
|
+
onFocusOutside,
|
|
40
|
+
className: cn(
|
|
41
|
+
"pointer-events-auto z-50 flex w-[255px] max-w-[520px] flex-col gap-1 overflow-x-clip overflow-y-auto p-1",
|
|
42
|
+
"max-h-(--radix-dropdown-menu-content-available-height)",
|
|
43
|
+
menuSurfaceClass,
|
|
44
|
+
"origin-(--radix-dropdown-menu-content-transform-origin) outline-none",
|
|
45
|
+
"data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]",
|
|
46
|
+
className
|
|
47
|
+
),
|
|
48
|
+
children
|
|
49
|
+
}
|
|
50
|
+
) })
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
function DropdownMenuGroup({ label, children, className, ...props }) {
|
|
54
|
+
return /* @__PURE__ */ jsxs(
|
|
55
|
+
DropdownMenu$1.Group,
|
|
56
|
+
{
|
|
57
|
+
"data-slot": "dropdown-group",
|
|
58
|
+
className: cn(menuGroupClass, className),
|
|
59
|
+
...props,
|
|
60
|
+
children: [
|
|
61
|
+
label ? /* @__PURE__ */ jsx(DropdownMenu$1.Label, { className: menuGroupLabelClass, children: label }) : null,
|
|
62
|
+
children
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
var menuItemClass = cn(
|
|
68
|
+
"flex min-h-menu-row w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-left outline-none select-none focus-visible:ring-0",
|
|
69
|
+
"transition-colors duration-(--duration-fast) ease-(--ease-out)",
|
|
70
|
+
"data-[highlighted]:bg-bg-selected data-[force=hover]:bg-bg-selected data-[selected]:bg-bg-selected",
|
|
71
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
72
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0"
|
|
73
|
+
);
|
|
74
|
+
function MenuItemContent({
|
|
75
|
+
label,
|
|
76
|
+
description,
|
|
77
|
+
icon,
|
|
78
|
+
iconSize = 16,
|
|
79
|
+
selected = false,
|
|
80
|
+
layout = "stacked",
|
|
81
|
+
shortcut,
|
|
82
|
+
renderLabel = (l) => l
|
|
83
|
+
}) {
|
|
84
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
85
|
+
icon ? /* @__PURE__ */ jsx(
|
|
86
|
+
"span",
|
|
87
|
+
{
|
|
88
|
+
className: cn(
|
|
89
|
+
"grid shrink-0 place-items-center text-text-muted",
|
|
90
|
+
iconSize === 20 ? "size-5 [&_svg]:size-5 [&_svg]:[stroke-width:1.5]" : "size-4 [&_svg]:size-4 [&_svg]:[stroke-width:1.875]"
|
|
91
|
+
),
|
|
92
|
+
children: icon
|
|
93
|
+
}
|
|
94
|
+
) : null,
|
|
95
|
+
layout === "stacked" ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col justify-center gap-0.5", children: [
|
|
96
|
+
/* @__PURE__ */ jsx("span", { className: "text-base leading-5 font-medium text-text-default", children: renderLabel(label) }),
|
|
97
|
+
description ? /* @__PURE__ */ jsx("span", { className: "text-sm leading-[18px] text-text-muted", children: description }) : null
|
|
98
|
+
] }) : /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-baseline gap-3", children: [
|
|
99
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-base leading-5 font-medium whitespace-nowrap text-text-default", children: renderLabel(label) }),
|
|
100
|
+
description ? /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm text-text-muted", children: description }) : null
|
|
101
|
+
] }),
|
|
102
|
+
shortcut && /* @__PURE__ */ jsx(KbdGroup, { keys: shortcut, "aria-hidden": true }),
|
|
103
|
+
selected && /* @__PURE__ */ jsx("span", { className: "sr-only", children: "(selected)" }),
|
|
104
|
+
selected && /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, className: "text-status-green-fg", children: /* @__PURE__ */ jsx(
|
|
105
|
+
"path",
|
|
106
|
+
{
|
|
107
|
+
d: "M3.33333 8.66667L6 11.3333L12.6667 4.66667",
|
|
108
|
+
stroke: "currentColor",
|
|
109
|
+
strokeWidth: "1.25",
|
|
110
|
+
strokeLinecap: "round",
|
|
111
|
+
strokeLinejoin: "round"
|
|
112
|
+
}
|
|
113
|
+
) })
|
|
114
|
+
] });
|
|
115
|
+
}
|
|
116
|
+
function DropdownMenuItem({
|
|
117
|
+
label,
|
|
118
|
+
description,
|
|
119
|
+
icon,
|
|
120
|
+
iconSize = 16,
|
|
121
|
+
selected = false,
|
|
122
|
+
layout = "stacked",
|
|
123
|
+
shortcut,
|
|
124
|
+
className,
|
|
125
|
+
...props
|
|
126
|
+
}) {
|
|
127
|
+
return /* @__PURE__ */ jsx(
|
|
128
|
+
DropdownMenu$1.Item,
|
|
129
|
+
{
|
|
130
|
+
"data-slot": "dropdown-item",
|
|
131
|
+
"data-selected": selected || void 0,
|
|
132
|
+
textValue: label,
|
|
133
|
+
className: cn(menuItemClass, className),
|
|
134
|
+
...props,
|
|
135
|
+
children: /* @__PURE__ */ jsx(
|
|
136
|
+
MenuItemContent,
|
|
137
|
+
{
|
|
138
|
+
label,
|
|
139
|
+
description,
|
|
140
|
+
icon,
|
|
141
|
+
iconSize,
|
|
142
|
+
selected,
|
|
143
|
+
layout,
|
|
144
|
+
shortcut
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { DropdownMenu, DropdownMenuGroup, DropdownMenuItem, MenuItemContent, menuGroupClass, menuGroupLabelClass, menuItemClass, menuSurfaceClass };
|
|
152
|
+
//# sourceMappingURL=chunk-3DINAQLL.js.map
|
|
153
|
+
//# sourceMappingURL=chunk-3DINAQLL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/dropdown.tsx"],"names":["DropdownPrimitive"],"mappings":"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","file":"chunk-3DINAQLL.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { DropdownMenu as DropdownPrimitive } from 'radix-ui'\nimport { cn } from '../lib/utils'\nimport { KbdGroup } from './kbd'\n\n/**\n * DropdownMenu, 1:1 with the uiKit `DropdownMenu` (654:19150) and `DropdownMenu/Item`\n * (653:19165) sets. A 255px popover surface (max 520), 4px padding, radius-xl,\n * border/subtle, the shadcn `sm` shadow. Items are at least 32px high, 12px in, 6px top and\n * bottom, radius-lg, with an 8px gap between a 16px leading icon (text/muted), the content and\n * a trailing check (status green) when selected. An optional `shortcut` shows its keys (Kbd sm)\n * before the check. Hover, keyboard highlight and selected fill\n * bg/selected.\n *\n * Groups: `DropdownMenuGroup`. Content: a 14px medium label (20px line). `stacked` puts the\n * description under it, 2px apart, at 13px / 18px in text/muted; `inline` puts it on the same\n * baseline 12px after the label, at 13px, truncated. Groups have a 24px header in 12px\n * text/subtle and are 4px apart with a 1px bg/muted rule between them. Items are 4px apart.\n *\n * Built on the Radix DropdownMenu: arrow keys, typeahead, Escape, focus return.\n */\n/** The popover surface menus share: radius-xl, border/subtle, bg/popover, the shadcn `sm` shadow. */\nexport const menuSurfaceClass = cn(\n 'rounded-xl border border-border-subtle bg-bg-popover',\n '[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n)\n/** A group of rows, with a 1px bg/muted rule under every group but the last. */\nexport const menuGroupClass = 'flex flex-col gap-1 not-last:after:block not-last:after:h-px not-last:after:bg-bg-muted'\n/** The 24px group header in 12px text/subtle. */\nexport const menuGroupLabelClass = 'flex h-6 items-center px-3 text-xs leading-3 tracking-normal text-text-subtle'\n\nexport interface DropdownMenuProps {\n /** The element that opens the menu. Rendered with `asChild`, so pass a Button. */\n trigger: React.ReactNode\n /** `DropdownMenuItem`s, optionally inside `DropdownMenuGroup`s. */\n children: React.ReactNode\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Modal menus block the rest of the page while open. */\n modal?: boolean\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n /** Portal target. Defaults to `document.body`. */\n container?: HTMLElement | null\n /** Accessible name for the menu, when the trigger's text doesn't say enough. */\n 'aria-label'?: string\n /** Focus moved outside a non-modal menu; call `preventDefault()` to keep it open. */\n onFocusOutside?: (event: Event) => void\n className?: string\n}\n\nexport function DropdownMenu({\n trigger,\n children,\n open,\n defaultOpen,\n onOpenChange,\n modal = true,\n side = 'bottom',\n align = 'start',\n sideOffset = 8,\n container,\n onFocusOutside,\n className,\n ...props\n}: DropdownMenuProps) {\n return (\n <DropdownPrimitive.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} modal={modal}>\n <DropdownPrimitive.Trigger asChild>{trigger}</DropdownPrimitive.Trigger>\n <DropdownPrimitive.Portal container={container}>\n <DropdownPrimitive.Content\n data-slot=\"dropdown-menu\"\n aria-label={props['aria-label']}\n side={side}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={8}\n onFocusOutside={onFocusOutside}\n className={cn(\n 'pointer-events-auto z-50 flex w-[255px] max-w-[520px] flex-col gap-1 overflow-x-clip overflow-y-auto p-1',\n 'max-h-(--radix-dropdown-menu-content-available-height)',\n menuSurfaceClass,\n 'origin-(--radix-dropdown-menu-content-transform-origin) outline-none',\n 'data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]',\n className,\n )}\n >\n {children}\n </DropdownPrimitive.Content>\n </DropdownPrimitive.Portal>\n </DropdownPrimitive.Root>\n )\n}\n\n/* ------------------------------------------------------------------------------------------ */\n\nexport interface DropdownMenuGroupProps extends React.ComponentProps<typeof DropdownPrimitive.Group> {\n /** The 24px group header. */\n label?: React.ReactNode\n}\n\n/** A titled group of items (Figma `_dropdown/group`). Groups get a rule between them. */\nexport function DropdownMenuGroup({ label, children, className, ...props }: DropdownMenuGroupProps) {\n return (\n <DropdownPrimitive.Group\n data-slot=\"dropdown-group\"\n // Figma's divider lives inside the group, 8px under the last item; the last group has none.\n className={cn(menuGroupClass, className)}\n {...props}\n >\n {label ? (\n <DropdownPrimitive.Label className={menuGroupLabelClass}>\n {label}\n </DropdownPrimitive.Label>\n ) : null}\n {children}\n </DropdownPrimitive.Group>\n )\n}\n\n/* ------------------------------------------------------------------------------------------ */\n\n/** The row skin every menu shares: Dropdown, Select, Combobox and the Command menu. */\nexport const menuItemClass = cn(\n 'flex min-h-menu-row w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-1.5 text-left outline-none select-none focus-visible:ring-0',\n 'transition-colors duration-(--duration-fast) ease-(--ease-out)',\n 'data-[highlighted]:bg-bg-selected data-[force=hover]:bg-bg-selected data-[selected]:bg-bg-selected',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n)\n\nexport interface MenuItemContentProps {\n label: React.ReactNode\n description?: React.ReactNode\n /** Leading icon. 16px by default; stacked two-line items may use 20px (`iconSize={20}`). */\n icon?: React.ReactNode\n iconSize?: 16 | 20\n /** Marks the current value: a trailing check. */\n selected?: boolean\n layout?: 'stacked' | 'inline'\n /** Keys that run the item, e.g. \"⌘N\", shown on the right (Figma's `showShortcut`). */\n shortcut?: string\n /** Wraps the label, e.g. in Radix Select's `ItemText`. */\n renderLabel?: (label: React.ReactNode) => React.ReactNode\n}\n\n/** What sits inside a menu row: icon, label and description, then shortcut and check. */\nexport function MenuItemContent({\n label,\n description,\n icon,\n iconSize = 16,\n selected = false,\n layout = 'stacked',\n shortcut,\n renderLabel = (l) => l,\n}: MenuItemContentProps) {\n return (\n <>\n {icon ? (\n <span\n className={cn(\n 'grid shrink-0 place-items-center text-text-muted',\n iconSize === 20 ? 'size-5 [&_svg]:size-5 [&_svg]:[stroke-width:1.5]' : 'size-4 [&_svg]:size-4 [&_svg]:[stroke-width:1.875]',\n )}\n >\n {icon}\n </span>\n ) : null}\n\n {layout === 'stacked' ? (\n <span className=\"flex min-w-0 flex-1 flex-col justify-center gap-0.5\">\n <span className=\"text-base leading-5 font-medium text-text-default\">{renderLabel(label)}</span>\n {description ? <span className=\"text-sm leading-[18px] text-text-muted\">{description}</span> : null}\n </span>\n ) : (\n <span className=\"flex min-w-0 flex-1 items-baseline gap-3\">\n <span className=\"shrink-0 text-base leading-5 font-medium whitespace-nowrap text-text-default\">{renderLabel(label)}</span>\n {description ? (\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-muted\">{description}</span>\n ) : null}\n </span>\n )}\n\n {shortcut && <KbdGroup keys={shortcut} aria-hidden />}\n {selected && <span className=\"sr-only\">(selected)</span>}\n {selected && (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden className=\"text-status-green-fg\">\n <path\n d=\"M3.33333 8.66667L6 11.3333L12.6667 4.66667\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </>\n )\n}\n\nexport interface DropdownMenuItemProps\n extends Omit<React.ComponentProps<typeof DropdownPrimitive.Item>, 'children'>,\n Omit<MenuItemContentProps, 'label' | 'renderLabel'> {\n label: string\n}\n\nexport function DropdownMenuItem({\n label,\n description,\n icon,\n iconSize = 16,\n selected = false,\n layout = 'stacked',\n shortcut,\n className,\n ...props\n}: DropdownMenuItemProps) {\n return (\n <DropdownPrimitive.Item\n data-slot=\"dropdown-item\"\n data-selected={selected || undefined}\n textValue={label}\n className={cn(menuItemClass, className)}\n {...props}\n >\n <MenuItemContent\n label={label}\n description={description}\n icon={icon}\n iconSize={iconSize}\n selected={selected}\n layout={layout}\n shortcut={shortcut}\n />\n </DropdownPrimitive.Item>\n )\n}\n"]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var chipVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"group/chip relative inline-flex shrink-0 items-center rounded-pill whitespace-nowrap select-none",
|
|
9
|
+
"text-sm leading-(--text-sm--line-height) font-medium",
|
|
10
|
+
"transition-[background-color,border-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
|
|
11
|
+
"focus-visible:outline-none",
|
|
12
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[disabled]:[box-shadow:none]"
|
|
13
|
+
],
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
variant: {
|
|
17
|
+
outline: "border",
|
|
18
|
+
subtle: ""
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
md: "h-control-height",
|
|
22
|
+
sm: "h-control-height-xs"
|
|
23
|
+
},
|
|
24
|
+
neutral: { true: "text-text-default", false: "text-tone-fg" }
|
|
25
|
+
},
|
|
26
|
+
compoundVariants: [
|
|
27
|
+
{
|
|
28
|
+
variant: "outline",
|
|
29
|
+
neutral: true,
|
|
30
|
+
className: [
|
|
31
|
+
"border-border-default bg-bg-popover [box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]",
|
|
32
|
+
"satin-hover:border-border-strong satin-hover:bg-bg-hover",
|
|
33
|
+
"satin-focus:border-border-strong satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
34
|
+
"has-[button:focus-visible]:border-border-strong has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
35
|
+
"satin-pressed:border-border-strong satin-pressed:bg-border-input satin-pressed:[box-shadow:none]",
|
|
36
|
+
"data-[disabled]:border-border-strong"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
variant: "outline",
|
|
41
|
+
neutral: false,
|
|
42
|
+
className: [
|
|
43
|
+
"border-tone-border bg-tone-bg [box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]",
|
|
44
|
+
"satin-hover:bg-tone-border",
|
|
45
|
+
"satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
46
|
+
"has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
47
|
+
"satin-pressed:bg-tone-border satin-pressed:[box-shadow:none]"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
variant: "subtle",
|
|
52
|
+
neutral: true,
|
|
53
|
+
className: [
|
|
54
|
+
"bg-action-secondary-bg",
|
|
55
|
+
"satin-hover:bg-border-input",
|
|
56
|
+
"satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
57
|
+
"has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
58
|
+
"satin-pressed:bg-border-input satin-pressed:[box-shadow:inset_0_0_0_1px_var(--border-strong)]"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
variant: "subtle",
|
|
63
|
+
neutral: false,
|
|
64
|
+
className: [
|
|
65
|
+
"bg-tone-bg",
|
|
66
|
+
"satin-hover:bg-tone-border",
|
|
67
|
+
"satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
68
|
+
"has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
69
|
+
"satin-pressed:bg-tone-border"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
defaultVariants: { variant: "subtle", size: "md", neutral: true }
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
function CloseGlyph({ size }) {
|
|
77
|
+
return /* @__PURE__ */ jsx("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
78
|
+
"path",
|
|
79
|
+
{
|
|
80
|
+
d: "M4.50551 11.4951L8.0006 8M8.0006 8L11.4957 4.50491M8.0006 8L4.50551 4.50491M8.0006 8L11.4957 11.4951",
|
|
81
|
+
stroke: "currentColor",
|
|
82
|
+
strokeWidth: "1.25",
|
|
83
|
+
strokeLinecap: "round",
|
|
84
|
+
strokeLinejoin: "round"
|
|
85
|
+
}
|
|
86
|
+
) });
|
|
87
|
+
}
|
|
88
|
+
function Chip({
|
|
89
|
+
className,
|
|
90
|
+
variant = "subtle",
|
|
91
|
+
size = "md",
|
|
92
|
+
tone = "neutral",
|
|
93
|
+
dot = false,
|
|
94
|
+
avatar,
|
|
95
|
+
onRemove,
|
|
96
|
+
removeLabel,
|
|
97
|
+
disabled = false,
|
|
98
|
+
children,
|
|
99
|
+
type,
|
|
100
|
+
...props
|
|
101
|
+
}) {
|
|
102
|
+
const neutral = tone === "neutral";
|
|
103
|
+
const iconSize = size === "sm" ? 14 : 16;
|
|
104
|
+
const classes = cn(chipVariants({ variant, size, neutral }), className);
|
|
105
|
+
const label = typeof children === "string" ? children : void 0;
|
|
106
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
107
|
+
dot && // Dot slot: 4px in, a 16px box with an 8px status dot (status/green fg in Figma).
|
|
108
|
+
/* @__PURE__ */ jsx("span", { "data-slot": "chip-dot", className: "-mr-1 flex shrink-0 items-center pl-1", "aria-hidden": true, children: /* @__PURE__ */ jsx("span", { className: "grid size-4 place-items-center", children: /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-status-green-fg" }) }) }),
|
|
109
|
+
avatar && /* @__PURE__ */ jsx(
|
|
110
|
+
"span",
|
|
111
|
+
{
|
|
112
|
+
"data-slot": "chip-avatar",
|
|
113
|
+
className: "-mr-1 flex shrink-0 items-center pl-1 [&>*]:size-4 [&>*]:rounded-full",
|
|
114
|
+
children: avatar
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
/* @__PURE__ */ jsx("span", { "data-slot": "chip-label", className: cn("flex shrink-0 items-center px-2", onRemove && "-mr-1"), children }),
|
|
118
|
+
onRemove && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center pr-1", children: /* @__PURE__ */ jsx(
|
|
119
|
+
"button",
|
|
120
|
+
{
|
|
121
|
+
type: "button",
|
|
122
|
+
"data-slot": "chip-remove",
|
|
123
|
+
disabled,
|
|
124
|
+
"aria-label": removeLabel ?? (label ? `Remove ${label}` : "Remove"),
|
|
125
|
+
onClick: onRemove,
|
|
126
|
+
className: cn(
|
|
127
|
+
"grid shrink-0 place-items-center rounded-pill focus-visible:outline-none",
|
|
128
|
+
neutral ? "text-text-muted" : "text-tone-fg"
|
|
129
|
+
),
|
|
130
|
+
children: /* @__PURE__ */ jsx(CloseGlyph, { size: iconSize })
|
|
131
|
+
}
|
|
132
|
+
) })
|
|
133
|
+
] });
|
|
134
|
+
if (onRemove) {
|
|
135
|
+
const { "data-force": force } = props;
|
|
136
|
+
return /* @__PURE__ */ jsx(
|
|
137
|
+
"span",
|
|
138
|
+
{
|
|
139
|
+
"data-slot": "chip",
|
|
140
|
+
"data-tone": tone,
|
|
141
|
+
"data-force": force,
|
|
142
|
+
"data-disabled": disabled || void 0,
|
|
143
|
+
className: classes,
|
|
144
|
+
children: content
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return /* @__PURE__ */ jsx(
|
|
149
|
+
"button",
|
|
150
|
+
{
|
|
151
|
+
"data-slot": "chip",
|
|
152
|
+
"data-tone": tone,
|
|
153
|
+
"data-disabled": disabled || void 0,
|
|
154
|
+
type: type ?? "button",
|
|
155
|
+
disabled,
|
|
156
|
+
className: classes,
|
|
157
|
+
...props,
|
|
158
|
+
children: content
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
function ChipAvatar({ initials, tone, className }) {
|
|
163
|
+
return /* @__PURE__ */ jsx(
|
|
164
|
+
"span",
|
|
165
|
+
{
|
|
166
|
+
"data-tone": tone,
|
|
167
|
+
"aria-hidden": true,
|
|
168
|
+
className: cn(
|
|
169
|
+
"grid size-4 shrink-0 place-items-center overflow-hidden rounded-full bg-tone-bg text-[7px] leading-2 font-semibold text-tone-fg",
|
|
170
|
+
className
|
|
171
|
+
),
|
|
172
|
+
children: initials
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { Chip, ChipAvatar, chipVariants };
|
|
178
|
+
//# sourceMappingURL=chunk-3ERGAHKA.js.map
|
|
179
|
+
//# sourceMappingURL=chunk-3ERGAHKA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chip.tsx"],"names":[],"mappings":";;;;;AA4BA,IAAM,YAAA,GAAe,GAAA;AAAA,EACnB;AAAA,IACE,kGAAA;AAAA,IACA,sDAAA;AAAA,IACA,0GAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,QAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,kBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAO,cAAA;AAAe,KAC9D;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,sFAAA;AAAA,UACA,0DAAA;AAAA,UACA,wHAAA;AAAA,UACA,4HAAA;AAAA,UACA,kGAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA;AAAA,QACE,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,gFAAA;AAAA,UACA,4BAAA;AAAA,UACA,6DAAA;AAAA,UACA,4EAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,wBAAA;AAAA,UACA,6BAAA;AAAA,UACA,6DAAA;AAAA,UACA,4EAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA;AAAA,QACE,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,YAAA;AAAA,UACA,4BAAA;AAAA,UACA,6DAAA;AAAA,UACA,4EAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,IACA,iBAAiB,EAAE,OAAA,EAAS,UAAU,IAAA,EAAM,IAAA,EAAM,SAAS,IAAA;AAAK;AAEpE;AAuBA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAK,EAAsB;AAC/C,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAW,IAAA,EACzE,QAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,sGAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,MAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ;AAEO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA;AAAA,EACA,OAAA,GAAU,QAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,IAAA,GAAO,SAAA;AAAA,EACP,GAAA,GAAM,KAAA;AAAA,EACN,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,UAAU,IAAA,KAAS,SAAA;AACzB,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA;AACtC,EAAA,MAAM,OAAA,GAAU,GAAG,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAExD,EAAA,MAAM,0BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,GAAA;AAAA,wBAEE,MAAA,EAAA,EAAK,WAAA,EAAU,UAAA,EAAW,SAAA,EAAU,yCAAwC,aAAA,EAAW,IAAA,EACtF,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACd,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,wCAAA,EAAyC,GAC3D,CAAA,EACF,CAAA;AAAA,IAED,MAAA,oBACC,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,aAAA;AAAA,QACV,SAAA,EAAU,uEAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEF,GAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,YAAA,EAAa,SAAA,EAAW,GAAG,iCAAA,EAAmC,QAAA,IAAY,OAAO,CAAA,EAC9F,QAAA,EACH,CAAA;AAAA,IACC,QAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACd,QAAA,kBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,aAAA;AAAA,QACV,QAAA;AAAA,QACA,YAAA,EAAY,WAAA,KAAgB,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,GAAK,QAAA,CAAA;AAAA,QACxD,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,0EAAA;AAAA,UACA,UAAU,iBAAA,GAAoB;AAAA,SAChC;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,QAAA,EAAU;AAAA;AAAA,KAC9B,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAM,GAAI,KAAA;AAChC,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,MAAA;AAAA,QACV,WAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAY,KAAA;AAAA,QACZ,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAW,OAAA;AAAA,QAEV,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,MAAM,IAAA,IAAQ,QAAA;AAAA,MACd,QAAA;AAAA,MACA,SAAA,EAAW,OAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAU,IAAA,EAAM,WAAU,EAA+D;AACpH,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,iIAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ","file":"chunk-3ERGAHKA.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\nimport type { BadgeTone } from './badge'\n\n/**\n * Chip, 1:1 with the uiKit `Chip` set (3206:79959): Subtle or Outline, md (28, control-height)\n * or sm (24, control-height-xs), eight tones like Badge, an optional dot, avatar and remove\n * button. Label medium 13/19.5, 8px side padding; the dot, avatar and close slots overlap\n * the label padding by 4px, as in Figma.\n *\n * Neutral is its own look: Outline is a popover surface with a border-default edge and an\n * xs drop shadow, Subtle is the secondary action fill. Every other tone uses the `tone/*`\n * tokens (repointed by `data-tone`): tone-bg fill, tone-border edge, tone-fg text; hover and\n * pressed fill with tone-border.\n *\n * States (satin-hover / satin-focus / satin-pressed, or `data-force`):\n * - hover: neutral outline bg-hover + border-strong; neutral subtle border-input fill.\n * - pressed: neutral border-input fill with a border-strong edge, no drop shadow.\n * - focus: the 2px action/focus-ring spread, border-strong edge, no drop shadow.\n * - disabled: 50% opacity, no drop shadow.\n * Subtle pressed's 1px edge is an inset shadow so the chip doesn't grow by 2px.\n *\n * With `onRemove` the chip is a `span` holding a real remove button (a button can't hold\n * a button); without it, the chip itself is the button.\n */\nconst chipVariants = cva(\n [\n 'group/chip relative inline-flex shrink-0 items-center rounded-pill whitespace-nowrap select-none',\n 'text-sm leading-(--text-sm--line-height) font-medium',\n 'transition-[background-color,border-color,color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:outline-none',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[disabled]:[box-shadow:none]',\n ],\n {\n variants: {\n variant: {\n outline: 'border',\n subtle: '',\n },\n size: {\n md: 'h-control-height',\n sm: 'h-control-height-xs',\n },\n neutral: { true: 'text-text-default', false: 'text-tone-fg' },\n },\n compoundVariants: [\n {\n variant: 'outline',\n neutral: true,\n className: [\n 'border-border-default bg-bg-popover [box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n 'satin-hover:border-border-strong satin-hover:bg-bg-hover',\n 'satin-focus:border-border-strong satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'has-[button:focus-visible]:border-border-strong has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:border-border-strong satin-pressed:bg-border-input satin-pressed:[box-shadow:none]',\n 'data-[disabled]:border-border-strong',\n ],\n },\n {\n variant: 'outline',\n neutral: false,\n className: [\n 'border-tone-border bg-tone-bg [box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n 'satin-hover:bg-tone-border',\n 'satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-tone-border satin-pressed:[box-shadow:none]',\n ],\n },\n {\n variant: 'subtle',\n neutral: true,\n className: [\n 'bg-action-secondary-bg',\n 'satin-hover:bg-border-input',\n 'satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-border-input satin-pressed:[box-shadow:inset_0_0_0_1px_var(--border-strong)]',\n ],\n },\n {\n variant: 'subtle',\n neutral: false,\n className: [\n 'bg-tone-bg',\n 'satin-hover:bg-tone-border',\n 'satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'has-[button:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'satin-pressed:bg-tone-border',\n ],\n },\n ],\n defaultVariants: { variant: 'subtle', size: 'md', neutral: true },\n },\n)\n\ntype ChipBaseProps = Omit<VariantProps<typeof chipVariants>, 'neutral'> & {\n tone?: BadgeTone\n /** A status dot before the label. */\n dot?: boolean\n /** A 16px avatar before the label (an initials avatar or an image). */\n avatar?: React.ReactNode\n /** Shows the close button; called when it's clicked. */\n onRemove?: () => void\n /** Accessible name of the remove button. Defaults to \"Remove <label>\". */\n removeLabel?: string\n disabled?: boolean\n children?: React.ReactNode\n className?: string\n}\n\nexport type ChipProps = ChipBaseProps &\n Omit<React.ComponentProps<'button'>, keyof ChipBaseProps> & {\n 'data-force'?: 'hover' | 'focus' | 'pressed'\n }\n\n/** The Figma close glyph, 16 at 1.25 (14 at 1.09 on sm). */\nfunction CloseGlyph({ size }: { size: 14 | 16 }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M4.50551 11.4951L8.0006 8M8.0006 8L11.4957 4.50491M8.0006 8L4.50551 4.50491M8.0006 8L11.4957 11.4951\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport function Chip({\n className,\n variant = 'subtle',\n size = 'md',\n tone = 'neutral',\n dot = false,\n avatar,\n onRemove,\n removeLabel,\n disabled = false,\n children,\n type,\n ...props\n}: ChipProps) {\n const neutral = tone === 'neutral'\n const iconSize = size === 'sm' ? 14 : 16\n const classes = cn(chipVariants({ variant, size, neutral }), className)\n const label = typeof children === 'string' ? children : undefined\n\n const content = (\n <>\n {dot && (\n // Dot slot: 4px in, a 16px box with an 8px status dot (status/green fg in Figma).\n <span data-slot=\"chip-dot\" className=\"-mr-1 flex shrink-0 items-center pl-1\" aria-hidden>\n <span className=\"grid size-4 place-items-center\">\n <span className=\"size-2 rounded-full bg-status-green-fg\" />\n </span>\n </span>\n )}\n {avatar && (\n <span\n data-slot=\"chip-avatar\"\n className=\"-mr-1 flex shrink-0 items-center pl-1 [&>*]:size-4 [&>*]:rounded-full\"\n >\n {avatar}\n </span>\n )}\n <span data-slot=\"chip-label\" className={cn('flex shrink-0 items-center px-2', onRemove && '-mr-1')}>\n {children}\n </span>\n {onRemove && (\n <span className=\"flex shrink-0 items-center pr-1\">\n <button\n type=\"button\"\n data-slot=\"chip-remove\"\n disabled={disabled}\n aria-label={removeLabel ?? (label ? `Remove ${label}` : 'Remove')}\n onClick={onRemove}\n className={cn(\n 'grid shrink-0 place-items-center rounded-pill focus-visible:outline-none',\n neutral ? 'text-text-muted' : 'text-tone-fg',\n )}\n >\n <CloseGlyph size={iconSize} />\n </button>\n </span>\n )}\n </>\n )\n\n if (onRemove) {\n const { 'data-force': force } = props\n return (\n <span\n data-slot=\"chip\"\n data-tone={tone}\n data-force={force}\n data-disabled={disabled || undefined}\n className={classes}\n >\n {content}\n </span>\n )\n }\n\n return (\n <button\n data-slot=\"chip\"\n data-tone={tone}\n data-disabled={disabled || undefined}\n type={type ?? 'button'}\n disabled={disabled}\n className={classes}\n {...props}\n >\n {content}\n </button>\n )\n}\n\n/** The 16px initials avatar from Figma (Avatar 992:20199 at size 16): tone-bg, 7px semibold tone-fg. */\nexport function ChipAvatar({ initials, tone, className }: { initials: string; tone?: BadgeTone; className?: string }) {\n return (\n <span\n data-tone={tone}\n aria-hidden\n className={cn(\n 'grid size-4 shrink-0 place-items-center overflow-hidden rounded-full bg-tone-bg text-[7px] leading-2 font-semibold text-tone-fg',\n className,\n )}\n >\n {initials}\n </span>\n )\n}\n\nexport { chipVariants }\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { HoverCard } from './chunk-HRKPV66B.js';
|
|
2
|
+
import { cn } from './chunk-H63FYCMY.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function SourceIcon({ source }) {
|
|
7
|
+
if (source.icon) return /* @__PURE__ */ jsx("span", { className: "grid size-4 shrink-0 place-items-center overflow-clip rounded-xs [&>*]:size-4", children: source.icon });
|
|
8
|
+
return /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "grid size-4 shrink-0 place-items-center rounded-xs bg-bg-muted text-[10px] leading-none font-semibold text-text-muted", children: source.title.charAt(0).toUpperCase() });
|
|
9
|
+
}
|
|
10
|
+
function Citation({ index, source, className }) {
|
|
11
|
+
const chip = /* @__PURE__ */ jsx(
|
|
12
|
+
"a",
|
|
13
|
+
{
|
|
14
|
+
"data-slot": "citation",
|
|
15
|
+
href: source.href,
|
|
16
|
+
target: source.href ? "_blank" : void 0,
|
|
17
|
+
rel: source.href ? "noreferrer" : void 0,
|
|
18
|
+
"aria-label": `Source ${index}: ${source.title}`,
|
|
19
|
+
className: cn(
|
|
20
|
+
"mx-0.5 inline-grid h-4 min-w-4 translate-y-[-1px] place-items-center rounded-sm bg-bg-muted px-1 align-middle text-xs leading-none font-medium text-text-default no-underline tabular-nums outline-none",
|
|
21
|
+
"transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
|
|
22
|
+
"hover:bg-bg-hover hover:[box-shadow:inset_0_0_0_1px_var(--border-strong)] focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
children: index
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
return /* @__PURE__ */ jsxs(HoverCard, { trigger: chip, side: "top", align: "center", className: "w-[300px] gap-2 p-3", children: [
|
|
29
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-xs text-text-muted", children: [
|
|
30
|
+
/* @__PURE__ */ jsx(SourceIcon, { source }),
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: source.origin })
|
|
32
|
+
] }),
|
|
33
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-default", children: source.title }),
|
|
34
|
+
source.quote && /* @__PURE__ */ jsxs("span", { className: "text-body text-text-muted", children: [
|
|
35
|
+
"\u201C",
|
|
36
|
+
source.quote,
|
|
37
|
+
"\u201D"
|
|
38
|
+
] })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
function Sources({ sources, defaultOpen = false, className }) {
|
|
42
|
+
const [open, setOpen] = React.useState(defaultOpen);
|
|
43
|
+
const listId = React.useId();
|
|
44
|
+
return /* @__PURE__ */ jsxs("div", { "data-slot": "sources", className: cn("flex flex-col gap-2", className), children: [
|
|
45
|
+
/* @__PURE__ */ jsxs(
|
|
46
|
+
"button",
|
|
47
|
+
{
|
|
48
|
+
type: "button",
|
|
49
|
+
"aria-expanded": open,
|
|
50
|
+
"aria-controls": listId,
|
|
51
|
+
onClick: () => setOpen(!open),
|
|
52
|
+
className: cn(
|
|
53
|
+
"inline-flex h-8 w-fit items-center gap-2 rounded-pill border border-border-default py-1 pr-3 pl-1.5 text-sm font-medium text-text-default outline-none",
|
|
54
|
+
"transition-[border-color,background-color] duration-(--duration-fast) ease-(--ease-out)",
|
|
55
|
+
"hover:border-border-strong focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
56
|
+
open && "bg-bg-hover"
|
|
57
|
+
),
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx("span", { className: "flex items-center gap-0.5", children: sources.slice(0, 3).map((s, i) => /* @__PURE__ */ jsx(SourceIcon, { source: s }, i)) }),
|
|
60
|
+
sources.length,
|
|
61
|
+
" ",
|
|
62
|
+
sources.length === 1 ? "source" : "sources"
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsx("div", { id: listId, "data-state": open ? "open" : "closed", className: "satin-expand", children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("ol", { className: "flex flex-col gap-0.5", children: sources.map((s, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
67
|
+
"a",
|
|
68
|
+
{
|
|
69
|
+
href: s.href,
|
|
70
|
+
target: s.href ? "_blank" : void 0,
|
|
71
|
+
rel: s.href ? "noreferrer" : void 0,
|
|
72
|
+
className: "flex items-center gap-3 rounded-lg p-2 text-sm no-underline outline-none transition-colors duration-(--duration-fast) ease-(--ease-out) hover:bg-bg-hover focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx("span", { className: "grid h-4 min-w-4 place-items-center rounded-sm bg-bg-muted px-1 text-xs leading-none font-medium text-text-default tabular-nums", children: i + 1 }),
|
|
75
|
+
/* @__PURE__ */ jsx(SourceIcon, { source: s }),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-text-default", children: s.title }),
|
|
77
|
+
s.origin && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-text-muted", children: s.origin })
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
) }, i)) }) }) })
|
|
81
|
+
] });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { Citation, Sources };
|
|
85
|
+
//# sourceMappingURL=chunk-6C7CGJX2.js.map
|
|
86
|
+
//# sourceMappingURL=chunk-6C7CGJX2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/citations.tsx"],"names":[],"mappings":"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","file":"chunk-6C7CGJX2.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { HoverCard } from './hover-card'\n\n/**\n * Citations and sources, 1:1 with the uiKit design (🆕 citations): where an answer comes from.\n *\n * - `Citation`: a numbered chip right after the claim — 16 high, text/xs medium on bg/muted,\n * radius-sm; hover bg/hover with a border/strong ring. Resting on it (or focusing it) opens a\n * HoverCard with the source: logo and where it lives, the title, and the quoted passage.\n * - `Sources`: under the message, a pill with the sources' logos stacked and \"3 sources\"; it\n * opens into the list — number, logo, title, where it lives — each row a link.\n *\n * A source's `icon` is its logo (an app's or a site's favicon); without one it gets a tile with\n * its first letter, so a missing favicon never leaves a hole.\n */\nexport interface CitationSource {\n title: string\n /** Where it comes from: the app or site, \"Notion\" or \"freshfarm.pl\". */\n origin?: string\n href?: string\n /** A 16px logo or favicon. */\n icon?: React.ReactNode\n /** The passage the answer relies on, shown in the preview. */\n quote?: string\n}\n\nfunction SourceIcon({ source }: { source: CitationSource }) {\n if (source.icon) return <span className=\"grid size-4 shrink-0 place-items-center overflow-clip rounded-xs [&>*]:size-4\">{source.icon}</span>\n return (\n <span aria-hidden className=\"grid size-4 shrink-0 place-items-center rounded-xs bg-bg-muted text-[10px] leading-none font-semibold text-text-muted\">\n {source.title.charAt(0).toUpperCase()}\n </span>\n )\n}\n\nexport interface CitationProps {\n /** 1-based, as in the Sources list. */\n index: number\n source: CitationSource\n className?: string\n}\n\nexport function Citation({ index, source, className }: CitationProps) {\n const chip = (\n <a\n data-slot=\"citation\"\n href={source.href}\n target={source.href ? '_blank' : undefined}\n rel={source.href ? 'noreferrer' : undefined}\n aria-label={`Source ${index}: ${source.title}`}\n className={cn(\n 'mx-0.5 inline-grid h-4 min-w-4 translate-y-[-1px] place-items-center rounded-sm bg-bg-muted px-1 align-middle text-xs leading-none font-medium text-text-default no-underline tabular-nums outline-none',\n 'transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'hover:bg-bg-hover hover:[box-shadow:inset_0_0_0_1px_var(--border-strong)] focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n className,\n )}\n >\n {index}\n </a>\n )\n return (\n <HoverCard trigger={chip} side=\"top\" align=\"center\" className=\"w-[300px] gap-2 p-3\">\n <span className=\"flex items-center gap-2 text-xs text-text-muted\">\n <SourceIcon source={source} />\n <span className=\"truncate\">{source.origin}</span>\n </span>\n <span className=\"text-sm font-medium text-text-default\">{source.title}</span>\n {source.quote && <span className=\"text-body text-text-muted\">“{source.quote}”</span>}\n </HoverCard>\n )\n}\n\nexport interface SourcesProps {\n sources: CitationSource[]\n /** Start with the list open. */\n defaultOpen?: boolean\n className?: string\n}\n\nexport function Sources({ sources, defaultOpen = false, className }: SourcesProps) {\n const [open, setOpen] = React.useState(defaultOpen)\n const listId = React.useId()\n return (\n <div data-slot=\"sources\" className={cn('flex flex-col gap-2', className)}>\n <button\n type=\"button\"\n aria-expanded={open}\n aria-controls={listId}\n onClick={() => setOpen(!open)}\n className={cn(\n 'inline-flex h-8 w-fit items-center gap-2 rounded-pill border border-border-default py-1 pr-3 pl-1.5 text-sm font-medium text-text-default outline-none',\n 'transition-[border-color,background-color] duration-(--duration-fast) ease-(--ease-out)',\n 'hover:border-border-strong focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n open && 'bg-bg-hover',\n )}\n >\n <span className=\"flex items-center gap-0.5\">\n {sources.slice(0, 3).map((s, i) => (\n <SourceIcon key={i} source={s} />\n ))}\n </span>\n {sources.length} {sources.length === 1 ? 'source' : 'sources'}\n </button>\n <div id={listId} data-state={open ? 'open' : 'closed'} className=\"satin-expand\">\n <div>\n <ol className=\"flex flex-col gap-0.5\">\n {sources.map((s, i) => (\n <li key={i}>\n <a\n href={s.href}\n target={s.href ? '_blank' : undefined}\n rel={s.href ? 'noreferrer' : undefined}\n className=\"flex items-center gap-3 rounded-lg p-2 text-sm no-underline outline-none transition-colors duration-(--duration-fast) ease-(--ease-out) hover:bg-bg-hover focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]\"\n >\n <span className=\"grid h-4 min-w-4 place-items-center rounded-sm bg-bg-muted px-1 text-xs leading-none font-medium text-text-default tabular-nums\">{i + 1}</span>\n <SourceIcon source={s} />\n <span className=\"min-w-0 flex-1 truncate text-text-default\">{s.title}</span>\n {s.origin && <span className=\"shrink-0 text-text-muted\">{s.origin}</span>}\n </a>\n </li>\n ))}\n </ol>\n </div>\n </div>\n </div>\n )\n}\n"]}
|