@nurix/ui-component-library 1.1.4-stage.116 → 1.1.4-stage.117
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +121 -45
- package/dist/index.mjs +121 -45
- package/dist/styles.css +44 -10
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7306,13 +7306,14 @@ var INPUT_TOKENS = {
|
|
|
7306
7306
|
// border at rest. Focus reveals the brand border. No hover/pressed overlay.
|
|
7307
7307
|
fieldBgBorderless: "bg-transparent",
|
|
7308
7308
|
// Base border + focus-within treatment.
|
|
7309
|
-
//
|
|
7310
|
-
|
|
7309
|
+
// Inputs do NOT paint a fill on hover (matches Figma — the field reads as
|
|
7310
|
+
// a static surface; only focus changes the border colour).
|
|
7311
|
+
fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
|
|
7311
7312
|
// Borderless base — transparent resting border, brand border only on focus.
|
|
7312
7313
|
// No hover/pressed overlay (these cells sit inside a larger interactive row).
|
|
7313
7314
|
// Layout-shift safe: border width stays 1px across states (color-only swap).
|
|
7314
7315
|
fieldBaseBorderless: "border border-transparent focus-within:border-token-brand disabled:pointer-events-none [&>*]:relative [&>*]:z-10",
|
|
7315
|
-
fieldDisabled: "border-token-xlight
|
|
7316
|
+
fieldDisabled: "border-token-xlight",
|
|
7316
7317
|
fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
|
|
7317
7318
|
// Leading/trailing icon slots (Figma: 16px, text-fg-grey-secondary)
|
|
7318
7319
|
slotIcon: "shrink-0 size-4 [&>svg]:size-4 text-fg-grey-secondary",
|
|
@@ -8072,14 +8073,25 @@ var NAVIGATION_TOKENS = {
|
|
|
8072
8073
|
// Shared base — focus ring uses design system pattern.
|
|
8073
8074
|
base: "inline-flex items-center cursor-pointer transition-colors focus-visible:outline-2 focus-visible:outline outline-token-brand focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
8074
8075
|
// ----- Page Top Tab -----
|
|
8075
|
-
// Figma 5229:66149 — px-12 py-8, rounded-12, 1.5px
|
|
8076
|
-
//
|
|
8076
|
+
// Figma 5229:66149 — px-12 py-8, rounded-12 (all corners), 1.5px
|
|
8077
|
+
// underline rendered just outside the rounded pill. Same padding
|
|
8078
|
+
// across states to prevent layout shift on selection. The pill itself
|
|
8079
|
+
// does NOT visually merge with the underline; the underline sits
|
|
8080
|
+
// below the pill as a separate horizontal bar that is brand-coloured
|
|
8081
|
+
// for selected, 5% black on hover-unselected, and transparent at rest.
|
|
8077
8082
|
topBase: "justify-center gap-2 px-3 py-2 rounded-xl relative",
|
|
8078
8083
|
topBaseSelected: "justify-center gap-2 px-3 py-2 rounded-xl relative",
|
|
8079
8084
|
topLabelSelected: "text-base font-semibold leading-6 text-fg-brand shrink-0",
|
|
8080
8085
|
topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary shrink-0",
|
|
8081
|
-
// 1.5px
|
|
8082
|
-
|
|
8086
|
+
// 1.5px underline anchored ~6px BELOW the rounded pill (Figma 5229:66149
|
|
8087
|
+
// places the bar at `top-[46px]` for a 40px pill — a 6px breathing gap
|
|
8088
|
+
// between pill bottom and bar). Coloured per state via the *Selected /
|
|
8089
|
+
// *Hover / *Default modifiers.
|
|
8090
|
+
topHighlight: "pointer-events-none absolute -bottom-1.5 left-0 right-0 h-[1.5px] rounded-sm transition-colors",
|
|
8091
|
+
topHighlightSelected: "bg-token-brand-primary",
|
|
8092
|
+
// Faint 5% black bar on hover of unselected — matches Figma 5229:66155.
|
|
8093
|
+
topHighlightHover: "bg-transparent group-hover/tab:bg-interaction-hov-opacity-primary",
|
|
8094
|
+
topHighlightDefault: "bg-transparent",
|
|
8083
8095
|
// Interaction layers specific to top tab.
|
|
8084
8096
|
topHoverUnselected: "hover:bg-interaction-hov-solid-primary",
|
|
8085
8097
|
topHoverSelected: "hover:bg-interaction-hov-solid-primary",
|
|
@@ -8269,6 +8281,7 @@ var TabsTrigger = React12.forwardRef(
|
|
|
8269
8281
|
selected ? selectedClass : NAVIGATION_TOKENS.tab.unselected,
|
|
8270
8282
|
hoverClass,
|
|
8271
8283
|
pressedClass,
|
|
8284
|
+
v2 === "top" && "group/tab",
|
|
8272
8285
|
className
|
|
8273
8286
|
),
|
|
8274
8287
|
disabled,
|
|
@@ -8279,7 +8292,16 @@ var TabsTrigger = React12.forwardRef(
|
|
|
8279
8292
|
children: [
|
|
8280
8293
|
iconLeft ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: cn(NAVIGATION_TOKENS.tab.iconWrap, iconColor), children: iconLeft }) : null,
|
|
8281
8294
|
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: cn(NAVIGATION_TOKENS.tab.labelBase, labelClass), children }),
|
|
8282
|
-
v2 === "top" &&
|
|
8295
|
+
v2 === "top" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
8296
|
+
"span",
|
|
8297
|
+
{
|
|
8298
|
+
className: cn(
|
|
8299
|
+
NAVIGATION_TOKENS.tab.topHighlight,
|
|
8300
|
+
selected ? NAVIGATION_TOKENS.tab.topHighlightSelected : NAVIGATION_TOKENS.tab.topHighlightHover
|
|
8301
|
+
),
|
|
8302
|
+
"aria-hidden": "true"
|
|
8303
|
+
}
|
|
8304
|
+
)
|
|
8283
8305
|
]
|
|
8284
8306
|
}
|
|
8285
8307
|
);
|
|
@@ -10709,9 +10731,9 @@ var TOAST_TOKENS = {
|
|
|
10709
10731
|
// Inner content row — Figma: px-16 py-12, gap-12, items-center, full width
|
|
10710
10732
|
innerRow: "flex gap-3 items-center px-4 py-3 w-full",
|
|
10711
10733
|
icon: {
|
|
10712
|
-
success: "text-fg-success shrink-0
|
|
10713
|
-
error: "text-fg-destructive shrink-0
|
|
10714
|
-
default: "text-fg-black shrink-0
|
|
10734
|
+
success: "text-fg-success shrink-0 size-4",
|
|
10735
|
+
error: "text-fg-destructive shrink-0 size-4",
|
|
10736
|
+
default: "text-fg-black shrink-0 size-4"
|
|
10715
10737
|
},
|
|
10716
10738
|
// Title + subtext column — Figma: flex-1, flex-col, gap-0
|
|
10717
10739
|
content: "flex flex-col flex-1 min-w-0",
|
|
@@ -11446,7 +11468,24 @@ var TABLE_TOKENS = {
|
|
|
11446
11468
|
* element itself and stays visible through the scroll.
|
|
11447
11469
|
* A second outer shadow extends to the right so users can tell the column
|
|
11448
11470
|
* is pinned even when the bordering unpinned column is visually similar. */
|
|
11449
|
-
|
|
11471
|
+
// Pinned-column right edge — Figma 5087:54840.
|
|
11472
|
+
// • `inset` shadow draws a 1px hairline at the cell's right edge.
|
|
11473
|
+
// • `before:` pseudo paints the elevation gradient INSIDE the cell at
|
|
11474
|
+
// its right edge. CSS `border-collapse: collapse` plus the cell's
|
|
11475
|
+
// own `overflow-hidden` (needed for text truncation) blocks an
|
|
11476
|
+
// outer drop-shadow from rendering, so we simulate the shadow with
|
|
11477
|
+
// an absolutely-positioned gradient that fades from transparent to
|
|
11478
|
+
// ~10% black across the last 8px of the cell. The pinned column
|
|
11479
|
+
// reads as elevated above the scrolling content beside it without
|
|
11480
|
+
// us having to drop overflow-hidden everywhere.
|
|
11481
|
+
// Pinned-column right edge — Figma 5087:54840.
|
|
11482
|
+
// • Inset 1px hairline (border-light) so the column always has a clear
|
|
11483
|
+
// boundary line.
|
|
11484
|
+
// • Outer drop-shadow extending right INTO the unpinned area below it.
|
|
11485
|
+
// Using strong x-offset / -spread so the shadow only paints to the
|
|
11486
|
+
// right (not on top/bottom). Sticky cell sits at z-20, unpinned cells
|
|
11487
|
+
// at z-0, so the shadow is always painted above the scrolling content.
|
|
11488
|
+
pinnedLastBorder: "shadow-[inset_-1px_0_0_0_hsl(var(--border-light)),12px_0_12px_-8px_rgba(0,0,0,0.18)]",
|
|
11450
11489
|
// ── Checkbox column — Figma: w-40, px-12 py-8
|
|
11451
11490
|
checkboxCell: "w-10 px-3 py-2",
|
|
11452
11491
|
// ── Actions column ──
|
|
@@ -12038,8 +12077,10 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12038
12077
|
// Disabled
|
|
12039
12078
|
disabled: "disabled:opacity-50 disabled:pointer-events-none"
|
|
12040
12079
|
},
|
|
12041
|
-
// Left icon — Figma: icon/black, 16px
|
|
12042
|
-
|
|
12080
|
+
// Left icon — Figma: icon/black, 16px. Force `stroke-width: 1.5` on inner
|
|
12081
|
+
// SVG so lucide icons (which default to 2) read at the same visual weight
|
|
12082
|
+
// as the lighter HugeiconsIcon strokes used elsewhere in the bar.
|
|
12083
|
+
icon: "shrink-0 size-4 text-fg-black [&]:[stroke-width:1.5]",
|
|
12043
12084
|
// Label — Label/sm: Nunito medium 12/16 black.
|
|
12044
12085
|
// The "Without Label" variant (used as right pill inside CompoundFilterSelect — Figma
|
|
12045
12086
|
// 5427:32334) shows the selected value as the label itself in text/brand, Subtext/xs
|
|
@@ -12067,7 +12108,7 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12067
12108
|
// Symmetric 4px padding on all sides — prevents the extra whitespace
|
|
12068
12109
|
// below the last list item / footer that used to come from `pb-2`.
|
|
12069
12110
|
"p-1 rounded-[16px] shadow-sm",
|
|
12070
|
-
"min-w-[196px] font-sans",
|
|
12111
|
+
"min-w-[196px] min-h-[144px] font-sans",
|
|
12071
12112
|
"outline-none"
|
|
12072
12113
|
].join(" "),
|
|
12073
12114
|
// Date dropdown — tight 4px padding on all sides so the calendar / presets
|
|
@@ -12271,8 +12312,10 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12271
12312
|
"w-full resize-none",
|
|
12272
12313
|
"min-h-[114px] px-2 py-1",
|
|
12273
12314
|
"rounded-[12px] bg-token-white",
|
|
12274
|
-
//
|
|
12275
|
-
|
|
12315
|
+
// Reserve 1px border so focus state doesn't shift layout. The brand
|
|
12316
|
+
// colour only paints while the textarea actually has focus.
|
|
12317
|
+
"border border-solid border-token-light",
|
|
12318
|
+
"focus:border-token-brand",
|
|
12276
12319
|
"font-sans text-xs font-normal leading-4 text-fg-black",
|
|
12277
12320
|
"placeholder:text-fg-placeholder",
|
|
12278
12321
|
"outline-none transition-colors"
|
|
@@ -12289,10 +12332,11 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12289
12332
|
"focus-within:border-token-brand"
|
|
12290
12333
|
].join(" "),
|
|
12291
12334
|
// Compact variant — used by the duration filter so the dropdown doesn't
|
|
12292
|
-
// stretch edge-to-edge.
|
|
12335
|
+
// stretch edge-to-edge. Sized to roughly match a single field of the
|
|
12336
|
+
// range layout so single/range modes feel visually consistent.
|
|
12293
12337
|
wrapperCompact: [
|
|
12294
12338
|
"flex items-center gap-2",
|
|
12295
|
-
"w-
|
|
12339
|
+
"w-[88px] px-3 h-8 min-h-[32px]",
|
|
12296
12340
|
"rounded-[12px] bg-token-white",
|
|
12297
12341
|
"border border-solid border-token-light",
|
|
12298
12342
|
"transition-colors",
|
|
@@ -12947,8 +12991,9 @@ var CalendarMonthCaption = ({
|
|
|
12947
12991
|
onDateChange == null ? void 0 : onDateChange({ start: date == null ? void 0 : date.start, end: d });
|
|
12948
12992
|
}
|
|
12949
12993
|
};
|
|
12994
|
+
const phantomSlotClass = "size-8 shrink-0";
|
|
12950
12995
|
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between gap-1 w-full px-0 py-1", children: [
|
|
12951
|
-
isFirst
|
|
12996
|
+
isFirst ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
12952
12997
|
"button",
|
|
12953
12998
|
{
|
|
12954
12999
|
type: "button",
|
|
@@ -12958,8 +13003,8 @@ var CalendarMonthCaption = ({
|
|
|
12958
13003
|
disabled: !previousMonth,
|
|
12959
13004
|
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ChevronLeft, { className: "size-4" })
|
|
12960
13005
|
}
|
|
12961
|
-
),
|
|
12962
|
-
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-1 flex-1 justify-
|
|
13006
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: phantomSlotClass, "aria-hidden": "true" }),
|
|
13007
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-1 flex-1 justify-center", children: [
|
|
12963
13008
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
12964
13009
|
MonthSelectPill,
|
|
12965
13010
|
{
|
|
@@ -12991,7 +13036,7 @@ var CalendarMonthCaption = ({
|
|
|
12991
13036
|
}
|
|
12992
13037
|
)
|
|
12993
13038
|
] }),
|
|
12994
|
-
isLast
|
|
13039
|
+
isLast ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
12995
13040
|
"button",
|
|
12996
13041
|
{
|
|
12997
13042
|
type: "button",
|
|
@@ -13001,7 +13046,7 @@ var CalendarMonthCaption = ({
|
|
|
13001
13046
|
disabled: !nextMonth,
|
|
13002
13047
|
children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react16.ChevronRight, { className: "size-4" })
|
|
13003
13048
|
}
|
|
13004
|
-
)
|
|
13049
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: phantomSlotClass, "aria-hidden": "true" })
|
|
13005
13050
|
] });
|
|
13006
13051
|
};
|
|
13007
13052
|
var DEFAULT_DURATION_UNITS = [
|
|
@@ -13066,7 +13111,20 @@ var FilterSelect = React37.forwardRef(
|
|
|
13066
13111
|
const open = controlledOpen != null ? controlledOpen : internalOpen;
|
|
13067
13112
|
const [searchQuery, setSearchQuery] = React37.useState("");
|
|
13068
13113
|
const triggerRef = React37.useRef(null);
|
|
13114
|
+
const searchInputRef = React37.useRef(null);
|
|
13115
|
+
const numericInputRef = React37.useRef(null);
|
|
13116
|
+
const rangeMinInputRef = React37.useRef(null);
|
|
13069
13117
|
const [triggerWidth, setTriggerWidth] = React37.useState(null);
|
|
13118
|
+
const focusActiveBodyInput = React37.useCallback(() => {
|
|
13119
|
+
requestAnimationFrame(() => {
|
|
13120
|
+
var _a5, _b5;
|
|
13121
|
+
if (isRangeMode) {
|
|
13122
|
+
(_a5 = rangeMinInputRef.current) == null ? void 0 : _a5.focus();
|
|
13123
|
+
} else {
|
|
13124
|
+
(_b5 = numericInputRef.current) == null ? void 0 : _b5.focus();
|
|
13125
|
+
}
|
|
13126
|
+
});
|
|
13127
|
+
}, [isRangeMode]);
|
|
13070
13128
|
const [focusedMonth, setFocusedMonth] = React37.useState(
|
|
13071
13129
|
() => {
|
|
13072
13130
|
var _a5;
|
|
@@ -13393,8 +13451,13 @@ var FilterSelect = React37.forwardRef(
|
|
|
13393
13451
|
setDraggedValue(null);
|
|
13394
13452
|
setDragOverValue(null);
|
|
13395
13453
|
}, []);
|
|
13396
|
-
const isCompactBody = type === "duration"
|
|
13397
|
-
const
|
|
13454
|
+
const isCompactBody = type === "duration";
|
|
13455
|
+
const supportsRangeOperand = type === "numeric_with_operands" && operands.some(
|
|
13456
|
+
(op) => op.value === "Is between" || op.label === "Is between" || /between/i.test(op.value) || /between/i.test(op.label)
|
|
13457
|
+
);
|
|
13458
|
+
const numericWithOperandsWidth = 224;
|
|
13459
|
+
const bodyMinWidth = supportsRangeOperand ? Math.max(numericWithOperandsWidth, triggerWidth != null ? triggerWidth : 0) : isCompactBody ? Math.max(160, triggerWidth != null ? triggerWidth : 0) : Math.max(196, triggerWidth != null ? triggerWidth : 0);
|
|
13460
|
+
const bodyMaxWidth = supportsRangeOperand ? Math.max(numericWithOperandsWidth, triggerWidth != null ? triggerWidth : 0) : void 0;
|
|
13398
13461
|
const renderFooterClear = (onClick, labelText, ariaLabel) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: FILTER_SELECT_TOKENS.footer.wrapper, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
13399
13462
|
"button",
|
|
13400
13463
|
{
|
|
@@ -13521,7 +13584,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13521
13584
|
maxHeight: type === "date" ? void 0 : dropdownMaxHeight,
|
|
13522
13585
|
minHeight: loading ? dropdownMaxHeight : void 0,
|
|
13523
13586
|
minWidth: bodyMinWidth,
|
|
13524
|
-
maxWidth:
|
|
13587
|
+
maxWidth: bodyMaxWidth
|
|
13525
13588
|
},
|
|
13526
13589
|
side: "bottom",
|
|
13527
13590
|
align: "start",
|
|
@@ -13551,7 +13614,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13551
13614
|
autoFocus: true
|
|
13552
13615
|
}
|
|
13553
13616
|
) }),
|
|
13554
|
-
|
|
13617
|
+
showClearBtn && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} text`)
|
|
13555
13618
|
] }) : type === "text_with_operands" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
|
|
13556
13619
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "p-1 flex flex-col gap-2", children: [
|
|
13557
13620
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
@@ -13576,7 +13639,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13576
13639
|
}
|
|
13577
13640
|
)
|
|
13578
13641
|
] }),
|
|
13579
|
-
|
|
13642
|
+
showClearBtn && renderFooterClear(
|
|
13580
13643
|
handleTextClear,
|
|
13581
13644
|
footerActionLabel,
|
|
13582
13645
|
`${footerActionLabel} filter`
|
|
@@ -13596,25 +13659,29 @@ var FilterSelect = React37.forwardRef(
|
|
|
13596
13659
|
),
|
|
13597
13660
|
unitLabel && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13598
13661
|
] }) }),
|
|
13599
|
-
|
|
13662
|
+
showClearBtn && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} number`)
|
|
13600
13663
|
] }) : type === "numeric_with_operands" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
|
|
13601
13664
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "p-1 flex flex-col gap-2", children: [
|
|
13602
13665
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13603
13666
|
OperandDropdown,
|
|
13604
13667
|
{
|
|
13605
13668
|
value: operand != null ? operand : "",
|
|
13606
|
-
onChange: (v2) =>
|
|
13669
|
+
onChange: (v2) => {
|
|
13670
|
+
onOperandChange == null ? void 0 : onOperandChange(v2);
|
|
13671
|
+
focusActiveBodyInput();
|
|
13672
|
+
},
|
|
13607
13673
|
options: operands,
|
|
13608
13674
|
placeholder: operandPlaceholder,
|
|
13609
13675
|
container,
|
|
13610
13676
|
themeClass
|
|
13611
13677
|
}
|
|
13612
13678
|
),
|
|
13613
|
-
isRangeMode ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2
|
|
13614
|
-
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: FILTER_SELECT_TOKENS.bodyInput.
|
|
13679
|
+
isRangeMode ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
13680
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapperCompact, children: [
|
|
13615
13681
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13616
13682
|
"input",
|
|
13617
13683
|
{
|
|
13684
|
+
ref: rangeMinInputRef,
|
|
13618
13685
|
type: "text",
|
|
13619
13686
|
inputMode: "numeric",
|
|
13620
13687
|
pattern: "[0-9]*",
|
|
@@ -13638,7 +13705,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13638
13705
|
)
|
|
13639
13706
|
] }),
|
|
13640
13707
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: FILTER_SELECT_TOKENS.rangeDivider, children: "-" }),
|
|
13641
|
-
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: FILTER_SELECT_TOKENS.bodyInput.
|
|
13708
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapperCompact, children: [
|
|
13642
13709
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13643
13710
|
"input",
|
|
13644
13711
|
{
|
|
@@ -13668,6 +13735,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13668
13735
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13669
13736
|
"input",
|
|
13670
13737
|
{
|
|
13738
|
+
ref: numericInputRef,
|
|
13671
13739
|
type: "number",
|
|
13672
13740
|
value: text != null ? text : "",
|
|
13673
13741
|
onChange: (e) => onTextChange == null ? void 0 : onTextChange(e.target.value),
|
|
@@ -13679,7 +13747,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13679
13747
|
unitLabel && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13680
13748
|
] })
|
|
13681
13749
|
] }),
|
|
13682
|
-
|
|
13750
|
+
showClearBtn && renderFooterClear(
|
|
13683
13751
|
() => {
|
|
13684
13752
|
onTextChange == null ? void 0 : onTextChange("");
|
|
13685
13753
|
onOperandChange == null ? void 0 : onOperandChange("");
|
|
@@ -13735,7 +13803,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13735
13803
|
unitLabel && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13736
13804
|
] })
|
|
13737
13805
|
] }) }),
|
|
13738
|
-
|
|
13806
|
+
showClearBtn && renderFooterClear(
|
|
13739
13807
|
() => {
|
|
13740
13808
|
onRangeMinChange == null ? void 0 : onRangeMinChange("");
|
|
13741
13809
|
onRangeMaxChange == null ? void 0 : onRangeMaxChange("");
|
|
@@ -13769,7 +13837,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13769
13837
|
}
|
|
13770
13838
|
)
|
|
13771
13839
|
] }),
|
|
13772
|
-
|
|
13840
|
+
showClearBtn && renderFooterClear(
|
|
13773
13841
|
() => {
|
|
13774
13842
|
onTextChange == null ? void 0 : onTextChange("");
|
|
13775
13843
|
onDurationUnitChange == null ? void 0 : onDurationUnitChange("");
|
|
@@ -13812,7 +13880,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13812
13880
|
preset.value
|
|
13813
13881
|
);
|
|
13814
13882
|
}) }),
|
|
13815
|
-
|
|
13883
|
+
showClearBtn && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13816
13884
|
"div",
|
|
13817
13885
|
{
|
|
13818
13886
|
className: FILTER_SELECT_TOKENS.datePresetSidebarAction.wrapper,
|
|
@@ -13895,7 +13963,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13895
13963
|
// inside our custom MonthCaption on the outer edges.
|
|
13896
13964
|
Nav: () => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_jsx_runtime33.Fragment, {})
|
|
13897
13965
|
},
|
|
13898
|
-
className: "p-0 font-sans [&_.rdp-day_button]:rounded-[8px]"
|
|
13966
|
+
className: "p-0 font-sans [&_.rdp-day_button]:rounded-[8px] [&_.rdp-months]:gap-3"
|
|
13899
13967
|
}
|
|
13900
13968
|
)
|
|
13901
13969
|
}
|
|
@@ -13903,7 +13971,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13903
13971
|
]
|
|
13904
13972
|
}
|
|
13905
13973
|
),
|
|
13906
|
-
datePresets === false &&
|
|
13974
|
+
datePresets === false && showClearBtn && renderFooterClear(
|
|
13907
13975
|
handleDateClear,
|
|
13908
13976
|
footerActionLabel,
|
|
13909
13977
|
`${footerActionLabel} date range`
|
|
@@ -13918,11 +13986,13 @@ var FilterSelect = React37.forwardRef(
|
|
|
13918
13986
|
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
13919
13987
|
"input",
|
|
13920
13988
|
{
|
|
13989
|
+
ref: searchInputRef,
|
|
13921
13990
|
type: "text",
|
|
13922
13991
|
value: searchQuery,
|
|
13923
13992
|
onChange: (e) => setSearchQuery(e.target.value),
|
|
13924
13993
|
placeholder: searchPlaceholder || "Search...",
|
|
13925
13994
|
"aria-label": "Search options",
|
|
13995
|
+
autoFocus: true,
|
|
13926
13996
|
className: FILTER_SELECT_TOKENS.searchBar.input
|
|
13927
13997
|
}
|
|
13928
13998
|
),
|
|
@@ -13999,7 +14069,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13999
14069
|
String(item.value)
|
|
14000
14070
|
);
|
|
14001
14071
|
}) }),
|
|
14002
|
-
showClearBtn &&
|
|
14072
|
+
showClearBtn && renderFooterClear(
|
|
14003
14073
|
handleClearAll,
|
|
14004
14074
|
footerActionLabel,
|
|
14005
14075
|
`${footerActionLabel} all selected items`
|
|
@@ -14156,8 +14226,12 @@ function CompoundFilterSelect({
|
|
|
14156
14226
|
// Force children's rounded corners to be right-only and remove left border to overlap
|
|
14157
14227
|
"[&>*]:!rounded-none [&>*]:!rounded-r-[16px]",
|
|
14158
14228
|
"[&_button[data-state]]:!rounded-none [&_button[data-state]]:!rounded-r-[16px]",
|
|
14159
|
-
// Paint the FilterSelect label in brand blue
|
|
14160
|
-
|
|
14229
|
+
// Paint the FilterSelect label in brand blue when it carries a value
|
|
14230
|
+
// (Figma 5427:32334). When the right pill is empty / showing a
|
|
14231
|
+
// placeholder, render the label in placeholder grey instead so it
|
|
14232
|
+
// reads as a hint rather than a real selection.
|
|
14233
|
+
"[&_button[data-has-value]_[data-filter-label]]:!text-fg-brand",
|
|
14234
|
+
"[&_button:not([data-has-value])_[data-filter-label]]:!text-fg-placeholder",
|
|
14161
14235
|
"[&_[data-filter-label]]:!font-normal",
|
|
14162
14236
|
// In a compound pill, the right-side label IS the value — there is no
|
|
14163
14237
|
// separate label/value split to divide. Hide the internal separator
|
|
@@ -15729,8 +15803,10 @@ var CHAT_BUBBLE_TOKENS = {
|
|
|
15729
15803
|
timestampRow: "flex items-center justify-end gap-2 pr-5"
|
|
15730
15804
|
},
|
|
15731
15805
|
user: {
|
|
15732
|
-
// Row: avatar first, then text (no bubble).
|
|
15733
|
-
|
|
15806
|
+
// Row: avatar first, then text (no bubble). `pr-5` mirrors the
|
|
15807
|
+
// 16px avatar + 4px gap on the left so message text doesn't run flush
|
|
15808
|
+
// to the container's right edge.
|
|
15809
|
+
row: "flex items-end gap-1 w-full pr-5",
|
|
15734
15810
|
// 16px grey circle holding the user icon.
|
|
15735
15811
|
avatar: "shrink-0 size-4 rounded-full bg-token-grey flex items-center justify-center text-fg-grey-secondary [&>svg]:size-3",
|
|
15736
15812
|
// Message text — per Figma: 14px regular, grey-secondary.
|
package/dist/index.mjs
CHANGED
|
@@ -7202,13 +7202,14 @@ var INPUT_TOKENS = {
|
|
|
7202
7202
|
// border at rest. Focus reveals the brand border. No hover/pressed overlay.
|
|
7203
7203
|
fieldBgBorderless: "bg-transparent",
|
|
7204
7204
|
// Base border + focus-within treatment.
|
|
7205
|
-
//
|
|
7206
|
-
|
|
7205
|
+
// Inputs do NOT paint a fill on hover (matches Figma — the field reads as
|
|
7206
|
+
// a static surface; only focus changes the border colour).
|
|
7207
|
+
fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
|
|
7207
7208
|
// Borderless base — transparent resting border, brand border only on focus.
|
|
7208
7209
|
// No hover/pressed overlay (these cells sit inside a larger interactive row).
|
|
7209
7210
|
// Layout-shift safe: border width stays 1px across states (color-only swap).
|
|
7210
7211
|
fieldBaseBorderless: "border border-transparent focus-within:border-token-brand disabled:pointer-events-none [&>*]:relative [&>*]:z-10",
|
|
7211
|
-
fieldDisabled: "border-token-xlight
|
|
7212
|
+
fieldDisabled: "border-token-xlight",
|
|
7212
7213
|
fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
|
|
7213
7214
|
// Leading/trailing icon slots (Figma: 16px, text-fg-grey-secondary)
|
|
7214
7215
|
slotIcon: "shrink-0 size-4 [&>svg]:size-4 text-fg-grey-secondary",
|
|
@@ -7968,14 +7969,25 @@ var NAVIGATION_TOKENS = {
|
|
|
7968
7969
|
// Shared base — focus ring uses design system pattern.
|
|
7969
7970
|
base: "inline-flex items-center cursor-pointer transition-colors focus-visible:outline-2 focus-visible:outline outline-token-brand focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
7970
7971
|
// ----- Page Top Tab -----
|
|
7971
|
-
// Figma 5229:66149 — px-12 py-8, rounded-12, 1.5px
|
|
7972
|
-
//
|
|
7972
|
+
// Figma 5229:66149 — px-12 py-8, rounded-12 (all corners), 1.5px
|
|
7973
|
+
// underline rendered just outside the rounded pill. Same padding
|
|
7974
|
+
// across states to prevent layout shift on selection. The pill itself
|
|
7975
|
+
// does NOT visually merge with the underline; the underline sits
|
|
7976
|
+
// below the pill as a separate horizontal bar that is brand-coloured
|
|
7977
|
+
// for selected, 5% black on hover-unselected, and transparent at rest.
|
|
7973
7978
|
topBase: "justify-center gap-2 px-3 py-2 rounded-xl relative",
|
|
7974
7979
|
topBaseSelected: "justify-center gap-2 px-3 py-2 rounded-xl relative",
|
|
7975
7980
|
topLabelSelected: "text-base font-semibold leading-6 text-fg-brand shrink-0",
|
|
7976
7981
|
topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary shrink-0",
|
|
7977
|
-
// 1.5px
|
|
7978
|
-
|
|
7982
|
+
// 1.5px underline anchored ~6px BELOW the rounded pill (Figma 5229:66149
|
|
7983
|
+
// places the bar at `top-[46px]` for a 40px pill — a 6px breathing gap
|
|
7984
|
+
// between pill bottom and bar). Coloured per state via the *Selected /
|
|
7985
|
+
// *Hover / *Default modifiers.
|
|
7986
|
+
topHighlight: "pointer-events-none absolute -bottom-1.5 left-0 right-0 h-[1.5px] rounded-sm transition-colors",
|
|
7987
|
+
topHighlightSelected: "bg-token-brand-primary",
|
|
7988
|
+
// Faint 5% black bar on hover of unselected — matches Figma 5229:66155.
|
|
7989
|
+
topHighlightHover: "bg-transparent group-hover/tab:bg-interaction-hov-opacity-primary",
|
|
7990
|
+
topHighlightDefault: "bg-transparent",
|
|
7979
7991
|
// Interaction layers specific to top tab.
|
|
7980
7992
|
topHoverUnselected: "hover:bg-interaction-hov-solid-primary",
|
|
7981
7993
|
topHoverSelected: "hover:bg-interaction-hov-solid-primary",
|
|
@@ -8165,6 +8177,7 @@ var TabsTrigger = React12.forwardRef(
|
|
|
8165
8177
|
selected ? selectedClass : NAVIGATION_TOKENS.tab.unselected,
|
|
8166
8178
|
hoverClass,
|
|
8167
8179
|
pressedClass,
|
|
8180
|
+
v2 === "top" && "group/tab",
|
|
8168
8181
|
className
|
|
8169
8182
|
),
|
|
8170
8183
|
disabled,
|
|
@@ -8175,7 +8188,16 @@ var TabsTrigger = React12.forwardRef(
|
|
|
8175
8188
|
children: [
|
|
8176
8189
|
iconLeft ? /* @__PURE__ */ jsx10("span", { className: cn(NAVIGATION_TOKENS.tab.iconWrap, iconColor), children: iconLeft }) : null,
|
|
8177
8190
|
/* @__PURE__ */ jsx10("span", { className: cn(NAVIGATION_TOKENS.tab.labelBase, labelClass), children }),
|
|
8178
|
-
v2 === "top" &&
|
|
8191
|
+
v2 === "top" && /* @__PURE__ */ jsx10(
|
|
8192
|
+
"span",
|
|
8193
|
+
{
|
|
8194
|
+
className: cn(
|
|
8195
|
+
NAVIGATION_TOKENS.tab.topHighlight,
|
|
8196
|
+
selected ? NAVIGATION_TOKENS.tab.topHighlightSelected : NAVIGATION_TOKENS.tab.topHighlightHover
|
|
8197
|
+
),
|
|
8198
|
+
"aria-hidden": "true"
|
|
8199
|
+
}
|
|
8200
|
+
)
|
|
8179
8201
|
]
|
|
8180
8202
|
}
|
|
8181
8203
|
);
|
|
@@ -10605,9 +10627,9 @@ var TOAST_TOKENS = {
|
|
|
10605
10627
|
// Inner content row — Figma: px-16 py-12, gap-12, items-center, full width
|
|
10606
10628
|
innerRow: "flex gap-3 items-center px-4 py-3 w-full",
|
|
10607
10629
|
icon: {
|
|
10608
|
-
success: "text-fg-success shrink-0
|
|
10609
|
-
error: "text-fg-destructive shrink-0
|
|
10610
|
-
default: "text-fg-black shrink-0
|
|
10630
|
+
success: "text-fg-success shrink-0 size-4",
|
|
10631
|
+
error: "text-fg-destructive shrink-0 size-4",
|
|
10632
|
+
default: "text-fg-black shrink-0 size-4"
|
|
10611
10633
|
},
|
|
10612
10634
|
// Title + subtext column — Figma: flex-1, flex-col, gap-0
|
|
10613
10635
|
content: "flex flex-col flex-1 min-w-0",
|
|
@@ -11350,7 +11372,24 @@ var TABLE_TOKENS = {
|
|
|
11350
11372
|
* element itself and stays visible through the scroll.
|
|
11351
11373
|
* A second outer shadow extends to the right so users can tell the column
|
|
11352
11374
|
* is pinned even when the bordering unpinned column is visually similar. */
|
|
11353
|
-
|
|
11375
|
+
// Pinned-column right edge — Figma 5087:54840.
|
|
11376
|
+
// • `inset` shadow draws a 1px hairline at the cell's right edge.
|
|
11377
|
+
// • `before:` pseudo paints the elevation gradient INSIDE the cell at
|
|
11378
|
+
// its right edge. CSS `border-collapse: collapse` plus the cell's
|
|
11379
|
+
// own `overflow-hidden` (needed for text truncation) blocks an
|
|
11380
|
+
// outer drop-shadow from rendering, so we simulate the shadow with
|
|
11381
|
+
// an absolutely-positioned gradient that fades from transparent to
|
|
11382
|
+
// ~10% black across the last 8px of the cell. The pinned column
|
|
11383
|
+
// reads as elevated above the scrolling content beside it without
|
|
11384
|
+
// us having to drop overflow-hidden everywhere.
|
|
11385
|
+
// Pinned-column right edge — Figma 5087:54840.
|
|
11386
|
+
// • Inset 1px hairline (border-light) so the column always has a clear
|
|
11387
|
+
// boundary line.
|
|
11388
|
+
// • Outer drop-shadow extending right INTO the unpinned area below it.
|
|
11389
|
+
// Using strong x-offset / -spread so the shadow only paints to the
|
|
11390
|
+
// right (not on top/bottom). Sticky cell sits at z-20, unpinned cells
|
|
11391
|
+
// at z-0, so the shadow is always painted above the scrolling content.
|
|
11392
|
+
pinnedLastBorder: "shadow-[inset_-1px_0_0_0_hsl(var(--border-light)),12px_0_12px_-8px_rgba(0,0,0,0.18)]",
|
|
11354
11393
|
// ── Checkbox column — Figma: w-40, px-12 py-8
|
|
11355
11394
|
checkboxCell: "w-10 px-3 py-2",
|
|
11356
11395
|
// ── Actions column ──
|
|
@@ -11950,8 +11989,10 @@ var FILTER_SELECT_TOKENS = {
|
|
|
11950
11989
|
// Disabled
|
|
11951
11990
|
disabled: "disabled:opacity-50 disabled:pointer-events-none"
|
|
11952
11991
|
},
|
|
11953
|
-
// Left icon — Figma: icon/black, 16px
|
|
11954
|
-
|
|
11992
|
+
// Left icon — Figma: icon/black, 16px. Force `stroke-width: 1.5` on inner
|
|
11993
|
+
// SVG so lucide icons (which default to 2) read at the same visual weight
|
|
11994
|
+
// as the lighter HugeiconsIcon strokes used elsewhere in the bar.
|
|
11995
|
+
icon: "shrink-0 size-4 text-fg-black [&]:[stroke-width:1.5]",
|
|
11955
11996
|
// Label — Label/sm: Nunito medium 12/16 black.
|
|
11956
11997
|
// The "Without Label" variant (used as right pill inside CompoundFilterSelect — Figma
|
|
11957
11998
|
// 5427:32334) shows the selected value as the label itself in text/brand, Subtext/xs
|
|
@@ -11979,7 +12020,7 @@ var FILTER_SELECT_TOKENS = {
|
|
|
11979
12020
|
// Symmetric 4px padding on all sides — prevents the extra whitespace
|
|
11980
12021
|
// below the last list item / footer that used to come from `pb-2`.
|
|
11981
12022
|
"p-1 rounded-[16px] shadow-sm",
|
|
11982
|
-
"min-w-[196px] font-sans",
|
|
12023
|
+
"min-w-[196px] min-h-[144px] font-sans",
|
|
11983
12024
|
"outline-none"
|
|
11984
12025
|
].join(" "),
|
|
11985
12026
|
// Date dropdown — tight 4px padding on all sides so the calendar / presets
|
|
@@ -12183,8 +12224,10 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12183
12224
|
"w-full resize-none",
|
|
12184
12225
|
"min-h-[114px] px-2 py-1",
|
|
12185
12226
|
"rounded-[12px] bg-token-white",
|
|
12186
|
-
//
|
|
12187
|
-
|
|
12227
|
+
// Reserve 1px border so focus state doesn't shift layout. The brand
|
|
12228
|
+
// colour only paints while the textarea actually has focus.
|
|
12229
|
+
"border border-solid border-token-light",
|
|
12230
|
+
"focus:border-token-brand",
|
|
12188
12231
|
"font-sans text-xs font-normal leading-4 text-fg-black",
|
|
12189
12232
|
"placeholder:text-fg-placeholder",
|
|
12190
12233
|
"outline-none transition-colors"
|
|
@@ -12201,10 +12244,11 @@ var FILTER_SELECT_TOKENS = {
|
|
|
12201
12244
|
"focus-within:border-token-brand"
|
|
12202
12245
|
].join(" "),
|
|
12203
12246
|
// Compact variant — used by the duration filter so the dropdown doesn't
|
|
12204
|
-
// stretch edge-to-edge.
|
|
12247
|
+
// stretch edge-to-edge. Sized to roughly match a single field of the
|
|
12248
|
+
// range layout so single/range modes feel visually consistent.
|
|
12205
12249
|
wrapperCompact: [
|
|
12206
12250
|
"flex items-center gap-2",
|
|
12207
|
-
"w-
|
|
12251
|
+
"w-[88px] px-3 h-8 min-h-[32px]",
|
|
12208
12252
|
"rounded-[12px] bg-token-white",
|
|
12209
12253
|
"border border-solid border-token-light",
|
|
12210
12254
|
"transition-colors",
|
|
@@ -12859,8 +12903,9 @@ var CalendarMonthCaption = ({
|
|
|
12859
12903
|
onDateChange == null ? void 0 : onDateChange({ start: date == null ? void 0 : date.start, end: d });
|
|
12860
12904
|
}
|
|
12861
12905
|
};
|
|
12906
|
+
const phantomSlotClass = "size-8 shrink-0";
|
|
12862
12907
|
return /* @__PURE__ */ jsxs23("div", { className: "flex items-center justify-between gap-1 w-full px-0 py-1", children: [
|
|
12863
|
-
isFirst
|
|
12908
|
+
isFirst ? /* @__PURE__ */ jsx33(
|
|
12864
12909
|
"button",
|
|
12865
12910
|
{
|
|
12866
12911
|
type: "button",
|
|
@@ -12870,8 +12915,8 @@ var CalendarMonthCaption = ({
|
|
|
12870
12915
|
disabled: !previousMonth,
|
|
12871
12916
|
children: /* @__PURE__ */ jsx33(ChevronLeft2, { className: "size-4" })
|
|
12872
12917
|
}
|
|
12873
|
-
),
|
|
12874
|
-
/* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-1 flex-1 justify-
|
|
12918
|
+
) : /* @__PURE__ */ jsx33("span", { className: phantomSlotClass, "aria-hidden": "true" }),
|
|
12919
|
+
/* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-1 flex-1 justify-center", children: [
|
|
12875
12920
|
/* @__PURE__ */ jsx33(
|
|
12876
12921
|
MonthSelectPill,
|
|
12877
12922
|
{
|
|
@@ -12903,7 +12948,7 @@ var CalendarMonthCaption = ({
|
|
|
12903
12948
|
}
|
|
12904
12949
|
)
|
|
12905
12950
|
] }),
|
|
12906
|
-
isLast
|
|
12951
|
+
isLast ? /* @__PURE__ */ jsx33(
|
|
12907
12952
|
"button",
|
|
12908
12953
|
{
|
|
12909
12954
|
type: "button",
|
|
@@ -12913,7 +12958,7 @@ var CalendarMonthCaption = ({
|
|
|
12913
12958
|
disabled: !nextMonth,
|
|
12914
12959
|
children: /* @__PURE__ */ jsx33(ChevronRight3, { className: "size-4" })
|
|
12915
12960
|
}
|
|
12916
|
-
)
|
|
12961
|
+
) : /* @__PURE__ */ jsx33("span", { className: phantomSlotClass, "aria-hidden": "true" })
|
|
12917
12962
|
] });
|
|
12918
12963
|
};
|
|
12919
12964
|
var DEFAULT_DURATION_UNITS = [
|
|
@@ -12978,7 +13023,20 @@ var FilterSelect = React37.forwardRef(
|
|
|
12978
13023
|
const open = controlledOpen != null ? controlledOpen : internalOpen;
|
|
12979
13024
|
const [searchQuery, setSearchQuery] = React37.useState("");
|
|
12980
13025
|
const triggerRef = React37.useRef(null);
|
|
13026
|
+
const searchInputRef = React37.useRef(null);
|
|
13027
|
+
const numericInputRef = React37.useRef(null);
|
|
13028
|
+
const rangeMinInputRef = React37.useRef(null);
|
|
12981
13029
|
const [triggerWidth, setTriggerWidth] = React37.useState(null);
|
|
13030
|
+
const focusActiveBodyInput = React37.useCallback(() => {
|
|
13031
|
+
requestAnimationFrame(() => {
|
|
13032
|
+
var _a5, _b5;
|
|
13033
|
+
if (isRangeMode) {
|
|
13034
|
+
(_a5 = rangeMinInputRef.current) == null ? void 0 : _a5.focus();
|
|
13035
|
+
} else {
|
|
13036
|
+
(_b5 = numericInputRef.current) == null ? void 0 : _b5.focus();
|
|
13037
|
+
}
|
|
13038
|
+
});
|
|
13039
|
+
}, [isRangeMode]);
|
|
12982
13040
|
const [focusedMonth, setFocusedMonth] = React37.useState(
|
|
12983
13041
|
() => {
|
|
12984
13042
|
var _a5;
|
|
@@ -13305,8 +13363,13 @@ var FilterSelect = React37.forwardRef(
|
|
|
13305
13363
|
setDraggedValue(null);
|
|
13306
13364
|
setDragOverValue(null);
|
|
13307
13365
|
}, []);
|
|
13308
|
-
const isCompactBody = type === "duration"
|
|
13309
|
-
const
|
|
13366
|
+
const isCompactBody = type === "duration";
|
|
13367
|
+
const supportsRangeOperand = type === "numeric_with_operands" && operands.some(
|
|
13368
|
+
(op) => op.value === "Is between" || op.label === "Is between" || /between/i.test(op.value) || /between/i.test(op.label)
|
|
13369
|
+
);
|
|
13370
|
+
const numericWithOperandsWidth = 224;
|
|
13371
|
+
const bodyMinWidth = supportsRangeOperand ? Math.max(numericWithOperandsWidth, triggerWidth != null ? triggerWidth : 0) : isCompactBody ? Math.max(160, triggerWidth != null ? triggerWidth : 0) : Math.max(196, triggerWidth != null ? triggerWidth : 0);
|
|
13372
|
+
const bodyMaxWidth = supportsRangeOperand ? Math.max(numericWithOperandsWidth, triggerWidth != null ? triggerWidth : 0) : void 0;
|
|
13310
13373
|
const renderFooterClear = (onClick, labelText, ariaLabel) => /* @__PURE__ */ jsx33("div", { className: FILTER_SELECT_TOKENS.footer.wrapper, children: /* @__PURE__ */ jsxs23(
|
|
13311
13374
|
"button",
|
|
13312
13375
|
{
|
|
@@ -13433,7 +13496,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13433
13496
|
maxHeight: type === "date" ? void 0 : dropdownMaxHeight,
|
|
13434
13497
|
minHeight: loading ? dropdownMaxHeight : void 0,
|
|
13435
13498
|
minWidth: bodyMinWidth,
|
|
13436
|
-
maxWidth:
|
|
13499
|
+
maxWidth: bodyMaxWidth
|
|
13437
13500
|
},
|
|
13438
13501
|
side: "bottom",
|
|
13439
13502
|
align: "start",
|
|
@@ -13463,7 +13526,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13463
13526
|
autoFocus: true
|
|
13464
13527
|
}
|
|
13465
13528
|
) }),
|
|
13466
|
-
|
|
13529
|
+
showClearBtn && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} text`)
|
|
13467
13530
|
] }) : type === "text_with_operands" ? /* @__PURE__ */ jsxs23(Fragment11, { children: [
|
|
13468
13531
|
/* @__PURE__ */ jsxs23("div", { className: "p-1 flex flex-col gap-2", children: [
|
|
13469
13532
|
/* @__PURE__ */ jsx33(
|
|
@@ -13488,7 +13551,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13488
13551
|
}
|
|
13489
13552
|
)
|
|
13490
13553
|
] }),
|
|
13491
|
-
|
|
13554
|
+
showClearBtn && renderFooterClear(
|
|
13492
13555
|
handleTextClear,
|
|
13493
13556
|
footerActionLabel,
|
|
13494
13557
|
`${footerActionLabel} filter`
|
|
@@ -13508,25 +13571,29 @@ var FilterSelect = React37.forwardRef(
|
|
|
13508
13571
|
),
|
|
13509
13572
|
unitLabel && /* @__PURE__ */ jsx33("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13510
13573
|
] }) }),
|
|
13511
|
-
|
|
13574
|
+
showClearBtn && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} number`)
|
|
13512
13575
|
] }) : type === "numeric_with_operands" ? /* @__PURE__ */ jsxs23(Fragment11, { children: [
|
|
13513
13576
|
/* @__PURE__ */ jsxs23("div", { className: "p-1 flex flex-col gap-2", children: [
|
|
13514
13577
|
/* @__PURE__ */ jsx33(
|
|
13515
13578
|
OperandDropdown,
|
|
13516
13579
|
{
|
|
13517
13580
|
value: operand != null ? operand : "",
|
|
13518
|
-
onChange: (v2) =>
|
|
13581
|
+
onChange: (v2) => {
|
|
13582
|
+
onOperandChange == null ? void 0 : onOperandChange(v2);
|
|
13583
|
+
focusActiveBodyInput();
|
|
13584
|
+
},
|
|
13519
13585
|
options: operands,
|
|
13520
13586
|
placeholder: operandPlaceholder,
|
|
13521
13587
|
container,
|
|
13522
13588
|
themeClass
|
|
13523
13589
|
}
|
|
13524
13590
|
),
|
|
13525
|
-
isRangeMode ? /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2
|
|
13526
|
-
/* @__PURE__ */ jsxs23("div", { className: FILTER_SELECT_TOKENS.bodyInput.
|
|
13591
|
+
isRangeMode ? /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2", children: [
|
|
13592
|
+
/* @__PURE__ */ jsxs23("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapperCompact, children: [
|
|
13527
13593
|
/* @__PURE__ */ jsx33(
|
|
13528
13594
|
"input",
|
|
13529
13595
|
{
|
|
13596
|
+
ref: rangeMinInputRef,
|
|
13530
13597
|
type: "text",
|
|
13531
13598
|
inputMode: "numeric",
|
|
13532
13599
|
pattern: "[0-9]*",
|
|
@@ -13550,7 +13617,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13550
13617
|
)
|
|
13551
13618
|
] }),
|
|
13552
13619
|
/* @__PURE__ */ jsx33("span", { className: FILTER_SELECT_TOKENS.rangeDivider, children: "-" }),
|
|
13553
|
-
/* @__PURE__ */ jsxs23("div", { className: FILTER_SELECT_TOKENS.bodyInput.
|
|
13620
|
+
/* @__PURE__ */ jsxs23("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapperCompact, children: [
|
|
13554
13621
|
/* @__PURE__ */ jsx33(
|
|
13555
13622
|
"input",
|
|
13556
13623
|
{
|
|
@@ -13580,6 +13647,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13580
13647
|
/* @__PURE__ */ jsx33(
|
|
13581
13648
|
"input",
|
|
13582
13649
|
{
|
|
13650
|
+
ref: numericInputRef,
|
|
13583
13651
|
type: "number",
|
|
13584
13652
|
value: text != null ? text : "",
|
|
13585
13653
|
onChange: (e) => onTextChange == null ? void 0 : onTextChange(e.target.value),
|
|
@@ -13591,7 +13659,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13591
13659
|
unitLabel && /* @__PURE__ */ jsx33("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13592
13660
|
] })
|
|
13593
13661
|
] }),
|
|
13594
|
-
|
|
13662
|
+
showClearBtn && renderFooterClear(
|
|
13595
13663
|
() => {
|
|
13596
13664
|
onTextChange == null ? void 0 : onTextChange("");
|
|
13597
13665
|
onOperandChange == null ? void 0 : onOperandChange("");
|
|
@@ -13647,7 +13715,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13647
13715
|
unitLabel && /* @__PURE__ */ jsx33("span", { className: FILTER_SELECT_TOKENS.bodyInput.unit, children: unitLabel })
|
|
13648
13716
|
] })
|
|
13649
13717
|
] }) }),
|
|
13650
|
-
|
|
13718
|
+
showClearBtn && renderFooterClear(
|
|
13651
13719
|
() => {
|
|
13652
13720
|
onRangeMinChange == null ? void 0 : onRangeMinChange("");
|
|
13653
13721
|
onRangeMaxChange == null ? void 0 : onRangeMaxChange("");
|
|
@@ -13681,7 +13749,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13681
13749
|
}
|
|
13682
13750
|
)
|
|
13683
13751
|
] }),
|
|
13684
|
-
|
|
13752
|
+
showClearBtn && renderFooterClear(
|
|
13685
13753
|
() => {
|
|
13686
13754
|
onTextChange == null ? void 0 : onTextChange("");
|
|
13687
13755
|
onDurationUnitChange == null ? void 0 : onDurationUnitChange("");
|
|
@@ -13724,7 +13792,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13724
13792
|
preset.value
|
|
13725
13793
|
);
|
|
13726
13794
|
}) }),
|
|
13727
|
-
|
|
13795
|
+
showClearBtn && /* @__PURE__ */ jsx33(
|
|
13728
13796
|
"div",
|
|
13729
13797
|
{
|
|
13730
13798
|
className: FILTER_SELECT_TOKENS.datePresetSidebarAction.wrapper,
|
|
@@ -13807,7 +13875,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13807
13875
|
// inside our custom MonthCaption on the outer edges.
|
|
13808
13876
|
Nav: () => /* @__PURE__ */ jsx33(Fragment11, {})
|
|
13809
13877
|
},
|
|
13810
|
-
className: "p-0 font-sans [&_.rdp-day_button]:rounded-[8px]"
|
|
13878
|
+
className: "p-0 font-sans [&_.rdp-day_button]:rounded-[8px] [&_.rdp-months]:gap-3"
|
|
13811
13879
|
}
|
|
13812
13880
|
)
|
|
13813
13881
|
}
|
|
@@ -13815,7 +13883,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13815
13883
|
]
|
|
13816
13884
|
}
|
|
13817
13885
|
),
|
|
13818
|
-
datePresets === false &&
|
|
13886
|
+
datePresets === false && showClearBtn && renderFooterClear(
|
|
13819
13887
|
handleDateClear,
|
|
13820
13888
|
footerActionLabel,
|
|
13821
13889
|
`${footerActionLabel} date range`
|
|
@@ -13830,11 +13898,13 @@ var FilterSelect = React37.forwardRef(
|
|
|
13830
13898
|
/* @__PURE__ */ jsx33(
|
|
13831
13899
|
"input",
|
|
13832
13900
|
{
|
|
13901
|
+
ref: searchInputRef,
|
|
13833
13902
|
type: "text",
|
|
13834
13903
|
value: searchQuery,
|
|
13835
13904
|
onChange: (e) => setSearchQuery(e.target.value),
|
|
13836
13905
|
placeholder: searchPlaceholder || "Search...",
|
|
13837
13906
|
"aria-label": "Search options",
|
|
13907
|
+
autoFocus: true,
|
|
13838
13908
|
className: FILTER_SELECT_TOKENS.searchBar.input
|
|
13839
13909
|
}
|
|
13840
13910
|
),
|
|
@@ -13911,7 +13981,7 @@ var FilterSelect = React37.forwardRef(
|
|
|
13911
13981
|
String(item.value)
|
|
13912
13982
|
);
|
|
13913
13983
|
}) }),
|
|
13914
|
-
showClearBtn &&
|
|
13984
|
+
showClearBtn && renderFooterClear(
|
|
13915
13985
|
handleClearAll,
|
|
13916
13986
|
footerActionLabel,
|
|
13917
13987
|
`${footerActionLabel} all selected items`
|
|
@@ -14068,8 +14138,12 @@ function CompoundFilterSelect({
|
|
|
14068
14138
|
// Force children's rounded corners to be right-only and remove left border to overlap
|
|
14069
14139
|
"[&>*]:!rounded-none [&>*]:!rounded-r-[16px]",
|
|
14070
14140
|
"[&_button[data-state]]:!rounded-none [&_button[data-state]]:!rounded-r-[16px]",
|
|
14071
|
-
// Paint the FilterSelect label in brand blue
|
|
14072
|
-
|
|
14141
|
+
// Paint the FilterSelect label in brand blue when it carries a value
|
|
14142
|
+
// (Figma 5427:32334). When the right pill is empty / showing a
|
|
14143
|
+
// placeholder, render the label in placeholder grey instead so it
|
|
14144
|
+
// reads as a hint rather than a real selection.
|
|
14145
|
+
"[&_button[data-has-value]_[data-filter-label]]:!text-fg-brand",
|
|
14146
|
+
"[&_button:not([data-has-value])_[data-filter-label]]:!text-fg-placeholder",
|
|
14073
14147
|
"[&_[data-filter-label]]:!font-normal",
|
|
14074
14148
|
// In a compound pill, the right-side label IS the value — there is no
|
|
14075
14149
|
// separate label/value split to divide. Hide the internal separator
|
|
@@ -15641,8 +15715,10 @@ var CHAT_BUBBLE_TOKENS = {
|
|
|
15641
15715
|
timestampRow: "flex items-center justify-end gap-2 pr-5"
|
|
15642
15716
|
},
|
|
15643
15717
|
user: {
|
|
15644
|
-
// Row: avatar first, then text (no bubble).
|
|
15645
|
-
|
|
15718
|
+
// Row: avatar first, then text (no bubble). `pr-5` mirrors the
|
|
15719
|
+
// 16px avatar + 4px gap on the left so message text doesn't run flush
|
|
15720
|
+
// to the container's right edge.
|
|
15721
|
+
row: "flex items-end gap-1 w-full pr-5",
|
|
15646
15722
|
// 16px grey circle holding the user icon.
|
|
15647
15723
|
avatar: "shrink-0 size-4 rounded-full bg-token-grey flex items-center justify-center text-fg-grey-secondary [&>svg]:size-3",
|
|
15648
15724
|
// Message text — per Figma: 14px regular, grey-secondary.
|
package/dist/styles.css
CHANGED
|
@@ -265,12 +265,18 @@
|
|
|
265
265
|
.lego-land .top-2 {
|
|
266
266
|
top: calc(var(--spacing) * 2);
|
|
267
267
|
}
|
|
268
|
+
.lego-land .top-\[46px\] {
|
|
269
|
+
top: 46px;
|
|
270
|
+
}
|
|
268
271
|
.lego-land .top-px {
|
|
269
272
|
top: 1px;
|
|
270
273
|
}
|
|
271
274
|
.lego-land .right-0 {
|
|
272
275
|
right: calc(var(--spacing) * 0);
|
|
273
276
|
}
|
|
277
|
+
.lego-land .-bottom-1\.5 {
|
|
278
|
+
bottom: calc(var(--spacing) * -1.5);
|
|
279
|
+
}
|
|
274
280
|
.lego-land .bottom-0 {
|
|
275
281
|
bottom: calc(var(--spacing) * 0);
|
|
276
282
|
}
|
|
@@ -638,6 +644,9 @@
|
|
|
638
644
|
.lego-land .min-h-\[114px\] {
|
|
639
645
|
min-height: 114px;
|
|
640
646
|
}
|
|
647
|
+
.lego-land .min-h-\[144px\] {
|
|
648
|
+
min-height: 144px;
|
|
649
|
+
}
|
|
641
650
|
.lego-land .min-h-\[200px\] {
|
|
642
651
|
min-height: 200px;
|
|
643
652
|
}
|
|
@@ -713,6 +722,9 @@
|
|
|
713
722
|
.lego-land .w-\[85vw\] {
|
|
714
723
|
width: 85vw;
|
|
715
724
|
}
|
|
725
|
+
.lego-land .w-\[88px\] {
|
|
726
|
+
width: 88px;
|
|
727
|
+
}
|
|
716
728
|
.lego-land .w-\[116px\] {
|
|
717
729
|
width: 116px;
|
|
718
730
|
}
|
|
@@ -869,9 +881,6 @@
|
|
|
869
881
|
.lego-land .shrink-0 {
|
|
870
882
|
flex-shrink: 0;
|
|
871
883
|
}
|
|
872
|
-
.lego-land .grow {
|
|
873
|
-
flex-grow: 1;
|
|
874
|
-
}
|
|
875
884
|
.lego-land .table-fixed {
|
|
876
885
|
table-layout: fixed;
|
|
877
886
|
}
|
|
@@ -1905,8 +1914,8 @@
|
|
|
1905
1914
|
--tw-shadow: 0px 4px 6px 0px var(--tw-shadow-color, rgba(0,0,0,0.1)), 0px 10px 15px 0px var(--tw-shadow-color, rgba(0,0,0,0.1));
|
|
1906
1915
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1907
1916
|
}
|
|
1908
|
-
.lego-land .shadow-\[inset_-1px_0_0_0_hsl\(var\(--border-
|
|
1909
|
-
--tw-shadow: inset -1px 0 0 0 var(--tw-shadow-color, hsl(var(--border-
|
|
1917
|
+
.lego-land .shadow-\[inset_-1px_0_0_0_hsl\(var\(--border-light\)\)\,12px_0_12px_-8px_rgba\(0\,0\,0\,0\.18\)\] {
|
|
1918
|
+
--tw-shadow: inset -1px 0 0 0 var(--tw-shadow-color, hsl(var(--border-light))), 12px 0 12px -8px var(--tw-shadow-color, rgba(0,0,0,0.18));
|
|
1910
1919
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1911
1920
|
}
|
|
1912
1921
|
.lego-land .shadow-lg {
|
|
@@ -1953,6 +1962,11 @@
|
|
|
1953
1962
|
.lego-land .outline-token-brand {
|
|
1954
1963
|
outline-color: hsl(var(--border-brand));
|
|
1955
1964
|
}
|
|
1965
|
+
.lego-land .drop-shadow {
|
|
1966
|
+
--tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.1))) drop-shadow(0 1px 1px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.06)));
|
|
1967
|
+
--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow( 0 1px 1px rgb(0 0 0 / 0.06));
|
|
1968
|
+
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
1969
|
+
}
|
|
1956
1970
|
.lego-land .filter {
|
|
1957
1971
|
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
1958
1972
|
}
|
|
@@ -2041,6 +2055,13 @@
|
|
|
2041
2055
|
}
|
|
2042
2056
|
}
|
|
2043
2057
|
}
|
|
2058
|
+
.lego-land .group-hover\/tab\:bg-interaction-hov-opacity-primary {
|
|
2059
|
+
.lego-land &:is(:where(.group\/tab):hover *) {
|
|
2060
|
+
@media (hover: hover) {
|
|
2061
|
+
background-color: hsl(var(--hov-opacity-primary));
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2044
2065
|
.lego-land .group-active\:w-5 {
|
|
2045
2066
|
.lego-land &:is(:where(.group):active *) {
|
|
2046
2067
|
width: calc(var(--spacing) * 5);
|
|
@@ -2759,27 +2780,40 @@
|
|
|
2759
2780
|
background-color: hsl(var(--bg-dark-grey));
|
|
2760
2781
|
}
|
|
2761
2782
|
}
|
|
2783
|
+
.lego-land .\[\&\]\:\[stroke-width\:1\.5\] {
|
|
2784
|
+
stroke-width: 1.5;
|
|
2785
|
+
}
|
|
2762
2786
|
.lego-land .\[\&_\.rdp-day_button\]\:rounded-\[8px\] {
|
|
2763
2787
|
.lego-land & .rdp-day button {
|
|
2764
2788
|
border-radius: 8px;
|
|
2765
2789
|
}
|
|
2766
2790
|
}
|
|
2791
|
+
.lego-land .\[\&_\.rdp-months\]\:gap-3 {
|
|
2792
|
+
.lego-land & .rdp-months {
|
|
2793
|
+
gap: calc(var(--spacing) * 3);
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2767
2796
|
.lego-land .\[\&_\[data-filter-label\]\]\:\!font-normal {
|
|
2768
2797
|
.lego-land & [data-filter-label] {
|
|
2769
2798
|
--tw-font-weight: var(--font-weight-normal) !important;
|
|
2770
2799
|
font-weight: var(--font-weight-normal) !important;
|
|
2771
2800
|
}
|
|
2772
2801
|
}
|
|
2773
|
-
.lego-land .\[\&_\[data-filter-label\]\]\:\!text-fg-brand {
|
|
2774
|
-
.lego-land & [data-filter-label] {
|
|
2775
|
-
color: hsl(var(--text-brand)) !important;
|
|
2776
|
-
}
|
|
2777
|
-
}
|
|
2778
2802
|
.lego-land .\[\&_\[data-filter-separator\]\]\:\!hidden {
|
|
2779
2803
|
.lego-land & [data-filter-separator] {
|
|
2780
2804
|
display: none !important;
|
|
2781
2805
|
}
|
|
2782
2806
|
}
|
|
2807
|
+
.lego-land .\[\&_button\:not\(\[data-has-value\]\)_\[data-filter-label\]\]\:\!text-fg-placeholder {
|
|
2808
|
+
.lego-land & button:not([data-has-value]) [data-filter-label] {
|
|
2809
|
+
color: hsl(var(--text-placeholder)) !important;
|
|
2810
|
+
}
|
|
2811
|
+
}
|
|
2812
|
+
.lego-land .\[\&_button\[data-has-value\]_\[data-filter-label\]\]\:\!text-fg-brand {
|
|
2813
|
+
.lego-land & button[data-has-value] [data-filter-label] {
|
|
2814
|
+
color: hsl(var(--text-brand)) !important;
|
|
2815
|
+
}
|
|
2816
|
+
}
|
|
2783
2817
|
.lego-land .\[\&_button\[data-state\]\]\:\!rounded-none {
|
|
2784
2818
|
.lego-land & button[data-state] {
|
|
2785
2819
|
border-radius: 0 !important;
|