@cdx-ui/primitives 0.3.2 → 0.3.4

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 (188) hide show
  1. package/lib/commonjs/index.js +12 -0
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/insight/InsightRoot.js +159 -0
  4. package/lib/commonjs/insight/InsightRoot.js.map +1 -0
  5. package/lib/commonjs/insight/context.js +11 -0
  6. package/lib/commonjs/insight/context.js.map +1 -0
  7. package/lib/commonjs/insight/index.js +26 -0
  8. package/lib/commonjs/insight/index.js.map +1 -0
  9. package/lib/commonjs/insight/types.js +6 -0
  10. package/lib/commonjs/insight/types.js.map +1 -0
  11. package/lib/commonjs/list-item/ListItemRoot.js +2 -18
  12. package/lib/commonjs/list-item/ListItemRoot.js.map +1 -1
  13. package/lib/commonjs/select/SelectContent.js +89 -45
  14. package/lib/commonjs/select/SelectContent.js.map +1 -1
  15. package/lib/commonjs/select/SelectDismissButton.js +14 -0
  16. package/lib/commonjs/select/SelectDismissButton.js.map +1 -0
  17. package/lib/commonjs/select/SelectDismissButton.web.js +28 -0
  18. package/lib/commonjs/select/SelectDismissButton.web.js.map +1 -0
  19. package/lib/commonjs/select/SelectEmpty.js +53 -0
  20. package/lib/commonjs/select/SelectEmpty.js.map +1 -0
  21. package/lib/commonjs/select/SelectItem.js +30 -9
  22. package/lib/commonjs/select/SelectItem.js.map +1 -1
  23. package/lib/commonjs/select/SelectListbox.js +47 -0
  24. package/lib/commonjs/select/SelectListbox.js.map +1 -0
  25. package/lib/commonjs/select/SelectRoot.js +110 -21
  26. package/lib/commonjs/select/SelectRoot.js.map +1 -1
  27. package/lib/commonjs/select/SelectSearch.js +81 -0
  28. package/lib/commonjs/select/SelectSearch.js.map +1 -0
  29. package/lib/commonjs/select/SelectSearchStatus.js +14 -0
  30. package/lib/commonjs/select/SelectSearchStatus.js.map +1 -0
  31. package/lib/commonjs/select/SelectSearchStatus.web.js +24 -0
  32. package/lib/commonjs/select/SelectSearchStatus.web.js.map +1 -0
  33. package/lib/commonjs/select/SelectSheetContent.js +67 -0
  34. package/lib/commonjs/select/SelectSheetContent.js.map +1 -0
  35. package/lib/commonjs/select/context.js +5 -1
  36. package/lib/commonjs/select/context.js.map +1 -1
  37. package/lib/commonjs/select/filter.js +16 -0
  38. package/lib/commonjs/select/filter.js.map +1 -0
  39. package/lib/commonjs/select/index.js +34 -0
  40. package/lib/commonjs/select/index.js.map +1 -1
  41. package/lib/commonjs/select/popupRole.js +27 -0
  42. package/lib/commonjs/select/popupRole.js.map +1 -0
  43. package/lib/commonjs/select/useContentFocus.js +10 -21
  44. package/lib/commonjs/select/useContentFocus.js.map +1 -1
  45. package/lib/commonjs/select/useListboxNavigation.js +21 -8
  46. package/lib/commonjs/select/useListboxNavigation.js.map +1 -1
  47. package/lib/commonjs/select/useQueryHighlight.js +50 -0
  48. package/lib/commonjs/select/useQueryHighlight.js.map +1 -0
  49. package/lib/commonjs/select/useSelectTrigger.js +4 -1
  50. package/lib/commonjs/select/useSelectTrigger.js.map +1 -1
  51. package/lib/commonjs/select/useSelectTrigger.web.js +4 -1
  52. package/lib/commonjs/select/useSelectTrigger.web.js.map +1 -1
  53. package/lib/commonjs/utils/splitContainerProps.js +26 -0
  54. package/lib/commonjs/utils/splitContainerProps.js.map +1 -0
  55. package/lib/module/index.js +1 -0
  56. package/lib/module/index.js.map +1 -1
  57. package/lib/module/insight/InsightRoot.js +154 -0
  58. package/lib/module/insight/InsightRoot.js.map +1 -0
  59. package/lib/module/insight/context.js +5 -0
  60. package/lib/module/insight/context.js.map +1 -0
  61. package/lib/module/insight/index.js +5 -0
  62. package/lib/module/insight/index.js.map +1 -0
  63. package/lib/module/insight/types.js +4 -0
  64. package/lib/module/insight/types.js.map +1 -0
  65. package/lib/module/list-item/ListItemRoot.js +1 -17
  66. package/lib/module/list-item/ListItemRoot.js.map +1 -1
  67. package/lib/module/select/SelectContent.js +94 -48
  68. package/lib/module/select/SelectContent.js.map +1 -1
  69. package/lib/module/select/SelectDismissButton.js +10 -0
  70. package/lib/module/select/SelectDismissButton.js.map +1 -0
  71. package/lib/module/select/SelectDismissButton.web.js +24 -0
  72. package/lib/module/select/SelectDismissButton.web.js.map +1 -0
  73. package/lib/module/select/SelectEmpty.js +49 -0
  74. package/lib/module/select/SelectEmpty.js.map +1 -0
  75. package/lib/module/select/SelectItem.js +32 -11
  76. package/lib/module/select/SelectItem.js.map +1 -1
  77. package/lib/module/select/SelectListbox.js +43 -0
  78. package/lib/module/select/SelectListbox.js.map +1 -0
  79. package/lib/module/select/SelectRoot.js +111 -22
  80. package/lib/module/select/SelectRoot.js.map +1 -1
  81. package/lib/module/select/SelectSearch.js +77 -0
  82. package/lib/module/select/SelectSearch.js.map +1 -0
  83. package/lib/module/select/SelectSearchStatus.js +10 -0
  84. package/lib/module/select/SelectSearchStatus.js.map +1 -0
  85. package/lib/module/select/SelectSearchStatus.web.js +20 -0
  86. package/lib/module/select/SelectSearchStatus.web.js.map +1 -0
  87. package/lib/module/select/SelectSheetContent.js +63 -0
  88. package/lib/module/select/SelectSheetContent.js.map +1 -0
  89. package/lib/module/select/context.js +2 -0
  90. package/lib/module/select/context.js.map +1 -1
  91. package/lib/module/select/filter.js +11 -0
  92. package/lib/module/select/filter.js.map +1 -0
  93. package/lib/module/select/index.js +5 -1
  94. package/lib/module/select/index.js.map +1 -1
  95. package/lib/module/select/popupRole.js +23 -0
  96. package/lib/module/select/popupRole.js.map +1 -0
  97. package/lib/module/select/useContentFocus.js +11 -22
  98. package/lib/module/select/useContentFocus.js.map +1 -1
  99. package/lib/module/select/useListboxNavigation.js +21 -8
  100. package/lib/module/select/useListboxNavigation.js.map +1 -1
  101. package/lib/module/select/useQueryHighlight.js +46 -0
  102. package/lib/module/select/useQueryHighlight.js.map +1 -0
  103. package/lib/module/select/useSelectTrigger.js +4 -1
  104. package/lib/module/select/useSelectTrigger.js.map +1 -1
  105. package/lib/module/select/useSelectTrigger.web.js +4 -1
  106. package/lib/module/select/useSelectTrigger.web.js.map +1 -1
  107. package/lib/module/utils/splitContainerProps.js +22 -0
  108. package/lib/module/utils/splitContainerProps.js.map +1 -0
  109. package/lib/typescript/index.d.ts +1 -0
  110. package/lib/typescript/index.d.ts.map +1 -1
  111. package/lib/typescript/insight/InsightRoot.d.ts +6 -0
  112. package/lib/typescript/insight/InsightRoot.d.ts.map +1 -0
  113. package/lib/typescript/insight/context.d.ts +6 -0
  114. package/lib/typescript/insight/context.d.ts.map +1 -0
  115. package/lib/typescript/insight/index.d.ts +4 -0
  116. package/lib/typescript/insight/index.d.ts.map +1 -0
  117. package/lib/typescript/insight/types.d.ts +44 -0
  118. package/lib/typescript/insight/types.d.ts.map +1 -0
  119. package/lib/typescript/list-item/ListItemRoot.d.ts.map +1 -1
  120. package/lib/typescript/select/SelectContent.d.ts.map +1 -1
  121. package/lib/typescript/select/SelectDismissButton.d.ts +10 -0
  122. package/lib/typescript/select/SelectDismissButton.d.ts.map +1 -0
  123. package/lib/typescript/select/SelectDismissButton.web.d.ts +9 -0
  124. package/lib/typescript/select/SelectDismissButton.web.d.ts.map +1 -0
  125. package/lib/typescript/select/SelectEmpty.d.ts +12 -0
  126. package/lib/typescript/select/SelectEmpty.d.ts.map +1 -0
  127. package/lib/typescript/select/SelectItem.d.ts.map +1 -1
  128. package/lib/typescript/select/SelectListbox.d.ts +12 -0
  129. package/lib/typescript/select/SelectListbox.d.ts.map +1 -0
  130. package/lib/typescript/select/SelectRoot.d.ts +2 -2
  131. package/lib/typescript/select/SelectRoot.d.ts.map +1 -1
  132. package/lib/typescript/select/SelectSearch.d.ts +18 -0
  133. package/lib/typescript/select/SelectSearch.d.ts.map +1 -0
  134. package/lib/typescript/select/SelectSearchStatus.d.ts +9 -0
  135. package/lib/typescript/select/SelectSearchStatus.d.ts.map +1 -0
  136. package/lib/typescript/select/SelectSearchStatus.web.d.ts +8 -0
  137. package/lib/typescript/select/SelectSearchStatus.web.d.ts.map +1 -0
  138. package/lib/typescript/select/SelectSheetContent.d.ts +14 -0
  139. package/lib/typescript/select/SelectSheetContent.d.ts.map +1 -0
  140. package/lib/typescript/select/context.d.ts +9 -0
  141. package/lib/typescript/select/context.d.ts.map +1 -1
  142. package/lib/typescript/select/filter.d.ts +4 -0
  143. package/lib/typescript/select/filter.d.ts.map +1 -0
  144. package/lib/typescript/select/index.d.ts +6 -2
  145. package/lib/typescript/select/index.d.ts.map +1 -1
  146. package/lib/typescript/select/popupRole.d.ts +18 -0
  147. package/lib/typescript/select/popupRole.d.ts.map +1 -0
  148. package/lib/typescript/select/types.d.ts +129 -8
  149. package/lib/typescript/select/types.d.ts.map +1 -1
  150. package/lib/typescript/select/useContentFocus.d.ts +4 -7
  151. package/lib/typescript/select/useContentFocus.d.ts.map +1 -1
  152. package/lib/typescript/select/useListboxNavigation.d.ts +16 -3
  153. package/lib/typescript/select/useListboxNavigation.d.ts.map +1 -1
  154. package/lib/typescript/select/useQueryHighlight.d.ts +21 -0
  155. package/lib/typescript/select/useQueryHighlight.d.ts.map +1 -0
  156. package/lib/typescript/select/useSelectTrigger.d.ts.map +1 -1
  157. package/lib/typescript/select/useSelectTrigger.web.d.ts.map +1 -1
  158. package/lib/typescript/utils/splitContainerProps.d.ts +9 -0
  159. package/lib/typescript/utils/splitContainerProps.d.ts.map +1 -0
  160. package/package.json +3 -3
  161. package/src/index.ts +1 -0
  162. package/src/insight/InsightRoot.tsx +162 -0
  163. package/src/insight/context.tsx +5 -0
  164. package/src/insight/index.ts +11 -0
  165. package/src/insight/types.ts +51 -0
  166. package/src/list-item/ListItemRoot.tsx +1 -14
  167. package/src/select/SelectContent.tsx +89 -54
  168. package/src/select/SelectDismissButton.tsx +14 -0
  169. package/src/select/SelectDismissButton.web.tsx +26 -0
  170. package/src/select/SelectEmpty.tsx +61 -0
  171. package/src/select/SelectItem.tsx +42 -10
  172. package/src/select/SelectListbox.tsx +43 -0
  173. package/src/select/SelectRoot.tsx +184 -12
  174. package/src/select/SelectSearch.tsx +98 -0
  175. package/src/select/SelectSearchStatus.tsx +11 -0
  176. package/src/select/SelectSearchStatus.web.tsx +18 -0
  177. package/src/select/SelectSheetContent.tsx +54 -0
  178. package/src/select/context.tsx +9 -0
  179. package/src/select/filter.ts +12 -0
  180. package/src/select/index.ts +14 -1
  181. package/src/select/popupRole.ts +26 -0
  182. package/src/select/types.ts +142 -9
  183. package/src/select/useContentFocus.ts +12 -31
  184. package/src/select/useListboxNavigation.ts +41 -9
  185. package/src/select/useQueryHighlight.ts +61 -0
  186. package/src/select/useSelectTrigger.ts +5 -1
  187. package/src/select/useSelectTrigger.web.ts +5 -1
  188. package/src/utils/splitContainerProps.ts +16 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef, useCallback, useMemo } from 'react';
4
- import { Pressable } from 'react-native';
3
+ import { forwardRef, useCallback, useLayoutEffect, useMemo } from 'react';
4
+ import { Platform, Pressable } from 'react-native';
5
5
  import { composeEventHandlers } from '@cdx-ui/utils';
6
6
  import { useFocus, useFocusRing } from '@react-native-aria/focus';
7
7
  import { useHover, usePress } from '@react-native-aria/interactions';
@@ -9,6 +9,13 @@ import { Slot } from '../slot';
9
9
  import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
10
10
  import { SelectItemProvider, useSelectContext } from './context';
11
11
  import { jsx as _jsx } from "react/jsx-runtime";
12
+ /**
13
+ * Options are reached through the highlight (`aria-activedescendant`), not the Tab order, so
14
+ * popup autofocus lands on the search input or the listbox rather than the first option.
15
+ */
16
+ const WEB_OPTION_PROPS = Platform.OS === 'web' ? {
17
+ tabIndex: -1
18
+ } : {};
12
19
  export const SelectItem = /*#__PURE__*/forwardRef(({
13
20
  asChild,
14
21
  children,
@@ -22,16 +29,26 @@ export const SelectItem = /*#__PURE__*/forwardRef(({
22
29
  ...props
23
30
  }, ref) => {
24
31
  const {
25
- value: selectedValue,
26
- onValueChange,
27
- setOpen,
32
+ isSelected,
33
+ commitValue,
28
34
  activeValue,
35
+ setActiveValue,
29
36
  contentId,
30
- disabled: contextDisabled
37
+ items,
38
+ disabled: contextDisabled,
39
+ registerDisabledItem,
40
+ isItemVisible
31
41
  } = useSelectContext();
32
- const disabled = contextDisabled || !!disabledProp || !!isDisabledProp;
33
- const checked = selectedValue === itemValue;
42
+ const isDisabledByItem = !!disabledProp || !!isDisabledProp;
43
+ const disabled = contextDisabled || isDisabledByItem || items.some(item => item.value === itemValue && !!item.disabled);
44
+ const checked = isSelected(itemValue);
34
45
  const highlighted = activeValue === itemValue;
46
+ useLayoutEffect(() => {
47
+ if (isDisabledByItem) {
48
+ return registerDisabledItem(itemValue);
49
+ }
50
+ return undefined;
51
+ }, [isDisabledByItem, itemValue, registerDisabledItem]);
35
52
  const {
36
53
  isFocusVisible,
37
54
  focusProps: focusRingProps
@@ -52,10 +69,10 @@ export const SelectItem = /*#__PURE__*/forwardRef(({
52
69
  } = useHover();
53
70
  const handlePress = useCallback(() => {
54
71
  if (!disabled) {
55
- onValueChange(itemValue);
56
- setOpen(false);
72
+ setActiveValue(itemValue);
73
+ commitValue(itemValue);
57
74
  }
58
- }, [disabled, itemValue, onValueChange, setOpen]);
75
+ }, [disabled, itemValue, commitValue, setActiveValue]);
59
76
  const interactionState = useMemo(() => ({
60
77
  hover: !!(isHoveredProp || isHovered),
61
78
  focus: !!(isFocusedProp || isFocused),
@@ -65,6 +82,9 @@ export const SelectItem = /*#__PURE__*/forwardRef(({
65
82
  highlighted,
66
83
  checked
67
84
  }), [isHoveredProp, isHovered, isFocusedProp, isFocused, isActiveProp, isActive, disabled, isFocusVisibleProp, isFocusVisible, highlighted, checked]);
85
+ if (!isItemVisible(itemValue)) {
86
+ return null;
87
+ }
68
88
  const Comp = asChild ? Slot : Pressable;
69
89
  return /*#__PURE__*/_jsx(SelectItemProvider, {
70
90
  value: interactionState,
@@ -75,6 +95,7 @@ export const SelectItem = /*#__PURE__*/forwardRef(({
75
95
  "aria-selected": checked,
76
96
  "aria-disabled": disabled,
77
97
  disabled: disabled,
98
+ ...WEB_OPTION_PROPS,
78
99
  ...props,
79
100
  ...mergeDataAttributes(props, dataAttributes({
80
101
  hover: interactionState.hover,
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","useCallback","useMemo","Pressable","composeEventHandlers","useFocus","useFocusRing","useHover","usePress","Slot","dataAttributes","mergeDataAttributes","SelectItemProvider","useSelectContext","jsx","_jsx","SelectItem","asChild","children","value","itemValue","disabled","disabledProp","isHovered","isHoveredProp","isActive","isActiveProp","isFocused","isFocusedProp","isFocusVisible","isFocusVisibleProp","isDisabled","isDisabledProp","props","ref","selectedValue","onValueChange","setOpen","activeValue","contentId","contextDisabled","checked","highlighted","focusProps","focusRingProps","pressProps","isPressed","hoverProps","handlePress","interactionState","hover","focus","active","focusVisible","Comp","role","id","state","onPress","onPressIn","onPressOut","onHoverIn","onHoverOut","onFocus","onBlur","displayName"],"sourceRoot":"../../../src","sources":["select/SelectItem.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useCallback","useLayoutEffect","useMemo","Platform","Pressable","composeEventHandlers","useFocus","useFocusRing","useHover","usePress","Slot","dataAttributes","mergeDataAttributes","SelectItemProvider","useSelectContext","jsx","_jsx","WEB_OPTION_PROPS","OS","tabIndex","SelectItem","asChild","children","value","itemValue","disabled","disabledProp","isHovered","isHoveredProp","isActive","isActiveProp","isFocused","isFocusedProp","isFocusVisible","isFocusVisibleProp","isDisabled","isDisabledProp","props","ref","isSelected","commitValue","activeValue","setActiveValue","contentId","items","contextDisabled","registerDisabledItem","isItemVisible","isDisabledByItem","some","item","checked","highlighted","undefined","focusProps","focusRingProps","pressProps","isPressed","hoverProps","handlePress","interactionState","hover","focus","active","focusVisible","Comp","role","id","state","onPress","onPressIn","onPressOut","onHoverIn","onHoverOut","onFocus","onBlur","displayName"],"sourceRoot":"../../../src","sources":["select/SelectItem.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ import { forwardRef } from 'react';
4
+ import { Platform, View } from 'react-native';
5
+ import { Slot } from '../slot';
6
+ import { useSelectContext } from './context';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ /**
9
+ * Wraps the options. With `Select.Search` mounted it is the `role="listbox"` inside the dialog
10
+ * popup; without it the popup itself is the listbox and this renders a plain container.
11
+ */
12
+ export const SelectListbox = /*#__PURE__*/forwardRef(({
13
+ asChild,
14
+ children,
15
+ ...props
16
+ }, ref) => {
17
+ const {
18
+ hasSearch,
19
+ listboxId,
20
+ labelId,
21
+ triggerId,
22
+ accessibilityLabel,
23
+ type
24
+ } = useSelectContext();
25
+ const listboxProps = hasSearch ? {
26
+ role: 'listbox',
27
+ id: listboxId,
28
+ 'aria-labelledby': labelId ?? (accessibilityLabel ? undefined : triggerId),
29
+ 'aria-label': labelId ? undefined : accessibilityLabel,
30
+ ...(Platform.OS === 'web' ? {
31
+ 'aria-multiselectable': type === 'multiple' || undefined
32
+ } : {})
33
+ } : {};
34
+ const Comp = asChild ? Slot : View;
35
+ return /*#__PURE__*/_jsx(Comp, {
36
+ ref: ref,
37
+ ...listboxProps,
38
+ ...props,
39
+ children: children
40
+ });
41
+ });
42
+ SelectListbox.displayName = 'SelectListbox';
43
+ //# sourceMappingURL=SelectListbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","Platform","View","Slot","useSelectContext","jsx","_jsx","SelectListbox","asChild","children","props","ref","hasSearch","listboxId","labelId","triggerId","accessibilityLabel","type","listboxProps","role","id","undefined","OS","Comp","displayName"],"sourceRoot":"../../../src","sources":["select/SelectListbox.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAA2B,OAAO;AACrD,SAASC,QAAQ,EAAEC,IAAI,QAAQ,cAAc;AAC7C,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,gBAAgB,QAAQ,WAAW;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQ7C;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,gBAAGP,UAAU,CACrC,CAAC;EAAEQ,OAAO;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EACxC,MAAM;IAAEC,SAAS;IAAEC,SAAS;IAAEC,OAAO;IAAEC,SAAS;IAAEC,kBAAkB;IAAEC;EAAK,CAAC,GAC1Eb,gBAAgB,CAAC,CAAC;EAEpB,MAAMc,YAAY,GAAGN,SAAS,GAC1B;IACEO,IAAI,EAAE,SAAkB;IACxBC,EAAE,EAAEP,SAAS;IACb,iBAAiB,EAAEC,OAAO,KAAKE,kBAAkB,GAAGK,SAAS,GAAGN,SAAS,CAAC;IAC1E,YAAY,EAAED,OAAO,GAAGO,SAAS,GAAGL,kBAAkB;IACtD,IAAIf,QAAQ,CAACqB,EAAE,KAAK,KAAK,GACrB;MAAE,sBAAsB,EAAEL,IAAI,KAAK,UAAU,IAAII;IAAU,CAAC,GAC5D,CAAC,CAAC;EACR,CAAC,GACD,CAAC,CAAC;EAEN,MAAME,IAAI,GAAGf,OAAO,GAAGL,IAAI,GAAGD,IAAI;EAElC,oBACEI,IAAA,CAACiB,IAAI;IAACZ,GAAG,EAAEA,GAAI;IAAA,GAAKO,YAAY;IAAA,GAAMR,KAAK;IAAAD,QAAA,EACxCA;EAAQ,CACL,CAAC;AAEX,CACF,CAAC;AAEDF,aAAa,CAACiB,WAAW,GAAG,eAAe","ignoreList":[]}
@@ -1,30 +1,43 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef, useCallback, useId, useMemo, useRef, useState } from 'react';
3
+ import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
4
4
  import { View } from 'react-native';
5
5
  import { useControllableState, useFormControl } from '@cdx-ui/utils';
6
6
  import { Slot } from '../slot';
7
7
  import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
8
8
  import { SelectProvider } from './context';
9
+ import { defaultSelectFilter } from './filter';
10
+
11
+ /**
12
+ * Internal widening of the public discriminated union: the runtime accepts either value
13
+ * shape and reads `type` to decide branch behavior. The public API stays narrow.
14
+ */
9
15
  import { jsx as _jsx } from "react/jsx-runtime";
10
- export const SelectRoot = /*#__PURE__*/forwardRef(({
11
- asChild,
12
- children,
13
- items,
14
- value: valueProp,
15
- defaultValue,
16
- onValueChange,
17
- isOpen: openProp,
18
- defaultOpen = false,
19
- onOpenChange,
20
- disabled = false,
21
- isRequired,
22
- isInvalid,
23
- isReadOnly,
24
- native = false,
25
- accessibilityLabel,
26
- ...props
27
- }, ref) => {
16
+ const EMPTY_VALUES = [];
17
+ export const SelectRoot = /*#__PURE__*/forwardRef((rootProps, ref) => {
18
+ const {
19
+ asChild,
20
+ children,
21
+ items,
22
+ type = 'single',
23
+ value: valueProp,
24
+ defaultValue,
25
+ onValueChange,
26
+ isOpen: openProp,
27
+ defaultOpen = false,
28
+ onOpenChange,
29
+ disabled = false,
30
+ isRequired,
31
+ isInvalid,
32
+ isReadOnly,
33
+ native = false,
34
+ accessibilityLabel,
35
+ inputValue: inputValueProp,
36
+ defaultInputValue = '',
37
+ onInputChange,
38
+ filter = defaultSelectFilter,
39
+ ...props
40
+ } = rootProps;
28
41
  const formControlProps = useFormControl({
29
42
  isDisabled: disabled,
30
43
  isRequired,
@@ -35,15 +48,23 @@ export const SelectRoot = /*#__PURE__*/forwardRef(({
35
48
  const isEffectivelyRequired = !!formControlProps.required;
36
49
  const isEffectivelyInvalid = !!formControlProps['aria-invalid'];
37
50
  const isEffectivelyReadOnly = !!formControlProps.readOnly;
51
+ const isMultiple = type === 'multiple';
38
52
  const [value, setValue] = useControllableState({
39
53
  prop: valueProp,
40
- defaultProp: defaultValue,
54
+ defaultProp: defaultValue ?? (isMultiple ? EMPTY_VALUES : undefined),
41
55
  onChange: newValue => {
42
56
  if (newValue !== undefined) {
43
57
  onValueChange?.(newValue);
44
58
  }
45
59
  }
46
60
  });
61
+ const selectedValues = useMemo(() => {
62
+ if (isMultiple) {
63
+ return Array.isArray(value) ? value : EMPTY_VALUES;
64
+ }
65
+ return typeof value === 'string' ? [value] : EMPTY_VALUES;
66
+ }, [isMultiple, value]);
67
+ const isSelected = useCallback(itemValue => selectedValues.includes(itemValue), [selectedValues]);
47
68
  const [open, setOpenState] = useControllableState({
48
69
  prop: openProp,
49
70
  defaultProp: defaultOpen,
@@ -56,18 +77,76 @@ export const SelectRoot = /*#__PURE__*/forwardRef(({
56
77
  setOpenState(newOpen);
57
78
  }, [isEffectivelyDisabled, isEffectivelyReadOnly, setOpenState]);
58
79
  const [activeValue, setActiveValue] = useState(undefined);
80
+ const [inputValueState, setInputValueState] = useControllableState({
81
+ prop: inputValueProp,
82
+ defaultProp: defaultInputValue,
83
+ onChange: onInputChange
84
+ });
85
+ const inputValue = inputValueState ?? '';
86
+ const setInputValue = useCallback(next => setInputValueState(next), [setInputValueState]);
87
+ const wasOpenRef = useRef(!!open);
88
+ useEffect(() => {
89
+ const wasOpen = wasOpenRef.current;
90
+ wasOpenRef.current = !!open;
91
+ if (wasOpen && !open) {
92
+ setInputValueState('');
93
+ }
94
+ }, [open, setInputValueState]);
95
+ const visibleItems = useMemo(() => inputValue === '' ? items : items.filter(item => filter(item.label, inputValue)), [items, inputValue, filter]);
96
+ const visibleValues = useMemo(() => new Set(visibleItems.map(item => item.value)), [visibleItems]);
97
+ const isItemVisible = useCallback(itemValue => inputValue === '' || visibleValues.has(itemValue), [inputValue, visibleValues]);
98
+ const [searchCount, setSearchCount] = useState(0);
99
+ const registerSearch = useCallback(() => {
100
+ setSearchCount(count => count + 1);
101
+ return () => setSearchCount(count => count - 1);
102
+ }, []);
103
+ const [emptyText, setEmptyText] = useState(undefined);
104
+ const toggleValue = useCallback(itemValue => {
105
+ setValue(prev => {
106
+ const current = Array.isArray(prev) ? prev : EMPTY_VALUES;
107
+ return current.includes(itemValue) ? current.filter(v => v !== itemValue) : [...current, itemValue];
108
+ });
109
+ }, [setValue]);
110
+ const selectValueAndClose = useCallback(itemValue => {
111
+ setValue(itemValue);
112
+ setOpen(false);
113
+ }, [setValue, setOpen]);
114
+ const commitValue = isMultiple ? toggleValue : selectValueAndClose;
115
+
116
+ /**
117
+ * `Select.Item disabled` lives on the rendered child, not in `items`, so mounted items
118
+ * register here for keyboard navigation. A ref keeps registration from re-rendering the root.
119
+ */
120
+ const disabledItemsRef = useRef(new Set());
121
+ const registerDisabledItem = useCallback(itemValue => {
122
+ disabledItemsRef.current.add(itemValue);
123
+ return () => {
124
+ disabledItemsRef.current.delete(itemValue);
125
+ };
126
+ }, []);
127
+ const isItemDisabled = useCallback(itemValue => isEffectivelyDisabled || disabledItemsRef.current.has(itemValue) || items.some(item => item.value === itemValue && !!item.disabled), [isEffectivelyDisabled, items]);
59
128
  const triggerRef = useRef(null);
60
129
  const reactId = useId();
61
130
  /** Align with `useFormControl` default id (`${field.id}-input`) when inside `Form.Field`. */
62
131
  const triggerId = formControlProps.id ?? `select-trigger-${reactId}`;
63
132
  const contentId = `select-content-${reactId}`;
133
+ const listboxId = `${contentId}-listbox`;
64
134
  const ariaDescribedBy = formControlProps['aria-describedby'];
135
+ const labelId = formControlProps['aria-labelledby'];
136
+ const hasSearch = searchCount > 0;
65
137
  const contextValue = useMemo(() => ({
66
138
  open: open ?? false,
67
139
  items,
68
140
  setOpen,
141
+ type,
69
142
  value,
70
- onValueChange: setValue,
143
+ selectedValues,
144
+ isSelected,
145
+ toggleValue,
146
+ selectValueAndClose,
147
+ commitValue,
148
+ isItemDisabled,
149
+ registerDisabledItem,
71
150
  disabled: isEffectivelyDisabled,
72
151
  required: isEffectivelyRequired,
73
152
  invalid: isEffectivelyInvalid,
@@ -76,11 +155,21 @@ export const SelectRoot = /*#__PURE__*/forwardRef(({
76
155
  triggerRef,
77
156
  contentId,
78
157
  triggerId,
158
+ inputValue,
159
+ setInputValue,
160
+ visibleItems,
161
+ isItemVisible,
162
+ hasSearch,
163
+ registerSearch,
164
+ emptyText,
165
+ setEmptyText,
166
+ listboxId,
167
+ labelId,
79
168
  activeValue,
80
169
  setActiveValue,
81
170
  accessibilityLabel,
82
171
  ariaDescribedBy
83
- }), [open, items, setOpen, value, setValue, isEffectivelyDisabled, isEffectivelyRequired, isEffectivelyInvalid, isEffectivelyReadOnly, native, contentId, triggerId, activeValue, accessibilityLabel, ariaDescribedBy]);
172
+ }), [open, items, setOpen, type, value, selectedValues, isSelected, toggleValue, selectValueAndClose, commitValue, isItemDisabled, registerDisabledItem, isEffectivelyDisabled, isEffectivelyRequired, isEffectivelyInvalid, isEffectivelyReadOnly, native, contentId, triggerId, inputValue, setInputValue, visibleItems, isItemVisible, hasSearch, registerSearch, emptyText, listboxId, labelId, activeValue, accessibilityLabel, ariaDescribedBy]);
84
173
  const Comp = asChild ? Slot : View;
85
174
  return /*#__PURE__*/_jsx(SelectProvider, {
86
175
  value: contextValue,
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","useCallback","useId","useMemo","useRef","useState","View","useControllableState","useFormControl","Slot","dataAttributes","mergeDataAttributes","SelectProvider","jsx","_jsx","SelectRoot","asChild","children","items","value","valueProp","defaultValue","onValueChange","isOpen","openProp","defaultOpen","onOpenChange","disabled","isRequired","isInvalid","isReadOnly","native","accessibilityLabel","props","ref","formControlProps","isDisabled","isEffectivelyDisabled","isEffectivelyRequired","required","isEffectivelyInvalid","isEffectivelyReadOnly","readOnly","setValue","prop","defaultProp","onChange","newValue","undefined","open","setOpenState","setOpen","newOpen","activeValue","setActiveValue","triggerRef","reactId","triggerId","id","contentId","ariaDescribedBy","contextValue","invalid","Comp","readonly","displayName"],"sourceRoot":"../../../src","sources":["select/SelectRoot.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","View","useControllableState","useFormControl","Slot","dataAttributes","mergeDataAttributes","SelectProvider","defaultSelectFilter","jsx","_jsx","EMPTY_VALUES","SelectRoot","rootProps","ref","asChild","children","items","type","value","valueProp","defaultValue","onValueChange","isOpen","openProp","defaultOpen","onOpenChange","disabled","isRequired","isInvalid","isReadOnly","native","accessibilityLabel","inputValue","inputValueProp","defaultInputValue","onInputChange","filter","props","formControlProps","isDisabled","isEffectivelyDisabled","isEffectivelyRequired","required","isEffectivelyInvalid","isEffectivelyReadOnly","readOnly","isMultiple","setValue","prop","defaultProp","undefined","onChange","newValue","selectedValues","Array","isArray","isSelected","itemValue","includes","open","setOpenState","setOpen","newOpen","activeValue","setActiveValue","inputValueState","setInputValueState","setInputValue","next","wasOpenRef","wasOpen","current","visibleItems","item","label","visibleValues","Set","map","isItemVisible","has","searchCount","setSearchCount","registerSearch","count","emptyText","setEmptyText","toggleValue","prev","v","selectValueAndClose","commitValue","disabledItemsRef","registerDisabledItem","add","delete","isItemDisabled","some","triggerRef","reactId","triggerId","id","contentId","listboxId","ariaDescribedBy","labelId","hasSearch","contextValue","invalid","Comp","readonly","displayName"],"sourceRoot":"../../../src","sources":["select/SelectRoot.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ import { forwardRef, useLayoutEffect } from 'react';
4
+ import { Platform, TextInput } from 'react-native';
5
+ import { composeEventHandlers } from '@cdx-ui/utils';
6
+ import { Slot } from '../slot';
7
+ import { useSelectContentContext, useSelectContext } from './context';
8
+ import { SelectSearchStatus } from './SelectSearchStatus';
9
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
10
+ const defaultResultCountLabel = count => count === 1 ? '1 result' : `${String(count)} results`;
11
+
12
+ /**
13
+ * Search input for `Select.Content`. Its query filters the options through the root `filter`.
14
+ * Mounting it turns the popup into a dialog that contains this searchbox and the listbox.
15
+ *
16
+ * Web uses virtual focus: DOM focus stays here, arrow keys move the highlight, and
17
+ * `aria-activedescendant` points at it. Native renders the input without virtual focus.
18
+ */
19
+ export const SelectSearch = /*#__PURE__*/forwardRef(({
20
+ asChild,
21
+ children,
22
+ accessibilityLabel,
23
+ getResultCountLabel = defaultResultCountLabel,
24
+ onKeyPress,
25
+ ...props
26
+ }, ref) => {
27
+ const {
28
+ inputValue,
29
+ setInputValue,
30
+ registerSearch,
31
+ listboxId,
32
+ contentId,
33
+ activeValue,
34
+ isItemVisible,
35
+ visibleItems,
36
+ emptyText
37
+ } = useSelectContext();
38
+ const {
39
+ handleKeyDown
40
+ } = useSelectContentContext();
41
+ useLayoutEffect(() => registerSearch(), [registerSearch]);
42
+ const activeDescendant = activeValue !== undefined && isItemVisible(activeValue) ? `${contentId}-option-${activeValue}` : undefined;
43
+
44
+ // RNW's TextInput stops keydown propagation, so the listbox keys are handled here.
45
+ const platformProps = Platform.OS === 'web' ? {
46
+ 'aria-controls': listboxId,
47
+ 'aria-autocomplete': 'list',
48
+ 'aria-activedescendant': activeDescendant,
49
+ onKeyPress: composeEventHandlers(onKeyPress, handleKeyDown)
50
+ } : {
51
+ onKeyPress
52
+ };
53
+ const count = visibleItems.length;
54
+ const statusMessage = count === 0 && emptyText ? emptyText : getResultCountLabel(count);
55
+ const Comp = asChild ? Slot : TextInput;
56
+ return /*#__PURE__*/_jsxs(_Fragment, {
57
+ children: [/*#__PURE__*/_jsx(Comp, {
58
+ ref: ref,
59
+ role: "searchbox",
60
+ value: inputValue,
61
+ onChangeText: setInputValue,
62
+ autoCapitalize: "none",
63
+ autoComplete: "off",
64
+ autoCorrect: false,
65
+ spellCheck: false,
66
+ accessibilityLabel: accessibilityLabel,
67
+ "aria-label": accessibilityLabel,
68
+ ...platformProps,
69
+ ...props,
70
+ children: children
71
+ }), /*#__PURE__*/_jsx(SelectSearchStatus, {
72
+ message: statusMessage
73
+ })]
74
+ });
75
+ });
76
+ SelectSearch.displayName = 'SelectSearch';
77
+ //# sourceMappingURL=SelectSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useLayoutEffect","Platform","TextInput","composeEventHandlers","Slot","useSelectContentContext","useSelectContext","SelectSearchStatus","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","defaultResultCountLabel","count","String","SelectSearch","asChild","children","accessibilityLabel","getResultCountLabel","onKeyPress","props","ref","inputValue","setInputValue","registerSearch","listboxId","contentId","activeValue","isItemVisible","visibleItems","emptyText","handleKeyDown","activeDescendant","undefined","platformProps","OS","length","statusMessage","Comp","role","value","onChangeText","autoCapitalize","autoComplete","autoCorrect","spellCheck","message","displayName"],"sourceRoot":"../../../src","sources":["select/SelectSearch.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,eAAe,QAAwB,OAAO;AACnE,SAASC,QAAQ,EAAEC,SAAS,QAAQ,cAAc;AAClD,SAASC,oBAAoB,QAAQ,eAAe;AACpD,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,uBAAuB,EAAEC,gBAAgB,QAAQ,WAAW;AACrE,SAASC,kBAAkB,QAAQ,sBAAsB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAU1D,MAAMC,uBAAuB,GAAIC,KAAa,IAC5CA,KAAK,KAAK,CAAC,GAAG,UAAU,GAAG,GAAGC,MAAM,CAACD,KAAK,CAAC,UAAU;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,YAAY,gBAAGlB,UAAU,CACpC,CACE;EACEmB,OAAO;EACPC,QAAQ;EACRC,kBAAkB;EAClBC,mBAAmB,GAAGP,uBAAuB;EAC7CQ,UAAU;EACV,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAM;IACJC,UAAU;IACVC,aAAa;IACbC,cAAc;IACdC,SAAS;IACTC,SAAS;IACTC,WAAW;IACXC,aAAa;IACbC,YAAY;IACZC;EACF,CAAC,GAAG3B,gBAAgB,CAAC,CAAC;EACtB,MAAM;IAAE4B;EAAc,CAAC,GAAG7B,uBAAuB,CAAC,CAAC;EAEnDL,eAAe,CAAC,MAAM2B,cAAc,CAAC,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEzD,MAAMQ,gBAAgB,GACpBL,WAAW,KAAKM,SAAS,IAAIL,aAAa,CAACD,WAAW,CAAC,GACnD,GAAGD,SAAS,WAAWC,WAAW,EAAE,GACpCM,SAAS;;EAEf;EACA,MAAMC,aAAa,GACjBpC,QAAQ,CAACqC,EAAE,KAAK,KAAK,GACjB;IACE,eAAe,EAAEV,SAAS;IAC1B,mBAAmB,EAAE,MAAe;IACpC,uBAAuB,EAAEO,gBAAgB;IACzCb,UAAU,EAAEnB,oBAAoB,CAACmB,UAAU,EAAEY,aAAa;EAC5D,CAAC,GACD;IAAEZ;EAAW,CAAC;EAEpB,MAAMP,KAAK,GAAGiB,YAAY,CAACO,MAAM;EACjC,MAAMC,aAAa,GAAGzB,KAAK,KAAK,CAAC,IAAIkB,SAAS,GAAGA,SAAS,GAAGZ,mBAAmB,CAACN,KAAK,CAAC;EAEvF,MAAM0B,IAAI,GAAGvB,OAAO,GAAGd,IAAI,GAAGF,SAAS;EAEvC,oBACEW,KAAA,CAAAF,SAAA;IAAAQ,QAAA,gBACEV,IAAA,CAACgC,IAAI;MACHjB,GAAG,EAAEA,GAAI;MACTkB,IAAI,EAAC,WAAW;MAChBC,KAAK,EAAElB,UAAW;MAClBmB,YAAY,EAAElB,aAAc;MAC5BmB,cAAc,EAAC,MAAM;MACrBC,YAAY,EAAC,KAAK;MAClBC,WAAW,EAAE,KAAM;MACnBC,UAAU,EAAE,KAAM;MAClB5B,kBAAkB,EAAEA,kBAAmB;MACvC,cAAYA,kBAAmB;MAAA,GAC3BiB,aAAa;MAAA,GACbd,KAAK;MAAAJ,QAAA,EAERA;IAAQ,CACL,CAAC,eACPV,IAAA,CAACF,kBAAkB;MAAC0C,OAAO,EAAET;IAAc,CAAE,CAAC;EAAA,CAC9C,CAAC;AAEP,CACF,CAAC;AAEDvB,YAAY,CAACiC,WAAW,GAAG,cAAc","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Web-only. On native, screen readers move through the rows directly, in the anchored popover
5
+ * or in `Select.BottomSheet`, instead of following an input-driven live region.
6
+ */
7
+ export function SelectSearchStatus(_props) {
8
+ return null;
9
+ }
10
+ //# sourceMappingURL=SelectSearchStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SelectSearchStatus","_props"],"sourceRoot":"../../../src","sources":["select/SelectSearchStatus.tsx"],"mappings":";;AAIA;AACA;AACA;AACA;AACA,OAAO,SAASA,kBAAkBA,CAACC,MAA+B,EAAE;EAClE,OAAO,IAAI;AACb","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ import { VisuallyHidden } from '@react-aria/visually-hidden';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ /**
6
+ * Polite live region for the search results. It stays mounted while the search is, so each
7
+ * change to the count (or to the empty-state text) is announced.
8
+ */
9
+ export function SelectSearchStatus({
10
+ message
11
+ }) {
12
+ return /*#__PURE__*/_jsx(VisuallyHidden, {
13
+ children: /*#__PURE__*/_jsx("div", {
14
+ role: "status",
15
+ "aria-live": "polite",
16
+ children: message
17
+ })
18
+ });
19
+ }
20
+ //# sourceMappingURL=SelectSearchStatus.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["VisuallyHidden","jsx","_jsx","SelectSearchStatus","message","children","role"],"sourceRoot":"../../../src","sources":["select/SelectSearchStatus.web.tsx"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,6BAA6B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAK7D;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAC;EAAEC;AAAiC,CAAC,EAAE;EACvE,oBACEF,IAAA,CAACF,cAAc;IAAAK,QAAA,eACbH,IAAA;MAAKI,IAAI,EAAC,QAAQ;MAAC,aAAU,QAAQ;MAAAD,QAAA,EAClCD;IAAO,CACL;EAAC,CACQ,CAAC;AAErB","ignoreList":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ import { forwardRef, useCallback } from 'react';
4
+ import { View } from 'react-native';
5
+ import { composeEventHandlers } from '@cdx-ui/utils';
6
+ import { Slot } from '../slot';
7
+ import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
8
+ import { SelectContentProvider, useSelectContext } from './context';
9
+ import { getPopupRoleProps } from './popupRole';
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ /**
12
+ * Native rows take screen-reader focus directly, so the sheet has no listbox keyboard model
13
+ * for `Select.Search` to drive.
14
+ */
15
+ const SHEET_CONTENT_CONTEXT = {
16
+ handleKeyDown: () => undefined
17
+ };
18
+
19
+ /**
20
+ * Body of a native sheet surface that presents the options in place of `SelectContent`. The
21
+ * styled layer owns presentation (open, swipe, backdrop, back) and renders this inside it.
22
+ * It carries the popup role and name, and closes on the VoiceOver escape gesture without
23
+ * changing the value.
24
+ */
25
+ export const SelectSheetContent = /*#__PURE__*/forwardRef(({
26
+ asChild,
27
+ children,
28
+ onAccessibilityEscape,
29
+ ...props
30
+ }, ref) => {
31
+ const {
32
+ setOpen,
33
+ hasSearch,
34
+ labelId,
35
+ accessibilityLabel,
36
+ triggerId,
37
+ contentId
38
+ } = useSelectContext();
39
+ const dismiss = useCallback(() => setOpen(false), [setOpen]);
40
+ const roleProps = getPopupRoleProps({
41
+ hasSearch,
42
+ labelId,
43
+ accessibilityLabel,
44
+ triggerId
45
+ });
46
+ const Comp = asChild ? Slot : View;
47
+ return /*#__PURE__*/_jsx(SelectContentProvider, {
48
+ value: SHEET_CONTENT_CONTEXT,
49
+ children: /*#__PURE__*/_jsx(Comp, {
50
+ ref: ref,
51
+ id: contentId,
52
+ ...roleProps,
53
+ ...props,
54
+ ...mergeDataAttributes(props, dataAttributes({
55
+ state: 'open'
56
+ })),
57
+ onAccessibilityEscape: composeEventHandlers(onAccessibilityEscape, dismiss),
58
+ children: children
59
+ })
60
+ });
61
+ });
62
+ SelectSheetContent.displayName = 'SelectSheetContent';
63
+ //# sourceMappingURL=SelectSheetContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useCallback","View","composeEventHandlers","Slot","dataAttributes","mergeDataAttributes","SelectContentProvider","useSelectContext","getPopupRoleProps","jsx","_jsx","SHEET_CONTENT_CONTEXT","handleKeyDown","undefined","SelectSheetContent","asChild","children","onAccessibilityEscape","props","ref","setOpen","hasSearch","labelId","accessibilityLabel","triggerId","contentId","dismiss","roleProps","Comp","value","id","state","displayName"],"sourceRoot":"../../../src","sources":["select/SelectSheetContent.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,WAAW,QAA2B,OAAO;AAClE,SAASC,IAAI,QAAQ,cAAc;AACnC,SAASC,oBAAoB,QAAQ,eAAe;AACpD,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,cAAc,EAAEC,mBAAmB,QAAQ,yBAAyB;AAC7E,SAASC,qBAAqB,EAAEC,gBAAgB,QAAwC,WAAW;AACnG,SAASC,iBAAiB,QAAQ,aAAa;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQhD;AACA;AACA;AACA;AACA,MAAMC,qBAAgD,GAAG;EAAEC,aAAa,EAAEA,CAAA,KAAMC;AAAU,CAAC;;AAE3F;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,gBAAGf,UAAU,CAC1C,CAAC;EAAEgB,OAAO;EAAEC,QAAQ;EAAEC,qBAAqB;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC/D,MAAM;IAAEC,OAAO;IAAEC,SAAS;IAAEC,OAAO;IAAEC,kBAAkB;IAAEC,SAAS;IAAEC;EAAU,CAAC,GAC7ElB,gBAAgB,CAAC,CAAC;EAEpB,MAAMmB,OAAO,GAAG1B,WAAW,CAAC,MAAMoB,OAAO,CAAC,KAAK,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAC5D,MAAMO,SAAS,GAAGnB,iBAAiB,CAAC;IAAEa,SAAS;IAAEC,OAAO;IAAEC,kBAAkB;IAAEC;EAAU,CAAC,CAAC;EAE1F,MAAMI,IAAI,GAAGb,OAAO,GAAGZ,IAAI,GAAGF,IAAI;EAElC,oBACES,IAAA,CAACJ,qBAAqB;IAACuB,KAAK,EAAElB,qBAAsB;IAAAK,QAAA,eAClDN,IAAA,CAACkB,IAAI;MACHT,GAAG,EAAEA,GAAI;MACTW,EAAE,EAAEL,SAAU;MAAA,GACVE,SAAS;MAAA,GACTT,KAAK;MAAA,GACLb,mBAAmB,CAACa,KAAK,EAAEd,cAAc,CAAC;QAAE2B,KAAK,EAAE;MAAO,CAAC,CAAC,CAAC;MACjEd,qBAAqB,EAAEf,oBAAoB,CAACe,qBAAqB,EAAES,OAAO,CAAE;MAAAV,QAAA,EAE3EA;IAAQ,CACL;EAAC,CACc,CAAC;AAE5B,CACF,CAAC;AAEDF,kBAAkB,CAACkB,WAAW,GAAG,oBAAoB","ignoreList":[]}
@@ -8,4 +8,6 @@ export const [SelectProvider, useSelectContext] = createContext('SelectContext')
8
8
  * highlighted, checked, etc.) to child slots like `Select.ItemLabel`.
9
9
  */
10
10
  export const [SelectItemProvider, useSelectItemContext] = createContext('SelectItemContext');
11
+ /** Internal: lets `Select.Search` drive the listbox from its input. */
12
+ export const [SelectContentProvider, useSelectContentContext] = createContext('SelectContentContext');
11
13
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","SelectProvider","useSelectContext","SelectItemProvider","useSelectItemContext"],"sourceRoot":"../../../src","sources":["select/context.tsx"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,eAAe;AAG7C,OAAO,MAAM,CAACC,cAAc,EAAEC,gBAAgB,CAAC,GAC7CF,aAAa,CAAqB,eAAe,CAAC;;AAEpD;AACA;AACA;AACA;AACA,OAAO,MAAM,CAACG,kBAAkB,EAAEC,oBAAoB,CAAC,GACrDJ,aAAa,CAA6B,mBAAmB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createContext","SelectProvider","useSelectContext","SelectItemProvider","useSelectItemContext","SelectContentProvider","useSelectContentContext"],"sourceRoot":"../../../src","sources":["select/context.tsx"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,eAAe;AAG7C,OAAO,MAAM,CAACC,cAAc,EAAEC,gBAAgB,CAAC,GAC7CF,aAAa,CAAqB,eAAe,CAAC;;AAEpD;AACA;AACA;AACA;AACA,OAAO,MAAM,CAACG,kBAAkB,EAAEC,oBAAoB,CAAC,GACrDJ,aAAa,CAA6B,mBAAmB,CAAC;AAOhE;AACA,OAAO,MAAM,CAACK,qBAAqB,EAAEC,uBAAuB,CAAC,GAC3DN,aAAa,CAA4B,sBAAsB,CAAC","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ const COMBINING_MARKS = /[̀-ͯ]/g;
4
+ function normalize(text) {
5
+ const decomposed = typeof text.normalize === 'function' ? text.normalize('NFD') : text;
6
+ return decomposed.replace(COMBINING_MARKS, '').toLocaleLowerCase();
7
+ }
8
+
9
+ /** Case- and accent-insensitive `contains`: "cafe" matches "Café". */
10
+ export const defaultSelectFilter = (textValue, inputValue) => normalize(textValue).includes(normalize(inputValue));
11
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["COMBINING_MARKS","normalize","text","decomposed","replace","toLocaleLowerCase","defaultSelectFilter","textValue","inputValue","includes"],"sourceRoot":"../../../src","sources":["select/filter.ts"],"mappings":";;AAEA,MAAMA,eAAe,GAAG,QAAQ;AAEhC,SAASC,SAASA,CAACC,IAAY,EAAU;EACvC,MAAMC,UAAU,GAAG,OAAOD,IAAI,CAACD,SAAS,KAAK,UAAU,GAAGC,IAAI,CAACD,SAAS,CAAC,KAAK,CAAC,GAAGC,IAAI;EACtF,OAAOC,UAAU,CAACC,OAAO,CAACJ,eAAe,EAAE,EAAE,CAAC,CAACK,iBAAiB,CAAC,CAAC;AACpE;;AAEA;AACA,OAAO,MAAMC,mBAAiC,GAAGA,CAACC,SAAS,EAAEC,UAAU,KACrEP,SAAS,CAACM,SAAS,CAAC,CAACE,QAAQ,CAACR,SAAS,CAACO,UAAU,CAAC,CAAC","ignoreList":[]}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
 
3
- export { useSelectContext, useSelectItemContext } from './context';
3
+ export { SelectProvider, useSelectContext, useSelectItemContext } from './context';
4
4
  export { SelectRoot } from './SelectRoot';
5
5
  export { SelectTrigger } from './SelectTrigger';
6
6
  export { SelectContent } from './SelectContent';
7
+ export { SelectSheetContent } from './SelectSheetContent';
8
+ export { SelectSearch } from './SelectSearch';
9
+ export { SelectListbox } from './SelectListbox';
10
+ export { SelectEmpty } from './SelectEmpty';
7
11
  export { SelectItem } from './SelectItem';
8
12
  //# sourceMappingURL=index.js.map