@nurix/ui-component-library 1.1.4-stage.115 → 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 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
- // Hover/pressed are painted via a pseudo-element overlay (see fieldOverlay) to avoid layout shift.
7310
- fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none before:pointer-events-none before:absolute before:inset-0 before:content-[''] before:[border-radius:inherit] before:transition-colors before:bg-transparent hover:before:bg-interaction-hov-opacity-primary active:before:bg-interaction-pressed-opacity-primary [&>*]:relative [&>*]:z-10",
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 hover:before:bg-transparent active:before:bg-transparent",
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 underline when selected.
8076
- // Same padding across states to prevent layout shift on selection.
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
- topLabelSelected: "text-base font-semibold leading-6 text-fg-brand",
8080
- topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary",
8081
- // 1.5px brand underline (selected).
8082
- topHighlight: "pointer-events-none absolute bottom-0 left-0 right-0 h-[1.5px] rounded-sm bg-token-brand-primary",
8084
+ topLabelSelected: "text-base font-semibold leading-6 text-fg-brand shrink-0",
8085
+ topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary shrink-0",
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",
@@ -8090,8 +8102,8 @@ var NAVIGATION_TOKENS = {
8090
8102
  // Reserved 1.5px transparent border prevents layout shift on selection.
8091
8103
  sideBase: "w-full justify-start gap-2 px-2.5 py-2 rounded-full border-[1.5px] border-transparent",
8092
8104
  sideSelected: "bg-token-white border-token-xlight shadow-sm",
8093
- sideLabelSelected: "text-sm font-semibold leading-5 text-fg-black",
8094
- sideLabelUnselected: "text-sm font-semibold leading-5 text-fg-grey-secondary",
8105
+ sideLabelSelected: "text-sm font-semibold leading-5 text-fg-black truncate text-left",
8106
+ sideLabelUnselected: "text-sm font-semibold leading-5 text-fg-grey-secondary truncate text-left",
8095
8107
  sideHoverUnselected: "hover:bg-interaction-hov-solid-primary",
8096
8108
  sideHoverSelected: "hover:bg-interaction-hov-solid-primary",
8097
8109
  sidePressedUnselected: "active:bg-interaction-pressed-solid",
@@ -8100,8 +8112,8 @@ var NAVIGATION_TOKENS = {
8100
8112
  // Figma: brand-secondary bg for active, xs/medium label.
8101
8113
  sectionBase: "w-full justify-start gap-2 px-2.5 py-2 rounded-full",
8102
8114
  sectionSelected: "bg-token-brand-secondary",
8103
- sectionLabelSelected: "text-xs font-medium leading-4 text-fg-brand",
8104
- sectionLabelUnselected: "text-xs font-medium leading-4 text-fg-grey-secondary",
8115
+ sectionLabelSelected: "text-xs font-medium leading-4 text-fg-brand truncate text-left",
8116
+ sectionLabelUnselected: "text-xs font-medium leading-4 text-fg-grey-secondary truncate text-left",
8105
8117
  sectionHoverUnselected: "hover:bg-interaction-hov-solid-primary",
8106
8118
  sectionHoverSelected: "hover:bg-interaction-hov-solid-primary",
8107
8119
  sectionPressedUnselected: "active:bg-interaction-pressed-solid",
@@ -8116,7 +8128,7 @@ var NAVIGATION_TOKENS = {
8116
8128
  // narrow pill, the longer labels clipped past their neighbours).
8117
8129
  groupSide: "flex w-full flex-col items-stretch gap-1",
8118
8130
  groupSection: "flex w-full flex-col items-stretch gap-1",
8119
- labelBase: "shrink-0"
8131
+ labelBase: "min-w-0"
8120
8132
  },
8121
8133
  // --- ListNavigation ---
8122
8134
  listNav: {
@@ -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" && selected && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: NAVIGATION_TOKENS.tab.topHighlight })
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
  );
@@ -10705,13 +10727,13 @@ var import_lucide_react10 = require("lucide-react");
10705
10727
  // src/toast/variables.ts
10706
10728
  var TOAST_TOKENS = {
10707
10729
  // Outer container — Figma: bg-white, border-light, rounded-16, min-w-400, max-w-800
10708
- root: "relative bg-token-white border border-token-light rounded-[16px] overflow-hidden flex flex-col items-start min-w-[400px] max-w-[800px]",
10730
+ root: "relative bg-token-white border border-token-light rounded-[16px] overflow-hidden flex flex-col items-start min-w-[320px] max-w-[600px]",
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 [&>svg]:size-4",
10713
- error: "text-fg-destructive shrink-0 [&>svg]:size-4",
10714
- default: "text-fg-black shrink-0 [&>svg]:size-4"
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",
@@ -10749,7 +10771,7 @@ var Toaster = ({
10749
10771
  import_sonner.Toaster,
10750
10772
  {
10751
10773
  position,
10752
- toastOptions: { unstyled: true, classNames: { toast: "w-[600px]" } },
10774
+ toastOptions: { unstyled: true, classNames: { toast: "w-fit" } },
10753
10775
  ...props
10754
10776
  }
10755
10777
  );
@@ -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
- pinnedLastBorder: "shadow-[inset_-1px_0_0_0_hsl(var(--border-xlight)),6px_0_8px_-4px_rgba(0,0,0,0.08)]",
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
- icon: "shrink-0 size-4 text-fg-black",
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
- // Figma shows brand/primary border on the focused textarea. Reserve 1px.
12275
- "border border-solid border-token-brand",
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. Matches Figma numeric field for duration (~96px).
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-24 px-3 h-8 min-h-[32px]",
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 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
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-start", children: [
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 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
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" || type === "numeric_with_operands" && !isRangeMode;
13397
- const bodyMinWidth = isCompactBody ? Math.max(160, triggerWidth != null ? triggerWidth : 0) : Math.max(196, triggerWidth != null ? triggerWidth : 0);
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: type === "date" ? void 0 : void 0
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
- (showClearBtn || hasContentToClear) && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} text`)
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} number`)
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) => onOperandChange == null ? void 0 : onOperandChange(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 w-full", children: [
13614
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapper, children: [
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.wrapper, children: [
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
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 && (showClearBtn || hasContentToClear) && renderFooterClear(
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 && selectedItems.length > 0 && renderFooterClear(
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, regular weight (Figma 5427:32334).
14160
- "[&_[data-filter-label]]:!text-fg-brand",
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
- row: "flex items-end gap-1 w-full",
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.
@@ -16100,7 +16176,6 @@ var Popover = React44.forwardRef(
16100
16176
  {
16101
16177
  ref: triggerRef,
16102
16178
  onClick: () => setOpen(!open),
16103
- className: "inline-block",
16104
16179
  children: trigger
16105
16180
  }
16106
16181
  ),
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
- // Hover/pressed are painted via a pseudo-element overlay (see fieldOverlay) to avoid layout shift.
7206
- fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none before:pointer-events-none before:absolute before:inset-0 before:content-[''] before:[border-radius:inherit] before:transition-colors before:bg-transparent hover:before:bg-interaction-hov-opacity-primary active:before:bg-interaction-pressed-opacity-primary [&>*]:relative [&>*]:z-10",
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 hover:before:bg-transparent active:before:bg-transparent",
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 underline when selected.
7972
- // Same padding across states to prevent layout shift on selection.
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
- topLabelSelected: "text-base font-semibold leading-6 text-fg-brand",
7976
- topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary",
7977
- // 1.5px brand underline (selected).
7978
- topHighlight: "pointer-events-none absolute bottom-0 left-0 right-0 h-[1.5px] rounded-sm bg-token-brand-primary",
7980
+ topLabelSelected: "text-base font-semibold leading-6 text-fg-brand shrink-0",
7981
+ topLabelUnselected: "text-base font-semibold leading-6 text-fg-grey-primary shrink-0",
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",
@@ -7986,8 +7998,8 @@ var NAVIGATION_TOKENS = {
7986
7998
  // Reserved 1.5px transparent border prevents layout shift on selection.
7987
7999
  sideBase: "w-full justify-start gap-2 px-2.5 py-2 rounded-full border-[1.5px] border-transparent",
7988
8000
  sideSelected: "bg-token-white border-token-xlight shadow-sm",
7989
- sideLabelSelected: "text-sm font-semibold leading-5 text-fg-black",
7990
- sideLabelUnselected: "text-sm font-semibold leading-5 text-fg-grey-secondary",
8001
+ sideLabelSelected: "text-sm font-semibold leading-5 text-fg-black truncate text-left",
8002
+ sideLabelUnselected: "text-sm font-semibold leading-5 text-fg-grey-secondary truncate text-left",
7991
8003
  sideHoverUnselected: "hover:bg-interaction-hov-solid-primary",
7992
8004
  sideHoverSelected: "hover:bg-interaction-hov-solid-primary",
7993
8005
  sidePressedUnselected: "active:bg-interaction-pressed-solid",
@@ -7996,8 +8008,8 @@ var NAVIGATION_TOKENS = {
7996
8008
  // Figma: brand-secondary bg for active, xs/medium label.
7997
8009
  sectionBase: "w-full justify-start gap-2 px-2.5 py-2 rounded-full",
7998
8010
  sectionSelected: "bg-token-brand-secondary",
7999
- sectionLabelSelected: "text-xs font-medium leading-4 text-fg-brand",
8000
- sectionLabelUnselected: "text-xs font-medium leading-4 text-fg-grey-secondary",
8011
+ sectionLabelSelected: "text-xs font-medium leading-4 text-fg-brand truncate text-left",
8012
+ sectionLabelUnselected: "text-xs font-medium leading-4 text-fg-grey-secondary truncate text-left",
8001
8013
  sectionHoverUnselected: "hover:bg-interaction-hov-solid-primary",
8002
8014
  sectionHoverSelected: "hover:bg-interaction-hov-solid-primary",
8003
8015
  sectionPressedUnselected: "active:bg-interaction-pressed-solid",
@@ -8012,7 +8024,7 @@ var NAVIGATION_TOKENS = {
8012
8024
  // narrow pill, the longer labels clipped past their neighbours).
8013
8025
  groupSide: "flex w-full flex-col items-stretch gap-1",
8014
8026
  groupSection: "flex w-full flex-col items-stretch gap-1",
8015
- labelBase: "shrink-0"
8027
+ labelBase: "min-w-0"
8016
8028
  },
8017
8029
  // --- ListNavigation ---
8018
8030
  listNav: {
@@ -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" && selected && /* @__PURE__ */ jsx10("span", { className: NAVIGATION_TOKENS.tab.topHighlight })
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
  );
@@ -10601,13 +10623,13 @@ import { ChevronRight, CircleCheck, CircleAlert, ThumbsUp } from "lucide-react";
10601
10623
  // src/toast/variables.ts
10602
10624
  var TOAST_TOKENS = {
10603
10625
  // Outer container — Figma: bg-white, border-light, rounded-16, min-w-400, max-w-800
10604
- root: "relative bg-token-white border border-token-light rounded-[16px] overflow-hidden flex flex-col items-start min-w-[400px] max-w-[800px]",
10626
+ root: "relative bg-token-white border border-token-light rounded-[16px] overflow-hidden flex flex-col items-start min-w-[320px] max-w-[600px]",
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 [&>svg]:size-4",
10609
- error: "text-fg-destructive shrink-0 [&>svg]:size-4",
10610
- default: "text-fg-black shrink-0 [&>svg]:size-4"
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",
@@ -10645,7 +10667,7 @@ var Toaster = ({
10645
10667
  SonnerToaster,
10646
10668
  {
10647
10669
  position,
10648
- toastOptions: { unstyled: true, classNames: { toast: "w-[600px]" } },
10670
+ toastOptions: { unstyled: true, classNames: { toast: "w-fit" } },
10649
10671
  ...props
10650
10672
  }
10651
10673
  );
@@ -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
- pinnedLastBorder: "shadow-[inset_-1px_0_0_0_hsl(var(--border-xlight)),6px_0_8px_-4px_rgba(0,0,0,0.08)]",
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
- icon: "shrink-0 size-4 text-fg-black",
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
- // Figma shows brand/primary border on the focused textarea. Reserve 1px.
12187
- "border border-solid border-token-brand",
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. Matches Figma numeric field for duration (~96px).
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-24 px-3 h-8 min-h-[32px]",
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 && /* @__PURE__ */ jsx33(
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-start", children: [
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 && /* @__PURE__ */ jsx33(
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" || type === "numeric_with_operands" && !isRangeMode;
13309
- const bodyMinWidth = isCompactBody ? Math.max(160, triggerWidth != null ? triggerWidth : 0) : Math.max(196, triggerWidth != null ? triggerWidth : 0);
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: type === "date" ? void 0 : void 0
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
- (showClearBtn || hasContentToClear) && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} text`)
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(handleTextClear, footerActionLabel, `${footerActionLabel} number`)
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) => onOperandChange == null ? void 0 : onOperandChange(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 w-full", children: [
13526
- /* @__PURE__ */ jsxs23("div", { className: FILTER_SELECT_TOKENS.bodyInput.wrapper, children: [
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.wrapper, children: [
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && renderFooterClear(
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
- (showClearBtn || hasContentToClear) && /* @__PURE__ */ jsx33(
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 && (showClearBtn || hasContentToClear) && renderFooterClear(
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 && selectedItems.length > 0 && renderFooterClear(
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, regular weight (Figma 5427:32334).
14072
- "[&_[data-filter-label]]:!text-fg-brand",
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
- row: "flex items-end gap-1 w-full",
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.
@@ -16012,7 +16088,6 @@ var Popover = React44.forwardRef(
16012
16088
  {
16013
16089
  ref: triggerRef,
16014
16090
  onClick: () => setOpen(!open),
16015
- className: "inline-block",
16016
16091
  children: trigger
16017
16092
  }
16018
16093
  ),
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
  }
@@ -752,9 +764,6 @@
752
764
  .lego-land .w-\[520px\] {
753
765
  width: 520px;
754
766
  }
755
- .lego-land .w-\[600px\] {
756
- width: 600px;
757
- }
758
767
  .lego-land .w-\[620px\] {
759
768
  width: 620px;
760
769
  }
@@ -803,8 +812,8 @@
803
812
  .lego-land .max-w-\[472px\] {
804
813
  max-width: 472px;
805
814
  }
806
- .lego-land .max-w-\[800px\] {
807
- max-width: 800px;
815
+ .lego-land .max-w-\[600px\] {
816
+ max-width: 600px;
808
817
  }
809
818
  .lego-land .max-w-full {
810
819
  max-width: 100%;
@@ -851,8 +860,8 @@
851
860
  .lego-land .min-w-\[196px\] {
852
861
  min-width: 196px;
853
862
  }
854
- .lego-land .min-w-\[400px\] {
855
- min-width: 400px;
863
+ .lego-land .min-w-\[320px\] {
864
+ min-width: 320px;
856
865
  }
857
866
  .lego-land .min-w-\[var\(--radix-select-trigger-width\)\] {
858
867
  min-width: var(--radix-select-trigger-width);
@@ -872,9 +881,6 @@
872
881
  .lego-land .shrink-0 {
873
882
  flex-shrink: 0;
874
883
  }
875
- .lego-land .grow {
876
- flex-grow: 1;
877
- }
878
884
  .lego-land .table-fixed {
879
885
  table-layout: fixed;
880
886
  }
@@ -1908,8 +1914,8 @@
1908
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));
1909
1915
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1910
1916
  }
1911
- .lego-land .shadow-\[inset_-1px_0_0_0_hsl\(var\(--border-xlight\)\)\,6px_0_8px_-4px_rgba\(0\,0\,0\,0\.08\)\] {
1912
- --tw-shadow: inset -1px 0 0 0 var(--tw-shadow-color, hsl(var(--border-xlight))), 6px 0 8px -4px var(--tw-shadow-color, rgba(0,0,0,0.08));
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));
1913
1919
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1914
1920
  }
1915
1921
  .lego-land .shadow-lg {
@@ -1956,6 +1962,11 @@
1956
1962
  .lego-land .outline-token-brand {
1957
1963
  outline-color: hsl(var(--border-brand));
1958
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
+ }
1959
1970
  .lego-land .filter {
1960
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,);
1961
1972
  }
@@ -2044,6 +2055,13 @@
2044
2055
  }
2045
2056
  }
2046
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
+ }
2047
2065
  .lego-land .group-active\:w-5 {
2048
2066
  .lego-land &:is(:where(.group):active *) {
2049
2067
  width: calc(var(--spacing) * 5);
@@ -2762,27 +2780,40 @@
2762
2780
  background-color: hsl(var(--bg-dark-grey));
2763
2781
  }
2764
2782
  }
2783
+ .lego-land .\[\&\]\:\[stroke-width\:1\.5\] {
2784
+ stroke-width: 1.5;
2785
+ }
2765
2786
  .lego-land .\[\&_\.rdp-day_button\]\:rounded-\[8px\] {
2766
2787
  .lego-land & .rdp-day button {
2767
2788
  border-radius: 8px;
2768
2789
  }
2769
2790
  }
2791
+ .lego-land .\[\&_\.rdp-months\]\:gap-3 {
2792
+ .lego-land & .rdp-months {
2793
+ gap: calc(var(--spacing) * 3);
2794
+ }
2795
+ }
2770
2796
  .lego-land .\[\&_\[data-filter-label\]\]\:\!font-normal {
2771
2797
  .lego-land & [data-filter-label] {
2772
2798
  --tw-font-weight: var(--font-weight-normal) !important;
2773
2799
  font-weight: var(--font-weight-normal) !important;
2774
2800
  }
2775
2801
  }
2776
- .lego-land .\[\&_\[data-filter-label\]\]\:\!text-fg-brand {
2777
- .lego-land & [data-filter-label] {
2778
- color: hsl(var(--text-brand)) !important;
2779
- }
2780
- }
2781
2802
  .lego-land .\[\&_\[data-filter-separator\]\]\:\!hidden {
2782
2803
  .lego-land & [data-filter-separator] {
2783
2804
  display: none !important;
2784
2805
  }
2785
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
+ }
2786
2817
  .lego-land .\[\&_button\[data-state\]\]\:\!rounded-none {
2787
2818
  .lego-land & button[data-state] {
2788
2819
  border-radius: 0 !important;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/ui-component-library",
3
- "version": "1.1.4-stage.115",
3
+ "version": "1.1.4-stage.117",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",