@moises.ai/design-system 4.19.6 → 4.19.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moises.ai/design-system",
3
- "version": "4.19.6",
3
+ "version": "4.19.8",
4
4
  "description": "Design System package based on @radix-ui/themes with custom defaults",
5
5
  "private": false,
6
6
  "type": "module",
@@ -67,6 +67,7 @@ The \`options\` prop accepts an array of objects with the following types:
67
67
  icon: <Icon />, // Optional, icon displayed before the label
68
68
  onClick: () => {}, // Function called when clicked
69
69
  disabled: false, // Optional, disables the item when true
70
+ allowClickWhenDisabled: false, // Optional, keeps disabled look but still fires onClick (e.g. paywall)
70
71
  keybinding: '⌘C', // Optional, displays a keyboard shortcut
71
72
  rightIcon: <Icon />, // Optional, icon displayed on the right side
72
73
  color: 'red' | 'cyan', // Optional: custom color for this item
@@ -114,6 +115,7 @@ The \`options\` prop accepts an array of objects with the following types:
114
115
  checked: true, // Whether the checkbox is checked (always reserves space for checkmark)
115
116
  onChange: (checked) => {}, // Function called when toggled, receives new checked state
116
117
  disabled: false, // Optional, disables the checkbox when true
118
+ allowClickWhenDisabled: false, // Optional, keeps disabled look but still allows interaction (e.g. paywall)
117
119
  keybinding: '⌘C', // Optional, displays a keyboard shortcut
118
120
  rightIcon: <Icon />, // Optional, icon displayed on the right side
119
121
  color: 'red' | 'cyan', // Optional: custom color for this checkbox item
@@ -310,6 +312,69 @@ export const StayOpenAfterSelect = {
310
312
  },
311
313
  }
312
314
 
315
+ export const AllowClickWhenDisabled = {
316
+ render: () => {
317
+ const [lastAction, setLastAction] = useState('none yet')
318
+
319
+ const options = [
320
+ {
321
+ type: 'item',
322
+ key: 'edit',
323
+ label: 'Edit',
324
+ onClick: () => setLastAction('Edit'),
325
+ },
326
+ {
327
+ type: 'item',
328
+ key: 'disabled',
329
+ label: 'Disabled (no click)',
330
+ disabled: true,
331
+ onClick: () => setLastAction('Disabled item clicked'),
332
+ },
333
+ {
334
+ type: 'item',
335
+ key: 'premium',
336
+ label: 'Premium feature',
337
+ secondaryText: 'Looks disabled, still clickable',
338
+ secondaryTextPosition: 'bottom',
339
+ disabled: true,
340
+ allowClickWhenDisabled: true,
341
+ onClick: () => setLastAction('Paywall opened'),
342
+ },
343
+ { type: 'separator', key: 'sep1' },
344
+ {
345
+ type: 'checkbox',
346
+ key: 'premium-checkbox',
347
+ label: 'Premium checkbox',
348
+ checked: false,
349
+ disabled: true,
350
+ allowClickWhenDisabled: true,
351
+ onChange: () => setLastAction('Paywall opened from checkbox'),
352
+ },
353
+ ]
354
+
355
+ return (
356
+ <Flex direction="column" gap="2" align="center" height="320px">
357
+ <ContextMenu options={options}>
358
+ <Flex
359
+ justify="center"
360
+ align="center"
361
+ style={{
362
+ padding: '50px',
363
+ border: '1px dashed gray',
364
+ borderRadius: '8px',
365
+ }}
366
+ >
367
+ Right-click here
368
+ </Flex>
369
+ </ContextMenu>
370
+ <div style={{ fontSize: '14px', color: '#4b5563' }}>
371
+ Last action: {lastAction}
372
+ </div>
373
+ </Flex>
374
+ )
375
+ },
376
+ }
377
+
313
378
  const ItemPlaygroundComponent = ({
314
379
  size,
315
380
  // Item 1
@@ -321,6 +386,7 @@ const ItemPlaygroundComponent = ({
321
386
  item1Keybinding,
322
387
  item1ShowRightIcon,
323
388
  item1Disabled,
389
+ item1AllowClickWhenDisabled,
324
390
  item1Color,
325
391
  // Item 2
326
392
  item2Type,
@@ -331,6 +397,7 @@ const ItemPlaygroundComponent = ({
331
397
  item2Keybinding,
332
398
  item2ShowRightIcon,
333
399
  item2Disabled,
400
+ item2AllowClickWhenDisabled,
334
401
  item2Color,
335
402
  // Submenu
336
403
  showSubmenu,
@@ -343,6 +410,7 @@ const ItemPlaygroundComponent = ({
343
410
  subItemShowIcon,
344
411
  subItemKeybinding,
345
412
  subItemDisabled,
413
+ subItemAllowClickWhenDisabled,
346
414
  }) => {
347
415
  const [item1IsChecked, setItem1IsChecked] = useState(false)
348
416
  const [item2IsChecked, setItem2IsChecked] = useState(true)
@@ -358,6 +426,7 @@ const ItemPlaygroundComponent = ({
358
426
  keybinding: item1Keybinding || undefined,
359
427
  rightIcon: item1ShowRightIcon ? <DotsVerticalIcon /> : undefined,
360
428
  disabled: item1Disabled,
429
+ allowClickWhenDisabled: item1AllowClickWhenDisabled,
361
430
  color: item1Color === 'default' ? undefined : item1Color,
362
431
  ...(item1Type === 'checkbox'
363
432
  ? {
@@ -379,6 +448,7 @@ const ItemPlaygroundComponent = ({
379
448
  keybinding: item2Keybinding || undefined,
380
449
  rightIcon: item2ShowRightIcon ? <DotsVerticalIcon /> : undefined,
381
450
  disabled: item2Disabled,
451
+ allowClickWhenDisabled: item2AllowClickWhenDisabled,
382
452
  color: item2Color === 'default' ? undefined : item2Color,
383
453
  ...(item2Type === 'checkbox'
384
454
  ? {
@@ -399,6 +469,7 @@ const ItemPlaygroundComponent = ({
399
469
  icon: subItemShowIcon ? <GearIcon /> : undefined,
400
470
  keybinding: subItemKeybinding || undefined,
401
471
  disabled: subItemDisabled,
472
+ allowClickWhenDisabled: subItemAllowClickWhenDisabled,
402
473
  ...(subItemType === 'checkbox'
403
474
  ? {
404
475
  checked: subItemIsChecked,
@@ -467,6 +538,7 @@ export const Playground = {
467
538
  item1Keybinding: '⌘ C',
468
539
  item1ShowRightIcon: true,
469
540
  item1Disabled: false,
541
+ item1AllowClickWhenDisabled: false,
470
542
  item1Color: 'default',
471
543
  // Item 2
472
544
  item2Type: 'checkbox',
@@ -477,6 +549,7 @@ export const Playground = {
477
549
  item2Keybinding: '⌘ S',
478
550
  item2ShowRightIcon: false,
479
551
  item2Disabled: false,
552
+ item2AllowClickWhenDisabled: false,
480
553
  item2Color: 'default',
481
554
  // Submenu
482
555
  showSubmenu: true,
@@ -489,6 +562,7 @@ export const Playground = {
489
562
  subItemShowIcon: false,
490
563
  subItemKeybinding: '',
491
564
  subItemDisabled: false,
565
+ subItemAllowClickWhenDisabled: false,
492
566
  },
493
567
  argTypes: {
494
568
  size: {
@@ -540,6 +614,11 @@ export const Playground = {
540
614
  description: 'Disabled state',
541
615
  table: { category: 'Item 1' },
542
616
  },
617
+ item1AllowClickWhenDisabled: {
618
+ control: { type: 'boolean' },
619
+ description: 'Keep disabled look but still allow click',
620
+ table: { category: 'Item 1' },
621
+ },
543
622
  item1Color: {
544
623
  options: ['default', 'red', 'cyan'],
545
624
  control: { type: 'select' },
@@ -589,6 +668,11 @@ export const Playground = {
589
668
  description: 'Disabled state',
590
669
  table: { category: 'Item 2' },
591
670
  },
671
+ item2AllowClickWhenDisabled: {
672
+ control: { type: 'boolean' },
673
+ description: 'Keep disabled look but still allow click',
674
+ table: { category: 'Item 2' },
675
+ },
592
676
  item2Color: {
593
677
  options: ['default', 'red', 'cyan'],
594
678
  control: { type: 'select' },
@@ -652,6 +736,12 @@ export const Playground = {
652
736
  table: { category: 'Sub Item' },
653
737
  if: { arg: 'showSubmenu' },
654
738
  },
739
+ subItemAllowClickWhenDisabled: {
740
+ control: { type: 'boolean' },
741
+ description: 'Keep disabled look but still allow click',
742
+ table: { category: 'Sub Item' },
743
+ if: { arg: 'showSubmenu' },
744
+ },
655
745
  },
656
746
  render: (args) => <ItemPlaygroundComponent {...args} />,
657
747
  }
@@ -79,6 +79,7 @@ The \`options\` prop accepts an array of objects with the following types:
79
79
  icon: <Icon />, // Optional, icon displayed before the label
80
80
  onClick: () => {}, // Function called when clicked
81
81
  disabled: false, // Optional, disables the item when true
82
+ allowClickWhenDisabled: false, // Optional, keeps disabled look but still fires onClick (e.g. paywall)
82
83
  keybinding: '⌘C', // Optional, displays a keyboard shortcut
83
84
  rightIcon: <Icon />, // Optional, icon displayed on the right side
84
85
  color: 'red' | 'cyan', // Optional: custom color for this item
@@ -127,6 +128,7 @@ The \`options\` prop accepts an array of objects with the following types:
127
128
  checked: true, // Whether the checkbox is checked (always reserves space for checkmark)
128
129
  onChange: (checked) => {}, // Function called when toggled, receives new checked state
129
130
  disabled: false, // Optional, disables the checkbox when true
131
+ allowClickWhenDisabled: false, // Optional, keeps disabled look but still allows interaction (e.g. paywall)
130
132
  keybinding: '⌘C', // Optional, displays a keyboard shortcut
131
133
  rightIcon: <Icon />, // Optional, icon displayed on the right side
132
134
  color: 'red' | 'cyan', // Optional: custom color for this checkbox item
@@ -559,6 +561,66 @@ export const CustomWithSwitch = {
559
561
  },
560
562
  }
561
563
 
564
+ export const AllowClickWhenDisabled = {
565
+ render: () => {
566
+ const [lastAction, setLastAction] = useState('none yet')
567
+
568
+ const options = [
569
+ {
570
+ type: 'item',
571
+ key: 'edit',
572
+ label: 'Edit',
573
+ onClick: () => setLastAction('Edit'),
574
+ },
575
+ {
576
+ type: 'item',
577
+ key: 'disabled',
578
+ label: 'Disabled (no click)',
579
+ disabled: true,
580
+ onClick: () => setLastAction('Disabled item clicked'),
581
+ },
582
+ {
583
+ type: 'item',
584
+ key: 'premium',
585
+ label: 'Premium feature',
586
+ secondaryText: 'Looks disabled, still clickable',
587
+ secondaryTextPosition: 'bottom',
588
+ disabled: true,
589
+ allowClickWhenDisabled: true,
590
+ onClick: () => setLastAction('Paywall opened'),
591
+ },
592
+ { type: 'separator', key: 'sep1' },
593
+ {
594
+ type: 'checkbox',
595
+ key: 'premium-checkbox',
596
+ label: 'Premium checkbox',
597
+ checked: false,
598
+ disabled: true,
599
+ allowClickWhenDisabled: true,
600
+ onChange: () => setLastAction('Paywall opened from checkbox'),
601
+ },
602
+ ]
603
+
604
+ return (
605
+ <Flex direction="column" gap="2" align="center" height="320px">
606
+ <DropdownMenu
607
+ side="bottom"
608
+ align="end"
609
+ trigger={
610
+ <IconButton>
611
+ <DotsVerticalIcon />
612
+ </IconButton>
613
+ }
614
+ options={options}
615
+ />
616
+ <div style={{ fontSize: '14px', color: '#4b5563' }}>
617
+ Last action: {lastAction}
618
+ </div>
619
+ </Flex>
620
+ )
621
+ },
622
+ }
623
+
562
624
  const ItemPlaygroundComponent = ({
563
625
  size,
564
626
  // Item 1
@@ -570,6 +632,7 @@ const ItemPlaygroundComponent = ({
570
632
  item1Keybinding,
571
633
  item1ShowRightIcon,
572
634
  item1Disabled,
635
+ item1AllowClickWhenDisabled,
573
636
  item1Color,
574
637
  // Item 2
575
638
  item2Type,
@@ -580,6 +643,7 @@ const ItemPlaygroundComponent = ({
580
643
  item2Keybinding,
581
644
  item2ShowRightIcon,
582
645
  item2Disabled,
646
+ item2AllowClickWhenDisabled,
583
647
  item2Color,
584
648
  // Submenu
585
649
  showSubmenu,
@@ -592,6 +656,7 @@ const ItemPlaygroundComponent = ({
592
656
  subItemShowIcon,
593
657
  subItemKeybinding,
594
658
  subItemDisabled,
659
+ subItemAllowClickWhenDisabled,
595
660
  }) => {
596
661
  const [item1IsChecked, setItem1IsChecked] = useState(false)
597
662
  const [item2IsChecked, setItem2IsChecked] = useState(true)
@@ -607,6 +672,7 @@ const ItemPlaygroundComponent = ({
607
672
  keybinding: item1Keybinding || undefined,
608
673
  rightIcon: item1ShowRightIcon ? <DotsVerticalIcon /> : undefined,
609
674
  disabled: item1Disabled,
675
+ allowClickWhenDisabled: item1AllowClickWhenDisabled,
610
676
  color: item1Color === 'default' ? undefined : item1Color,
611
677
  ...(item1Type === 'checkbox'
612
678
  ? {
@@ -628,6 +694,7 @@ const ItemPlaygroundComponent = ({
628
694
  keybinding: item2Keybinding || undefined,
629
695
  rightIcon: item2ShowRightIcon ? <DotsVerticalIcon /> : undefined,
630
696
  disabled: item2Disabled,
697
+ allowClickWhenDisabled: item2AllowClickWhenDisabled,
631
698
  color: item2Color === 'default' ? undefined : item2Color,
632
699
  ...(item2Type === 'checkbox'
633
700
  ? {
@@ -648,6 +715,7 @@ const ItemPlaygroundComponent = ({
648
715
  icon: subItemShowIcon ? <GearIcon /> : undefined,
649
716
  keybinding: subItemKeybinding || undefined,
650
717
  disabled: subItemDisabled,
718
+ allowClickWhenDisabled: subItemAllowClickWhenDisabled,
651
719
  ...(subItemType === 'checkbox'
652
720
  ? {
653
721
  checked: subItemIsChecked,
@@ -712,6 +780,7 @@ export const Playground = {
712
780
  item1Keybinding: '⌘ C',
713
781
  item1ShowRightIcon: true,
714
782
  item1Disabled: false,
783
+ item1AllowClickWhenDisabled: false,
715
784
  item1Color: 'default',
716
785
  // Item 2
717
786
  item2Type: 'checkbox',
@@ -722,6 +791,7 @@ export const Playground = {
722
791
  item2Keybinding: '⌘ S',
723
792
  item2ShowRightIcon: false,
724
793
  item2Disabled: false,
794
+ item2AllowClickWhenDisabled: false,
725
795
  item2Color: 'default',
726
796
  // Submenu
727
797
  showSubmenu: true,
@@ -734,6 +804,7 @@ export const Playground = {
734
804
  subItemShowIcon: false,
735
805
  subItemKeybinding: '',
736
806
  subItemDisabled: false,
807
+ subItemAllowClickWhenDisabled: false,
737
808
  },
738
809
  argTypes: {
739
810
  size: {
@@ -785,6 +856,11 @@ export const Playground = {
785
856
  description: 'Disabled state',
786
857
  table: { category: 'Item 1' },
787
858
  },
859
+ item1AllowClickWhenDisabled: {
860
+ control: { type: 'boolean' },
861
+ description: 'Keep disabled look but still allow click',
862
+ table: { category: 'Item 1' },
863
+ },
788
864
  item1Color: {
789
865
  options: ['default', 'red', 'cyan'],
790
866
  control: { type: 'select' },
@@ -834,6 +910,11 @@ export const Playground = {
834
910
  description: 'Disabled state',
835
911
  table: { category: 'Item 2' },
836
912
  },
913
+ item2AllowClickWhenDisabled: {
914
+ control: { type: 'boolean' },
915
+ description: 'Keep disabled look but still allow click',
916
+ table: { category: 'Item 2' },
917
+ },
837
918
  item2Color: {
838
919
  options: ['default', 'red', 'cyan'],
839
920
  control: { type: 'select' },
@@ -897,6 +978,12 @@ export const Playground = {
897
978
  table: { category: 'Sub Item' },
898
979
  if: { arg: 'showSubmenu' },
899
980
  },
981
+ subItemAllowClickWhenDisabled: {
982
+ control: { type: 'boolean' },
983
+ description: 'Keep disabled look but still allow click',
984
+ table: { category: 'Sub Item' },
985
+ if: { arg: 'showSubmenu' },
986
+ },
900
987
  },
901
988
  render: (args) => <ItemPlaygroundComponent {...args} />,
902
989
  }
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { useRef, useState } from 'react'
2
2
  import {
3
3
  Box,
4
4
  Flex,
@@ -7,7 +7,8 @@ import {
7
7
  Tooltip,
8
8
  Separator,
9
9
  } from '@radix-ui/themes'
10
- import { InfoIcon } from '../../icons'
10
+ import { Select as SelectPrimitive } from 'radix-ui'
11
+ import { CheckIcon, InfoIcon } from '../../icons'
11
12
  import styles from './Select.module.css'
12
13
  import classNames from 'classnames'
13
14
 
@@ -22,17 +23,56 @@ export const Select = ({
22
23
  size = '2',
23
24
  variant = 'soft',
24
25
  disabled = false,
26
+ allowClickWhenDisabled = false,
25
27
  readOnly = false,
26
28
  maxHeight = 'auto',
27
29
  showSelectIndicator = true,
28
30
  maxWidth = '100%',
29
31
  placeholder = null,
32
+ onFocus,
33
+ onOpenChange,
30
34
  ...props
31
35
  }) => {
32
36
  const resolvedValue = value === null ? '' : value
33
37
  const resolvedDefaultValue =
34
38
  defaultValue === null ? undefined : defaultValue
35
39
 
40
+ const isDisabled = Boolean(disabled)
41
+ const isDisabledClickable = isDisabled && Boolean(allowClickWhenDisabled)
42
+ const isRadixDisabled = (isDisabled && !allowClickWhenDisabled) || readOnly
43
+
44
+ const [open, setOpen] = useState(false)
45
+ const suppressCloseRef = useRef(false)
46
+
47
+ const handleOpenChange = (nextOpen) => {
48
+ if (!isDisabledClickable) {
49
+ onOpenChange?.(nextOpen)
50
+ return
51
+ }
52
+
53
+ if (nextOpen) {
54
+ setOpen(true)
55
+ onOpenChange?.(true)
56
+ // Keep menu open while onFocus runs (e.g. alert/paywall steals focus).
57
+ suppressCloseRef.current = true
58
+ setTimeout(() => {
59
+ onFocus?.()
60
+ setTimeout(() => {
61
+ suppressCloseRef.current = false
62
+ }, 50)
63
+ }, 0)
64
+ return
65
+ }
66
+
67
+ if (suppressCloseRef.current) {
68
+ setOpen(true)
69
+ return
70
+ }
71
+
72
+ setOpen(false)
73
+ onOpenChange?.(false)
74
+ }
75
+
36
76
  return (
37
77
  <Box width="100%">
38
78
  {title && (
@@ -53,8 +93,10 @@ export const Select = ({
53
93
  defaultValue={resolvedDefaultValue}
54
94
  value={resolvedValue}
55
95
  className={classNames(className)}
56
- disabled={disabled || readOnly}
57
96
  {...props}
97
+ disabled={isRadixDisabled}
98
+ open={isDisabledClickable ? open : props.open}
99
+ onOpenChange={handleOpenChange}
58
100
  >
59
101
  <SelectRadix.Trigger
60
102
  variant={variant}
@@ -64,6 +106,7 @@ export const Select = ({
64
106
  className={classNames(styles.selectTrigger, {
65
107
  [styles.ghost]: variant === 'ghost',
66
108
  [styles.soft]: variant === 'soft',
109
+ [styles.triggerDisabled]: isDisabledClickable,
67
110
  })}
68
111
  />
69
112
  <SelectRadix.Content
@@ -72,52 +115,86 @@ export const Select = ({
72
115
  style={{ height: maxHeight }}
73
116
  >
74
117
  <SelectRadix.Group>
75
- {items.map((item) =>
76
- item.type === 'separator' ? (
77
- <Separator
78
- key={item.value}
79
- my="2"
80
- style={{
81
- width: '100%',
82
- background: 'var(--neutral-alpha-4)',
83
- }}
84
- />
85
- ) : (
86
- <SelectRadix.Item
118
+ {items.map((item) => {
119
+ if (item.type === 'separator') {
120
+ return (
121
+ <Separator
122
+ key={item.value}
123
+ my="2"
124
+ style={{
125
+ width: '100%',
126
+ background: 'var(--neutral-alpha-4)',
127
+ }}
128
+ />
129
+ )
130
+ }
131
+
132
+ const itemDisabled =
133
+ isDisabledClickable || Boolean(item.disabled) || readOnly
134
+
135
+ return (
136
+ <SelectPrimitive.Item
87
137
  key={item.value}
88
138
  value={item.value}
89
- className={classNames(styles.selectItem, {
139
+ className={classNames('rt-SelectItem', styles.selectItem, {
90
140
  [styles.hideIndicator]: !showSelectIndicator,
91
141
  [styles.size1]: size === '1',
92
142
  [styles.size2]: size === '2',
93
143
  })}
94
- disabled={disabled || readOnly}
144
+ disabled={itemDisabled}
95
145
  >
96
- <span className={styles.itemLabel}>
97
- <Text size={size} style={{ color: 'var(--neutral-12)' }}>
98
- {item.label}
99
- </Text>
100
- {item.aiDetected && (
101
- <span className={styles.aiDetected} aria-hidden>
102
-
103
- </span>
104
- )}
105
- {item.extra && (
146
+ <SelectPrimitive.ItemIndicator className="rt-SelectItemIndicator">
147
+ <CheckIcon
148
+ className="rt-SelectItemIndicatorIcon"
149
+ width={16}
150
+ height={16}
151
+ />
152
+ </SelectPrimitive.ItemIndicator>
153
+ <SelectPrimitive.ItemText className={styles.itemText}>
154
+ <span className={styles.itemLabel}>
106
155
  <Text
107
156
  size={size}
108
- className={styles.extra}
109
157
  style={{
110
- color: 'var(--neutral-alpha-9)',
158
+ color: itemDisabled
159
+ ? 'var(--neutral-alpha-9)'
160
+ : 'var(--neutral-12)',
111
161
  }}
112
162
  >
113
- {' '}
114
- {item.extra}
163
+ {item.label}
115
164
  </Text>
116
- )}
117
- </span>
118
- </SelectRadix.Item>
119
- ),
120
- )}
165
+ {item.aiDetected && (
166
+ <span className={styles.aiDetected} aria-hidden>
167
+
168
+ </span>
169
+ )}
170
+ {item.extra && (
171
+ <Text
172
+ size={size}
173
+ className={styles.extra}
174
+ style={{
175
+ color: 'var(--neutral-alpha-9)',
176
+ }}
177
+ >
178
+ {' '}
179
+ {item.extra}
180
+ </Text>
181
+ )}
182
+ </span>
183
+ </SelectPrimitive.ItemText>
184
+ {item.rightIcon && (
185
+ <span className={styles.rightSlot}>
186
+ <span
187
+ className={classNames(styles.rightIcon, {
188
+ [styles.rightIconDisabled]: itemDisabled,
189
+ })}
190
+ >
191
+ {item.rightIcon}
192
+ </span>
193
+ </span>
194
+ )}
195
+ </SelectPrimitive.Item>
196
+ )
197
+ })}
121
198
  </SelectRadix.Group>
122
199
  </SelectRadix.Content>
123
200
  </SelectRadix.Root>
@@ -75,7 +75,7 @@
75
75
  .selectTrigger.soft {
76
76
  background-color: var(--neutral-alpha-2) ;
77
77
 
78
- &:hover:not([disabled]) {
78
+ &:hover:not([disabled]):not(.triggerDisabled) {
79
79
  background-color: var(--neutral-alpha-3);
80
80
  }
81
81
  }
@@ -92,7 +92,7 @@
92
92
  .selectTrigger.ghost {
93
93
  background-color: transparent;
94
94
 
95
- &:hover:not([disabled]) {
95
+ &:hover:not([disabled]):not(.triggerDisabled) {
96
96
  background-color: var(--neutral-alpha-2);
97
97
  }
98
98
  }
@@ -102,6 +102,8 @@
102
102
 
103
103
  /* List items */
104
104
  .selectItem {
105
+ width: 100%;
106
+ padding-right: 12px;
105
107
  &:hover {
106
108
  background-color: var(--neutral-alpha-2);
107
109
  }
@@ -115,19 +117,31 @@
115
117
  /* Disabled styles */
116
118
  .selectTrigger.soft {
117
119
  color: var(--white);
118
- &:disabled {
120
+ &:disabled,
121
+ &.triggerDisabled {
119
122
  color: var(--neutral-alpha-9);
120
123
  background-color: var(--neutral-alpha-2);
121
- }}
124
+ }
125
+ }
122
126
 
123
127
  .selectTrigger.ghost {
124
128
  color: var(--white);
125
- &:disabled {
129
+ &:disabled,
130
+ &.triggerDisabled {
126
131
  color: var(--neutral-alpha-9);
127
132
  background-color: transparent;
128
133
  }
129
134
  }
130
135
 
136
+ .selectTrigger.soft.triggerDisabled[aria-expanded='true'],
137
+ .selectTrigger.ghost.triggerDisabled[aria-expanded='true'] {
138
+ background-color: var(--neutral-alpha-2);
139
+ }
140
+
141
+ .selectTrigger.ghost.triggerDisabled[aria-expanded='true'] {
142
+ background-color: transparent;
143
+ }
144
+
131
145
  .hideIndicator :global(.rt-SelectItemIndicator) {
132
146
  display: none;
133
147
  }
@@ -147,8 +161,44 @@
147
161
  padding: 12px 15px;
148
162
  }
149
163
 
164
+ .itemText {
165
+ flex: 1;
166
+ min-width: 0;
167
+ }
168
+
150
169
  .itemLabel {
151
170
  line-height: 1;
171
+ min-width: 0;
172
+ }
173
+
174
+ .rightSlot {
175
+ margin-left: auto;
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 8px;
179
+ flex-shrink: 0;
180
+ height: 18px;
181
+ color: var(--neutral-alpha-11);
182
+ }
183
+
184
+ .rightIcon {
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ color: var(--neutral-alpha-11);
189
+ }
190
+
191
+ .rightIcon > svg {
192
+ width: 14px;
193
+ height: 14px;
194
+ }
195
+
196
+ .rightIconDisabled {
197
+ color: var(--neutral-alpha-7);
198
+ }
199
+
200
+ .rightIconDisabled > svg {
201
+ color: var(--neutral-alpha-7);
152
202
  }
153
203
 
154
204
  .aiDetected {