@nurix/ui-component-library 1.1.4-stage.118 → 1.1.4-stage.119

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.d.mts CHANGED
@@ -1590,6 +1590,10 @@ interface DialogProps {
1590
1590
  showCancel?: boolean;
1591
1591
  onCancel?: () => void;
1592
1592
  onConfirm?: () => void;
1593
+ /** @default "primary" */
1594
+ confirmVariant?: ButtonVariant;
1595
+ /** Disable the confirm button. */
1596
+ confirmDisabled?: boolean;
1593
1597
  className?: string;
1594
1598
  }
1595
1599
  interface DialogIconProps {
@@ -1617,6 +1621,10 @@ interface DialogFooterProps {
1617
1621
  showCancel?: boolean;
1618
1622
  onCancel?: () => void;
1619
1623
  onConfirm?: () => void;
1624
+ /** @default "primary" */
1625
+ confirmVariant?: ButtonVariant;
1626
+ /** Disable the confirm button. */
1627
+ confirmDisabled?: boolean;
1620
1628
  showDivider?: boolean;
1621
1629
  className?: string;
1622
1630
  }
package/dist/index.d.ts CHANGED
@@ -1590,6 +1590,10 @@ interface DialogProps {
1590
1590
  showCancel?: boolean;
1591
1591
  onCancel?: () => void;
1592
1592
  onConfirm?: () => void;
1593
+ /** @default "primary" */
1594
+ confirmVariant?: ButtonVariant;
1595
+ /** Disable the confirm button. */
1596
+ confirmDisabled?: boolean;
1593
1597
  className?: string;
1594
1598
  }
1595
1599
  interface DialogIconProps {
@@ -1617,6 +1621,10 @@ interface DialogFooterProps {
1617
1621
  showCancel?: boolean;
1618
1622
  onCancel?: () => void;
1619
1623
  onConfirm?: () => void;
1624
+ /** @default "primary" */
1625
+ confirmVariant?: ButtonVariant;
1626
+ /** Disable the confirm button. */
1627
+ confirmDisabled?: boolean;
1620
1628
  showDivider?: boolean;
1621
1629
  className?: string;
1622
1630
  }
package/dist/index.js CHANGED
@@ -7313,8 +7313,11 @@ var INPUT_TOKENS = {
7313
7313
  fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7314
7314
  // Hover-only border darkening for the active (non-invalid, non-disabled)
7315
7315
  // state. Applied conditionally by the component so it does not override
7316
- // the destructive border on invalid fields.
7317
- fieldHover: "hover:border-token-input-hover",
7316
+ // the destructive border on invalid fields. The `:not(:focus-within)`
7317
+ // guard is required because Tailwind emits `:hover` rules AFTER
7318
+ // `:focus-within` — without it, hovering a focused field would replace
7319
+ // the brand border with the hover border.
7320
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7318
7321
  // Borderless base — transparent resting border, brand border only on focus.
7319
7322
  // No hover/pressed overlay (these cells sit inside a larger interactive row).
7320
7323
  // Layout-shift safe: border width stays 1px across states (color-only swap).
@@ -7534,7 +7537,9 @@ var INPUT_GROUP_TOKENS = {
7534
7537
  fieldBase: "border border-token-light focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7535
7538
  // Hover-only border darkening (Figma hover variant: #dadada). Applied
7536
7539
  // conditionally by the component so it does not override invalid/disabled.
7537
- fieldHover: "hover:border-token-input-hover",
7540
+ // The `:not(:focus-within)` guard prevents the hover border from beating
7541
+ // the brand focus border (Tailwind emits `:hover` after `:focus-within`).
7542
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7538
7543
  fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
7539
7544
  fieldDisabled: "border-token-xlight",
7540
7545
  // Inner input area
@@ -7544,7 +7549,7 @@ var INPUT_GROUP_TOKENS = {
7544
7549
  segmentDivider: "border-token-light",
7545
7550
  // Textarea
7546
7551
  textareaField: "w-full bg-token-white py-[10px] px-[var(--input-padding-horizontal,12px)] text-sm border border-token-light focus-visible:outline-none focus-visible:border-token-brand disabled:pointer-events-none shadow-none transition-colors",
7547
- textareaHover: "hover:border-token-input-hover",
7552
+ textareaHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7548
7553
  textareaInvalid: "border-token-destructive focus-visible:border-token-destructive",
7549
7554
  textareaDisabled: "border-token-xlight",
7550
7555
  radius: {
@@ -7714,8 +7719,10 @@ var TEXTAREA_TOKENS = {
7714
7719
  // Focus ring uses outline (not ring) so it doesn't contribute to box size.
7715
7720
  fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7716
7721
  // Hover-only border darkening. Applied conditionally by the component so
7717
- // it does not override invalid/disabled borders.
7718
- fieldHover: "hover:border-token-input-hover",
7722
+ // it does not override invalid/disabled borders. The `:not(:focus-within)`
7723
+ // guard keeps the brand focus border visible when a focused field is
7724
+ // hovered (Tailwind emits `:hover` after `:focus-within`).
7725
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7719
7726
  fieldDisabled: "border-token-xlight",
7720
7727
  fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
7721
7728
  // Textarea itself.
@@ -9269,11 +9276,11 @@ var SELECT_TOKENS = {
9269
9276
  // Main select container
9270
9277
  container: {
9271
9278
  // Figma: trigger uses rounded-xl (12px), border visible, padding px-12 py-10.
9272
- // Hover darkens the border to match Figma (#dadada) `data-[state=open]`
9273
- // and `disabled:` use higher specificity (attribute / pseudo-class) so they
9274
- // override the hover border when the dropdown is open or the trigger is
9275
- // disabled.
9276
- default: "rounded-[var(--rounded-xl,12px)] border border-token-input flex items-center justify-between gap-2 transition-colors hover:border-token-input-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-token-input focus-visible:outline-none data-[state=open]:border-token-brand",
9279
+ // Hover darkens the border to match Figma (#dadada). The hover is scoped
9280
+ // via `[&:not([data-state=open])]` so the brand border wins when the
9281
+ // dropdown is open (Tailwind emits `data-[*]` selectors before `:hover`,
9282
+ // so without the guard hover would override the open-state border).
9283
+ default: "rounded-[var(--rounded-xl,12px)] border border-token-input flex items-center justify-between gap-2 transition-colors [&:not([data-state=open])]:hover:border-token-input-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-token-input focus-visible:outline-none data-[state=open]:border-token-brand",
9277
9284
  // bg variants: default = input (grey), white = card
9278
9285
  bgDefault: "bg-token-white",
9279
9286
  bgWhite: "bg-token-white",
@@ -10542,7 +10549,7 @@ var DIALOG_TOKENS = {
10542
10549
  },
10543
10550
  header: {
10544
10551
  wrapper: "flex flex-col shrink-0",
10545
- row: "flex items-center gap-[10px] px-6 py-6",
10552
+ row: "flex items-center gap-[10px] px-6 pt-6 pb-2",
10546
10553
  title: "flex-1 text-lg font-semibold leading-7 text-fg-black",
10547
10554
  closeBtn: "size-9 flex items-center justify-center rounded-md text-fg-black hover:bg-token-grey transition-colors cursor-pointer",
10548
10555
  divider: "h-px bg-border-token-light"
@@ -10577,6 +10584,8 @@ var Dialog = React29.forwardRef(
10577
10584
  showCancel = true,
10578
10585
  onCancel,
10579
10586
  onConfirm,
10587
+ confirmVariant = "primary",
10588
+ confirmDisabled = false,
10580
10589
  className
10581
10590
  }, ref) => {
10582
10591
  const close = React29.useCallback(() => onOpenChange(false), [onOpenChange]);
@@ -10649,9 +10658,10 @@ var Dialog = React29.forwardRef(
10649
10658
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
10650
10659
  Button,
10651
10660
  {
10652
- variant: "primary",
10661
+ variant: confirmVariant,
10653
10662
  button_border_radius: "rounded",
10654
10663
  onClick: onConfirm,
10664
+ disabled: confirmDisabled,
10655
10665
  children: confirmLabel
10656
10666
  }
10657
10667
  )
@@ -10711,6 +10721,8 @@ var DialogFooter = React29.forwardRef(
10711
10721
  showCancel = true,
10712
10722
  onCancel,
10713
10723
  onConfirm,
10724
+ confirmVariant = "primary",
10725
+ confirmDisabled = false,
10714
10726
  showDivider = false,
10715
10727
  className
10716
10728
  }, ref) => {
@@ -10730,9 +10742,10 @@ var DialogFooter = React29.forwardRef(
10730
10742
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
10731
10743
  Button,
10732
10744
  {
10733
- variant: "primary",
10745
+ variant: confirmVariant,
10734
10746
  button_border_radius: "rounded",
10735
10747
  onClick: onConfirm,
10748
+ disabled: confirmDisabled,
10736
10749
  children: confirmLabel
10737
10750
  }
10738
10751
  )
package/dist/index.mjs CHANGED
@@ -7209,8 +7209,11 @@ var INPUT_TOKENS = {
7209
7209
  fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7210
7210
  // Hover-only border darkening for the active (non-invalid, non-disabled)
7211
7211
  // state. Applied conditionally by the component so it does not override
7212
- // the destructive border on invalid fields.
7213
- fieldHover: "hover:border-token-input-hover",
7212
+ // the destructive border on invalid fields. The `:not(:focus-within)`
7213
+ // guard is required because Tailwind emits `:hover` rules AFTER
7214
+ // `:focus-within` — without it, hovering a focused field would replace
7215
+ // the brand border with the hover border.
7216
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7214
7217
  // Borderless base — transparent resting border, brand border only on focus.
7215
7218
  // No hover/pressed overlay (these cells sit inside a larger interactive row).
7216
7219
  // Layout-shift safe: border width stays 1px across states (color-only swap).
@@ -7430,7 +7433,9 @@ var INPUT_GROUP_TOKENS = {
7430
7433
  fieldBase: "border border-token-light focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7431
7434
  // Hover-only border darkening (Figma hover variant: #dadada). Applied
7432
7435
  // conditionally by the component so it does not override invalid/disabled.
7433
- fieldHover: "hover:border-token-input-hover",
7436
+ // The `:not(:focus-within)` guard prevents the hover border from beating
7437
+ // the brand focus border (Tailwind emits `:hover` after `:focus-within`).
7438
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7434
7439
  fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
7435
7440
  fieldDisabled: "border-token-xlight",
7436
7441
  // Inner input area
@@ -7440,7 +7445,7 @@ var INPUT_GROUP_TOKENS = {
7440
7445
  segmentDivider: "border-token-light",
7441
7446
  // Textarea
7442
7447
  textareaField: "w-full bg-token-white py-[10px] px-[var(--input-padding-horizontal,12px)] text-sm border border-token-light focus-visible:outline-none focus-visible:border-token-brand disabled:pointer-events-none shadow-none transition-colors",
7443
- textareaHover: "hover:border-token-input-hover",
7448
+ textareaHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7444
7449
  textareaInvalid: "border-token-destructive focus-visible:border-token-destructive",
7445
7450
  textareaDisabled: "border-token-xlight",
7446
7451
  radius: {
@@ -7610,8 +7615,10 @@ var TEXTAREA_TOKENS = {
7610
7615
  // Focus ring uses outline (not ring) so it doesn't contribute to box size.
7611
7616
  fieldBase: "border border-token-input focus-within:border-token-brand disabled:pointer-events-none transition-colors",
7612
7617
  // Hover-only border darkening. Applied conditionally by the component so
7613
- // it does not override invalid/disabled borders.
7614
- fieldHover: "hover:border-token-input-hover",
7618
+ // it does not override invalid/disabled borders. The `:not(:focus-within)`
7619
+ // guard keeps the brand focus border visible when a focused field is
7620
+ // hovered (Tailwind emits `:hover` after `:focus-within`).
7621
+ fieldHover: "[&:not(:focus-within)]:hover:border-token-input-hover",
7615
7622
  fieldDisabled: "border-token-xlight",
7616
7623
  fieldInvalid: "border-token-destructive focus-within:border-token-destructive",
7617
7624
  // Textarea itself.
@@ -9165,11 +9172,11 @@ var SELECT_TOKENS = {
9165
9172
  // Main select container
9166
9173
  container: {
9167
9174
  // Figma: trigger uses rounded-xl (12px), border visible, padding px-12 py-10.
9168
- // Hover darkens the border to match Figma (#dadada) `data-[state=open]`
9169
- // and `disabled:` use higher specificity (attribute / pseudo-class) so they
9170
- // override the hover border when the dropdown is open or the trigger is
9171
- // disabled.
9172
- default: "rounded-[var(--rounded-xl,12px)] border border-token-input flex items-center justify-between gap-2 transition-colors hover:border-token-input-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-token-input focus-visible:outline-none data-[state=open]:border-token-brand",
9175
+ // Hover darkens the border to match Figma (#dadada). The hover is scoped
9176
+ // via `[&:not([data-state=open])]` so the brand border wins when the
9177
+ // dropdown is open (Tailwind emits `data-[*]` selectors before `:hover`,
9178
+ // so without the guard hover would override the open-state border).
9179
+ default: "rounded-[var(--rounded-xl,12px)] border border-token-input flex items-center justify-between gap-2 transition-colors [&:not([data-state=open])]:hover:border-token-input-hover disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-token-input focus-visible:outline-none data-[state=open]:border-token-brand",
9173
9180
  // bg variants: default = input (grey), white = card
9174
9181
  bgDefault: "bg-token-white",
9175
9182
  bgWhite: "bg-token-white",
@@ -10438,7 +10445,7 @@ var DIALOG_TOKENS = {
10438
10445
  },
10439
10446
  header: {
10440
10447
  wrapper: "flex flex-col shrink-0",
10441
- row: "flex items-center gap-[10px] px-6 py-6",
10448
+ row: "flex items-center gap-[10px] px-6 pt-6 pb-2",
10442
10449
  title: "flex-1 text-lg font-semibold leading-7 text-fg-black",
10443
10450
  closeBtn: "size-9 flex items-center justify-center rounded-md text-fg-black hover:bg-token-grey transition-colors cursor-pointer",
10444
10451
  divider: "h-px bg-border-token-light"
@@ -10473,6 +10480,8 @@ var Dialog = React29.forwardRef(
10473
10480
  showCancel = true,
10474
10481
  onCancel,
10475
10482
  onConfirm,
10483
+ confirmVariant = "primary",
10484
+ confirmDisabled = false,
10476
10485
  className
10477
10486
  }, ref) => {
10478
10487
  const close = React29.useCallback(() => onOpenChange(false), [onOpenChange]);
@@ -10545,9 +10554,10 @@ var Dialog = React29.forwardRef(
10545
10554
  /* @__PURE__ */ jsx25(
10546
10555
  Button,
10547
10556
  {
10548
- variant: "primary",
10557
+ variant: confirmVariant,
10549
10558
  button_border_radius: "rounded",
10550
10559
  onClick: onConfirm,
10560
+ disabled: confirmDisabled,
10551
10561
  children: confirmLabel
10552
10562
  }
10553
10563
  )
@@ -10607,6 +10617,8 @@ var DialogFooter = React29.forwardRef(
10607
10617
  showCancel = true,
10608
10618
  onCancel,
10609
10619
  onConfirm,
10620
+ confirmVariant = "primary",
10621
+ confirmDisabled = false,
10610
10622
  showDivider = false,
10611
10623
  className
10612
10624
  }, ref) => {
@@ -10626,9 +10638,10 @@ var DialogFooter = React29.forwardRef(
10626
10638
  /* @__PURE__ */ jsx25(
10627
10639
  Button,
10628
10640
  {
10629
- variant: "primary",
10641
+ variant: confirmVariant,
10630
10642
  button_border_radius: "rounded",
10631
10643
  onClick: onConfirm,
10644
+ disabled: confirmDisabled,
10632
10645
  children: confirmLabel
10633
10646
  }
10634
10647
  )
package/dist/styles.css CHANGED
@@ -1511,9 +1511,6 @@
1511
1511
  .lego-land .py-4 {
1512
1512
  padding-block: calc(var(--spacing) * 4);
1513
1513
  }
1514
- .lego-land .py-6 {
1515
- padding-block: calc(var(--spacing) * 6);
1516
- }
1517
1514
  .lego-land .py-8 {
1518
1515
  padding-block: calc(var(--spacing) * 8);
1519
1516
  }
@@ -1538,6 +1535,9 @@
1538
1535
  .lego-land .pt-4 {
1539
1536
  padding-top: calc(var(--spacing) * 4);
1540
1537
  }
1538
+ .lego-land .pt-6 {
1539
+ padding-top: calc(var(--spacing) * 6);
1540
+ }
1541
1541
  .lego-land .pr-2 {
1542
1542
  padding-right: calc(var(--spacing) * 2);
1543
1543
  }
@@ -2296,13 +2296,6 @@
2296
2296
  }
2297
2297
  }
2298
2298
  }
2299
- .lego-land .hover\:border-token-input-hover {
2300
- .lego-land &:hover {
2301
- @media (hover: hover) {
2302
- border-color: hsl(var(--border-input-hover));
2303
- }
2304
- }
2305
- }
2306
2299
  .lego-land .hover\:border-token-light {
2307
2300
  .lego-land &:hover {
2308
2301
  @media (hover: hover) {
@@ -2825,6 +2818,24 @@
2825
2818
  appearance: none;
2826
2819
  }
2827
2820
  }
2821
+ .lego-land .\[\&\:not\(\:focus-within\)\]\:hover\:border-token-input-hover {
2822
+ .lego-land &:not(:focus-within) {
2823
+ .lego-land &:hover {
2824
+ @media (hover: hover) {
2825
+ border-color: hsl(var(--border-input-hover));
2826
+ }
2827
+ }
2828
+ }
2829
+ }
2830
+ .lego-land .\[\&\:not\(\[data-state\=open\]\)\]\:hover\:border-token-input-hover {
2831
+ .lego-land &:not([data-state=open]) {
2832
+ .lego-land &:hover {
2833
+ @media (hover: hover) {
2834
+ border-color: hsl(var(--border-input-hover));
2835
+ }
2836
+ }
2837
+ }
2838
+ }
2828
2839
  .lego-land .\[\&\>\*\]\:relative {
2829
2840
  .lego-land &>* {
2830
2841
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/ui-component-library",
3
- "version": "1.1.4-stage.118",
3
+ "version": "1.1.4-stage.119",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",