reshaped 3.8.0-canary.6 → 3.8.0-canary.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.
Files changed (223) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/bundle.css +1 -1
  3. package/dist/bundle.js +10 -10
  4. package/dist/components/Actionable/Actionable.module.css +1 -1
  5. package/dist/components/Alert/tests/Alert.stories.d.ts +6 -5
  6. package/dist/components/Alert/tests/Alert.stories.js +15 -2
  7. package/dist/components/Badge/Badge.module.css +1 -1
  8. package/dist/components/Badge/tests/Badge.stories.d.ts +5 -0
  9. package/dist/components/Badge/tests/Badge.stories.js +34 -0
  10. package/dist/components/Breadcrumbs/tests/Breadcrumbs.stories.d.ts +8 -4
  11. package/dist/components/Breadcrumbs/tests/Breadcrumbs.stories.js +57 -1
  12. package/dist/components/Button/tests/Button.stories.d.ts +54 -12
  13. package/dist/components/Button/tests/Button.stories.js +725 -588
  14. package/dist/components/Card/Card.module.css +1 -1
  15. package/dist/components/Card/tests/Card.stories.d.ts +28 -6
  16. package/dist/components/Card/tests/Card.stories.js +110 -65
  17. package/dist/components/Carousel/Carousel.module.css +1 -1
  18. package/dist/components/Checkbox/Checkbox.module.css +1 -1
  19. package/dist/components/Checkbox/tests/Checkbox.stories.d.ts +20 -4
  20. package/dist/components/Checkbox/tests/Checkbox.stories.js +150 -79
  21. package/dist/components/CheckboxGroup/tests/CheckboxGroup.stories.d.ts +9 -2
  22. package/dist/components/CheckboxGroup/tests/CheckboxGroup.stories.js +67 -35
  23. package/dist/components/Container/tests/Container.stories.d.ts +2 -0
  24. package/dist/components/Container/tests/Container.stories.js +14 -0
  25. package/dist/components/ContextMenu/tests/ContextMenu.stories.d.ts +10 -1
  26. package/dist/components/ContextMenu/tests/ContextMenu.stories.js +57 -13
  27. package/dist/components/Dismissible/tests/Dismissible.stories.d.ts +5 -0
  28. package/dist/components/Dismissible/tests/Dismissible.stories.js +30 -1
  29. package/dist/components/Divider/tests/Divider.stories.d.ts +8 -3
  30. package/dist/components/Divider/tests/Divider.stories.js +71 -41
  31. package/dist/components/DropdownMenu/DropdownMenu.js +4 -4
  32. package/dist/components/DropdownMenu/DropdownMenu.types.d.ts +2 -2
  33. package/dist/components/DropdownMenu/tests/DropdownMenu.stories.d.ts +35 -6
  34. package/dist/components/DropdownMenu/tests/DropdownMenu.stories.js +222 -115
  35. package/dist/components/DropdownMenu/tests/DropdownMenu.test.stories.d.ts +0 -15
  36. package/dist/components/DropdownMenu/tests/DropdownMenu.test.stories.js +0 -106
  37. package/dist/components/FileUpload/FileUpload.module.css +1 -1
  38. package/dist/components/Flyout/Flyout.module.css +1 -1
  39. package/dist/components/Flyout/utilities/flyout.js +0 -1
  40. package/dist/components/Flyout/utilities/getPositionFallbacks.js +3 -3
  41. package/dist/components/Flyout/utilities/isFullyVisible.d.ts +0 -2
  42. package/dist/components/Flyout/utilities/isFullyVisible.js +5 -7
  43. package/dist/components/FormControl/tests/FormControl.stories.d.ts +2 -0
  44. package/dist/components/FormControl/tests/FormControl.stories.js +35 -0
  45. package/dist/components/Hidden/Hidden.js +2 -1
  46. package/dist/components/Hidden/tests/Hidden.stories.d.ts +2 -0
  47. package/dist/components/Hidden/tests/Hidden.stories.js +9 -0
  48. package/dist/components/HiddenVisually/tests/HiddenVisually.stories.d.ts +2 -0
  49. package/dist/components/HiddenVisually/tests/HiddenVisually.stories.js +9 -0
  50. package/dist/components/Hotkey/tests/Hotkey.stories.d.ts +2 -0
  51. package/dist/components/Hotkey/tests/Hotkey.stories.js +15 -0
  52. package/dist/components/Icon/tests/Icon.stories.d.ts +3 -0
  53. package/dist/components/Icon/tests/Icon.stories.js +23 -0
  54. package/dist/components/Link/tests/Link.stories.d.ts +28 -5
  55. package/dist/components/Link/tests/Link.stories.js +141 -58
  56. package/dist/components/Link/tests/Link.test.stories.d.ts +0 -13
  57. package/dist/components/Link/tests/Link.test.stories.js +0 -85
  58. package/dist/components/Loader/tests/Loader.stories.d.ts +11 -2
  59. package/dist/components/Loader/tests/Loader.stories.js +52 -25
  60. package/dist/components/Loader/tests/Loader.test.stories.d.ts +0 -3
  61. package/dist/components/Loader/tests/Loader.test.stories.js +0 -21
  62. package/dist/components/MenuItem/MenuItem.module.css +1 -1
  63. package/dist/components/MenuItem/tests/MenuItem.stories.d.ts +37 -7
  64. package/dist/components/MenuItem/tests/MenuItem.stories.js +218 -112
  65. package/dist/components/Modal/Modal.js +1 -1
  66. package/dist/components/Modal/Modal.module.css +1 -1
  67. package/dist/components/Modal/tests/Modal.stories.d.ts +53 -10
  68. package/dist/components/Modal/tests/Modal.stories.js +366 -214
  69. package/dist/components/Overlay/tests/Overlay.stories.d.ts +15 -1
  70. package/dist/components/Overlay/tests/Overlay.stories.js +135 -1
  71. package/dist/components/Pagination/tests/Pagination.stories.d.ts +14 -1
  72. package/dist/components/Pagination/tests/Pagination.stories.js +93 -15
  73. package/dist/components/PinField/tests/PinField.stories.d.ts +1 -1
  74. package/dist/components/PinField/tests/PinField.stories.js +1 -1
  75. package/dist/components/Popover/Popover.js +2 -2
  76. package/dist/components/Popover/Popover.module.css +1 -1
  77. package/dist/components/Popover/Popover.types.d.ts +2 -0
  78. package/dist/components/Progress/tests/Progress.stories.d.ts +19 -4
  79. package/dist/components/Progress/tests/Progress.stories.js +85 -49
  80. package/dist/components/Radio/Radio.module.css +1 -1
  81. package/dist/components/Radio/tests/Radio.stories.d.ts +25 -4
  82. package/dist/components/Radio/tests/Radio.stories.js +147 -65
  83. package/dist/components/RadioGroup/tests/RadioGroup.stories.d.ts +9 -2
  84. package/dist/components/RadioGroup/tests/RadioGroup.stories.js +64 -38
  85. package/dist/components/Reshaped/Reshaped.css +1 -1
  86. package/dist/components/Resizable/Resizable.js +4 -3
  87. package/dist/components/Scrim/tests/Scrim.stories.d.ts +10 -2
  88. package/dist/components/Scrim/tests/Scrim.stories.js +51 -31
  89. package/dist/components/ScrollArea/ScrollArea.module.css +1 -1
  90. package/dist/components/Select/Select.d.ts +8 -1
  91. package/dist/components/Select/Select.js +22 -48
  92. package/dist/components/Select/Select.module.css +1 -1
  93. package/dist/components/Select/Select.types.d.ts +83 -38
  94. package/dist/components/Select/SelectCustom.d.ts +3 -0
  95. package/dist/components/Select/SelectCustom.js +12 -0
  96. package/dist/components/Select/SelectCustomControlled.d.ts +4 -0
  97. package/dist/components/Select/SelectCustomControlled.js +102 -0
  98. package/dist/components/Select/SelectCustomUncontrolled.d.ts +4 -0
  99. package/dist/components/Select/SelectCustomUncontrolled.js +18 -0
  100. package/dist/components/Select/SelectEndContent.d.ts +3 -0
  101. package/dist/components/Select/SelectEndContent.js +12 -0
  102. package/dist/components/Select/SelectNative.d.ts +4 -0
  103. package/dist/components/Select/SelectNative.js +29 -0
  104. package/dist/components/Select/SelectOption.d.ts +4 -0
  105. package/dist/components/Select/SelectOption.js +15 -0
  106. package/dist/components/Select/SelectOptionGroup.d.ts +4 -0
  107. package/dist/components/Select/SelectOptionGroup.js +11 -0
  108. package/dist/components/Select/SelectRoot.d.ts +4 -0
  109. package/dist/components/Select/SelectRoot.js +21 -0
  110. package/dist/components/Select/SelectStartContent.d.ts +3 -0
  111. package/dist/components/Select/SelectStartContent.js +20 -0
  112. package/dist/components/Select/SelectTrigger.d.ts +4 -0
  113. package/dist/components/Select/SelectTrigger.js +16 -0
  114. package/dist/components/Select/tests/Select.stories.d.ts +38 -10
  115. package/dist/components/Select/tests/Select.stories.js +504 -175
  116. package/dist/components/Skeleton/tests/Skeleton.stories.d.ts +10 -2
  117. package/dist/components/Skeleton/tests/Skeleton.stories.js +46 -28
  118. package/dist/components/Slider/Slider.module.css +1 -1
  119. package/dist/components/Stepper/Stepper.js +2 -2
  120. package/dist/components/Stepper/Stepper.types.d.ts +2 -0
  121. package/dist/components/Stepper/tests/Stepper.stories.d.ts +18 -3
  122. package/dist/components/Stepper/tests/Stepper.stories.js +99 -47
  123. package/dist/components/Switch/Switch.module.css +1 -1
  124. package/dist/components/Switch/tests/Switch.stories.d.ts +10 -2
  125. package/dist/components/Switch/tests/Switch.stories.js +77 -23
  126. package/dist/components/Switch/tests/Switch.test.stories.d.ts +0 -10
  127. package/dist/components/Switch/tests/Switch.test.stories.js +0 -68
  128. package/dist/components/Table/Table.js +6 -3
  129. package/dist/components/Table/Table.module.css +1 -1
  130. package/dist/components/Table/tests/Table.stories.d.ts +25 -5
  131. package/dist/components/Table/tests/Table.stories.js +274 -177
  132. package/dist/components/Table/tests/Table.test.stories.d.ts +0 -5
  133. package/dist/components/Table/tests/Table.test.stories.js +0 -82
  134. package/dist/components/Tabs/Tabs.module.css +1 -1
  135. package/dist/components/TextArea/TextArea.module.css +1 -1
  136. package/dist/components/TextArea/tests/TextArea.stories.d.ts +41 -9
  137. package/dist/components/TextArea/tests/TextArea.stories.js +179 -93
  138. package/dist/components/TextField/TextField.js +1 -1
  139. package/dist/components/TextField/TextField.module.css +1 -1
  140. package/dist/components/TextField/tests/TextField.stories.d.ts +41 -11
  141. package/dist/components/TextField/tests/TextField.stories.js +206 -132
  142. package/dist/components/TextField/tests/TextField.test.stories.d.ts +0 -13
  143. package/dist/components/TextField/tests/TextField.test.stories.js +0 -88
  144. package/dist/components/Theme/Theme.module.css +1 -1
  145. package/dist/components/Timeline/Timeline.js +3 -2
  146. package/dist/components/Timeline/tests/Timeline.stories.d.ts +10 -2
  147. package/dist/components/Timeline/tests/Timeline.stories.js +69 -45
  148. package/dist/components/Timeline/tests/Timeline.test.stories.d.ts +0 -2
  149. package/dist/components/Timeline/tests/Timeline.test.stories.js +0 -21
  150. package/dist/components/Toast/tests/Toast.stories.d.ts +32 -8
  151. package/dist/components/Toast/tests/Toast.stories.js +109 -37
  152. package/dist/components/Tooltip/tests/Tooltip.stories.d.ts +18 -4
  153. package/dist/components/Tooltip/tests/Tooltip.stories.js +139 -107
  154. package/dist/components/Tooltip/tests/Tooltip.test.stories.d.ts +0 -6
  155. package/dist/components/Tooltip/tests/Tooltip.test.stories.js +0 -29
  156. package/dist/components/View/View.js +6 -4
  157. package/dist/components/View/tests/View.stories.d.ts +4 -0
  158. package/dist/components/View/tests/View.stories.js +39 -0
  159. package/dist/hooks/tests/useDrag.stories.js +1 -1
  160. package/dist/utilities/props.d.ts +3 -0
  161. package/dist/utilities/props.js +19 -0
  162. package/dist/utilities/scroll/disable.js +2 -2
  163. package/package.json +1 -1
  164. package/dist/components/Alert/tests/Alert.test.stories.d.ts +0 -15
  165. package/dist/components/Alert/tests/Alert.test.stories.js +0 -26
  166. package/dist/components/Badge/tests/Badge.test.stories.d.ts +0 -20
  167. package/dist/components/Badge/tests/Badge.test.stories.js +0 -46
  168. package/dist/components/Breadcrumbs/tests/Breadcrumbs.test.stories.d.ts +0 -23
  169. package/dist/components/Breadcrumbs/tests/Breadcrumbs.test.stories.js +0 -76
  170. package/dist/components/Button/tests/Button.test.stories.d.ts +0 -28
  171. package/dist/components/Button/tests/Button.test.stories.js +0 -135
  172. package/dist/components/Card/tests/Card.test.stories.d.ts +0 -35
  173. package/dist/components/Card/tests/Card.test.stories.js +0 -54
  174. package/dist/components/Checkbox/tests/Checkbox.test.stories.d.ts +0 -25
  175. package/dist/components/Checkbox/tests/Checkbox.test.stories.js +0 -104
  176. package/dist/components/CheckboxGroup/tests/CheckboxGroup.test.stories.d.ts +0 -22
  177. package/dist/components/CheckboxGroup/tests/CheckboxGroup.test.stories.js +0 -78
  178. package/dist/components/Container/tests/Container.test.stories.d.ts +0 -15
  179. package/dist/components/Container/tests/Container.test.stories.js +0 -26
  180. package/dist/components/ContextMenu/tests/ContextMenu.test.stories.d.ts +0 -25
  181. package/dist/components/ContextMenu/tests/ContextMenu.test.stories.js +0 -53
  182. package/dist/components/Dismissible/tests/Dismissible.test.stories.d.ts +0 -19
  183. package/dist/components/Dismissible/tests/Dismissible.test.stories.js +0 -42
  184. package/dist/components/Divider/tests/Divider.test.stories.d.ts +0 -18
  185. package/dist/components/Divider/tests/Divider.test.stories.js +0 -47
  186. package/dist/components/FormControl/tests/FormControl.test.stories.d.ts +0 -20
  187. package/dist/components/FormControl/tests/FormControl.test.stories.js +0 -49
  188. package/dist/components/Hidden/tests/Hidden.test.stories.d.ts +0 -15
  189. package/dist/components/Hidden/tests/Hidden.test.stories.js +0 -20
  190. package/dist/components/HiddenVisually/tests/HiddenVisually.test.stories.d.ts +0 -15
  191. package/dist/components/HiddenVisually/tests/HiddenVisually.test.stories.js +0 -20
  192. package/dist/components/Hotkey/tests/Hotkey.test.stories.d.ts +0 -15
  193. package/dist/components/Hotkey/tests/Hotkey.test.stories.js +0 -26
  194. package/dist/components/Icon/tests/Icon.test.stories.d.ts +0 -16
  195. package/dist/components/Icon/tests/Icon.test.stories.js +0 -35
  196. package/dist/components/MenuItem/tests/MenuItem.test.stories.d.ts +0 -27
  197. package/dist/components/MenuItem/tests/MenuItem.test.stories.js +0 -116
  198. package/dist/components/Modal/tests/Modal.test.stories.d.ts +0 -31
  199. package/dist/components/Modal/tests/Modal.test.stories.js +0 -149
  200. package/dist/components/Overlay/tests/Overlay.test.stories.d.ts +0 -28
  201. package/dist/components/Overlay/tests/Overlay.test.stories.js +0 -148
  202. package/dist/components/Pagination/tests/Pagination.test.stories.d.ts +0 -23
  203. package/dist/components/Pagination/tests/Pagination.test.stories.js +0 -86
  204. package/dist/components/Progress/tests/Progress.test.stories.d.ts +0 -16
  205. package/dist/components/Progress/tests/Progress.test.stories.js +0 -35
  206. package/dist/components/Radio/tests/Radio.test.stories.d.ts +0 -30
  207. package/dist/components/Radio/tests/Radio.test.stories.js +0 -118
  208. package/dist/components/RadioGroup/tests/RadioGroup.test.stories.d.ts +0 -22
  209. package/dist/components/RadioGroup/tests/RadioGroup.test.stories.js +0 -78
  210. package/dist/components/Scrim/tests/Scrim.test.stories.d.ts +0 -15
  211. package/dist/components/Scrim/tests/Scrim.test.stories.js +0 -25
  212. package/dist/components/Select/tests/Select.test.stories.d.ts +0 -27
  213. package/dist/components/Select/tests/Select.test.stories.js +0 -132
  214. package/dist/components/Skeleton/tests/Skeleton.test.stories.d.ts +0 -15
  215. package/dist/components/Skeleton/tests/Skeleton.test.stories.js +0 -23
  216. package/dist/components/Stepper/tests/Stepper.test.stories.d.ts +0 -20
  217. package/dist/components/Stepper/tests/Stepper.test.stories.js +0 -28
  218. package/dist/components/TextArea/tests/TextArea.test.stories.d.ts +0 -28
  219. package/dist/components/TextArea/tests/TextArea.test.stories.js +0 -99
  220. package/dist/components/Toast/tests/Toast.test.stories.d.ts +0 -16
  221. package/dist/components/Toast/tests/Toast.test.stories.js +0 -101
  222. package/dist/components/View/tests/View.test.stories.d.ts +0 -24
  223. package/dist/components/View/tests/View.test.stories.js +0 -50
@@ -1 +1 @@
1
- .root{background:var(--rs-color-background-elevation-base);border:1px solid var(--rs-color-border-neutral);display:flex;overflow:hidden;padding:calc(var(--rs-unit-x1) - 1px) 0;position:relative;z-index:0}.root:focus-within{border-color:var(--rs-color-border-primary);box-shadow:0 0 0 1px var(--rs-color-border-primary)}.input{align-items:center;-webkit-appearance:none;appearance:none;background:none;border:0;box-sizing:border-box;color:var(--rs-color-foreground-neutral);cursor:pointer;display:flex;flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);outline:none;padding-inline-end:calc(var(--rs-select-chevron-size) + var(--rs-select-gap) * 2 + var(--rs-unit-x1));padding-inline-start:var(--rs-select-gap);position:relative;text-overflow:ellipsis;width:100%;z-index:1}.input::-ms-expand{display:none}.slot{align-items:center;display:flex;flex-shrink:0;padding-inline-start:var(--rs-select-gap);position:relative;z-index:5}.input .slot{padding-inline-end:var(--rs-select-gap);padding-inline-start:0}.arrow{color:var(--rs-color-foreground-neutral-faded);display:flex;inset-block-start:50%;inset-inline-end:var(--rs-select-gap);pointer-events:none;position:absolute;transform:translateY(-50%);z-index:5}.--size-small{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-small .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:0}.--size-medium{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-medium .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-large{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-large .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x2)}.--size-xlarge{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-xlarge .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded);border-color:transparent}.root.--variant-faded:focus-within{border-color:var(--rs-color-border-primary)}.root.--variant-headless{background:transparent;border-color:transparent}.root.--variant-headless.--status-error,.root.--variant-headless.--status-error:focus-within,.root.--variant-headless:focus-within{border-color:transparent;box-shadow:none}.root.--status-error{border-color:var(--rs-color-border-critical)}.root.--status-error:focus-within{border-color:var(--rs-color-border-primary)}.root.--placeholder .input{color:var(--rs-color-foreground-disabled)}.root.--disabled{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled .arrow,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-2)!important}}@media (--rs-viewport-m ){.--size-small--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-small--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:0}.--size-medium--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-medium--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-large--m{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-large--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x2)}.--size-xlarge--m{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-xlarge--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}}@media (--rs-viewport-l ){.--size-small--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-small--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:0}.--size-medium--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-medium--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-large--l{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-large--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x2)}.--size-xlarge--l{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-xlarge--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}}@media (--rs-viewport-xl ){.--size-small--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-small--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:0}.--size-medium--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);border-radius:var(--rs-radius-small)}.--size-medium--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-large--xl{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-large--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x2)}.--size-xlarge--xl{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);border-radius:var(--rs-radius-medium)}.--size-xlarge--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}}
1
+ .root{background:var(--rs-color-background-elevation-base);display:flex;overflow:hidden;position:relative;z-index:0}.root,.root:after{border-radius:var(--rs-select-radius)}.root:after{box-shadow:0 0 0 1px var(--rs-color-border-neutral) inset;content:"";inset:0;pointer-events:none;position:absolute}[data-rs-keyboard] .root:focus-within:after{box-shadow:0 0 0 2px var(--rs-color-border-primary) inset}.input{align-items:center;-webkit-appearance:none;appearance:none;background:none;border:0;box-sizing:border-box;color:var(--rs-color-foreground-neutral);cursor:pointer;display:flex;flex-grow:1;font-family:var(--rs-font-family-body);font-weight:var(--rs-font-weight-regular);outline:none;padding-inline-end:calc(var(--rs-select-chevron-size) + var(--rs-select-gap) * 2 + var(--rs-unit-x1));padding-inline-start:var(--rs-select-gap);position:relative;text-overflow:ellipsis;width:100%;z-index:1}.input::-ms-expand{display:none}.input.input--placeholder{color:var(--rs-color-foreground-disabled)}.slot{align-items:center;display:flex;flex-shrink:0;padding-inline-start:var(--rs-select-gap);position:relative;z-index:5}.input .slot{padding-inline-end:var(--rs-select-gap);padding-inline-start:0}.arrow{color:var(--rs-color-foreground-neutral-faded);display:flex;inset-block-start:50%;inset-inline-end:var(--rs-select-gap);pointer-events:none;position:absolute;transform:translateY(-50%);z-index:5}.--size-small{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}.root.--variant-faded{background:var(--rs-color-background-neutral-faded)}.root.--variant-faded:after{box-shadow:none}.root.--variant-faded:focus-within{border-color:var(--rs-color-border-primary)}.root.--variant-headless{background:transparent}.root.--variant-headless:after{box-shadow:none}.root.--variant-headless.--status-error,.root.--variant-headless.--status-error:focus-within,.root.--variant-headless:focus-within{border-color:transparent}.root.--variant-headless.--status-error:after,.root.--variant-headless.--status-error:focus-within:after,.root.--variant-headless:focus-within:after{box-shadow:none}.root.--status-error:after{box-shadow:0 0 0 2px var(--rs-color-border-critical) inset}.root.--disabled{background:var(--rs-color-background-disabled-faded);border-color:var(--rs-color-border-disabled)}.root.--disabled:after{box-shadow:0 0 0 1px var(--rs-color-border-disabled) inset}.root.--disabled .arrow,.root.--disabled .input{color:var(--rs-color-foreground-disabled);cursor:not-allowed}@media (--rs-viewport-s ) and (hover:none){.input{font-size:var(--rs-font-size-body-2)!important}}@media (--rs-viewport-m ){.--size-small--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--m{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--m .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--m{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--m{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--m .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}@media (--rs-viewport-l ){.--size-small--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--l{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--l .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--l{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--l{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--l .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}@media (--rs-viewport-xl ){.--size-small--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-small--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x1)}.--size-medium--xl{--rs-select-gap:var(--rs-unit-x2);--rs-select-chevron-size:var(--rs-unit-x4);--rs-select-radius:var(--rs-radius-small)}.--size-medium--xl .input{font-size:var(--rs-font-size-body-3);letter-spacing:var(--rs-letter-spacing-body-3);line-height:var(--rs-line-height-body-3);padding-block:var(--rs-unit-x2)}.--size-large--xl{--rs-select-gap:var(--rs-unit-x3);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-large--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x3)}.--size-xlarge--xl{--rs-select-gap:var(--rs-unit-x4);--rs-select-chevron-size:var(--rs-unit-x5);--rs-select-radius:var(--rs-radius-medium)}.--size-xlarge--xl .input{font-size:var(--rs-font-size-body-2);letter-spacing:var(--rs-letter-spacing-body-2);line-height:var(--rs-line-height-body-2);padding-block:var(--rs-unit-x4)}}
@@ -1,10 +1,11 @@
1
1
  import React from "react";
2
2
  import type * as G from "../../types/global";
3
- import type { FormControlProps } from "../FormControl";
4
- import type { ActionableProps } from "../Actionable";
5
3
  import type { IconProps } from "../Icon";
4
+ import type { ActionableProps } from "../Actionable";
5
+ import type { MenuItemProps } from "../MenuItem";
6
+ import { DropdownMenuProps } from "../DropdownMenu";
6
7
  type Size = G.Responsive<"small" | "medium" | "large" | "xlarge">;
7
- type Option = {
8
+ type NativeOption = {
8
9
  /** Option text label */
9
10
  label: string;
10
11
  /** Option value used in the form submission */
@@ -12,40 +13,14 @@ type Option = {
12
13
  /** Disable the option from the selection */
13
14
  disabled?: boolean;
14
15
  };
15
- export type ButtonTriggerProps = {
16
- /** Callback when the button is clicked */
17
- onClick?: () => void;
18
- /** Node for inserting children */
19
- children?: React.ReactNode;
20
- /** Additional attributes for the input element */
21
- inputAttributes?: ActionableProps["attributes"];
22
- /** Callback when the input is focused */
23
- onFocus?: (e: React.FocusEvent<HTMLButtonElement>) => void;
24
- /** Callback when the input is blurred */
25
- onBlur?: (e: React.FocusEvent<HTMLButtonElement>) => void;
26
- /** Options for the select */
27
- options?: never;
28
- /** Callback when the input value changes */
29
- onChange?: never;
16
+ export type OptionProps = Pick<MenuItemProps, "attributes" | "children" | "className" | "disabled" | "endSlot" | "startSlot" | "icon" | "onClick"> & {
17
+ value: string;
30
18
  };
31
- export type SelectTriggerProps = {
32
- /** Options for the select */
33
- options: Option[];
34
- /** Callback when the input value changes */
35
- onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
36
- /** Callback when the input is focused */
37
- onFocus?: (e: React.FocusEvent<HTMLSelectElement>) => void;
38
- /** Callback when the input is blurred */
39
- onBlur?: (e: React.FocusEvent<HTMLSelectElement>) => void;
40
- /** Additional attributes for the input element */
41
- inputAttributes?: G.Attributes<"select">;
42
- /** Callback when the button is clicked */
43
- onClick?: never;
44
- /** Node for inserting children */
45
- children?: never;
19
+ export type OptionGroupProps = {
20
+ label: string;
21
+ children: React.ReactNode;
46
22
  };
47
- type BaseProps = ((ButtonTriggerProps | SelectTriggerProps) & Pick<FormControlProps, "hasError">) & {
48
- /** Unique identifier for the select */
23
+ type BaseFragment = {
49
24
  id?: string;
50
25
  /** Name of the input element */
51
26
  name: string;
@@ -61,18 +36,88 @@ type BaseProps = ((ButtonTriggerProps | SelectTriggerProps) & Pick<FormControlPr
61
36
  icon?: IconProps["svg"];
62
37
  /** Node for inserting content before the select value */
63
38
  startSlot?: React.ReactNode;
39
+ /** Show an error state, automatically inherited when component is used inside FormControl */
40
+ hasError?: boolean;
41
+ /** Callback when the trigger is clicked */
42
+ onClick?: ActionableProps["onClick"];
64
43
  /** Additional classname for the root element */
65
44
  className?: G.ClassName;
66
45
  /** Additional attributes for the root element */
67
46
  attributes?: G.Attributes<"div">;
47
+ /** Node for inserting children */
48
+ children?: React.ReactNode;
68
49
  };
69
- export type ControlledProps = BaseProps & {
50
+ export type CustomFragment = {
51
+ /** Options for the select */
52
+ options?: never;
53
+ /** Callback when the input is focused */
54
+ onFocus?: (e: React.FocusEvent<HTMLButtonElement>) => void;
55
+ /** Callback when the input is blurred */
56
+ onBlur?: (e: React.FocusEvent<HTMLButtonElement>) => void;
57
+ /** Additional attributes for the trigger element */
58
+ inputAttributes?: ActionableProps["attributes"];
59
+ } & Pick<DropdownMenuProps, "position" | "width" | "fallbackPositions">;
60
+ export type NativeFragment = {
61
+ /** Options for the select */
62
+ /** @deprecated Use <option /> children instead */
63
+ options?: NativeOption[];
64
+ /** Callback when the input is focused */
65
+ onFocus?: (e: React.FocusEvent<HTMLSelectElement>) => void;
66
+ /** Callback when the input is blurred */
67
+ onBlur?: (e: React.FocusEvent<HTMLSelectElement>) => void;
68
+ /** Additional attributes for the input element */
69
+ inputAttributes?: G.Attributes<"select">;
70
+ };
71
+ export type NativeControlledFragment = {
70
72
  value: string;
71
73
  defaultValue?: never;
74
+ /** Callback when the input value changes */
75
+ onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
72
76
  };
73
- export type UncontrolledProps = BaseProps & {
77
+ export type NativeUncontrolledFragment = {
74
78
  value?: never;
75
79
  defaultValue?: string;
80
+ /** Callback when the input value changes */
81
+ onChange?: G.ChangeHandler<string, React.ChangeEvent<HTMLSelectElement>>;
82
+ };
83
+ export type CustomControlledFragment = {
84
+ multiple?: false;
85
+ value: string;
86
+ defaultValue?: never;
87
+ /** Callback when the input value changes */
88
+ onChange?: G.ChangeHandler<string>;
89
+ } | {
90
+ multiple: true;
91
+ value: string[];
92
+ defaultValue?: never[];
93
+ /** Callback when the input value changes */
94
+ onChange?: G.ChangeHandler<string[]>;
95
+ };
96
+ export type CustomUncontrolledFragment = {
97
+ multiple?: false;
98
+ value?: never;
99
+ defaultValue?: string;
100
+ /** Callback when the input value changes */
101
+ onChange?: G.ChangeHandler<string>;
102
+ } | {
103
+ multiple: true;
104
+ value?: never[];
105
+ defaultValue?: string[];
106
+ /** Callback when the input value changes */
107
+ onChange?: G.ChangeHandler<string[]>;
108
+ };
109
+ export type NativeControlledProps = BaseFragment & NativeFragment & NativeControlledFragment;
110
+ export type NativeUncontrolledProps = BaseFragment & NativeFragment & NativeUncontrolledFragment;
111
+ export type CustomControlledProps = BaseFragment & CustomFragment & CustomControlledFragment;
112
+ export type CustomUncontrolledProps = BaseFragment & CustomFragment & CustomUncontrolledFragment;
113
+ export type NativeProps = NativeControlledProps | NativeUncontrolledProps;
114
+ export type CustomProps = CustomControlledProps | CustomUncontrolledProps;
115
+ export type Props = NativeControlledProps | NativeUncontrolledProps | CustomControlledProps | CustomUncontrolledProps;
116
+ export type TriggerProps = Pick<CustomControlledProps, "disabled" | "onClick" | "onFocus" | "onBlur" | "inputAttributes" | "startSlot" | "icon" | "size" | "placeholder" | "value" | "name" | "id"> & {
117
+ children?: React.ReactNode;
118
+ };
119
+ export type RootProps = Omit<Props, "children"> & {
120
+ children: (props: Omit<Props, "children">) => React.ReactNode;
76
121
  };
77
- export type Props = ControlledProps | UncontrolledProps;
122
+ export type SelectContextProps = CustomControlledProps;
78
123
  export {};
@@ -0,0 +1,3 @@
1
+ import type * as T from "./Select.types";
2
+ declare const SelectCustom: React.FC<T.CustomProps>;
3
+ export default SelectCustom;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import SelectCustomControlled from "./SelectCustomControlled.js";
3
+ import SelectCustomUncontrolled from "./SelectCustomUncontrolled.js";
4
+ const SelectCustom = (props) => {
5
+ const { value } = props;
6
+ if (value !== undefined) {
7
+ return _jsx(SelectCustomControlled, { ...props });
8
+ }
9
+ return _jsx(SelectCustomUncontrolled, { ...props });
10
+ };
11
+ SelectCustom.displayName = "SelectCustom";
12
+ export default SelectCustom;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectCustomControlled: React.FC<T.CustomControlledProps>;
4
+ export default SelectCustomControlled;
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import DropdownMenu from "../DropdownMenu/index.js";
4
+ import Icon from "../Icon/index.js";
5
+ import CheckmarkIcon from "../../icons/Checkmark.js";
6
+ import { isMatchingComponentChildId, responsivePropDependency } from "../../utilities/props.js";
7
+ import SelectRoot from "./SelectRoot.js";
8
+ import SelectTrigger from "./SelectTrigger.js";
9
+ const SelectCustomControlled = (props) => {
10
+ const { children, value, name, placeholder, size, multiple, width = "trigger", position, fallbackPositions, } = props;
11
+ const initialFocusRef = React.useRef(null);
12
+ const searchStringRef = React.useRef("");
13
+ const searchTimeoutRef = React.useRef(null);
14
+ const dropdownRef = React.useRef(null);
15
+ const indexedOptions = [];
16
+ const selectedOptions = [];
17
+ const hasValue = multiple ? value.length > 0 : value;
18
+ const traverseOptionList = (children) => {
19
+ return React.Children.map(children, (child, index) => {
20
+ if (!React.isValidElement(child))
21
+ return null;
22
+ if (isMatchingComponentChildId(child, "Select.Option")) {
23
+ const component = child;
24
+ const option = component.props;
25
+ const matchingValue = multiple ? value.includes(option.value) : option.value === value;
26
+ const selected = matchingValue || (!placeholder && !value && index === 0);
27
+ if (selected)
28
+ selectedOptions.push(option);
29
+ indexedOptions.push({
30
+ value: option.value,
31
+ text: typeof option.children === "string" ? option.children : option.value,
32
+ });
33
+ return React.cloneElement(component, {
34
+ key: option.value,
35
+ onClick: (e) => {
36
+ option.onClick?.(e);
37
+ if (multiple) {
38
+ const nextValue = selected
39
+ ? value.filter((v) => v !== option.value)
40
+ : [...value, option.value];
41
+ props.onChange?.({ value: nextValue, name });
42
+ }
43
+ else {
44
+ props.onChange?.({ value: option.value, name });
45
+ }
46
+ },
47
+ startSlot: option?.startSlot || (hasValue && _jsx(Icon, { svg: selected ? CheckmarkIcon : null })),
48
+ attributes: {
49
+ ...component.props.attributes,
50
+ ref: selected ? initialFocusRef : undefined,
51
+ },
52
+ });
53
+ }
54
+ if (isMatchingComponentChildId(child, "Select.OptionGroup")) {
55
+ const component = child;
56
+ const optionGroup = component.props;
57
+ return React.cloneElement(component, {
58
+ key: optionGroup.label,
59
+ children: traverseOptionList(optionGroup.children),
60
+ });
61
+ }
62
+ return null;
63
+ });
64
+ };
65
+ const resolvedChildren = traverseOptionList(children);
66
+ const handleKeyDown = (e) => {
67
+ const key = e.key;
68
+ // Only handle alphanumeric and space characters for type-ahead
69
+ if (key.length !== 1 || !key.match(/[\w\s]/))
70
+ return;
71
+ if (searchTimeoutRef.current)
72
+ clearTimeout(searchTimeoutRef.current);
73
+ searchStringRef.current += key.toLowerCase();
74
+ const matchingOption = indexedOptions.find((option) => option.text.toLowerCase().startsWith(searchStringRef.current));
75
+ if (matchingOption && dropdownRef.current) {
76
+ const button = dropdownRef.current.querySelector(`[value="${matchingOption.value}"]`);
77
+ button?.focus();
78
+ }
79
+ searchTimeoutRef.current = setTimeout(() => {
80
+ searchStringRef.current = "";
81
+ }, 1000);
82
+ };
83
+ return (_jsx(SelectRoot, { ...props, children: (props) => {
84
+ return (_jsxs(DropdownMenu, { width: width, disableHideAnimation: true, position: position ?? "bottom", fallbackPositions: fallbackPositions ?? (position ? undefined : ["bottom", "top"]), fallbackAdjustLayout: true, fallbackMinHeight: "150px", borderRadius: responsivePropDependency(size, (size) => size === "large" || size === "xlarge" ? "medium" : "small"), initialFocusRef: initialFocusRef, children: [_jsx(DropdownMenu.Trigger, { children: (attributes) => {
85
+ const triggerProps = {
86
+ ...props,
87
+ inputAttributes: {
88
+ ...props.inputAttributes,
89
+ ...attributes,
90
+ },
91
+ };
92
+ return (_jsx(SelectTrigger, { ...triggerProps, value: value, children: selectedOptions?.map((option) => option.children).join(", ") }));
93
+ } }), _jsx(DropdownMenu.Content, { attributes: {
94
+ ref: dropdownRef,
95
+ onKeyDown: handleKeyDown,
96
+ // Ignore the default menu role since we're using options
97
+ role: undefined,
98
+ }, children: resolvedChildren })] }));
99
+ } }));
100
+ };
101
+ SelectCustomControlled.displayName = "SelectCustomControlled";
102
+ export default SelectCustomControlled;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectCustomUncontrolled: React.FC<T.CustomUncontrolledProps>;
4
+ export default SelectCustomUncontrolled;
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import SelectCustomControlled from "./SelectCustomControlled.js";
5
+ const SelectCustomUncontrolled = (props) => {
6
+ const { defaultValue, onChange, multiple, ...controlledProps } = props;
7
+ const [value, setValue] = React.useState(defaultValue || (multiple ? [] : ""));
8
+ return (
9
+ // @ts-expect-error -- avoid complicating the types and implementation
10
+ _jsx(SelectCustomControlled, { ...controlledProps, multiple: multiple, value: value,
11
+ // @ts-expect-error -- avoid complicating the types and implementation
12
+ onChange: (args) => {
13
+ setValue(args.value);
14
+ onChange?.(args);
15
+ } }));
16
+ };
17
+ SelectCustomUncontrolled.displayName = "SelectCustomUncontrolled";
18
+ export default SelectCustomUncontrolled;
@@ -0,0 +1,3 @@
1
+ import type * as T from "./Select.types";
2
+ declare const SelectEndContent: React.FC<Pick<T.Props, "disabled" | "size">>;
3
+ export default SelectEndContent;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Icon from "../Icon/index.js";
3
+ import { responsivePropDependency } from "../../utilities/props.js";
4
+ import IconArrow from "../../icons/ChevronVertical.js";
5
+ import s from "./Select.module.css";
6
+ const SelectEndContent = (props) => {
7
+ const { disabled, size } = props;
8
+ return (_jsx("div", { className: s.arrow, children: _jsx(Icon, { svg: IconArrow, color: disabled ? "disabled" : "neutral-faded", size: responsivePropDependency(size, (size) => {
9
+ return size === "large" || size === "xlarge" ? 5 : 4;
10
+ }) }) }));
11
+ };
12
+ export default SelectEndContent;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectNative: React.FC<T.NativeProps>;
4
+ export default SelectNative;
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import { classNames } from "../../utilities/props.js";
5
+ import SelectStartContent from "./SelectStartContent.js";
6
+ import SelectEndContent from "./SelectEndContent.js";
7
+ import s from "./Select.module.css";
8
+ const SelectNative = (props) => {
9
+ const { startSlot, icon, size, inputAttributes, onFocus, onBlur, disabled, name, value, defaultValue, onChange, onClick, placeholder, id, children, } = props;
10
+ const [empty, setEmpty] = React.useState(value === undefined ? !defaultValue : !value);
11
+ const selectClassNames = classNames(s.input, placeholder && empty && s["input--placeholder"]);
12
+ const handleChange = (event) => {
13
+ const nextValue = event.target.value;
14
+ // Uncontrolled placeholder
15
+ if (value === undefined)
16
+ setEmpty(!nextValue);
17
+ if (!onChange)
18
+ return;
19
+ onChange({ name, value: nextValue, event });
20
+ };
21
+ // Controlled placeholder
22
+ React.useEffect(() => {
23
+ if (value === undefined)
24
+ return;
25
+ setEmpty(!value);
26
+ }, [value]);
27
+ return (_jsxs(_Fragment, { children: [_jsx(SelectStartContent, { startSlot: startSlot, icon: icon, size: size }), _jsxs("select", { ...inputAttributes, onFocus: onFocus || inputAttributes?.onFocus, onBlur: onBlur || inputAttributes?.onBlur, onClick: onClick || inputAttributes?.onClick, className: selectClassNames, disabled: disabled, name: name, value: value, defaultValue: defaultValue, onChange: handleChange, id: id, children: [placeholder && _jsx("option", { value: "", children: placeholder }), children] }), _jsx(SelectEndContent, { disabled: disabled, size: size })] }));
28
+ };
29
+ export default SelectNative;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectOption: React.FC<T.OptionProps>;
4
+ export default SelectOption;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import DropdownMenu from "../DropdownMenu/index.js";
3
+ import { setComponentChildId } from "../../utilities/props.js";
4
+ import s from "./Select.module.css";
5
+ const SelectOption = (props) => {
6
+ const { value, ...menuItemProps } = props;
7
+ return (_jsx(DropdownMenu.Item, { ...menuItemProps, className: [menuItemProps.className, s.option], color: "neutral", attributes: {
8
+ ...menuItemProps.attributes,
9
+ value,
10
+ role: "option",
11
+ } }));
12
+ };
13
+ SelectOption.displayName = "Select.Option";
14
+ setComponentChildId(SelectOption, "Select.Option");
15
+ export default SelectOption;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectOptionGroup: React.FC<T.OptionGroupProps>;
4
+ export default SelectOptionGroup;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import View from "../View/index.js";
3
+ import Text from "../Text/index.js";
4
+ import { setComponentChildId } from "../../utilities/props.js";
5
+ const SelectOptionGroup = (props) => {
6
+ const { label, children } = props;
7
+ return (_jsxs(View, { attributes: { role: "group" }, gap: 1, children: [_jsx(View, { paddingInline: 3, paddingTop: 3, children: _jsx(Text, { variant: "caption-1", color: "neutral-faded", children: label }) }), _jsx(View.Item, { children: children })] }));
8
+ };
9
+ SelectOptionGroup.displayName = "Select.OptionGroup";
10
+ setComponentChildId(SelectOptionGroup, "Select.OptionGroup");
11
+ export default SelectOptionGroup;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectRoot: React.FC<T.RootProps>;
4
+ export default SelectRoot;
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import useElementId from "../../hooks/useElementId.js";
4
+ import { useFormControl } from "../FormControl/index.js";
5
+ import { classNames, responsiveClassNames } from "../../utilities/props.js";
6
+ import s from "./Select.module.css";
7
+ const SelectRoot = (passedProps) => {
8
+ const formControl = useFormControl();
9
+ const internalId = useElementId(passedProps.id);
10
+ const props = {
11
+ ...passedProps,
12
+ id: formControl?.attributes?.id || passedProps.inputAttributes?.id || internalId,
13
+ disabled: formControl?.disabled || passedProps.disabled,
14
+ hasError: formControl?.hasError || passedProps.hasError,
15
+ inputAttributes: { ...passedProps.inputAttributes, ...formControl?.attributes },
16
+ };
17
+ const { children, className, size = "medium", variant = "outline", hasError, disabled, attributes, } = props;
18
+ const rootClassName = classNames(s.root, className, size && responsiveClassNames(s, "--size", size), hasError && s["--status-error"], disabled && s["--disabled"], variant && s[`--variant-${variant}`]);
19
+ return (_jsx("div", { ...attributes, className: rootClassName, children: children(props) }));
20
+ };
21
+ export default SelectRoot;
@@ -0,0 +1,3 @@
1
+ import type * as T from "./Select.types";
2
+ declare const SelectStartContent: React.FC<Pick<T.Props, "startSlot" | "icon" | "size">>;
3
+ export default SelectStartContent;
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Icon from "../Icon/index.js";
3
+ import { responsivePropDependency } from "../../utilities/props.js";
4
+ import s from "./Select.module.css";
5
+ const SelectStartContent = (props) => {
6
+ const { startSlot, icon, size } = props;
7
+ if (!startSlot && !icon)
8
+ return null;
9
+ if (icon) {
10
+ return (_jsx("div", { className: s.slot, children: _jsx(Icon, { size: responsivePropDependency(size, (size) => {
11
+ if (size === "large")
12
+ return 5;
13
+ if (size === "xlarge")
14
+ return 6;
15
+ return 4;
16
+ }), svg: icon }) }));
17
+ }
18
+ return _jsx("div", { className: s.slot, children: startSlot });
19
+ };
20
+ export default SelectStartContent;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type * as T from "./Select.types";
3
+ declare const SelectTrigger: React.FC<T.TriggerProps>;
4
+ export default SelectTrigger;
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import Actionable from "../Actionable/index.js";
4
+ import Text from "../Text/index.js";
5
+ import SelectStartContent from "./SelectStartContent.js";
6
+ import s from "./Select.module.css";
7
+ import SelectEndContent from "./SelectEndContent.js";
8
+ const SelectTrigger = (props) => {
9
+ const { children, disabled, onClick, onFocus, onBlur, inputAttributes, startSlot, icon, size, placeholder, value, name, id, } = props;
10
+ return (_jsxs(_Fragment, { children: [_jsxs(Actionable, { className: s.input, disabled: disabled, disableFocusRing: true, onClick: onClick, attributes: {
11
+ onFocus: onFocus || inputAttributes?.onFocus,
12
+ onBlur: onBlur || inputAttributes?.onBlur,
13
+ ...inputAttributes,
14
+ }, children: [_jsx(SelectStartContent, { startSlot: startSlot, icon: icon, size: size }), children ? _jsx(Text, { maxLines: 1, children: children }) : null, placeholder && !children ? _jsx(Text, { color: "disabled", children: placeholder }) : null, _jsx(SelectEndContent, { disabled: disabled, size: size })] }), _jsx("input", { type: "hidden", value: typeof value === "string" ? value : JSON.stringify(value), name: name, id: id })] }));
15
+ };
16
+ export default SelectTrigger;
@@ -1,6 +1,13 @@
1
+ import React from "react";
2
+ import { Mock } from "storybook/test";
3
+ import { StoryObj } from "@storybook/react-vite";
1
4
  declare const _default: {
2
5
  title: string;
3
- component: import("react").FC<import("./..").SelectProps>;
6
+ component: React.FC<import("../Select.types").NativeProps> & {
7
+ Custom: React.FC<import("../Select.types").CustomProps>;
8
+ Option: React.FC<import("../Select.types").OptionProps>;
9
+ OptionGroup: React.FC<import("../Select.types").OptionGroupProps>;
10
+ };
4
11
  parameters: {
5
12
  iframe: {
6
13
  url: string;
@@ -8,12 +15,33 @@ declare const _default: {
8
15
  };
9
16
  };
10
17
  export default _default;
11
- export declare const value: () => import("react").JSX.Element;
12
- export declare const variants: () => import("react").JSX.Element;
13
- export declare const size: () => import("react").JSX.Element;
14
- export declare const disabled: () => import("react").JSX.Element;
15
- export declare const error: () => import("react").JSX.Element;
16
- export declare const icon: () => import("react").JSX.Element;
17
- export declare const slots: () => import("react").JSX.Element;
18
- export declare const triggerComposition: () => import("react").JSX.Element;
19
- export declare const formControl: () => import("react").JSX.Element;
18
+ export declare const nativeRender: StoryObj;
19
+ export declare const customRender: StoryObj;
20
+ export declare const nativeHandlers: StoryObj<{
21
+ handleChange: Mock;
22
+ handleControlledChange: Mock;
23
+ handleFocus: Mock;
24
+ handleBlur: Mock;
25
+ handleClick: Mock;
26
+ }>;
27
+ export declare const customHandlers: StoryObj<{
28
+ handleChange: Mock;
29
+ handleControlledChange: Mock;
30
+ handleFocus: Mock;
31
+ handleBlur: Mock;
32
+ handleClick: Mock;
33
+ }>;
34
+ export declare const triggerOnly: StoryObj<{
35
+ handleClick: Mock;
36
+ }>;
37
+ export declare const multiple: StoryObj<{
38
+ handleChange: Mock;
39
+ }>;
40
+ export declare const variant: StoryObj;
41
+ export declare const size: StoryObj;
42
+ export declare const startSlot: StoryObj;
43
+ export declare const error: StoryObj;
44
+ export declare const disabled: StoryObj;
45
+ export declare const className: StoryObj;
46
+ export declare const fallback: StoryObj;
47
+ export declare const formControl: StoryObj;