@invergent/ui-sdk 0.0.0-stage → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -2
- package/dist/accordion.cjs +97 -0
- package/dist/accordion.cjs.map +1 -0
- package/dist/accordion.d.cts +10 -0
- package/dist/accordion.d.ts +10 -0
- package/dist/accordion.js +92 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.cjs +82 -0
- package/dist/alert.cjs.map +1 -0
- package/dist/alert.d.cts +14 -0
- package/dist/alert.d.ts +14 -0
- package/dist/alert.js +77 -0
- package/dist/alert.js.map +1 -0
- package/dist/avatar.cjs +110 -0
- package/dist/avatar.cjs.map +1 -0
- package/dist/avatar.d.cts +14 -0
- package/dist/avatar.d.ts +14 -0
- package/dist/avatar.js +103 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.cjs +47 -0
- package/dist/badge.cjs.map +1 -0
- package/dist/badge.d.cts +13 -0
- package/dist/badge.d.ts +13 -0
- package/dist/badge.js +44 -0
- package/dist/badge.js.map +1 -0
- package/dist/brand-beam.cjs +2303 -0
- package/dist/brand-beam.cjs.map +1 -0
- package/dist/brand-beam.d.cts +36 -0
- package/dist/brand-beam.d.ts +36 -0
- package/dist/brand-beam.js +2301 -0
- package/dist/brand-beam.js.map +1 -0
- package/dist/button.cjs +17 -0
- package/dist/button.cjs.map +1 -0
- package/dist/button.d.cts +14 -0
- package/dist/button.d.ts +14 -0
- package/dist/button.js +4 -0
- package/dist/button.js.map +1 -0
- package/dist/card.cjs +109 -0
- package/dist/card.cjs.map +1 -0
- package/dist/card.d.cts +14 -0
- package/dist/card.d.ts +14 -0
- package/dist/card.js +101 -0
- package/dist/card.js.map +1 -0
- package/dist/chart.cjs +275 -0
- package/dist/chart.cjs.map +1 -0
- package/dist/chart.d.cts +47 -0
- package/dist/chart.d.ts +47 -0
- package/dist/chart.js +247 -0
- package/dist/chart.js.map +1 -0
- package/dist/checkbox.cjs +41 -0
- package/dist/checkbox.cjs.map +1 -0
- package/dist/checkbox.d.cts +7 -0
- package/dist/checkbox.d.ts +7 -0
- package/dist/checkbox.js +39 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.cjs +92 -0
- package/dist/chip.cjs.map +1 -0
- package/dist/chip.d.cts +33 -0
- package/dist/chip.d.ts +33 -0
- package/dist/chip.js +86 -0
- package/dist/chip.js.map +1 -0
- package/dist/choice-card.cjs +127 -0
- package/dist/choice-card.cjs.map +1 -0
- package/dist/choice-card.d.cts +20 -0
- package/dist/choice-card.d.ts +20 -0
- package/dist/choice-card.js +124 -0
- package/dist/choice-card.js.map +1 -0
- package/dist/chunk-2UHRDVPT.cjs +183 -0
- package/dist/chunk-2UHRDVPT.cjs.map +1 -0
- package/dist/chunk-5CRE35VX.js +20 -0
- package/dist/chunk-5CRE35VX.js.map +1 -0
- package/dist/chunk-6ARYCL4L.cjs +30 -0
- package/dist/chunk-6ARYCL4L.cjs.map +1 -0
- package/dist/chunk-6JCVTRUK.js +21 -0
- package/dist/chunk-6JCVTRUK.js.map +1 -0
- package/dist/chunk-6YHDDRIM.cjs +13 -0
- package/dist/chunk-6YHDDRIM.cjs.map +1 -0
- package/dist/chunk-A44JJ6NH.js +58 -0
- package/dist/chunk-A44JJ6NH.js.map +1 -0
- package/dist/chunk-CPAFEXKR.js +63 -0
- package/dist/chunk-CPAFEXKR.js.map +1 -0
- package/dist/chunk-CTIEUG5L.js +28 -0
- package/dist/chunk-CTIEUG5L.js.map +1 -0
- package/dist/chunk-DSDDDYG3.cjs +60 -0
- package/dist/chunk-DSDDDYG3.cjs.map +1 -0
- package/dist/chunk-IB7LTHEQ.js +55 -0
- package/dist/chunk-IB7LTHEQ.js.map +1 -0
- package/dist/chunk-ID7MWMJO.cjs +162 -0
- package/dist/chunk-ID7MWMJO.cjs.map +1 -0
- package/dist/chunk-IVMZANP7.cjs +67 -0
- package/dist/chunk-IVMZANP7.cjs.map +1 -0
- package/dist/chunk-L73QIINW.js +157 -0
- package/dist/chunk-L73QIINW.js.map +1 -0
- package/dist/chunk-LZGII7SX.js +11 -0
- package/dist/chunk-LZGII7SX.js.map +1 -0
- package/dist/chunk-M677T75H.js +24 -0
- package/dist/chunk-M677T75H.js.map +1 -0
- package/dist/chunk-OAVCB3MR.cjs +26 -0
- package/dist/chunk-OAVCB3MR.cjs.map +1 -0
- package/dist/chunk-RVX6SN4U.cjs +23 -0
- package/dist/chunk-RVX6SN4U.cjs.map +1 -0
- package/dist/chunk-T74Z3WTK.js +151 -0
- package/dist/chunk-T74Z3WTK.js.map +1 -0
- package/dist/chunk-UOUXW63J.cjs +22 -0
- package/dist/chunk-UOUXW63J.cjs.map +1 -0
- package/dist/chunk-VBICNC43.cjs +61 -0
- package/dist/chunk-VBICNC43.cjs.map +1 -0
- package/dist/collapsible-header.cjs +66 -0
- package/dist/collapsible-header.cjs.map +1 -0
- package/dist/collapsible-header.d.cts +15 -0
- package/dist/collapsible-header.d.ts +15 -0
- package/dist/collapsible-header.js +63 -0
- package/dist/collapsible-header.js.map +1 -0
- package/dist/collapsible.cjs +38 -0
- package/dist/collapsible.cjs.map +1 -0
- package/dist/collapsible.d.cts +8 -0
- package/dist/collapsible.d.ts +8 -0
- package/dist/collapsible.js +34 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/color-picker.cjs +60 -0
- package/dist/color-picker.cjs.map +1 -0
- package/dist/color-picker.d.cts +12 -0
- package/dist/color-picker.d.ts +12 -0
- package/dist/color-picker.js +57 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/confirm-dialog.cjs +72 -0
- package/dist/confirm-dialog.cjs.map +1 -0
- package/dist/confirm-dialog.d.cts +19 -0
- package/dist/confirm-dialog.d.ts +19 -0
- package/dist/confirm-dialog.js +70 -0
- package/dist/confirm-dialog.js.map +1 -0
- package/dist/control-styles.cjs +16 -0
- package/dist/control-styles.cjs.map +1 -0
- package/dist/control-styles.d.cts +7 -0
- package/dist/control-styles.d.ts +7 -0
- package/dist/control-styles.js +10 -0
- package/dist/control-styles.js.map +1 -0
- package/dist/dialog.cjs +50 -0
- package/dist/dialog.cjs.map +1 -0
- package/dist/dialog.d.cts +20 -0
- package/dist/dialog.d.ts +20 -0
- package/dist/dialog.js +5 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dropdown-menu.cjs +265 -0
- package/dist/dropdown-menu.cjs.map +1 -0
- package/dist/dropdown-menu.d.cts +32 -0
- package/dist/dropdown-menu.d.ts +32 -0
- package/dist/dropdown-menu.js +249 -0
- package/dist/dropdown-menu.js.map +1 -0
- package/dist/empty-state.cjs +50 -0
- package/dist/empty-state.cjs.map +1 -0
- package/dist/empty-state.d.cts +23 -0
- package/dist/empty-state.d.ts +23 -0
- package/dist/empty-state.js +47 -0
- package/dist/empty-state.js.map +1 -0
- package/dist/field.cjs +221 -0
- package/dist/field.cjs.map +1 -0
- package/dist/field.d.cts +30 -0
- package/dist/field.d.ts +30 -0
- package/dist/field.js +210 -0
- package/dist/field.js.map +1 -0
- package/dist/input-group.cjs +148 -0
- package/dist/input-group.cjs.map +1 -0
- package/dist/input-group.d.cts +20 -0
- package/dist/input-group.d.ts +20 -0
- package/dist/input-group.js +141 -0
- package/dist/input-group.js.map +1 -0
- package/dist/input.cjs +13 -0
- package/dist/input.cjs.map +1 -0
- package/dist/input.d.cts +6 -0
- package/dist/input.d.ts +6 -0
- package/dist/input.js +4 -0
- package/dist/input.js.map +1 -0
- package/dist/label.cjs +13 -0
- package/dist/label.cjs.map +1 -0
- package/dist/label.d.cts +7 -0
- package/dist/label.d.ts +7 -0
- package/dist/label.js +4 -0
- package/dist/label.js.map +1 -0
- package/dist/lib/utils.cjs +12 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.d.cts +5 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +3 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/list-row.cjs +188 -0
- package/dist/list-row.cjs.map +1 -0
- package/dist/list-row.d.cts +51 -0
- package/dist/list-row.d.ts +51 -0
- package/dist/list-row.js +164 -0
- package/dist/list-row.js.map +1 -0
- package/dist/pill-tabs.cjs +109 -0
- package/dist/pill-tabs.cjs.map +1 -0
- package/dist/pill-tabs.d.cts +24 -0
- package/dist/pill-tabs.d.ts +24 -0
- package/dist/pill-tabs.js +107 -0
- package/dist/pill-tabs.js.map +1 -0
- package/dist/popover.cjs +88 -0
- package/dist/popover.cjs.map +1 -0
- package/dist/popover.d.cts +13 -0
- package/dist/popover.d.ts +13 -0
- package/dist/popover.js +80 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress-bar.cjs +28 -0
- package/dist/progress-bar.cjs.map +1 -0
- package/dist/progress-bar.d.cts +11 -0
- package/dist/progress-bar.d.ts +11 -0
- package/dist/progress-bar.js +26 -0
- package/dist/progress-bar.js.map +1 -0
- package/dist/scroll-area.cjs +63 -0
- package/dist/scroll-area.cjs.map +1 -0
- package/dist/scroll-area.d.cts +8 -0
- package/dist/scroll-area.d.ts +8 -0
- package/dist/scroll-area.js +60 -0
- package/dist/scroll-area.js.map +1 -0
- package/dist/section-label.cjs +30 -0
- package/dist/section-label.cjs.map +1 -0
- package/dist/section-label.d.cts +13 -0
- package/dist/section-label.d.ts +13 -0
- package/dist/section-label.js +28 -0
- package/dist/section-label.js.map +1 -0
- package/dist/segmented-control.cjs +75 -0
- package/dist/segmented-control.cjs.map +1 -0
- package/dist/segmented-control.d.cts +26 -0
- package/dist/segmented-control.d.ts +26 -0
- package/dist/segmented-control.js +53 -0
- package/dist/segmented-control.js.map +1 -0
- package/dist/select.cjs +193 -0
- package/dist/select.cjs.map +1 -0
- package/dist/select.d.cts +18 -0
- package/dist/select.d.ts +18 -0
- package/dist/select.js +182 -0
- package/dist/select.js.map +1 -0
- package/dist/separator.cjs +13 -0
- package/dist/separator.cjs.map +1 -0
- package/dist/separator.d.cts +7 -0
- package/dist/separator.d.ts +7 -0
- package/dist/separator.js +4 -0
- package/dist/separator.js.map +1 -0
- package/dist/sidebar.cjs +29 -0
- package/dist/sidebar.cjs.map +1 -0
- package/dist/sidebar.d.cts +58 -0
- package/dist/sidebar.d.ts +58 -0
- package/dist/sidebar.js +4 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/skeleton.cjs +19 -0
- package/dist/skeleton.cjs.map +1 -0
- package/dist/skeleton.d.cts +5 -0
- package/dist/skeleton.d.ts +5 -0
- package/dist/skeleton.js +17 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/sonner.cjs +40 -0
- package/dist/sonner.cjs.map +1 -0
- package/dist/sonner.d.cts +6 -0
- package/dist/sonner.d.ts +6 -0
- package/dist/sonner.js +38 -0
- package/dist/sonner.js.map +1 -0
- package/dist/sparkline.cjs +44 -0
- package/dist/sparkline.cjs.map +1 -0
- package/dist/sparkline.d.cts +12 -0
- package/dist/sparkline.d.ts +12 -0
- package/dist/sparkline.js +42 -0
- package/dist/sparkline.js.map +1 -0
- package/dist/spinner.cjs +13 -0
- package/dist/spinner.cjs.map +1 -0
- package/dist/spinner.d.cts +5 -0
- package/dist/spinner.d.ts +5 -0
- package/dist/spinner.js +11 -0
- package/dist/spinner.js.map +1 -0
- package/dist/stat-card.cjs +65 -0
- package/dist/stat-card.cjs.map +1 -0
- package/dist/stat-card.d.cts +22 -0
- package/dist/stat-card.d.ts +22 -0
- package/dist/stat-card.js +61 -0
- package/dist/stat-card.js.map +1 -0
- package/dist/status-dot.cjs +32 -0
- package/dist/status-dot.cjs.map +1 -0
- package/dist/status-dot.d.cts +11 -0
- package/dist/status-dot.d.ts +11 -0
- package/dist/status-dot.js +29 -0
- package/dist/status-dot.js.map +1 -0
- package/dist/switch.cjs +38 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +9 -0
- package/dist/switch.d.ts +9 -0
- package/dist/switch.js +36 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.cjs +118 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +13 -0
- package/dist/table.d.ts +13 -0
- package/dist/table.js +109 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.cjs +124 -0
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.d.cts +15 -0
- package/dist/tabs.d.ts +15 -0
- package/dist/tabs.js +118 -0
- package/dist/tabs.js.map +1 -0
- package/dist/text-link.cjs +51 -0
- package/dist/text-link.cjs.map +1 -0
- package/dist/text-link.d.cts +15 -0
- package/dist/text-link.d.ts +15 -0
- package/dist/text-link.js +48 -0
- package/dist/text-link.js.map +1 -0
- package/dist/textarea.cjs +13 -0
- package/dist/textarea.cjs.map +1 -0
- package/dist/textarea.d.cts +6 -0
- package/dist/textarea.d.ts +6 -0
- package/dist/textarea.js +4 -0
- package/dist/textarea.js.map +1 -0
- package/dist/theme.css +109 -0
- package/dist/toggle-group.cjs +155 -0
- package/dist/toggle-group.cjs.map +1 -0
- package/dist/toggle-group.d.cts +31 -0
- package/dist/toggle-group.d.ts +31 -0
- package/dist/toggle-group.js +130 -0
- package/dist/toggle-group.js.map +1 -0
- package/dist/toggle.cjs +21 -0
- package/dist/toggle.cjs.map +1 -0
- package/dist/toggle.d.cts +23 -0
- package/dist/toggle.d.ts +23 -0
- package/dist/toggle.js +4 -0
- package/dist/toggle.js.map +1 -0
- package/dist/tokens.css +77 -0
- package/dist/tooltip.cjs +25 -0
- package/dist/tooltip.cjs.map +1 -0
- package/dist/tooltip.d.cts +10 -0
- package/dist/tooltip.d.ts +10 -0
- package/dist/tooltip.js +4 -0
- package/dist/tooltip.js.map +1 -0
- package/package.json +60 -4
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk2UHRDVPT_cjs = require('./chunk-2UHRDVPT.cjs');
|
|
4
|
+
var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
7
|
+
var radixUi = require('radix-ui');
|
|
8
|
+
var lucideReact = require('lucide-react');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
30
|
+
|
|
31
|
+
var listRowVariants = classVarianceAuthority.cva(
|
|
32
|
+
"group/list-row flex w-full items-center text-left font-sans no-underline transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50",
|
|
33
|
+
{
|
|
34
|
+
variants: {
|
|
35
|
+
size: {
|
|
36
|
+
default: "gap-2.5 rounded-lg px-3 py-2.25 text-sm font-medium pointer-coarse:min-h-11 pointer-coarse:gap-3 pointer-coarse:rounded-xl pointer-coarse:px-3.5 pointer-coarse:text-[15px]",
|
|
37
|
+
sm: "gap-2.25 rounded-[7px] px-2 py-1.75 text-[13px] pointer-coarse:min-h-11 pointer-coarse:gap-2.5 pointer-coarse:rounded-lg pointer-coarse:px-2.5 pointer-coarse:text-[14px]",
|
|
38
|
+
lg: "min-h-14 gap-3 px-4 py-3 pointer-fine:min-h-0"
|
|
39
|
+
},
|
|
40
|
+
active: { true: "", false: "" }
|
|
41
|
+
},
|
|
42
|
+
compoundVariants: [
|
|
43
|
+
{ size: "default", active: true, className: "bg-foreground/5 text-foreground" },
|
|
44
|
+
{
|
|
45
|
+
size: "default",
|
|
46
|
+
active: false,
|
|
47
|
+
className: "text-muted-foreground hover:bg-foreground/5 hover:text-foreground"
|
|
48
|
+
},
|
|
49
|
+
{ size: "sm", active: true, className: "bg-foreground/6 font-medium text-foreground" },
|
|
50
|
+
{
|
|
51
|
+
size: "sm",
|
|
52
|
+
active: false,
|
|
53
|
+
className: "font-normal text-foreground/80 hover:bg-foreground/6 hover:text-foreground"
|
|
54
|
+
},
|
|
55
|
+
{ size: "lg", active: true, className: "bg-foreground/[0.04]" },
|
|
56
|
+
{
|
|
57
|
+
size: "lg",
|
|
58
|
+
active: false,
|
|
59
|
+
className: "hover:bg-foreground/[0.04] active:bg-foreground/[0.04]"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
defaultVariants: { size: "default", active: false }
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
var ICON_CLASS = {
|
|
66
|
+
default: "size-4.5 pointer-coarse:size-5",
|
|
67
|
+
// Quieter than the label while idle, the row's own colour once active.
|
|
68
|
+
sm: "size-4 pointer-coarse:size-4.5 group-data-[active=false]/list-row:text-muted-foreground",
|
|
69
|
+
lg: "size-5 text-muted-foreground"
|
|
70
|
+
};
|
|
71
|
+
function ListRow({
|
|
72
|
+
icon: Icon,
|
|
73
|
+
label,
|
|
74
|
+
description,
|
|
75
|
+
meta,
|
|
76
|
+
badge,
|
|
77
|
+
trailing,
|
|
78
|
+
chevron = false,
|
|
79
|
+
isActive = false,
|
|
80
|
+
activityPulse = false,
|
|
81
|
+
size = "default",
|
|
82
|
+
asChild = false,
|
|
83
|
+
className,
|
|
84
|
+
children,
|
|
85
|
+
...props
|
|
86
|
+
}) {
|
|
87
|
+
const Comp = asChild ? radixUi.Slot.Root : "button";
|
|
88
|
+
const isSmall = size !== "lg";
|
|
89
|
+
const { collapsed } = chunk2UHRDVPT_cjs.useSidebar();
|
|
90
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
91
|
+
Comp,
|
|
92
|
+
{
|
|
93
|
+
"data-slot": "list-row",
|
|
94
|
+
"data-size": size,
|
|
95
|
+
"data-active": isActive,
|
|
96
|
+
...asChild ? {} : { type: "button" },
|
|
97
|
+
"aria-label": collapsed && typeof label === "string" ? label : void 0,
|
|
98
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
99
|
+
listRowVariants({ size, active: isActive }),
|
|
100
|
+
!asChild && "cursor-pointer bg-transparent",
|
|
101
|
+
collapsed && "justify-center gap-0 px-0 pointer-coarse:px-0",
|
|
102
|
+
className
|
|
103
|
+
),
|
|
104
|
+
...props,
|
|
105
|
+
children: [
|
|
106
|
+
asChild && /* @__PURE__ */ jsxRuntime.jsx(radixUi.Slot.Slottable, { children }),
|
|
107
|
+
Icon && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative flex shrink-0", children: [
|
|
108
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: ICON_CLASS[size], strokeWidth: 1.75 }),
|
|
109
|
+
activityPulse && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "absolute -top-1 -right-1 flex size-2", children: [
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-green-500 opacity-75" }),
|
|
111
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative inline-flex size-2 rounded-full bg-green-500" })
|
|
112
|
+
] })
|
|
113
|
+
] }),
|
|
114
|
+
!collapsed && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
115
|
+
description ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
116
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
117
|
+
"span",
|
|
118
|
+
{
|
|
119
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
120
|
+
"truncate",
|
|
121
|
+
size === "lg" && "text-[15px] font-medium text-foreground"
|
|
122
|
+
),
|
|
123
|
+
children: label
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[12px] font-normal text-muted-foreground", children: description })
|
|
127
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
128
|
+
"span",
|
|
129
|
+
{
|
|
130
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
131
|
+
"min-w-0 flex-1 truncate",
|
|
132
|
+
size === "lg" && "text-[15px] font-medium text-foreground"
|
|
133
|
+
),
|
|
134
|
+
children: label
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
meta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-[12px] font-normal text-muted-foreground", children: meta }),
|
|
138
|
+
!badge ? null : typeof badge === "string" || typeof badge === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
139
|
+
"span",
|
|
140
|
+
{
|
|
141
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
142
|
+
"shrink-0 rounded bg-foreground/10 px-1.5 py-px text-xs font-normal text-muted-foreground",
|
|
143
|
+
isSmall && "pointer-coarse:rounded-md pointer-coarse:px-2 pointer-coarse:py-0.5 pointer-coarse:text-[13px]"
|
|
144
|
+
),
|
|
145
|
+
children: badge
|
|
146
|
+
}
|
|
147
|
+
) : badge,
|
|
148
|
+
trailing,
|
|
149
|
+
chevron && /* @__PURE__ */ jsxRuntime.jsx(
|
|
150
|
+
lucideReact.ChevronRight,
|
|
151
|
+
{
|
|
152
|
+
"aria-hidden": true,
|
|
153
|
+
className: "size-4 shrink-0 text-muted-foreground/60",
|
|
154
|
+
strokeWidth: 2
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
] })
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
function ListGroup({
|
|
163
|
+
className,
|
|
164
|
+
children,
|
|
165
|
+
...props
|
|
166
|
+
}) {
|
|
167
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
168
|
+
"ul",
|
|
169
|
+
{
|
|
170
|
+
"data-slot": "list-group",
|
|
171
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
172
|
+
"overflow-hidden rounded-2xl border border-border bg-card",
|
|
173
|
+
className
|
|
174
|
+
),
|
|
175
|
+
...props,
|
|
176
|
+
children: React__namespace.Children.toArray(children).map((child, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
177
|
+
index > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", className: "ml-[52px] h-px bg-foreground/[0.06]" }),
|
|
178
|
+
child
|
|
179
|
+
] }, React__namespace.isValidElement(child) && child.key != null ? child.key : index))
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
exports.ListGroup = ListGroup;
|
|
185
|
+
exports.ListRow = ListRow;
|
|
186
|
+
exports.listRowVariants = listRowVariants;
|
|
187
|
+
//# sourceMappingURL=list-row.cjs.map
|
|
188
|
+
//# sourceMappingURL=list-row.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/list-row.tsx"],"names":["cva","Slot","useSidebar","jsxs","cn","jsx","Fragment","ChevronRight","React"],"mappings":"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","file":"list-row.cjs","sourcesContent":["import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRight, type LucideIcon } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\nimport { useSidebar } from \"./sidebar\"\n\n// The Work console's list rows, in its three densities:\n// default — the navbar row (Agents, Sessions, Skills & Tools): a rounded\n// pill in muted text, filled faintly when hovered or active.\n// sm — the row under an expanded agent (Overview, Configure, Inbox):\n// tighter, 13px, the label a step brighter than the icon.\n// lg — the section-index row (agent sections, Configure on a phone):\n// a full-width row with a one-line description and a chevron,\n// meant for a bordered list (see ListGroup).\n// Touch sizing keys off the pointer, not the width: a finger needs the 44px\n// target at any screen size.\nconst listRowVariants = cva(\n \"group/list-row flex w-full items-center text-left font-sans no-underline transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n size: {\n default:\n \"gap-2.5 rounded-lg px-3 py-2.25 text-sm font-medium pointer-coarse:min-h-11 pointer-coarse:gap-3 pointer-coarse:rounded-xl pointer-coarse:px-3.5 pointer-coarse:text-[15px]\",\n sm: \"gap-2.25 rounded-[7px] px-2 py-1.75 text-[13px] pointer-coarse:min-h-11 pointer-coarse:gap-2.5 pointer-coarse:rounded-lg pointer-coarse:px-2.5 pointer-coarse:text-[14px]\",\n lg: \"min-h-14 gap-3 px-4 py-3 pointer-fine:min-h-0\",\n },\n active: { true: \"\", false: \"\" },\n },\n compoundVariants: [\n { size: \"default\", active: true, className: \"bg-foreground/5 text-foreground\" },\n {\n size: \"default\",\n active: false,\n className: \"text-muted-foreground hover:bg-foreground/5 hover:text-foreground\",\n },\n { size: \"sm\", active: true, className: \"bg-foreground/6 font-medium text-foreground\" },\n {\n size: \"sm\",\n active: false,\n className: \"font-normal text-foreground/80 hover:bg-foreground/6 hover:text-foreground\",\n },\n { size: \"lg\", active: true, className: \"bg-foreground/[0.04]\" },\n {\n size: \"lg\",\n active: false,\n className: \"hover:bg-foreground/[0.04] active:bg-foreground/[0.04]\",\n },\n ],\n defaultVariants: { size: \"default\", active: false },\n }\n)\n\nconst ICON_CLASS = {\n default: \"size-4.5 pointer-coarse:size-5\",\n // Quieter than the label while idle, the row's own colour once active.\n sm: \"size-4 pointer-coarse:size-4.5 group-data-[active=false]/list-row:text-muted-foreground\",\n lg: \"size-5 text-muted-foreground\",\n} as const\n\ntype ListRowProps = Omit<React.ComponentProps<\"button\">, \"children\"> & {\n icon?: LucideIcon\n label: React.ReactNode\n /** One line under the label, so a list of sections is scannable. */\n description?: React.ReactNode\n /** Quiet text at the end of the row (a time, a size). */\n meta?: React.ReactNode\n /** A count at the end of the row, hidden when falsy (0 included). A string\n * or number gets the muted pill; pass an element (e.g. an amber `Badge`)\n * to draw it yourself. */\n badge?: React.ReactNode\n /** Anything else at the end of the row. Interactive content cannot live\n * inside a button: render the row as a `div` (`asChild`) to hold it. */\n trailing?: React.ReactNode\n /** A chevron at the end: the row drills into something. */\n chevron?: boolean\n isActive?: boolean\n /** A pulsing activity dot on the icon (e.g. running workloads). */\n activityPulse?: boolean\n size?: \"default\" | \"sm\" | \"lg\"\n /** Render as the single child element (a router link, an `<a>`, a `div`)\n * instead of a button. The row's content is placed inside it. */\n asChild?: boolean\n children?: React.ReactElement\n}\n\n/**\n * A single Work list entry: icon, label, optional description, and a\n * trailing count, meta text or chevron. A button by default; any link (or a\n * plain `div`) with `asChild`:\n *\n * <ListRow asChild icon={Zap} label=\"Skills & Tools\" isActive={active}>\n * <Link to=\"/work/skills\" />\n * </ListRow>\n */\nfunction ListRow({\n icon: Icon,\n label,\n description,\n meta,\n badge,\n trailing,\n chevron = false,\n isActive = false,\n activityPulse = false,\n size = \"default\",\n asChild = false,\n className,\n children,\n ...props\n}: ListRowProps) {\n const Comp = asChild ? Slot.Root : \"button\"\n const isSmall = size !== \"lg\"\n // In a collapsed sidebar rail the row is its icon alone, centred, and the\n // label it no longer shows names it.\n const { collapsed } = useSidebar()\n\n return (\n <Comp\n data-slot=\"list-row\"\n data-size={size}\n data-active={isActive}\n {...(asChild ? {} : { type: \"button\" as const })}\n aria-label={collapsed && typeof label === \"string\" ? label : undefined}\n className={cn(\n listRowVariants({ size, active: isActive }),\n !asChild && \"cursor-pointer bg-transparent\",\n collapsed && \"justify-center gap-0 px-0 pointer-coarse:px-0\",\n className\n )}\n {...props}\n >\n {asChild && <Slot.Slottable>{children}</Slot.Slottable>}\n {Icon && (\n <span className=\"relative flex shrink-0\">\n <Icon className={ICON_CLASS[size]} strokeWidth={1.75} />\n {activityPulse && (\n <span className=\"absolute -top-1 -right-1 flex size-2\">\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-green-500 opacity-75\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-green-500\" />\n </span>\n )}\n </span>\n )}\n {!collapsed && (\n <>\n {description ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(\n \"truncate\",\n size === \"lg\" && \"text-[15px] font-medium text-foreground\"\n )}\n >\n {label}\n </span>\n <span className=\"truncate text-[12px] font-normal text-muted-foreground\">\n {description}\n </span>\n </span>\n ) : (\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n size === \"lg\" && \"text-[15px] font-medium text-foreground\"\n )}\n >\n {label}\n </span>\n )}\n {meta && (\n <span className=\"shrink-0 text-[12px] font-normal text-muted-foreground\">\n {meta}\n </span>\n )}\n {/* Falsy hides it: an empty string or a zero count says nothing. A\n ternary, not &&, or a 0 would render as text. */}\n {!badge ? null : typeof badge === \"string\" || typeof badge === \"number\" ? (\n <span\n className={cn(\n \"shrink-0 rounded bg-foreground/10 px-1.5 py-px text-xs font-normal text-muted-foreground\",\n isSmall && \"pointer-coarse:rounded-md pointer-coarse:px-2 pointer-coarse:py-0.5 pointer-coarse:text-[13px]\"\n )}\n >\n {badge}\n </span>\n ) : (\n badge\n )}\n {trailing}\n {chevron && (\n <ChevronRight\n aria-hidden={true}\n className=\"size-4 shrink-0 text-muted-foreground/60\"\n strokeWidth={2}\n />\n )}\n </>\n )}\n </Comp>\n )\n}\n\n/**\n * The bordered list the `lg` rows sit in, with dividers inset past the icon\n * column. Pass the rows as children; each is wrapped in an `<li>`.\n */\nfunction ListGroup({\n className,\n children,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"list-group\"\n className={cn(\n \"overflow-hidden rounded-2xl border border-border bg-card\",\n className\n )}\n {...props}\n >\n {React.Children.toArray(children).map((child, index) => (\n <li key={React.isValidElement(child) && child.key != null ? child.key : index}>\n {index > 0 && (\n <div aria-hidden=\"true\" className=\"ml-[52px] h-px bg-foreground/[0.06]\" />\n )}\n {child}\n </li>\n ))}\n </ul>\n )\n}\n\nexport { ListRow, ListGroup, listRowVariants }\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { LucideIcon } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
declare const listRowVariants: (props?: ({
|
|
7
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
8
|
+
active?: boolean | null | undefined;
|
|
9
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
|
+
type ListRowProps = Omit<React.ComponentProps<"button">, "children"> & {
|
|
11
|
+
icon?: LucideIcon;
|
|
12
|
+
label: React.ReactNode;
|
|
13
|
+
/** One line under the label, so a list of sections is scannable. */
|
|
14
|
+
description?: React.ReactNode;
|
|
15
|
+
/** Quiet text at the end of the row (a time, a size). */
|
|
16
|
+
meta?: React.ReactNode;
|
|
17
|
+
/** A count at the end of the row, hidden when falsy (0 included). A string
|
|
18
|
+
* or number gets the muted pill; pass an element (e.g. an amber `Badge`)
|
|
19
|
+
* to draw it yourself. */
|
|
20
|
+
badge?: React.ReactNode;
|
|
21
|
+
/** Anything else at the end of the row. Interactive content cannot live
|
|
22
|
+
* inside a button: render the row as a `div` (`asChild`) to hold it. */
|
|
23
|
+
trailing?: React.ReactNode;
|
|
24
|
+
/** A chevron at the end: the row drills into something. */
|
|
25
|
+
chevron?: boolean;
|
|
26
|
+
isActive?: boolean;
|
|
27
|
+
/** A pulsing activity dot on the icon (e.g. running workloads). */
|
|
28
|
+
activityPulse?: boolean;
|
|
29
|
+
size?: "default" | "sm" | "lg";
|
|
30
|
+
/** Render as the single child element (a router link, an `<a>`, a `div`)
|
|
31
|
+
* instead of a button. The row's content is placed inside it. */
|
|
32
|
+
asChild?: boolean;
|
|
33
|
+
children?: React.ReactElement;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A single Work list entry: icon, label, optional description, and a
|
|
37
|
+
* trailing count, meta text or chevron. A button by default; any link (or a
|
|
38
|
+
* plain `div`) with `asChild`:
|
|
39
|
+
*
|
|
40
|
+
* <ListRow asChild icon={Zap} label="Skills & Tools" isActive={active}>
|
|
41
|
+
* <Link to="/work/skills" />
|
|
42
|
+
* </ListRow>
|
|
43
|
+
*/
|
|
44
|
+
declare function ListRow({ icon: Icon, label, description, meta, badge, trailing, chevron, isActive, activityPulse, size, asChild, className, children, ...props }: ListRowProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
/**
|
|
46
|
+
* The bordered list the `lg` rows sit in, with dividers inset past the icon
|
|
47
|
+
* column. Pass the rows as children; each is wrapped in an `<li>`.
|
|
48
|
+
*/
|
|
49
|
+
declare function ListGroup({ className, children, ...props }: React.ComponentProps<"ul">): react_jsx_runtime.JSX.Element;
|
|
50
|
+
|
|
51
|
+
export { ListGroup, ListRow, listRowVariants };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { LucideIcon } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
declare const listRowVariants: (props?: ({
|
|
7
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
8
|
+
active?: boolean | null | undefined;
|
|
9
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
|
+
type ListRowProps = Omit<React.ComponentProps<"button">, "children"> & {
|
|
11
|
+
icon?: LucideIcon;
|
|
12
|
+
label: React.ReactNode;
|
|
13
|
+
/** One line under the label, so a list of sections is scannable. */
|
|
14
|
+
description?: React.ReactNode;
|
|
15
|
+
/** Quiet text at the end of the row (a time, a size). */
|
|
16
|
+
meta?: React.ReactNode;
|
|
17
|
+
/** A count at the end of the row, hidden when falsy (0 included). A string
|
|
18
|
+
* or number gets the muted pill; pass an element (e.g. an amber `Badge`)
|
|
19
|
+
* to draw it yourself. */
|
|
20
|
+
badge?: React.ReactNode;
|
|
21
|
+
/** Anything else at the end of the row. Interactive content cannot live
|
|
22
|
+
* inside a button: render the row as a `div` (`asChild`) to hold it. */
|
|
23
|
+
trailing?: React.ReactNode;
|
|
24
|
+
/** A chevron at the end: the row drills into something. */
|
|
25
|
+
chevron?: boolean;
|
|
26
|
+
isActive?: boolean;
|
|
27
|
+
/** A pulsing activity dot on the icon (e.g. running workloads). */
|
|
28
|
+
activityPulse?: boolean;
|
|
29
|
+
size?: "default" | "sm" | "lg";
|
|
30
|
+
/** Render as the single child element (a router link, an `<a>`, a `div`)
|
|
31
|
+
* instead of a button. The row's content is placed inside it. */
|
|
32
|
+
asChild?: boolean;
|
|
33
|
+
children?: React.ReactElement;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A single Work list entry: icon, label, optional description, and a
|
|
37
|
+
* trailing count, meta text or chevron. A button by default; any link (or a
|
|
38
|
+
* plain `div`) with `asChild`:
|
|
39
|
+
*
|
|
40
|
+
* <ListRow asChild icon={Zap} label="Skills & Tools" isActive={active}>
|
|
41
|
+
* <Link to="/work/skills" />
|
|
42
|
+
* </ListRow>
|
|
43
|
+
*/
|
|
44
|
+
declare function ListRow({ icon: Icon, label, description, meta, badge, trailing, chevron, isActive, activityPulse, size, asChild, className, children, ...props }: ListRowProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
/**
|
|
46
|
+
* The bordered list the `lg` rows sit in, with dividers inset past the icon
|
|
47
|
+
* column. Pass the rows as children; each is wrapped in an `<li>`.
|
|
48
|
+
*/
|
|
49
|
+
declare function ListGroup({ className, children, ...props }: React.ComponentProps<"ul">): react_jsx_runtime.JSX.Element;
|
|
50
|
+
|
|
51
|
+
export { ListGroup, ListRow, listRowVariants };
|
package/dist/list-row.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { useSidebar } from './chunk-L73QIINW.js';
|
|
2
|
+
import { cn } from './chunk-LZGII7SX.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { Slot } from 'radix-ui';
|
|
6
|
+
import { ChevronRight } from 'lucide-react';
|
|
7
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var listRowVariants = cva(
|
|
10
|
+
"group/list-row flex w-full items-center text-left font-sans no-underline transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50",
|
|
11
|
+
{
|
|
12
|
+
variants: {
|
|
13
|
+
size: {
|
|
14
|
+
default: "gap-2.5 rounded-lg px-3 py-2.25 text-sm font-medium pointer-coarse:min-h-11 pointer-coarse:gap-3 pointer-coarse:rounded-xl pointer-coarse:px-3.5 pointer-coarse:text-[15px]",
|
|
15
|
+
sm: "gap-2.25 rounded-[7px] px-2 py-1.75 text-[13px] pointer-coarse:min-h-11 pointer-coarse:gap-2.5 pointer-coarse:rounded-lg pointer-coarse:px-2.5 pointer-coarse:text-[14px]",
|
|
16
|
+
lg: "min-h-14 gap-3 px-4 py-3 pointer-fine:min-h-0"
|
|
17
|
+
},
|
|
18
|
+
active: { true: "", false: "" }
|
|
19
|
+
},
|
|
20
|
+
compoundVariants: [
|
|
21
|
+
{ size: "default", active: true, className: "bg-foreground/5 text-foreground" },
|
|
22
|
+
{
|
|
23
|
+
size: "default",
|
|
24
|
+
active: false,
|
|
25
|
+
className: "text-muted-foreground hover:bg-foreground/5 hover:text-foreground"
|
|
26
|
+
},
|
|
27
|
+
{ size: "sm", active: true, className: "bg-foreground/6 font-medium text-foreground" },
|
|
28
|
+
{
|
|
29
|
+
size: "sm",
|
|
30
|
+
active: false,
|
|
31
|
+
className: "font-normal text-foreground/80 hover:bg-foreground/6 hover:text-foreground"
|
|
32
|
+
},
|
|
33
|
+
{ size: "lg", active: true, className: "bg-foreground/[0.04]" },
|
|
34
|
+
{
|
|
35
|
+
size: "lg",
|
|
36
|
+
active: false,
|
|
37
|
+
className: "hover:bg-foreground/[0.04] active:bg-foreground/[0.04]"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
defaultVariants: { size: "default", active: false }
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
var ICON_CLASS = {
|
|
44
|
+
default: "size-4.5 pointer-coarse:size-5",
|
|
45
|
+
// Quieter than the label while idle, the row's own colour once active.
|
|
46
|
+
sm: "size-4 pointer-coarse:size-4.5 group-data-[active=false]/list-row:text-muted-foreground",
|
|
47
|
+
lg: "size-5 text-muted-foreground"
|
|
48
|
+
};
|
|
49
|
+
function ListRow({
|
|
50
|
+
icon: Icon,
|
|
51
|
+
label,
|
|
52
|
+
description,
|
|
53
|
+
meta,
|
|
54
|
+
badge,
|
|
55
|
+
trailing,
|
|
56
|
+
chevron = false,
|
|
57
|
+
isActive = false,
|
|
58
|
+
activityPulse = false,
|
|
59
|
+
size = "default",
|
|
60
|
+
asChild = false,
|
|
61
|
+
className,
|
|
62
|
+
children,
|
|
63
|
+
...props
|
|
64
|
+
}) {
|
|
65
|
+
const Comp = asChild ? Slot.Root : "button";
|
|
66
|
+
const isSmall = size !== "lg";
|
|
67
|
+
const { collapsed } = useSidebar();
|
|
68
|
+
return /* @__PURE__ */ jsxs(
|
|
69
|
+
Comp,
|
|
70
|
+
{
|
|
71
|
+
"data-slot": "list-row",
|
|
72
|
+
"data-size": size,
|
|
73
|
+
"data-active": isActive,
|
|
74
|
+
...asChild ? {} : { type: "button" },
|
|
75
|
+
"aria-label": collapsed && typeof label === "string" ? label : void 0,
|
|
76
|
+
className: cn(
|
|
77
|
+
listRowVariants({ size, active: isActive }),
|
|
78
|
+
!asChild && "cursor-pointer bg-transparent",
|
|
79
|
+
collapsed && "justify-center gap-0 px-0 pointer-coarse:px-0",
|
|
80
|
+
className
|
|
81
|
+
),
|
|
82
|
+
...props,
|
|
83
|
+
children: [
|
|
84
|
+
asChild && /* @__PURE__ */ jsx(Slot.Slottable, { children }),
|
|
85
|
+
Icon && /* @__PURE__ */ jsxs("span", { className: "relative flex shrink-0", children: [
|
|
86
|
+
/* @__PURE__ */ jsx(Icon, { className: ICON_CLASS[size], strokeWidth: 1.75 }),
|
|
87
|
+
activityPulse && /* @__PURE__ */ jsxs("span", { className: "absolute -top-1 -right-1 flex size-2", children: [
|
|
88
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-green-500 opacity-75" }),
|
|
89
|
+
/* @__PURE__ */ jsx("span", { className: "relative inline-flex size-2 rounded-full bg-green-500" })
|
|
90
|
+
] })
|
|
91
|
+
] }),
|
|
92
|
+
!collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
|
+
description ? /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
"span",
|
|
96
|
+
{
|
|
97
|
+
className: cn(
|
|
98
|
+
"truncate",
|
|
99
|
+
size === "lg" && "text-[15px] font-medium text-foreground"
|
|
100
|
+
),
|
|
101
|
+
children: label
|
|
102
|
+
}
|
|
103
|
+
),
|
|
104
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-[12px] font-normal text-muted-foreground", children: description })
|
|
105
|
+
] }) : /* @__PURE__ */ jsx(
|
|
106
|
+
"span",
|
|
107
|
+
{
|
|
108
|
+
className: cn(
|
|
109
|
+
"min-w-0 flex-1 truncate",
|
|
110
|
+
size === "lg" && "text-[15px] font-medium text-foreground"
|
|
111
|
+
),
|
|
112
|
+
children: label
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
meta && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[12px] font-normal text-muted-foreground", children: meta }),
|
|
116
|
+
!badge ? null : typeof badge === "string" || typeof badge === "number" ? /* @__PURE__ */ jsx(
|
|
117
|
+
"span",
|
|
118
|
+
{
|
|
119
|
+
className: cn(
|
|
120
|
+
"shrink-0 rounded bg-foreground/10 px-1.5 py-px text-xs font-normal text-muted-foreground",
|
|
121
|
+
isSmall && "pointer-coarse:rounded-md pointer-coarse:px-2 pointer-coarse:py-0.5 pointer-coarse:text-[13px]"
|
|
122
|
+
),
|
|
123
|
+
children: badge
|
|
124
|
+
}
|
|
125
|
+
) : badge,
|
|
126
|
+
trailing,
|
|
127
|
+
chevron && /* @__PURE__ */ jsx(
|
|
128
|
+
ChevronRight,
|
|
129
|
+
{
|
|
130
|
+
"aria-hidden": true,
|
|
131
|
+
className: "size-4 shrink-0 text-muted-foreground/60",
|
|
132
|
+
strokeWidth: 2
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
] })
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
function ListGroup({
|
|
141
|
+
className,
|
|
142
|
+
children,
|
|
143
|
+
...props
|
|
144
|
+
}) {
|
|
145
|
+
return /* @__PURE__ */ jsx(
|
|
146
|
+
"ul",
|
|
147
|
+
{
|
|
148
|
+
"data-slot": "list-group",
|
|
149
|
+
className: cn(
|
|
150
|
+
"overflow-hidden rounded-2xl border border-border bg-card",
|
|
151
|
+
className
|
|
152
|
+
),
|
|
153
|
+
...props,
|
|
154
|
+
children: React.Children.toArray(children).map((child, index) => /* @__PURE__ */ jsxs("li", { children: [
|
|
155
|
+
index > 0 && /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: "ml-[52px] h-px bg-foreground/[0.06]" }),
|
|
156
|
+
child
|
|
157
|
+
] }, React.isValidElement(child) && child.key != null ? child.key : index))
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export { ListGroup, ListRow, listRowVariants };
|
|
163
|
+
//# sourceMappingURL=list-row.js.map
|
|
164
|
+
//# sourceMappingURL=list-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/list-row.tsx"],"names":[],"mappings":"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","file":"list-row.js","sourcesContent":["import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRight, type LucideIcon } from \"lucide-react\"\n\nimport { cn } from \"./lib/utils\"\nimport { useSidebar } from \"./sidebar\"\n\n// The Work console's list rows, in its three densities:\n// default — the navbar row (Agents, Sessions, Skills & Tools): a rounded\n// pill in muted text, filled faintly when hovered or active.\n// sm — the row under an expanded agent (Overview, Configure, Inbox):\n// tighter, 13px, the label a step brighter than the icon.\n// lg — the section-index row (agent sections, Configure on a phone):\n// a full-width row with a one-line description and a chevron,\n// meant for a bordered list (see ListGroup).\n// Touch sizing keys off the pointer, not the width: a finger needs the 44px\n// target at any screen size.\nconst listRowVariants = cva(\n \"group/list-row flex w-full items-center text-left font-sans no-underline transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n size: {\n default:\n \"gap-2.5 rounded-lg px-3 py-2.25 text-sm font-medium pointer-coarse:min-h-11 pointer-coarse:gap-3 pointer-coarse:rounded-xl pointer-coarse:px-3.5 pointer-coarse:text-[15px]\",\n sm: \"gap-2.25 rounded-[7px] px-2 py-1.75 text-[13px] pointer-coarse:min-h-11 pointer-coarse:gap-2.5 pointer-coarse:rounded-lg pointer-coarse:px-2.5 pointer-coarse:text-[14px]\",\n lg: \"min-h-14 gap-3 px-4 py-3 pointer-fine:min-h-0\",\n },\n active: { true: \"\", false: \"\" },\n },\n compoundVariants: [\n { size: \"default\", active: true, className: \"bg-foreground/5 text-foreground\" },\n {\n size: \"default\",\n active: false,\n className: \"text-muted-foreground hover:bg-foreground/5 hover:text-foreground\",\n },\n { size: \"sm\", active: true, className: \"bg-foreground/6 font-medium text-foreground\" },\n {\n size: \"sm\",\n active: false,\n className: \"font-normal text-foreground/80 hover:bg-foreground/6 hover:text-foreground\",\n },\n { size: \"lg\", active: true, className: \"bg-foreground/[0.04]\" },\n {\n size: \"lg\",\n active: false,\n className: \"hover:bg-foreground/[0.04] active:bg-foreground/[0.04]\",\n },\n ],\n defaultVariants: { size: \"default\", active: false },\n }\n)\n\nconst ICON_CLASS = {\n default: \"size-4.5 pointer-coarse:size-5\",\n // Quieter than the label while idle, the row's own colour once active.\n sm: \"size-4 pointer-coarse:size-4.5 group-data-[active=false]/list-row:text-muted-foreground\",\n lg: \"size-5 text-muted-foreground\",\n} as const\n\ntype ListRowProps = Omit<React.ComponentProps<\"button\">, \"children\"> & {\n icon?: LucideIcon\n label: React.ReactNode\n /** One line under the label, so a list of sections is scannable. */\n description?: React.ReactNode\n /** Quiet text at the end of the row (a time, a size). */\n meta?: React.ReactNode\n /** A count at the end of the row, hidden when falsy (0 included). A string\n * or number gets the muted pill; pass an element (e.g. an amber `Badge`)\n * to draw it yourself. */\n badge?: React.ReactNode\n /** Anything else at the end of the row. Interactive content cannot live\n * inside a button: render the row as a `div` (`asChild`) to hold it. */\n trailing?: React.ReactNode\n /** A chevron at the end: the row drills into something. */\n chevron?: boolean\n isActive?: boolean\n /** A pulsing activity dot on the icon (e.g. running workloads). */\n activityPulse?: boolean\n size?: \"default\" | \"sm\" | \"lg\"\n /** Render as the single child element (a router link, an `<a>`, a `div`)\n * instead of a button. The row's content is placed inside it. */\n asChild?: boolean\n children?: React.ReactElement\n}\n\n/**\n * A single Work list entry: icon, label, optional description, and a\n * trailing count, meta text or chevron. A button by default; any link (or a\n * plain `div`) with `asChild`:\n *\n * <ListRow asChild icon={Zap} label=\"Skills & Tools\" isActive={active}>\n * <Link to=\"/work/skills\" />\n * </ListRow>\n */\nfunction ListRow({\n icon: Icon,\n label,\n description,\n meta,\n badge,\n trailing,\n chevron = false,\n isActive = false,\n activityPulse = false,\n size = \"default\",\n asChild = false,\n className,\n children,\n ...props\n}: ListRowProps) {\n const Comp = asChild ? Slot.Root : \"button\"\n const isSmall = size !== \"lg\"\n // In a collapsed sidebar rail the row is its icon alone, centred, and the\n // label it no longer shows names it.\n const { collapsed } = useSidebar()\n\n return (\n <Comp\n data-slot=\"list-row\"\n data-size={size}\n data-active={isActive}\n {...(asChild ? {} : { type: \"button\" as const })}\n aria-label={collapsed && typeof label === \"string\" ? label : undefined}\n className={cn(\n listRowVariants({ size, active: isActive }),\n !asChild && \"cursor-pointer bg-transparent\",\n collapsed && \"justify-center gap-0 px-0 pointer-coarse:px-0\",\n className\n )}\n {...props}\n >\n {asChild && <Slot.Slottable>{children}</Slot.Slottable>}\n {Icon && (\n <span className=\"relative flex shrink-0\">\n <Icon className={ICON_CLASS[size]} strokeWidth={1.75} />\n {activityPulse && (\n <span className=\"absolute -top-1 -right-1 flex size-2\">\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-green-500 opacity-75\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-green-500\" />\n </span>\n )}\n </span>\n )}\n {!collapsed && (\n <>\n {description ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(\n \"truncate\",\n size === \"lg\" && \"text-[15px] font-medium text-foreground\"\n )}\n >\n {label}\n </span>\n <span className=\"truncate text-[12px] font-normal text-muted-foreground\">\n {description}\n </span>\n </span>\n ) : (\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n size === \"lg\" && \"text-[15px] font-medium text-foreground\"\n )}\n >\n {label}\n </span>\n )}\n {meta && (\n <span className=\"shrink-0 text-[12px] font-normal text-muted-foreground\">\n {meta}\n </span>\n )}\n {/* Falsy hides it: an empty string or a zero count says nothing. A\n ternary, not &&, or a 0 would render as text. */}\n {!badge ? null : typeof badge === \"string\" || typeof badge === \"number\" ? (\n <span\n className={cn(\n \"shrink-0 rounded bg-foreground/10 px-1.5 py-px text-xs font-normal text-muted-foreground\",\n isSmall && \"pointer-coarse:rounded-md pointer-coarse:px-2 pointer-coarse:py-0.5 pointer-coarse:text-[13px]\"\n )}\n >\n {badge}\n </span>\n ) : (\n badge\n )}\n {trailing}\n {chevron && (\n <ChevronRight\n aria-hidden={true}\n className=\"size-4 shrink-0 text-muted-foreground/60\"\n strokeWidth={2}\n />\n )}\n </>\n )}\n </Comp>\n )\n}\n\n/**\n * The bordered list the `lg` rows sit in, with dividers inset past the icon\n * column. Pass the rows as children; each is wrapped in an `<li>`.\n */\nfunction ListGroup({\n className,\n children,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"list-group\"\n className={cn(\n \"overflow-hidden rounded-2xl border border-border bg-card\",\n className\n )}\n {...props}\n >\n {React.Children.toArray(children).map((child, index) => (\n <li key={React.isValidElement(child) && child.key != null ? child.key : index}>\n {index > 0 && (\n <div aria-hidden=\"true\" className=\"ml-[52px] h-px bg-foreground/[0.06]\" />\n )}\n {child}\n </li>\n ))}\n </ul>\n )\n}\n\nexport { ListRow, ListGroup, listRowVariants }\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
var RING_MASK = {
|
|
8
|
+
WebkitMask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
|
|
9
|
+
WebkitMaskComposite: "xor",
|
|
10
|
+
maskComposite: "exclude"
|
|
11
|
+
};
|
|
12
|
+
function PillTabs({
|
|
13
|
+
tabs,
|
|
14
|
+
activeId,
|
|
15
|
+
onSelect,
|
|
16
|
+
label = "Sections",
|
|
17
|
+
flush = false
|
|
18
|
+
}) {
|
|
19
|
+
const activeRef = react.useRef(null);
|
|
20
|
+
const [scrolled, setScrolled] = react.useState(false);
|
|
21
|
+
react.useEffect(() => {
|
|
22
|
+
activeRef.current?.scrollIntoView({
|
|
23
|
+
behavior: "smooth",
|
|
24
|
+
inline: "center",
|
|
25
|
+
block: "nearest"
|
|
26
|
+
});
|
|
27
|
+
}, [activeId]);
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "pill-tabs", className: "relative shrink-0 border-b border-line", children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
role: "tablist",
|
|
33
|
+
"aria-label": label,
|
|
34
|
+
onScroll: (e) => setScrolled(e.currentTarget.scrollLeft > 4),
|
|
35
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
36
|
+
"no-scrollbar flex snap-x snap-proximity gap-1.5 overflow-x-auto py-2 md:py-2.5",
|
|
37
|
+
!flush && "px-4 md:px-7"
|
|
38
|
+
),
|
|
39
|
+
children: tabs.map((tab) => {
|
|
40
|
+
const isActive = tab.id === activeId;
|
|
41
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
42
|
+
"button",
|
|
43
|
+
{
|
|
44
|
+
ref: isActive ? activeRef : void 0,
|
|
45
|
+
type: "button",
|
|
46
|
+
role: "tab",
|
|
47
|
+
"data-slot": "pill-tabs-tab",
|
|
48
|
+
"aria-selected": isActive,
|
|
49
|
+
"data-onboarding": tab.onboarding,
|
|
50
|
+
onClick: () => onSelect(tab.id),
|
|
51
|
+
className: chunk6YHDDRIM_cjs.cn(
|
|
52
|
+
"relative flex min-h-11 shrink-0 snap-center items-center whitespace-nowrap rounded-[10px] px-3.5 text-sm font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 pointer-fine:min-h-0 md:px-3 md:py-1.5",
|
|
53
|
+
isActive ? "bg-surface text-foreground" : "text-muted-foreground active:bg-surface/60 md:hover:bg-surface/60 md:hover:text-foreground"
|
|
54
|
+
),
|
|
55
|
+
children: [
|
|
56
|
+
isActive && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
58
|
+
"span",
|
|
59
|
+
{
|
|
60
|
+
"aria-hidden": "true",
|
|
61
|
+
className: "pointer-events-none absolute inset-0 rounded-[10px] blur-[2px]",
|
|
62
|
+
style: {
|
|
63
|
+
padding: "2px",
|
|
64
|
+
background: "linear-gradient(to top, rgba(245,158,11,0.75) 10%, rgba(245,158,11,0) 40%)",
|
|
65
|
+
...RING_MASK
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"span",
|
|
71
|
+
{
|
|
72
|
+
"aria-hidden": "true",
|
|
73
|
+
className: "pointer-events-none absolute inset-0 rounded-[10px]",
|
|
74
|
+
style: {
|
|
75
|
+
padding: "1px",
|
|
76
|
+
background: "linear-gradient(to top, rgba(245,158,11,1) 10%, rgba(245,158,11,0) 40%)",
|
|
77
|
+
...RING_MASK
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative", children: tab.label })
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
tab.id
|
|
86
|
+
);
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
scrolled && /* @__PURE__ */ jsxRuntime.jsx(
|
|
91
|
+
"div",
|
|
92
|
+
{
|
|
93
|
+
"aria-hidden": "true",
|
|
94
|
+
className: "pointer-events-none absolute inset-y-0 left-0 w-8 bg-gradient-to-r from-background to-transparent md:hidden"
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
98
|
+
"div",
|
|
99
|
+
{
|
|
100
|
+
"aria-hidden": "true",
|
|
101
|
+
className: "pointer-events-none absolute inset-y-0 right-0 w-8 bg-gradient-to-l from-background to-transparent md:hidden"
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
exports.PillTabs = PillTabs;
|
|
108
|
+
//# sourceMappingURL=pill-tabs.cjs.map
|
|
109
|
+
//# sourceMappingURL=pill-tabs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pill-tabs.tsx"],"names":["useRef","useState","useEffect","jsxs","jsx","cn","Fragment"],"mappings":"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","file":"pill-tabs.cjs","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\nimport { cn } from \"./lib/utils\";\nimport { type CSSProperties, useEffect, useRef, useState } from \"react\";\n\n// CSS mask that keeps only the border ring of a box: a gradient set as the\n// element's background then fills just the border (the interior is masked out).\n// Pair with a `padding` equal to the desired border thickness.\nconst RING_MASK: CSSProperties = {\n WebkitMask:\n \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n WebkitMaskComposite: \"xor\",\n maskComposite: \"exclude\",\n};\n\nexport interface PillTab<T extends string> {\n id: T;\n label: string;\n /** Getting-started spotlight anchor rendered as ``data-onboarding``. */\n onboarding?: string;\n}\n\n// The product's horizontal tab bar (Figma \"tabBar\"): the inner header on every\n// detail page that has sub-sections — agent Configure, models, training runs,\n// datasets, knowledge bases. Active tab gets a subtle surface fill, foreground\n// text and an amber border-glow; inactive tabs are muted.\n//\n// `tabs` draws the same pills over Radix Tabs (with panels); this one is a\n// bare strip for a page that swaps its own content by id.\n//\n// A dozen tabs never fit a phone, so the strip scrolls horizontally there. Two\n// things make that usable: the active tab scrolls itself into view (a\n// deep-linked `?tab=monetize` would otherwise land off-screen with nothing to\n// hint it exists), and a fade on the trailing edge advertises the overflow.\nexport function PillTabs<T extends string>({\n tabs,\n activeId,\n onSelect,\n label = \"Sections\",\n flush = false,\n}: {\n tabs: readonly PillTab<T>[];\n activeId: T;\n onSelect: (id: T) => void;\n /** Names the tablist for screen readers. */\n label?: string;\n /** Drop the horizontal padding.\n *\n * The default gutter is for a full-bleed page, where this strip spans the\n * viewport and supplies its own inset. Inside a container that already pads\n * — a detail view nested in a padded page — that gutter indents the tabs\n * relative to everything above and below them. */\n flush?: boolean;\n}) {\n const activeRef = useRef<HTMLButtonElement | null>(null);\n // Scrolled past the first tab: a matching fade on the leading edge says\n // there is more that way, instead of a word cut in half.\n const [scrolled, setScrolled] = useState(false);\n\n useEffect(() => {\n activeRef.current?.scrollIntoView({\n behavior: \"smooth\",\n inline: \"center\",\n block: \"nearest\",\n });\n }, [activeId]);\n\n return (\n <div data-slot=\"pill-tabs\" className=\"relative shrink-0 border-b border-line\">\n <div\n role=\"tablist\"\n aria-label={label}\n onScroll={(e) => setScrolled(e.currentTarget.scrollLeft > 4)}\n className={cn(\n \"no-scrollbar flex snap-x snap-proximity gap-1.5 overflow-x-auto py-2 md:py-2.5\",\n !flush && \"px-4 md:px-7\",\n )}\n >\n {tabs.map((tab) => {\n const isActive = tab.id === activeId;\n return (\n <button\n key={tab.id}\n ref={isActive ? activeRef : undefined}\n type=\"button\"\n role=\"tab\"\n data-slot=\"pill-tabs-tab\"\n aria-selected={isActive}\n data-onboarding={tab.onboarding}\n onClick={() => onSelect(tab.id)}\n className={cn(\n \"relative flex min-h-11 shrink-0 snap-center items-center whitespace-nowrap rounded-[10px] px-3.5 text-sm font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40 pointer-fine:min-h-0 md:px-3 md:py-1.5\",\n isActive\n ? \"bg-surface text-foreground\"\n : \"text-muted-foreground active:bg-surface/60 md:hover:bg-surface/60 md:hover:text-foreground\",\n )}\n >\n {/* Amber border-glow: bright along the bottom edge, fading upward\n along the rounded corners. The blurred copy adds the bloom. */}\n {isActive && (\n <>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 rounded-[10px] blur-[2px]\"\n style={{\n padding: \"2px\",\n background:\n \"linear-gradient(to top, rgba(245,158,11,0.75) 10%, rgba(245,158,11,0) 40%)\",\n ...RING_MASK,\n }}\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 rounded-[10px]\"\n style={{\n padding: \"1px\",\n background:\n \"linear-gradient(to top, rgba(245,158,11,1) 10%, rgba(245,158,11,0) 40%)\",\n ...RING_MASK,\n }}\n />\n </>\n )}\n <span className=\"relative\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n {/* Overflow hints. Decorative and non-interactive, so taps still reach\n the tab underneath. */}\n {scrolled && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 left-0 w-8 bg-gradient-to-r from-background to-transparent md:hidden\"\n />\n )}\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 right-0 w-8 bg-gradient-to-l from-background to-transparent md:hidden\"\n />\n </div>\n );\n}\n"]}
|