@eos-ui/vue 0.1.1 → 0.2.1

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 (407) hide show
  1. package/THIRD_PARTY.md +1 -1
  2. package/dist/component-names.js +1 -1
  3. package/dist/component-names.js.map +1 -1
  4. package/dist/components/Actions/EActions.js.map +1 -1
  5. package/dist/components/Actions/EActions.vue.d.ts +3 -1
  6. package/dist/components/Actions/EActions.vue_vue_type_script_setup_true_lang.js +12 -3
  7. package/dist/components/Actions/EActions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  8. package/dist/components/AppHeader/EAppHeader.js.map +1 -1
  9. package/dist/components/AppHeader/EAppHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/AppShell/EAppShell.js.map +1 -1
  11. package/dist/components/AppShell/EAppShell.vue.d.ts +2 -2
  12. package/dist/components/AppShell/EAppShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/Avatar/EAvatar.js.map +1 -1
  14. package/dist/components/Avatar/EAvatar.vue.d.ts +4 -4
  15. package/dist/components/Avatar/EAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/Breadcrumb/EBreadcrumb.js.map +1 -1
  17. package/dist/components/Breadcrumb/EBreadcrumb.vue.d.ts +2 -2
  18. package/dist/components/Breadcrumb/EBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/Button/EButton.js.map +1 -1
  20. package/dist/components/Button/EButton.vue.d.ts +5 -3
  21. package/dist/components/Button/EButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/Calendar/ECalendar.js.map +1 -1
  23. package/dist/components/Calendar/ECalendar.vue.d.ts +12 -9
  24. package/dist/components/Calendar/ECalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/Checkbox/ECheckbox.js.map +1 -1
  26. package/dist/components/Checkbox/ECheckbox.vue.d.ts +6 -3
  27. package/dist/components/Checkbox/ECheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/CodeBlock/ECodeBlock.js.map +1 -1
  29. package/dist/components/CodeBlock/ECodeBlock.vue.d.ts +2 -2
  30. package/dist/components/CodeBlock/ECodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  31. package/dist/components/ColorField/EColorField.js.map +1 -1
  32. package/dist/components/ColorField/EColorField.vue.d.ts +5 -3
  33. package/dist/components/ColorField/EColorField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/Combobox/ECombobox.js.map +1 -1
  35. package/dist/components/Combobox/ECombobox.vue.d.ts +7 -5
  36. package/dist/components/Combobox/ECombobox.vue_vue_type_script_setup_true_lang.js +3 -2
  37. package/dist/components/Combobox/ECombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/components/Combobox/EComboboxBase.js.map +1 -1
  39. package/dist/components/Combobox/EComboboxBase.vue.d.ts +6 -14
  40. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js +9 -8
  41. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/Combobox/EComboboxOption.js.map +1 -1
  43. package/dist/components/Combobox/EComboboxOption.vue_vue_type_script_setup_true_lang.js +1 -1
  44. package/dist/components/Combobox/EComboboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/Combobox/{EHighlight.js → matchHighlight.js} +3 -3
  46. package/dist/components/Combobox/matchHighlight.js.map +1 -0
  47. package/dist/components/Combobox/types.d.ts +13 -8
  48. package/dist/components/CurrencyField/ECurrencyField.js.map +1 -1
  49. package/dist/components/CurrencyField/ECurrencyField.vue.d.ts +8 -6
  50. package/dist/components/CurrencyField/ECurrencyField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/DataGrid/EDataGrid.js.map +1 -1
  52. package/dist/components/DataGrid/EDataGrid.vue.d.ts +20 -15
  53. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js +213 -213
  54. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/DatePicker/EDatePicker.js.map +1 -1
  56. package/dist/components/DatePicker/EDatePicker.vue.d.ts +9 -6
  57. package/dist/components/DatePicker/EDatePicker.vue_vue_type_script_setup_true_lang.js +10 -10
  58. package/dist/components/DatePicker/EDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/Definition/EDefinition.js +8 -0
  60. package/dist/components/Definition/EDefinition.js.map +1 -0
  61. package/dist/components/{Popover/EPopover.vue.d.ts → Definition/EDefinition.vue.d.ts} +2 -1
  62. package/dist/components/{Popover/EPopover.vue_vue_type_script_setup_true_lang.js → Definition/EDefinition.vue_vue_type_script_setup_true_lang.js} +4 -4
  63. package/dist/components/Definition/EDefinition.vue_vue_type_script_setup_true_lang.js.map +1 -0
  64. package/dist/components/Definition/index.d.ts +1 -0
  65. package/dist/components/DescriptionList/EDescriptionList.js.map +1 -1
  66. package/dist/components/DescriptionList/EDescriptionList.vue.d.ts +32 -5
  67. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js +70 -8
  68. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/Dialog/DialogFrame.js.map +1 -1
  70. package/dist/components/Dialog/DialogFrame.vue.d.ts +1 -0
  71. package/dist/components/Dialog/DialogFrame.vue_vue_type_script_setup_true_lang.js +19 -18
  72. package/dist/components/Dialog/DialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/Dialog/EDialog.js.map +1 -1
  74. package/dist/components/Dialog/EDialog.vue.d.ts +4 -1
  75. package/dist/components/Dialog/EDialog.vue_vue_type_script_setup_true_lang.js +3 -0
  76. package/dist/components/Dialog/EDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/components/Disclosure/EDisclosure.js.map +1 -1
  78. package/dist/components/Disclosure/EDisclosure.vue.d.ts +6 -9
  79. package/dist/components/Disclosure/EDisclosure.vue_vue_type_script_setup_true_lang.js +14 -19
  80. package/dist/components/Disclosure/EDisclosure.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/components/Drawer/EDrawer.js.map +1 -1
  82. package/dist/components/Drawer/EDrawer.vue.d.ts +4 -1
  83. package/dist/components/Drawer/EDrawer.vue_vue_type_script_setup_true_lang.js +3 -0
  84. package/dist/components/Drawer/EDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/EmptyState/EEmptyState.js.map +1 -1
  86. package/dist/components/EmptyState/EEmptyState.vue.d.ts +1 -1
  87. package/dist/components/EmptyState/EEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/ExpandableRow/EExpandableRow.js +8 -0
  89. package/dist/components/ExpandableRow/EExpandableRow.js.map +1 -0
  90. package/dist/components/{ButtonGroup/EButtonGroup.vue.d.ts → ExpandableRow/EExpandableRow.vue.d.ts} +12 -4
  91. package/dist/components/ExpandableRow/EExpandableRow.vue_vue_type_script_setup_true_lang.js +40 -0
  92. package/dist/components/ExpandableRow/EExpandableRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
  93. package/dist/components/ExpandableRow/index.d.ts +1 -0
  94. package/dist/components/Field/EField.js.map +1 -1
  95. package/dist/components/Field/EField.vue.d.ts +1 -1
  96. package/dist/components/Field/EField.vue_vue_type_script_setup_true_lang.js +4 -4
  97. package/dist/components/Field/EField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/Field/labelProps.d.ts +2 -2
  99. package/dist/components/Fieldset/EFieldset.js.map +1 -1
  100. package/dist/components/Fieldset/EFieldset.vue.d.ts +5 -3
  101. package/dist/components/Fieldset/EFieldset.vue_vue_type_script_setup_true_lang.js +54 -35
  102. package/dist/components/Fieldset/EFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/Grid/EGrid.js.map +1 -1
  104. package/dist/components/Grid/EGrid.vue.d.ts +5 -2
  105. package/dist/components/Grid/EGrid.vue_vue_type_script_setup_true_lang.js +15 -11
  106. package/dist/components/Grid/EGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/Heading/EHeading.js.map +1 -1
  108. package/dist/components/Heading/EHeading.vue.d.ts +1 -1
  109. package/dist/components/Heading/EHeading.vue_vue_type_script_setup_true_lang.js +10 -10
  110. package/dist/components/Heading/EHeading.vue_vue_type_script_setup_true_lang.js.map +1 -1
  111. package/dist/components/Highlight/EHighlight.js.map +1 -1
  112. package/dist/components/Highlight/EHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/IconButton/EIconButton.js.map +1 -1
  114. package/dist/components/IconButton/EIconButton.vue.d.ts +1 -0
  115. package/dist/components/IconButton/EIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/components/Inline/EInline.js.map +1 -1
  117. package/dist/components/Inline/EInline.vue.d.ts +3 -3
  118. package/dist/components/Inline/EInline.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/components/Kbd/EKbd.js.map +1 -1
  120. package/dist/components/Kbd/EKbd.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/Link/ELink.js.map +1 -1
  122. package/dist/components/Link/ELink.vue.d.ts +2 -2
  123. package/dist/components/Link/ELink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  124. package/dist/components/Menu/EMenu.js.map +1 -1
  125. package/dist/components/Menu/EMenu.vue.d.ts +4 -3
  126. package/dist/components/Menu/EMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/components/Menu/EMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  128. package/dist/components/NavList/ENavList.js.map +1 -1
  129. package/dist/components/NavList/ENavList.vue.d.ts +7 -9
  130. package/dist/components/NavList/ENavList.vue_vue_type_script_setup_true_lang.js +2 -3
  131. package/dist/components/NavList/ENavList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/components/{Tabs → NavList}/LinkNav.js +1 -1
  133. package/dist/components/NavList/LinkNav.js.map +1 -0
  134. package/dist/components/{Tabs → NavList}/LinkNav.vue_vue_type_script_setup_true_lang.js +1 -1
  135. package/dist/components/NavList/LinkNav.vue_vue_type_script_setup_true_lang.js.map +1 -0
  136. package/dist/components/Notice/ENotice.js.map +1 -1
  137. package/dist/components/Notice/ENotice.vue.d.ts +2 -2
  138. package/dist/components/Notice/ENotice.vue_vue_type_script_setup_true_lang.js.map +1 -1
  139. package/dist/components/NumberField/ENumberField.js.map +1 -1
  140. package/dist/components/NumberField/ENumberField.vue.d.ts +5 -3
  141. package/dist/components/NumberField/ENumberField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/components/OtpField/EOtpField.js.map +1 -1
  143. package/dist/components/OtpField/EOtpField.vue.d.ts +10 -8
  144. package/dist/components/OtpField/EOtpField.vue_vue_type_script_setup_true_lang.js +2 -2
  145. package/dist/components/OtpField/EOtpField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/PageHeader/EPageHeader.js.map +1 -1
  147. package/dist/components/PageHeader/EPageHeader.vue.d.ts +1 -1
  148. package/dist/components/PageHeader/EPageHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/Pagination/EPagination.js.map +1 -1
  150. package/dist/components/Pagination/EPagination.vue.d.ts +1 -0
  151. package/dist/components/Pagination/EPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  152. package/dist/components/PasswordField/EPasswordField.js.map +1 -1
  153. package/dist/components/PasswordField/EPasswordField.vue.d.ts +14 -10
  154. package/dist/components/PasswordField/EPasswordField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/components/PhoneField/EPhoneField.js.map +1 -1
  156. package/dist/components/PhoneField/EPhoneField.vue.d.ts +6 -4
  157. package/dist/components/PhoneField/EPhoneField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  158. package/dist/components/Progress/EProgress.js.map +1 -1
  159. package/dist/components/Progress/EProgress.vue.d.ts +5 -5
  160. package/dist/components/Progress/EProgress.vue_vue_type_script_setup_true_lang.js +20 -14
  161. package/dist/components/Progress/EProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  162. package/dist/components/RadioGroup/ERadioGroup.js.map +1 -1
  163. package/dist/components/RadioGroup/ERadioGroup.vue.d.ts +8 -4
  164. package/dist/components/RadioGroup/ERadioGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  165. package/dist/components/RadioGroup/ERadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/components/RangePicker/ERangePicker.js.map +1 -1
  167. package/dist/components/RangePicker/ERangePicker.vue.d.ts +12 -8
  168. package/dist/components/RangePicker/ERangePicker.vue_vue_type_script_setup_true_lang.js +65 -65
  169. package/dist/components/RangePicker/ERangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/SearchBar/ESearchBar.js.map +1 -1
  171. package/dist/components/SearchBar/ESearchBar.vue.d.ts +8 -7
  172. package/dist/components/SearchBar/ESearchBar.vue_vue_type_script_setup_true_lang.js +1 -1
  173. package/dist/components/SearchBar/ESearchBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/components/SearchResults/ESearchResults.js.map +1 -1
  175. package/dist/components/SearchResults/ESearchResults.vue.d.ts +3 -3
  176. package/dist/components/SearchResults/ESearchResults.vue_vue_type_script_setup_true_lang.js +1 -1
  177. package/dist/components/SearchResults/ESearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -1
  178. package/dist/components/Segmented/ESegmented.js.map +1 -1
  179. package/dist/components/Segmented/ESegmented.vue.d.ts +10 -6
  180. package/dist/components/Segmented/ESegmented.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/Select/ESelect.js.map +1 -1
  182. package/dist/components/Select/ESelect.vue.d.ts +9 -6
  183. package/dist/components/Select/ESelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/components/Select/ESelectControl.vue.d.ts +2 -2
  185. package/dist/components/Select/ESelectControl.vue_vue_type_script_setup_true_lang.js +6 -6
  186. package/dist/components/Select/options.d.ts +1 -1
  187. package/dist/components/Select/options.js.map +1 -1
  188. package/dist/components/SignatureField/ESignatureField.js.map +1 -1
  189. package/dist/components/SignatureField/ESignatureField.vue.d.ts +14 -10
  190. package/dist/components/SignatureField/ESignatureField.vue_vue_type_script_setup_true_lang.js +4 -4
  191. package/dist/components/SignatureField/ESignatureField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/SignaturePad/ESignaturePad.js.map +1 -1
  193. package/dist/components/SignaturePad/ESignaturePad.vue.d.ts +3 -1
  194. package/dist/components/SignaturePad/ESignaturePad.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/Skeleton/ESkeleton.js.map +1 -1
  196. package/dist/components/Skeleton/ESkeleton.vue.d.ts +3 -3
  197. package/dist/components/Skeleton/ESkeleton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/Stack/EStack.js.map +1 -1
  199. package/dist/components/Stack/EStack.vue.d.ts +2 -2
  200. package/dist/components/Stack/EStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/Stamp/EStamp.js.map +1 -1
  202. package/dist/components/Stamp/EStamp.vue.d.ts +18 -12
  203. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js +27 -40
  204. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js.map +1 -1
  205. package/dist/components/Stepper/EStepper.js.map +1 -1
  206. package/dist/components/Stepper/EStepper.vue.d.ts +2 -2
  207. package/dist/components/Stepper/EStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  208. package/dist/components/Surface/ESurface.js.map +1 -1
  209. package/dist/components/Surface/ESurface.vue.d.ts +5 -5
  210. package/dist/components/Surface/ESurface.vue_vue_type_script_setup_true_lang.js +5 -5
  211. package/dist/components/Surface/ESurface.vue_vue_type_script_setup_true_lang.js.map +1 -1
  212. package/dist/components/Switch/ESwitch.js.map +1 -1
  213. package/dist/components/Switch/ESwitch.vue.d.ts +3 -1
  214. package/dist/components/Switch/ESwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/components/Tabs/ETabs.js.map +1 -1
  216. package/dist/components/Tabs/ETabs.vue.d.ts +10 -32
  217. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js +21 -50
  218. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/components/Tabs/index.d.ts +1 -1
  220. package/dist/components/Text/EText.js.map +1 -1
  221. package/dist/components/Text/EText.vue.d.ts +4 -3
  222. package/dist/components/Text/EText.vue_vue_type_script_setup_true_lang.js +7 -2
  223. package/dist/components/Text/EText.vue_vue_type_script_setup_true_lang.js.map +1 -1
  224. package/dist/components/TextField/ETextField.js.map +1 -1
  225. package/dist/components/TextField/ETextField.vue.d.ts +8 -6
  226. package/dist/components/TextField/ETextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  227. package/dist/components/Textarea/ETextarea.js.map +1 -1
  228. package/dist/components/Textarea/ETextarea.vue.d.ts +4 -2
  229. package/dist/components/Textarea/ETextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/Toast/EToast.js.map +1 -1
  231. package/dist/components/Toast/EToast.vue_vue_type_script_setup_true_lang.js +5 -5
  232. package/dist/components/Toast/EToast.vue_vue_type_script_setup_true_lang.js.map +1 -1
  233. package/dist/components/ToastProvider/EToastProvider.js.map +1 -1
  234. package/dist/components/ToastProvider/EToastProvider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  235. package/dist/components/Tooltip/ETooltip.js.map +1 -1
  236. package/dist/components/Tooltip/ETooltip.vue.d.ts +1 -0
  237. package/dist/components/Tooltip/ETooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  238. package/dist/components/Upload/EUpload.js.map +1 -1
  239. package/dist/components/Upload/EUpload.vue.d.ts +5 -3
  240. package/dist/components/Upload/EUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/fonts.css +1 -1
  242. package/dist/index.d.ts +2 -25
  243. package/dist/index.js +71 -94
  244. package/dist/messages.d.ts +0 -13
  245. package/dist/messages.js +0 -13
  246. package/dist/messages.js.map +1 -1
  247. package/dist/style.css +2668 -3128
  248. package/package.json +4 -2
  249. package/dist/components/Accordion/EAccordion.js +0 -8
  250. package/dist/components/Accordion/EAccordion.js.map +0 -1
  251. package/dist/components/Accordion/EAccordion.vue.d.ts +0 -32
  252. package/dist/components/Accordion/EAccordion.vue_vue_type_script_setup_true_lang.js +0 -35
  253. package/dist/components/Accordion/EAccordion.vue_vue_type_script_setup_true_lang.js.map +0 -1
  254. package/dist/components/Accordion/index.d.ts +0 -2
  255. package/dist/components/AddressField/EAddressField.js +0 -8
  256. package/dist/components/AddressField/EAddressField.js.map +0 -1
  257. package/dist/components/AddressField/EAddressField.vue.d.ts +0 -39
  258. package/dist/components/AddressField/EAddressField.vue_vue_type_script_setup_true_lang.js +0 -119
  259. package/dist/components/AddressField/EAddressField.vue_vue_type_script_setup_true_lang.js.map +0 -1
  260. package/dist/components/AddressField/index.d.ts +0 -2
  261. package/dist/components/AddressField/usStates.d.ts +0 -5
  262. package/dist/components/AddressField/usStates.js +0 -211
  263. package/dist/components/AddressField/usStates.js.map +0 -1
  264. package/dist/components/Amount/EAmount.js +0 -8
  265. package/dist/components/Amount/EAmount.js.map +0 -1
  266. package/dist/components/Amount/EAmount.vue.d.ts +0 -21
  267. package/dist/components/Amount/EAmount.vue_vue_type_script_setup_true_lang.js +0 -38
  268. package/dist/components/Amount/EAmount.vue_vue_type_script_setup_true_lang.js.map +0 -1
  269. package/dist/components/Amount/index.d.ts +0 -2
  270. package/dist/components/Autocomplete/EAutocomplete.js +0 -7
  271. package/dist/components/Autocomplete/EAutocomplete.js.map +0 -1
  272. package/dist/components/Autocomplete/EAutocomplete.vue.d.ts +0 -44
  273. package/dist/components/Autocomplete/EAutocomplete.vue_vue_type_script_setup_true_lang.js +0 -58
  274. package/dist/components/Autocomplete/EAutocomplete.vue_vue_type_script_setup_true_lang.js.map +0 -1
  275. package/dist/components/Autocomplete/index.d.ts +0 -1
  276. package/dist/components/BackLink/EBackLink.js +0 -8
  277. package/dist/components/BackLink/EBackLink.js.map +0 -1
  278. package/dist/components/BackLink/EBackLink.vue.d.ts +0 -23
  279. package/dist/components/BackLink/EBackLink.vue_vue_type_script_setup_true_lang.js +0 -27
  280. package/dist/components/BackLink/EBackLink.vue_vue_type_script_setup_true_lang.js.map +0 -1
  281. package/dist/components/BackLink/index.d.ts +0 -1
  282. package/dist/components/BookingCard/EBookingCard.js +0 -8
  283. package/dist/components/BookingCard/EBookingCard.js.map +0 -1
  284. package/dist/components/BookingCard/EBookingCard.vue.d.ts +0 -46
  285. package/dist/components/BookingCard/EBookingCard.vue_vue_type_script_setup_true_lang.js +0 -86
  286. package/dist/components/BookingCard/EBookingCard.vue_vue_type_script_setup_true_lang.js.map +0 -1
  287. package/dist/components/BookingCard/index.d.ts +0 -2
  288. package/dist/components/ButtonGroup/EButtonGroup.js +0 -8
  289. package/dist/components/ButtonGroup/EButtonGroup.js.map +0 -1
  290. package/dist/components/ButtonGroup/EButtonGroup.vue_vue_type_script_setup_true_lang.js +0 -18
  291. package/dist/components/ButtonGroup/EButtonGroup.vue_vue_type_script_setup_true_lang.js.map +0 -1
  292. package/dist/components/ButtonGroup/index.d.ts +0 -1
  293. package/dist/components/CardField/ECardField.js +0 -8
  294. package/dist/components/CardField/ECardField.js.map +0 -1
  295. package/dist/components/CardField/ECardField.vue.d.ts +0 -31
  296. package/dist/components/CardField/ECardField.vue_vue_type_script_setup_true_lang.js +0 -65
  297. package/dist/components/CardField/ECardField.vue_vue_type_script_setup_true_lang.js.map +0 -1
  298. package/dist/components/CardField/index.d.ts +0 -1
  299. package/dist/components/Chip/EChip.js +0 -8
  300. package/dist/components/Chip/EChip.js.map +0 -1
  301. package/dist/components/Chip/EChip.vue.d.ts +0 -22
  302. package/dist/components/Chip/EChip.vue_vue_type_script_setup_true_lang.js +0 -18
  303. package/dist/components/Chip/EChip.vue_vue_type_script_setup_true_lang.js.map +0 -1
  304. package/dist/components/Chip/index.d.ts +0 -2
  305. package/dist/components/Combobox/EHighlight.js.map +0 -1
  306. package/dist/components/DetailRow/EDetailRow.js +0 -8
  307. package/dist/components/DetailRow/EDetailRow.js.map +0 -1
  308. package/dist/components/DetailRow/EDetailRow.vue.d.ts +0 -30
  309. package/dist/components/DetailRow/EDetailRow.vue_vue_type_script_setup_true_lang.js +0 -53
  310. package/dist/components/DetailRow/EDetailRow.vue_vue_type_script_setup_true_lang.js.map +0 -1
  311. package/dist/components/DetailRow/index.d.ts +0 -1
  312. package/dist/components/ErrorSummary/EErrorSummary.js +0 -8
  313. package/dist/components/ErrorSummary/EErrorSummary.js.map +0 -1
  314. package/dist/components/ErrorSummary/EErrorSummary.vue.d.ts +0 -30
  315. package/dist/components/ErrorSummary/EErrorSummary.vue_vue_type_script_setup_true_lang.js +0 -52
  316. package/dist/components/ErrorSummary/EErrorSummary.vue_vue_type_script_setup_true_lang.js.map +0 -1
  317. package/dist/components/ErrorSummary/index.d.ts +0 -2
  318. package/dist/components/FormSection/EFormSection.js +0 -8
  319. package/dist/components/FormSection/EFormSection.js.map +0 -1
  320. package/dist/components/FormSection/EFormSection.vue.d.ts +0 -28
  321. package/dist/components/FormSection/EFormSection.vue_vue_type_script_setup_true_lang.js +0 -38
  322. package/dist/components/FormSection/EFormSection.vue_vue_type_script_setup_true_lang.js.map +0 -1
  323. package/dist/components/FormSection/index.d.ts +0 -1
  324. package/dist/components/ItemList/EItemList.js +0 -8
  325. package/dist/components/ItemList/EItemList.js.map +0 -1
  326. package/dist/components/ItemList/EItemList.vue.d.ts +0 -13
  327. package/dist/components/ItemList/EItemList.vue_vue_type_script_setup_true_lang.js +0 -17
  328. package/dist/components/ItemList/EItemList.vue_vue_type_script_setup_true_lang.js.map +0 -1
  329. package/dist/components/ItemList/context.d.ts +0 -3
  330. package/dist/components/ItemList/context.js +0 -6
  331. package/dist/components/ItemList/context.js.map +0 -1
  332. package/dist/components/ItemList/index.d.ts +0 -1
  333. package/dist/components/ItemRow/EItemRow.js +0 -8
  334. package/dist/components/ItemRow/EItemRow.js.map +0 -1
  335. package/dist/components/ItemRow/EItemRow.vue.d.ts +0 -29
  336. package/dist/components/ItemRow/EItemRow.vue_vue_type_script_setup_true_lang.js +0 -54
  337. package/dist/components/ItemRow/EItemRow.vue_vue_type_script_setup_true_lang.js.map +0 -1
  338. package/dist/components/ItemRow/index.d.ts +0 -1
  339. package/dist/components/LinkCard/ELinkCard.js +0 -8
  340. package/dist/components/LinkCard/ELinkCard.js.map +0 -1
  341. package/dist/components/LinkCard/ELinkCard.vue.d.ts +0 -39
  342. package/dist/components/LinkCard/ELinkCard.vue_vue_type_script_setup_true_lang.js +0 -61
  343. package/dist/components/LinkCard/ELinkCard.vue_vue_type_script_setup_true_lang.js.map +0 -1
  344. package/dist/components/LinkCard/index.d.ts +0 -1
  345. package/dist/components/LoadingBar/ELoadingBar.js +0 -8
  346. package/dist/components/LoadingBar/ELoadingBar.js.map +0 -1
  347. package/dist/components/LoadingBar/ELoadingBar.vue.d.ts +0 -7
  348. package/dist/components/LoadingBar/ELoadingBar.vue_vue_type_script_setup_true_lang.js +0 -21
  349. package/dist/components/LoadingBar/ELoadingBar.vue_vue_type_script_setup_true_lang.js.map +0 -1
  350. package/dist/components/LoadingBar/index.d.ts +0 -1
  351. package/dist/components/MetaList/EMetaList.js +0 -8
  352. package/dist/components/MetaList/EMetaList.js.map +0 -1
  353. package/dist/components/MetaList/EMetaList.vue.d.ts +0 -15
  354. package/dist/components/MetaList/EMetaList.vue_vue_type_script_setup_true_lang.js +0 -19
  355. package/dist/components/MetaList/EMetaList.vue_vue_type_script_setup_true_lang.js.map +0 -1
  356. package/dist/components/MetaList/index.d.ts +0 -2
  357. package/dist/components/MultiSelect/EMultiSelect.js +0 -7
  358. package/dist/components/MultiSelect/EMultiSelect.js.map +0 -1
  359. package/dist/components/MultiSelect/EMultiSelect.vue.d.ts +0 -44
  360. package/dist/components/MultiSelect/EMultiSelect.vue_vue_type_script_setup_true_lang.js +0 -58
  361. package/dist/components/MultiSelect/EMultiSelect.vue_vue_type_script_setup_true_lang.js.map +0 -1
  362. package/dist/components/MultiSelect/index.d.ts +0 -1
  363. package/dist/components/Panel/EPanel.js +0 -8
  364. package/dist/components/Panel/EPanel.js.map +0 -1
  365. package/dist/components/Panel/EPanel.vue.d.ts +0 -25
  366. package/dist/components/Panel/EPanel.vue_vue_type_script_setup_true_lang.js +0 -38
  367. package/dist/components/Panel/EPanel.vue_vue_type_script_setup_true_lang.js.map +0 -1
  368. package/dist/components/Panel/index.d.ts +0 -1
  369. package/dist/components/Popover/EPopover.js +0 -8
  370. package/dist/components/Popover/EPopover.js.map +0 -1
  371. package/dist/components/Popover/EPopover.vue_vue_type_script_setup_true_lang.js.map +0 -1
  372. package/dist/components/Popover/index.d.ts +0 -1
  373. package/dist/components/SlotPicker/ESlotPicker.js +0 -8
  374. package/dist/components/SlotPicker/ESlotPicker.js.map +0 -1
  375. package/dist/components/SlotPicker/ESlotPicker.vue.d.ts +0 -55
  376. package/dist/components/SlotPicker/ESlotPicker.vue_vue_type_script_setup_true_lang.js +0 -82
  377. package/dist/components/SlotPicker/ESlotPicker.vue_vue_type_script_setup_true_lang.js.map +0 -1
  378. package/dist/components/SlotPicker/index.d.ts +0 -2
  379. package/dist/components/StatementCard/EStatementCard.js +0 -8
  380. package/dist/components/StatementCard/EStatementCard.js.map +0 -1
  381. package/dist/components/StatementCard/EStatementCard.vue.d.ts +0 -20
  382. package/dist/components/StatementCard/EStatementCard.vue_vue_type_script_setup_true_lang.js +0 -96
  383. package/dist/components/StatementCard/EStatementCard.vue_vue_type_script_setup_true_lang.js.map +0 -1
  384. package/dist/components/StatementCard/index.d.ts +0 -2
  385. package/dist/components/StatementCard/types.d.ts +0 -37
  386. package/dist/components/StatementRow/EStatementRow.js +0 -8
  387. package/dist/components/StatementRow/EStatementRow.js.map +0 -1
  388. package/dist/components/StatementRow/EStatementRow.vue.d.ts +0 -14
  389. package/dist/components/StatementRow/EStatementRow.vue_vue_type_script_setup_true_lang.js +0 -96
  390. package/dist/components/StatementRow/EStatementRow.vue_vue_type_script_setup_true_lang.js.map +0 -1
  391. package/dist/components/StatementRow/index.d.ts +0 -1
  392. package/dist/components/Tabs/LinkNav.js.map +0 -1
  393. package/dist/components/Tabs/LinkNav.vue_vue_type_script_setup_true_lang.js.map +0 -1
  394. package/dist/components/Timeline/ETimeline.js +0 -8
  395. package/dist/components/Timeline/ETimeline.js.map +0 -1
  396. package/dist/components/Timeline/ETimeline.vue.d.ts +0 -15
  397. package/dist/components/Timeline/ETimeline.vue_vue_type_script_setup_true_lang.js +0 -43
  398. package/dist/components/Timeline/ETimeline.vue_vue_type_script_setup_true_lang.js.map +0 -1
  399. package/dist/components/Timeline/index.d.ts +0 -2
  400. package/dist/components/Toggle/EToggle.js +0 -8
  401. package/dist/components/Toggle/EToggle.js.map +0 -1
  402. package/dist/components/Toggle/EToggle.vue.d.ts +0 -27
  403. package/dist/components/Toggle/EToggle.vue_vue_type_script_setup_true_lang.js +0 -40
  404. package/dist/components/Toggle/EToggle.vue_vue_type_script_setup_true_lang.js.map +0 -1
  405. package/dist/components/Toggle/index.d.ts +0 -1
  406. /package/dist/components/Combobox/{EHighlight.d.ts → matchHighlight.d.ts} +0 -0
  407. /package/dist/components/{Tabs → NavList}/LinkNav.vue.d.ts +0 -0
@@ -8,6 +8,8 @@ var c = /*@__PURE__*/ n({
8
8
  ariaLabel: {},
9
9
  label: {},
10
10
  bare: { type: Boolean },
11
+ multiple: { type: Boolean },
12
+ freeform: { type: Boolean },
11
13
  options: {},
12
14
  placeholder: {},
13
15
  hint: {},
@@ -25,7 +27,7 @@ var c = /*@__PURE__*/ n({
25
27
  filter: {},
26
28
  id: {}
27
29
  }, {
28
- modelValue: { default: "" },
30
+ modelValue: {},
29
31
  modelModifiers: {},
30
32
  open: {
31
33
  type: Boolean,
@@ -47,7 +49,6 @@ var c = /*@__PURE__*/ n({
47
49
  "onUpdate:modelValue": r[0] ||= (e) => l.value = e,
48
50
  open: u.value,
49
51
  "onUpdate:open": r[1] ||= (e) => u.value = e,
50
- mode: "single",
51
52
  onInputChange: r[2] ||= (e) => n.$emit("inputChange", e)
52
53
  }), null, 16, ["modelValue", "open"]));
53
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ECombobox.vue_vue_type_script_setup_true_lang.js","names":["$emit","_useModel","_openBlock","_createBlock","EComboboxBase","_mergeProps","EComboboxBase_default","ECombobox_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"open\"","\"openModifiers\"","__expose","props","__props","model","useModel","open","base","ref","openBlock","createBlock","mergeProps","_cache","$event","_ctx","text"],"sources":["../../../src/components/Combobox/ECombobox.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport EComboboxBase from \"./EComboboxBase.vue\";\nimport type { EComboboxProps } from \"./types.js\";\n\nconst props = withDefaults(defineProps<EComboboxProps>(), { clearable: true });\n\ndefineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\nconst model = defineModel<string>({ default: \"\" });\n\nconst open = defineModel<boolean>(\"open\", { default: false });\n\nconst base = ref<InstanceType<typeof EComboboxBase> | null>(null);\ndefineExpose({\n input: () => base.value?.input ?? null,\n focus: () => base.value?.focus(),\n});\n</script>\n\n<template>\n <EComboboxBase\n ref=\"base\"\n v-bind=\"props\"\n v-model=\"model\"\n v-model:open=\"open\"\n mode=\"single\"\n @input-change=\"(text: string) => $emit('inputChange', text)\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKA,IAAMa,IAAQC,GAORC,IAAQd,EAAmBa,GAAA,YAAgB,GAE3CG,IAAOhB,EAAoBa,GAAC,MAA0B,GAEtDI,IAAOC,EAA+C,IAAI;E,OAChEP,EAAa;GACX,aAAaM,EAAK,OAAO,SAAS;GAClC,aAAaA,EAAK,OAAO,MAAM;EACjC,CAAC,I,UAIChB,EAAA,GAAAC,EAOEC,GAPFC,EAOE;GANI,SAAA;GAAJ,KAAIa;EACI,GAAAL,GAAK;GACJ,YAAAE,EAAA;GAAA,uBAAA,AAAAQ,EAAA,QAAA,MAAA,EAAK,QAAAC;GACN,MAAMP,EAAA;GAAA,iBAAA,AAAAM,EAAA,QAAA,MAAA,EAAI,QAAAC;GAClB,MAAK;GACJ,eAAY,AAAAD,EAAA,QAAG,MAAiBvB,EAAAA,MAAK,eAAgB0B,CAAI"}
1
+ {"version":3,"file":"ECombobox.vue_vue_type_script_setup_true_lang.js","names":["$emit","_useModel","_openBlock","_createBlock","EComboboxBase","_mergeProps","EComboboxBase_default","ECombobox_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"open\"","\"openModifiers\"","__expose","props","__props","model","useModel","open","base","ref","openBlock","createBlock","mergeProps","_cache","$event","_ctx","text"],"sources":["../../../src/components/Combobox/ECombobox.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from \"vue\";\nimport EComboboxBase from \"./EComboboxBase.vue\";\nimport type { EComboboxProps } from \"./types.js\";\n\nconst props = withDefaults(defineProps<EComboboxProps>(), { clearable: true });\n\ndefineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\n/** The `value` of the chosen option, empty for nothing; with `multiple` the chosen values in the order chosen (replaced, not mutated); with `freeform` the typed text, updated on every key. @default \"\" or [] */\nconst model = defineModel<string | string[]>();\n\n/** Whether the list is open. Setting it moves no focus; a disabled field never opens. */\nconst open = defineModel<boolean>(\"open\", { default: false });\n\nconst base = ref<InstanceType<typeof EComboboxBase> | null>(null);\ndefineExpose({\n input: () => base.value?.input ?? null,\n focus: () => base.value?.focus(),\n});\n</script>\n\n<template>\n <EComboboxBase\n ref=\"base\"\n v-bind=\"props\"\n v-model=\"model\"\n v-model:open=\"open\"\n @input-change=\"(text: string) => $emit('inputChange', text)\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKA,IAAMa,IAAQC,GAQRC,IAAQd,EAA8Ba,GAAA,YAAC,GAGvCG,IAAOhB,EAAoBa,GAAC,MAA0B,GAEtDI,IAAOC,EAA+C,IAAI;E,OAChEP,EAAa;GACX,aAAaM,EAAK,OAAO,SAAS;GAClC,aAAaA,EAAK,OAAO,MAAM;EACjC,CAAC,I,UAIChB,EAAA,GAAAC,EAMEC,GANFC,EAME;GALI,SAAA;GAAJ,KAAIa;EACI,GAAAL,GAAK;GACJ,YAAAE,EAAA;GAAA,uBAAA,AAAAQ,EAAA,QAAA,MAAA,EAAK,QAAAC;GACN,MAAMP,EAAA;GAAA,iBAAA,AAAAM,EAAA,QAAA,MAAA,EAAI,QAAAC;GACjB,eAAY,AAAAD,EAAA,QAAG,MAAiBvB,EAAAA,MAAK,eAAgB0B,CAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"EComboboxBase.js","names":["_sfc_main","EComboboxBase_vue_vue_type_script_setup_true_lang_default","EComboboxBase_default"],"sources":["../../../src/components/Combobox/EComboboxBase.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onMounted, ref, watch, type FunctionalComponent } from \"vue\";\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxInput,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from \"reka-ui\";\nimport EField from \"../Field/EField.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport ESpinner from \"../Spinner/ESpinner.vue\";\nimport EComboboxOption from \"./EComboboxOption.vue\";\nimport { normalizeOptions, sectionOptions } from \"../Select/options.js\";\nimport type { EComboboxProps } from \"./types.js\";\nimport { useMessages, usePortalTarget } from \"../../config.js\";\nimport { useFieldAttrs } from \"../../composables/useFieldAttrs.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport \"../../styles/base.css\";\nimport \"../TextField/input.css\";\nimport \"../Select/panel.css\";\nimport \"./combo.css\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(defineProps<EComboboxProps & { mode: \"single\" | \"free\" | \"multiple\" }>(), {\n clearable: true,\n});\n\nconst emit = defineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\nconst model = defineModel<string | string[]>();\n\nconst t = useMessages();\nconst portal = usePortalTarget();\nconst attrs = useFieldAttrs();\nconst groupId = useUid();\nconst bareId = useUid(() => props.id);\n\nconst Bare: FunctionalComponent = (_, { slots }) =>\n h(\"div\", attrs.wrapper(), slots.default?.({ id: bareId.value, ariaInvalid: undefined, ariaDescribedby: undefined }));\nconst frame = computed(() =>\n props.bare\n ? {}\n : {\n id: props.id,\n label: props.label,\n hideLabel: props.hideLabel,\n hint: props.hint,\n error: props.error,\n required: props.required,\n optional: props.optional,\n },\n);\nconst listName = computed(() => (props.bare ? (props.ariaLabel ?? props.label) : props.label));\n\nconst multiple = computed(() => props.mode === \"multiple\");\nconst free = computed(() => props.mode === \"free\");\nconst all = computed(() => normalizeOptions(props.options));\nconst values = computed<string[]>(() => (multiple.value && Array.isArray(model.value) ? model.value : []));\nconst single = computed(() => (typeof model.value === \"string\" ? model.value : \"\"));\nconst rootValue = computed(() => (multiple.value ? values.value : single.value));\n\nfunction labelOf(v: string): string {\n return all.value.find((o) => o.value === v)?.label ?? (free.value ? v : \"\");\n}\nconst resting = () => (multiple.value ? \"\" : labelOf(single.value));\n\nconst text = ref(resting());\nconst typing = ref(false);\nconst wantOpen = defineModel<boolean>(\"open\", { default: false });\nconst anchor = ref<{ $el: HTMLElement } | null>(null);\nconst query = computed(() => (typing.value ? text.value.trim().toLowerCase() : \"\"));\n\nconst shown = computed(() => {\n const q = query.value;\n if (props.filter) return all.value.filter((o) => props.filter!(o, q));\n return all.value.filter(\n (o) => !q || o.label.toLowerCase().includes(q) || (o.description ?? \"\").toLowerCase().includes(q),\n );\n});\nconst sections = computed(() => sectionOptions(shown.value));\nconst hasList = computed(() => shown.value.length > 0 || !!props.loading || !free.value);\nconst open = computed(() => wantOpen.value && hasList.value && !props.disabled);\nconst announce = computed(() =>\n open.value && !shown.value.length ? (props.loading ? t(\"searching\") : props.emptyText || t(\"noMatches\")) : \"\",\n);\nconst hasValue = computed(() => (multiple.value ? values.value.length > 0 : !!text.value));\n\nwatch(rootValue, () => {\n const rest = resting();\n if (rest !== text.value) {\n text.value = rest;\n typing.value = false;\n }\n});\nwatch(all, () => {\n if (!typing.value && !open.value) text.value = resting();\n});\n\nconst listId = ref<string | undefined>();\nconst content = ref<{ $el: HTMLElement } | null>(null);\nonMounted(() => {\n if (!open.value) return;\n let tries = 0;\n const read = () => {\n listId.value = content.value?.$el?.id || undefined;\n if (!listId.value && tries++ < 10) requestAnimationFrame(read);\n };\n void nextTick(read);\n});\n\nconst inputEl = () => anchor.value?.$el?.querySelector(\"input\") ?? null;\nconst focusInput = () => inputEl()?.focus();\n\nfunction isSelected(value: string): boolean {\n return multiple.value ? values.value.includes(value) : free.value ? single.value === value : single.value === value;\n}\nconst itemValue = (o: { value: string; label: string }) => (free.value ? o.label : o.value);\n\nfunction onPick(v: unknown) {\n typing.value = false;\n if (multiple.value) {\n model.value = Array.isArray(v) ? (v as string[]) : [];\n text.value = \"\";\n emit(\"inputChange\", \"\");\n return;\n }\n const next = typeof v === \"string\" ? v : \"\";\n model.value = next;\n text.value = free.value ? next : labelOf(next);\n emit(\"inputChange\", text.value);\n}\n\nfunction onInput(e: Event) {\n const v = (e.target as HTMLInputElement).value;\n text.value = v;\n typing.value = true;\n wantOpen.value = true;\n emit(\"inputChange\", v);\n if (free.value) model.value = v;\n}\n\nfunction remove(v: string) {\n model.value = values.value.filter((x) => x !== v);\n}\n\nfunction clear() {\n model.value = multiple.value ? [] : \"\";\n text.value = \"\";\n typing.value = false;\n emit(\"inputChange\", \"\");\n focusInput();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && !open.value && text.value) {\n e.preventDefault();\n clear();\n } else if (e.key === \"Backspace\" && multiple.value && !text.value && values.value.length) {\n remove(values.value[values.value.length - 1]!);\n }\n}\n\nfunction keepCaretKeys(e: KeyboardEvent) {\n if (e.key === \"Home\" || e.key === \"End\") e.stopImmediatePropagation();\n}\n\nfunction onBlur(e: FocusEvent) {\n const next = e.relatedTarget as Element | null;\n if (next && (anchor.value?.$el?.contains(next) || next.closest?.(\".e-popover\"))) return;\n wantOpen.value = false;\n typing.value = false;\n if (!free.value) text.value = resting();\n}\n\nfunction onWrapDown(e: MouseEvent) {\n if (e.target === e.currentTarget && !props.disabled) {\n e.preventDefault();\n focusInput();\n }\n}\n\ntype FieldSlot = { id: string; ariaInvalid: \"true\" | undefined; ariaDescribedby: string | undefined };\nfunction inputBind(field: FieldSlot) {\n return {\n id: field.id,\n required: props.required && !(multiple.value && values.value.length) ? true : undefined,\n placeholder: multiple.value && values.value.length ? \"\" : props.placeholder,\n \"aria-invalid\": field.ariaInvalid,\n \"aria-label\": props.bare ? listName.value : undefined,\n autocomplete: \"off\",\n ...(listId.value ? { \"aria-controls\": listId.value } : {}),\n ...(shown.value.length ? {} : { \"aria-activedescendant\": undefined }),\n ...attrs.input(field.ariaDescribedby),\n };\n}\n\ndefineExpose({\n input: computed(() => inputEl()),\n focus: focusInput,\n});\n</script>\n\n<template>\n <component :is=\"bare ? Bare : EField\" v-bind=\"{ ...attrs.wrapper(), ...frame }\">\n <template #default=\"field\">\n <ComboboxRoot\n class=\"e-combo-root\"\n :model-value=\"rootValue\"\n :multiple=\"multiple\"\n :open=\"open\"\n :disabled=\"disabled\"\n ignore-filter\n @update:model-value=\"onPick\"\n @update:open=\"wantOpen = $event\"\n >\n <ComboboxAnchor\n ref=\"anchor\"\n class=\"e-input-wrap e-combo\"\n :class=\"{ 'e-combo--multi': multiple }\"\n :data-invalid=\"error && !bare ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n @mousedown=\"onWrapDown\"\n @focusout=\"onBlur\"\n >\n <div class=\"e-combo-main\">\n <template v-if=\"multiple\">\n <span v-for=\"v in values\" :key=\"v\" class=\"e-tag\">\n {{ labelOf(v) }}\n <button\n type=\"button\"\n class=\"e-tag-x\"\n :aria-label=\"t('removeItem', { label: labelOf(v) })\"\n :disabled=\"disabled\"\n @click=\"remove(v)\"\n >\n <EIcon name=\"x\" small />\n </button>\n </span>\n </template>\n <ComboboxInput\n class=\"e-input e-combo-input\"\n :model-value=\"text\"\n :display-value=\"(v: unknown) => (typeof v === 'string' ? (free ? v : labelOf(v)) : '')\"\n :disabled=\"disabled\"\n v-bind=\"inputBind(field)\"\n @update:model-value=\"text = $event\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @keydown.capture=\"keepCaretKeys\"\n />\n </div>\n <template v-if=\"name\">\n <input v-for=\"(v, k) in multiple ? values : [single]\" :key=\"k\" type=\"hidden\" :name=\"name\" :value=\"v\" />\n </template>\n <div class=\"e-combo-tail\">\n <button\n v-if=\"hasValue && clearable && !disabled\"\n type=\"button\"\n class=\"e-combo-btn\"\n :aria-label=\"t('clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <EIcon name=\"x\" />\n </button>\n <ComboboxTrigger\n v-if=\"!free\"\n class=\"e-combo-btn\"\n :aria-label=\"t('showOptions')\"\n :disabled=\"disabled\"\n @mousedown.prevent\n >\n <EIcon name=\"chevron-down\" bold />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <span class=\"e-sr\" role=\"status\">{{ announce }}</span>\n <ComboboxPortal :to=\"portal\">\n <ComboboxContent\n ref=\"content\"\n position=\"popper\"\n align=\"start\"\n :side-offset=\"6\"\n :collision-padding=\"8\"\n class=\"e-popover e-listpanel e-root\"\n :aria-label=\"listName\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <ComboboxViewport>\n <template v-if=\"shown.length\">\n <template v-for=\"(section, i) in sections\" :key=\"i\">\n <div v-if=\"section.group\" class=\"e-opt-set\" role=\"group\" :aria-labelledby=\"`${groupId}-g${i}`\">\n <div :id=\"`${groupId}-g${i}`\" class=\"e-opt-group\">{{ section.group }}</div>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </div>\n <template v-else>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </template>\n </template>\n </template>\n <div v-else class=\"e-opt-status\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n <ESpinner v-if=\"loading\" :label=\"t('searching')\" />\n <template v-else>{{ emptyText || t(\"noMatches\") }}</template>\n </div>\n </ComboboxViewport>\n </ComboboxContent>\n </ComboboxPortal>\n </ComboboxRoot>\n </template>\n </component>\n</template>\n\n<style>\n@layer e.controls {\n .e-combo-main {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-items: center;\n align-self: stretch;\n gap: var(--e-space-1);\n min-width: 0;\n }\n\n .e-combo-tail {\n display: flex;\n flex: none;\n align-items: center;\n align-self: center;\n }\n\n .e-combo--multi {\n padding: 3px var(--e-space-1) 3px var(--e-space-2);\n gap: var(--e-space-1);\n }\n\n .e-combo--multi .e-input {\n height: calc(var(--e-control-height) - 9px);\n align-self: center;\n padding-inline: var(--e-space-2);\n }\n\n .e-tag {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-1);\n height: 32px;\n padding: 0 var(--e-space-1) 0 var(--e-space-3);\n border-radius: var(--e-radius-pill);\n background: var(--e-surface-tint);\n box-shadow: inset 0 0 0 1px var(--e-primary);\n color: var(--e-ink);\n font: 500 var(--e-text-sm)/1 var(--e-font-sans);\n }\n\n .e-tag-x::after {\n content: \"\";\n position: absolute;\n inset: -10px;\n }\n\n .e-tag-x {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--e-primary);\n cursor: pointer;\n }\n\n .e-tag-x:hover {\n background: var(--e-wash-hover);\n box-shadow: inset 0 0 0 1px var(--e-primary);\n }\n\n .e-tag-x:active {\n background: var(--e-wash-press);\n }\n\n .e-tag-x:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: 1px;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EComboboxBase.js","names":["_sfc_main","EComboboxBase_vue_vue_type_script_setup_true_lang_default","EComboboxBase_default"],"sources":["../../../src/components/Combobox/EComboboxBase.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onMounted, ref, watch, type FunctionalComponent } from \"vue\";\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxInput,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from \"reka-ui\";\nimport EField from \"../Field/EField.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport ESpinner from \"../Spinner/ESpinner.vue\";\nimport EComboboxOption from \"./EComboboxOption.vue\";\nimport { normalizeOptions, sectionOptions } from \"../Select/options.js\";\nimport type { EComboboxProps } from \"./types.js\";\nimport { useMessages, usePortalTarget } from \"../../config.js\";\nimport { useFieldAttrs } from \"../../composables/useFieldAttrs.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport \"../../styles/base.css\";\nimport \"../TextField/input.css\";\nimport \"../Select/panel.css\";\nimport \"./combo.css\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(defineProps<EComboboxProps>(), {\n clearable: true,\n});\n\nconst emit = defineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\nconst model = defineModel<string | string[]>();\n\nconst t = useMessages();\nconst portal = usePortalTarget();\nconst attrs = useFieldAttrs();\nconst groupId = useUid();\nconst bareId = useUid(() => props.id);\n\nconst Bare: FunctionalComponent = (_, { slots }) =>\n h(\"div\", attrs.wrapper(), slots.default?.({ id: bareId.value, ariaInvalid: undefined, ariaDescribedby: undefined }));\nconst frame = computed(() =>\n props.bare\n ? {}\n : {\n id: props.id,\n label: props.label,\n hideLabel: props.hideLabel,\n hint: props.hint,\n error: props.error,\n required: props.required,\n optional: props.optional,\n },\n);\nconst listName = computed(() => (props.bare ? (props.ariaLabel ?? props.label) : props.label));\n\nconst multiple = computed(() => props.multiple);\n// Free text is for one value; with `multiple` it is ignored.\nconst free = computed(() => props.freeform && !props.multiple);\nconst all = computed(() => normalizeOptions(props.options));\nconst values = computed<string[]>(() => (multiple.value && Array.isArray(model.value) ? model.value : []));\nconst single = computed(() => (typeof model.value === \"string\" ? model.value : \"\"));\nconst rootValue = computed(() => (multiple.value ? values.value : single.value));\n\nfunction labelOf(v: string): string {\n return all.value.find((o) => o.value === v)?.label ?? (free.value ? v : \"\");\n}\nconst resting = () => (multiple.value ? \"\" : labelOf(single.value));\n\nconst text = ref(resting());\nconst typing = ref(false);\nconst wantOpen = defineModel<boolean>(\"open\", { default: false });\nconst anchor = ref<{ $el: HTMLElement } | null>(null);\nconst query = computed(() => (typing.value ? text.value.trim().toLowerCase() : \"\"));\n\nconst shown = computed(() => {\n const q = query.value;\n if (props.filter) return all.value.filter((o) => props.filter!(o, q));\n return all.value.filter(\n (o) => !q || o.label.toLowerCase().includes(q) || (o.description ?? \"\").toLowerCase().includes(q),\n );\n});\nconst sections = computed(() => sectionOptions(shown.value));\nconst hasList = computed(() => shown.value.length > 0 || !!props.loading || !free.value);\nconst open = computed(() => wantOpen.value && hasList.value && !props.disabled);\nconst announce = computed(() =>\n open.value && !shown.value.length ? (props.loading ? t(\"searching\") : props.emptyText || t(\"noMatches\")) : \"\",\n);\nconst hasValue = computed(() => (multiple.value ? values.value.length > 0 : !!text.value));\n\nwatch(rootValue, () => {\n const rest = resting();\n if (rest !== text.value) {\n text.value = rest;\n typing.value = false;\n }\n});\nwatch(all, () => {\n if (!typing.value && !open.value) text.value = resting();\n});\n\nconst listId = ref<string | undefined>();\nconst content = ref<{ $el: HTMLElement } | null>(null);\nonMounted(() => {\n if (!open.value) return;\n let tries = 0;\n const read = () => {\n listId.value = content.value?.$el?.id || undefined;\n if (!listId.value && tries++ < 10) requestAnimationFrame(read);\n };\n void nextTick(read);\n});\n\nconst inputEl = () => anchor.value?.$el?.querySelector(\"input\") ?? null;\nconst focusInput = () => inputEl()?.focus();\n\nfunction isSelected(value: string): boolean {\n return multiple.value ? values.value.includes(value) : free.value ? single.value === value : single.value === value;\n}\nconst itemValue = (o: { value: string; label: string }) => (free.value ? o.label : o.value);\n\nfunction onPick(v: unknown) {\n typing.value = false;\n if (multiple.value) {\n model.value = Array.isArray(v) ? (v as string[]) : [];\n text.value = \"\";\n emit(\"inputChange\", \"\");\n return;\n }\n const next = typeof v === \"string\" ? v : \"\";\n model.value = next;\n text.value = free.value ? next : labelOf(next);\n emit(\"inputChange\", text.value);\n}\n\nfunction onInput(e: Event) {\n const v = (e.target as HTMLInputElement).value;\n text.value = v;\n typing.value = true;\n wantOpen.value = true;\n emit(\"inputChange\", v);\n if (free.value) model.value = v;\n}\n\nfunction remove(v: string) {\n model.value = values.value.filter((x) => x !== v);\n}\n\nfunction clear() {\n model.value = multiple.value ? [] : \"\";\n text.value = \"\";\n typing.value = false;\n emit(\"inputChange\", \"\");\n focusInput();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && !open.value && text.value) {\n e.preventDefault();\n clear();\n } else if (e.key === \"Backspace\" && multiple.value && !text.value && values.value.length) {\n remove(values.value[values.value.length - 1]!);\n }\n}\n\nfunction keepCaretKeys(e: KeyboardEvent) {\n if (e.key === \"Home\" || e.key === \"End\") e.stopImmediatePropagation();\n}\n\nfunction onBlur(e: FocusEvent) {\n const next = e.relatedTarget as Element | null;\n if (next && (anchor.value?.$el?.contains(next) || next.closest?.(\".e-popover\"))) return;\n wantOpen.value = false;\n typing.value = false;\n if (!free.value) text.value = resting();\n}\n\nfunction onWrapDown(e: MouseEvent) {\n if (e.target === e.currentTarget && !props.disabled) {\n e.preventDefault();\n focusInput();\n }\n}\n\ntype FieldSlot = { id: string; ariaInvalid: \"true\" | undefined; ariaDescribedby: string | undefined };\nfunction inputBind(field: FieldSlot) {\n return {\n id: field.id,\n required: props.required && !(multiple.value && values.value.length) ? true : undefined,\n placeholder: multiple.value && values.value.length ? \"\" : props.placeholder,\n \"aria-invalid\": field.ariaInvalid,\n \"aria-label\": props.bare ? listName.value : undefined,\n autocomplete: \"off\",\n ...(listId.value ? { \"aria-controls\": listId.value } : {}),\n ...(shown.value.length ? {} : { \"aria-activedescendant\": undefined }),\n ...attrs.input(field.ariaDescribedby),\n };\n}\n\ndefineExpose({\n input: computed(() => inputEl()),\n focus: focusInput,\n});\n</script>\n\n<template>\n <component :is=\"bare ? Bare : EField\" v-bind=\"{ ...attrs.wrapper(), ...frame }\">\n <template #default=\"field\">\n <ComboboxRoot\n class=\"e-combo-root\"\n :model-value=\"rootValue\"\n :multiple=\"multiple\"\n :open=\"open\"\n :disabled=\"disabled\"\n ignore-filter\n @update:model-value=\"onPick\"\n @update:open=\"wantOpen = $event\"\n >\n <ComboboxAnchor\n ref=\"anchor\"\n class=\"e-input-wrap e-combo\"\n :class=\"{ 'e-combo--multi': multiple }\"\n :data-invalid=\"error && !bare ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n @mousedown=\"onWrapDown\"\n @focusout=\"onBlur\"\n >\n <div class=\"e-combo-main\">\n <template v-if=\"multiple\">\n <span v-for=\"v in values\" :key=\"v\" class=\"e-tag\">\n {{ labelOf(v) }}\n <button\n type=\"button\"\n class=\"e-tag-x\"\n :aria-label=\"t('removeItem', { label: labelOf(v) })\"\n :disabled=\"disabled\"\n @click=\"remove(v)\"\n >\n <EIcon name=\"x\" small />\n </button>\n </span>\n </template>\n <ComboboxInput\n class=\"e-input e-combo-input\"\n :model-value=\"text\"\n :display-value=\"(v: unknown) => (typeof v === 'string' ? (free ? v : labelOf(v)) : '')\"\n :disabled=\"disabled\"\n v-bind=\"inputBind(field)\"\n @update:model-value=\"text = $event\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @keydown.capture=\"keepCaretKeys\"\n />\n </div>\n <template v-if=\"name\">\n <input v-for=\"(v, k) in multiple ? values : [single]\" :key=\"k\" type=\"hidden\" :name=\"name\" :value=\"v\" />\n </template>\n <div class=\"e-combo-tail\">\n <button\n v-if=\"hasValue && clearable && !disabled\"\n type=\"button\"\n class=\"e-combo-btn\"\n :aria-label=\"t('clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <EIcon name=\"x\" />\n </button>\n <ComboboxTrigger\n v-if=\"!free\"\n class=\"e-combo-btn\"\n :aria-label=\"t('showOptions')\"\n :disabled=\"disabled\"\n @mousedown.prevent\n >\n <EIcon name=\"chevron-down\" bold />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <span class=\"e-sr\" role=\"status\">{{ announce }}</span>\n <ComboboxPortal :to=\"portal\">\n <ComboboxContent\n ref=\"content\"\n position=\"popper\"\n align=\"start\"\n :side-offset=\"6\"\n :collision-padding=\"8\"\n class=\"e-popover e-listpanel e-root\"\n :aria-label=\"listName\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <ComboboxViewport>\n <template v-if=\"shown.length\">\n <template v-for=\"(section, i) in sections\" :key=\"i\">\n <div v-if=\"section.group\" class=\"e-opt-set\" role=\"group\" :aria-labelledby=\"`${groupId}-g${i}`\">\n <div :id=\"`${groupId}-g${i}`\" class=\"e-opt-group\">{{ section.group }}</div>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </div>\n <template v-else>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </template>\n </template>\n </template>\n <div v-else class=\"e-opt-status\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n <ESpinner v-if=\"loading\" :label=\"t('searching')\" />\n <template v-else>{{ emptyText || t(\"noMatches\") }}</template>\n </div>\n </ComboboxViewport>\n </ComboboxContent>\n </ComboboxPortal>\n </ComboboxRoot>\n </template>\n </component>\n</template>\n\n<style>\n@layer e.controls {\n .e-combo-main {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-items: center;\n align-self: stretch;\n gap: var(--e-space-1);\n min-width: 0;\n }\n\n .e-combo-tail {\n display: flex;\n flex: none;\n align-items: center;\n align-self: center;\n }\n\n .e-combo--multi {\n padding: 3px var(--e-space-1) 3px var(--e-space-2);\n gap: var(--e-space-1);\n }\n\n .e-combo--multi .e-input {\n height: calc(var(--e-control-height) - 9px);\n align-self: center;\n padding-inline: var(--e-space-2);\n }\n\n .e-tag {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-1);\n height: var(--e-space-8);\n padding: 0 var(--e-space-1) 0 var(--e-space-3);\n border-radius: var(--e-radius-pill);\n background: var(--e-surface-tint);\n box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-primary);\n color: var(--e-ink);\n font: 500 var(--e-text-sm)/1 var(--e-font-sans);\n }\n\n .e-tag-x::after {\n content: \"\";\n position: absolute;\n inset: calc((var(--e-tap) - var(--e-space-6)) / -2);\n }\n\n .e-tag-x {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: var(--e-space-6);\n height: var(--e-space-6);\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--e-primary);\n cursor: pointer;\n }\n\n .e-tag-x:hover {\n background: var(--e-wash-hover);\n box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-primary);\n }\n\n .e-tag-x:active {\n background: var(--e-wash-press);\n }\n\n .e-tag-x:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (forced-colors: active) {\n .e-tag {\n outline: var(--e-stroke-card) solid CanvasText;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -8,43 +8,35 @@ declare const __VLS_export: import('vue').DefineComponent<({
8
8
  } & {
9
9
  label: string;
10
10
  bare?: boolean;
11
- } & import('./types.js').EComboboxFields & {
12
- mode: "single" | "free" | "multiple";
13
- } & __VLS_ModelProps) | ({
11
+ } & import('./types.js').EComboboxFields & __VLS_ModelProps) | ({
14
12
  hideLabel?: boolean;
15
13
  ariaLabel?: string;
16
14
  } & {
17
15
  label?: string;
18
16
  bare: true;
19
- } & import('./types.js').EComboboxFields & {
20
- mode: "single" | "free" | "multiple";
21
- } & __VLS_ModelProps), {
17
+ } & import('./types.js').EComboboxFields & __VLS_ModelProps), {
22
18
  input: import('vue').ComputedRef<HTMLInputElement | null>;
23
19
  focus: () => void | undefined;
24
20
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
25
- "update:open": (value: boolean) => any;
26
21
  "update:modelValue": (value: string | string[] | undefined) => any;
27
22
  inputChange: (text: string) => any;
23
+ "update:open": (value: boolean) => any;
28
24
  }, string, import('vue').PublicProps, Readonly<({
29
25
  hideLabel?: boolean;
30
26
  ariaLabel?: string;
31
27
  } & {
32
28
  label: string;
33
29
  bare?: boolean;
34
- } & import('./types.js').EComboboxFields & {
35
- mode: "single" | "free" | "multiple";
36
- } & __VLS_ModelProps) | ({
30
+ } & import('./types.js').EComboboxFields & __VLS_ModelProps) | ({
37
31
  hideLabel?: boolean;
38
32
  ariaLabel?: string;
39
33
  } & {
40
34
  label?: string;
41
35
  bare: true;
42
- } & import('./types.js').EComboboxFields & {
43
- mode: "single" | "free" | "multiple";
44
- } & __VLS_ModelProps)> & Readonly<{
45
- "onUpdate:open"?: ((value: boolean) => any) | undefined;
36
+ } & import('./types.js').EComboboxFields & __VLS_ModelProps)> & Readonly<{
46
37
  "onUpdate:modelValue"?: ((value: string | string[] | undefined) => any) | undefined;
47
38
  onInputChange?: ((text: string) => any) | undefined;
39
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
48
40
  }>, {
49
41
  clearable: boolean;
50
42
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
@@ -5,10 +5,10 @@ import { useUid as n } from "../../composables/useUid.js";
5
5
  import r from "../Icon/EIcon.js";
6
6
  import te from "../Field/EField.js";
7
7
  /* empty css */
8
- import { normalizeOptions as ne, sectionOptions as re } from "../Select/options.js";
9
- /* empty css */
10
- import ie from "../Spinner/ESpinner.js";
8
+ import ne from "../Spinner/ESpinner.js";
11
9
  import i from "./EComboboxOption.js";
10
+ import { normalizeOptions as re, sectionOptions as ie } from "../Select/options.js";
11
+ /* empty css */
12
12
  /* empty css */
13
13
  import { Fragment as a, computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, guardReactiveProps as ae, h as oe, mergeModels as m, mergeProps as se, nextTick as ce, normalizeClass as le, normalizeProps as ue, onMounted as de, openBlock as h, ref as g, renderList as _, resolveDynamicComponent as fe, toDisplayString as v, unref as y, useModel as b, watch as x, withCtx as S, withModifiers as C } from "vue";
14
14
  import { ComboboxAnchor as pe, ComboboxContent as me, ComboboxInput as he, ComboboxPortal as ge, ComboboxRoot as _e, ComboboxTrigger as ve, ComboboxViewport as ye } from "reka-ui";
@@ -34,6 +34,8 @@ var be = { class: "e-combo-main" }, xe = [
34
34
  ariaLabel: {},
35
35
  label: {},
36
36
  bare: { type: Boolean },
37
+ multiple: { type: Boolean },
38
+ freeform: { type: Boolean },
37
39
  options: {},
38
40
  placeholder: {},
39
41
  hint: {},
@@ -49,8 +51,7 @@ var be = { class: "e-combo-main" }, xe = [
49
51
  default: !0
50
52
  },
51
53
  filter: {},
52
- id: {},
53
- mode: {}
54
+ id: {}
54
55
  }, {
55
56
  modelValue: {},
56
57
  modelModifiers: {},
@@ -74,14 +75,14 @@ var be = { class: "e-combo-main" }, xe = [
74
75
  error: T.error,
75
76
  required: T.required,
76
77
  optional: T.optional
77
- }), j = o(() => T.bare ? T.ariaLabel ?? T.label : T.label), M = o(() => T.mode === "multiple"), N = o(() => T.mode === "free"), P = o(() => ne(T.options)), F = o(() => M.value && Array.isArray(D.value) ? D.value : []), I = o(() => typeof D.value == "string" ? D.value : ""), L = o(() => M.value ? F.value : I.value);
78
+ }), j = o(() => T.bare ? T.ariaLabel ?? T.label : T.label), M = o(() => T.multiple), N = o(() => T.freeform && !T.multiple), P = o(() => re(T.options)), F = o(() => M.value && Array.isArray(D.value) ? D.value : []), I = o(() => typeof D.value == "string" ? D.value : ""), L = o(() => M.value ? F.value : I.value);
78
79
  function R(e) {
79
80
  return P.value.find((t) => t.value === e)?.label ?? (N.value ? e : "");
80
81
  }
81
82
  let z = () => M.value ? "" : R(I.value), B = g(z()), V = g(!1), H = b(p, "open"), U = g(null), W = o(() => V.value ? B.value.trim().toLowerCase() : ""), G = o(() => {
82
83
  let e = W.value;
83
84
  return T.filter ? P.value.filter((t) => T.filter(t, e)) : P.value.filter((t) => !e || t.label.toLowerCase().includes(e) || (t.description ?? "").toLowerCase().includes(e));
84
- }), Ne = o(() => re(G.value)), Pe = o(() => G.value.length > 0 || !!T.loading || !N.value), K = o(() => H.value && Pe.value && !T.disabled), Fe = o(() => K.value && !G.value.length ? T.loading ? O("searching") : T.emptyText || O("noMatches") : ""), Ie = o(() => M.value ? F.value.length > 0 : !!B.value);
85
+ }), Ne = o(() => ie(G.value)), Pe = o(() => G.value.length > 0 || !!T.loading || !N.value), K = o(() => H.value && Pe.value && !T.disabled), Fe = o(() => K.value && !G.value.length ? T.loading ? O("searching") : T.emptyText || O("noMatches") : ""), Ie = o(() => M.value ? F.value.length > 0 : !!B.value);
85
86
  x(L, () => {
86
87
  let e = z();
87
88
  e !== B.value && (B.value = e, V.value = !1);
@@ -277,7 +278,7 @@ var be = { class: "e-combo-main" }, xe = [
277
278
  "value",
278
279
  "selected",
279
280
  "query"
280
- ]))), 128))], 64))), 128)) : (h(), l("div", Oe, [p.loading ? (h(), s(ie, {
281
+ ]))), 128))], 64))), 128)) : (h(), l("div", Oe, [p.loading ? (h(), s(ne, {
281
282
  key: 0,
282
283
  label: y(O)("searching")
283
284
  }, null, 8, ["label"])) : (h(), l(a, { key: 1 }, [d(v(p.emptyText || y(O)("noMatches")), 1)], 64))]))]),
@@ -1 +1 @@
1
- {"version":3,"file":"EComboboxBase.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_resolveDynamicComponent","EField","_normalizeProps","_guardReactiveProps","_unref","_withCtx","_createVNode","_normalizeClass","_createElementVNode","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","EIcon","_createCommentVNode","_mergeProps","_withModifiers","EComboboxOption","ESpinner","EIcon_default","EField_default","ESpinner_default","EComboboxOption_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","EComboboxBase_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"open\"","\"openModifiers\"","__expose","__emit","props","__props","emit","model","useModel","t","useMessages","portal","usePortalTarget","attrs","useFieldAttrs","groupId","useUid","bareId","Bare","h","slots","frame","computed","listName","multiple","free","all","normalizeOptions","values","single","rootValue","labelOf","o","v","resting","text","ref","typing","wantOpen","anchor","query","shown","q","sections","sectionOptions","hasList","open","announce","hasValue","watch","rest","listId","content","tries","read","inputEl","focusInput","isSelected","value","itemValue","onPick","next","onInput","remove","x","clear","onKeydown","keepCaretKeys","onBlur","onWrapDown","inputBind","field","openBlock","createBlock","resolveDynamicComponent","normalizeProps","guardReactiveProps","unref","withCtx","createVNode","ComboboxRoot","_cache","$event","ComboboxAnchor","normalizeClass","createElementVNode","createElementBlock","Fragment","renderList","createTextVNode","toDisplayString","createCommentVNode","ComboboxInput","mergeProps","k","withModifiers","ComboboxTrigger","ComboboxPortal","ComboboxContent","ComboboxViewport","i","section"],"sources":["../../../src/components/Combobox/EComboboxBase.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onMounted, ref, watch, type FunctionalComponent } from \"vue\";\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxInput,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from \"reka-ui\";\nimport EField from \"../Field/EField.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport ESpinner from \"../Spinner/ESpinner.vue\";\nimport EComboboxOption from \"./EComboboxOption.vue\";\nimport { normalizeOptions, sectionOptions } from \"../Select/options.js\";\nimport type { EComboboxProps } from \"./types.js\";\nimport { useMessages, usePortalTarget } from \"../../config.js\";\nimport { useFieldAttrs } from \"../../composables/useFieldAttrs.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport \"../../styles/base.css\";\nimport \"../TextField/input.css\";\nimport \"../Select/panel.css\";\nimport \"./combo.css\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(defineProps<EComboboxProps & { mode: \"single\" | \"free\" | \"multiple\" }>(), {\n clearable: true,\n});\n\nconst emit = defineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\nconst model = defineModel<string | string[]>();\n\nconst t = useMessages();\nconst portal = usePortalTarget();\nconst attrs = useFieldAttrs();\nconst groupId = useUid();\nconst bareId = useUid(() => props.id);\n\nconst Bare: FunctionalComponent = (_, { slots }) =>\n h(\"div\", attrs.wrapper(), slots.default?.({ id: bareId.value, ariaInvalid: undefined, ariaDescribedby: undefined }));\nconst frame = computed(() =>\n props.bare\n ? {}\n : {\n id: props.id,\n label: props.label,\n hideLabel: props.hideLabel,\n hint: props.hint,\n error: props.error,\n required: props.required,\n optional: props.optional,\n },\n);\nconst listName = computed(() => (props.bare ? (props.ariaLabel ?? props.label) : props.label));\n\nconst multiple = computed(() => props.mode === \"multiple\");\nconst free = computed(() => props.mode === \"free\");\nconst all = computed(() => normalizeOptions(props.options));\nconst values = computed<string[]>(() => (multiple.value && Array.isArray(model.value) ? model.value : []));\nconst single = computed(() => (typeof model.value === \"string\" ? model.value : \"\"));\nconst rootValue = computed(() => (multiple.value ? values.value : single.value));\n\nfunction labelOf(v: string): string {\n return all.value.find((o) => o.value === v)?.label ?? (free.value ? v : \"\");\n}\nconst resting = () => (multiple.value ? \"\" : labelOf(single.value));\n\nconst text = ref(resting());\nconst typing = ref(false);\nconst wantOpen = defineModel<boolean>(\"open\", { default: false });\nconst anchor = ref<{ $el: HTMLElement } | null>(null);\nconst query = computed(() => (typing.value ? text.value.trim().toLowerCase() : \"\"));\n\nconst shown = computed(() => {\n const q = query.value;\n if (props.filter) return all.value.filter((o) => props.filter!(o, q));\n return all.value.filter(\n (o) => !q || o.label.toLowerCase().includes(q) || (o.description ?? \"\").toLowerCase().includes(q),\n );\n});\nconst sections = computed(() => sectionOptions(shown.value));\nconst hasList = computed(() => shown.value.length > 0 || !!props.loading || !free.value);\nconst open = computed(() => wantOpen.value && hasList.value && !props.disabled);\nconst announce = computed(() =>\n open.value && !shown.value.length ? (props.loading ? t(\"searching\") : props.emptyText || t(\"noMatches\")) : \"\",\n);\nconst hasValue = computed(() => (multiple.value ? values.value.length > 0 : !!text.value));\n\nwatch(rootValue, () => {\n const rest = resting();\n if (rest !== text.value) {\n text.value = rest;\n typing.value = false;\n }\n});\nwatch(all, () => {\n if (!typing.value && !open.value) text.value = resting();\n});\n\nconst listId = ref<string | undefined>();\nconst content = ref<{ $el: HTMLElement } | null>(null);\nonMounted(() => {\n if (!open.value) return;\n let tries = 0;\n const read = () => {\n listId.value = content.value?.$el?.id || undefined;\n if (!listId.value && tries++ < 10) requestAnimationFrame(read);\n };\n void nextTick(read);\n});\n\nconst inputEl = () => anchor.value?.$el?.querySelector(\"input\") ?? null;\nconst focusInput = () => inputEl()?.focus();\n\nfunction isSelected(value: string): boolean {\n return multiple.value ? values.value.includes(value) : free.value ? single.value === value : single.value === value;\n}\nconst itemValue = (o: { value: string; label: string }) => (free.value ? o.label : o.value);\n\nfunction onPick(v: unknown) {\n typing.value = false;\n if (multiple.value) {\n model.value = Array.isArray(v) ? (v as string[]) : [];\n text.value = \"\";\n emit(\"inputChange\", \"\");\n return;\n }\n const next = typeof v === \"string\" ? v : \"\";\n model.value = next;\n text.value = free.value ? next : labelOf(next);\n emit(\"inputChange\", text.value);\n}\n\nfunction onInput(e: Event) {\n const v = (e.target as HTMLInputElement).value;\n text.value = v;\n typing.value = true;\n wantOpen.value = true;\n emit(\"inputChange\", v);\n if (free.value) model.value = v;\n}\n\nfunction remove(v: string) {\n model.value = values.value.filter((x) => x !== v);\n}\n\nfunction clear() {\n model.value = multiple.value ? [] : \"\";\n text.value = \"\";\n typing.value = false;\n emit(\"inputChange\", \"\");\n focusInput();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && !open.value && text.value) {\n e.preventDefault();\n clear();\n } else if (e.key === \"Backspace\" && multiple.value && !text.value && values.value.length) {\n remove(values.value[values.value.length - 1]!);\n }\n}\n\nfunction keepCaretKeys(e: KeyboardEvent) {\n if (e.key === \"Home\" || e.key === \"End\") e.stopImmediatePropagation();\n}\n\nfunction onBlur(e: FocusEvent) {\n const next = e.relatedTarget as Element | null;\n if (next && (anchor.value?.$el?.contains(next) || next.closest?.(\".e-popover\"))) return;\n wantOpen.value = false;\n typing.value = false;\n if (!free.value) text.value = resting();\n}\n\nfunction onWrapDown(e: MouseEvent) {\n if (e.target === e.currentTarget && !props.disabled) {\n e.preventDefault();\n focusInput();\n }\n}\n\ntype FieldSlot = { id: string; ariaInvalid: \"true\" | undefined; ariaDescribedby: string | undefined };\nfunction inputBind(field: FieldSlot) {\n return {\n id: field.id,\n required: props.required && !(multiple.value && values.value.length) ? true : undefined,\n placeholder: multiple.value && values.value.length ? \"\" : props.placeholder,\n \"aria-invalid\": field.ariaInvalid,\n \"aria-label\": props.bare ? listName.value : undefined,\n autocomplete: \"off\",\n ...(listId.value ? { \"aria-controls\": listId.value } : {}),\n ...(shown.value.length ? {} : { \"aria-activedescendant\": undefined }),\n ...attrs.input(field.ariaDescribedby),\n };\n}\n\ndefineExpose({\n input: computed(() => inputEl()),\n focus: focusInput,\n});\n</script>\n\n<template>\n <component :is=\"bare ? Bare : EField\" v-bind=\"{ ...attrs.wrapper(), ...frame }\">\n <template #default=\"field\">\n <ComboboxRoot\n class=\"e-combo-root\"\n :model-value=\"rootValue\"\n :multiple=\"multiple\"\n :open=\"open\"\n :disabled=\"disabled\"\n ignore-filter\n @update:model-value=\"onPick\"\n @update:open=\"wantOpen = $event\"\n >\n <ComboboxAnchor\n ref=\"anchor\"\n class=\"e-input-wrap e-combo\"\n :class=\"{ 'e-combo--multi': multiple }\"\n :data-invalid=\"error && !bare ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n @mousedown=\"onWrapDown\"\n @focusout=\"onBlur\"\n >\n <div class=\"e-combo-main\">\n <template v-if=\"multiple\">\n <span v-for=\"v in values\" :key=\"v\" class=\"e-tag\">\n {{ labelOf(v) }}\n <button\n type=\"button\"\n class=\"e-tag-x\"\n :aria-label=\"t('removeItem', { label: labelOf(v) })\"\n :disabled=\"disabled\"\n @click=\"remove(v)\"\n >\n <EIcon name=\"x\" small />\n </button>\n </span>\n </template>\n <ComboboxInput\n class=\"e-input e-combo-input\"\n :model-value=\"text\"\n :display-value=\"(v: unknown) => (typeof v === 'string' ? (free ? v : labelOf(v)) : '')\"\n :disabled=\"disabled\"\n v-bind=\"inputBind(field)\"\n @update:model-value=\"text = $event\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @keydown.capture=\"keepCaretKeys\"\n />\n </div>\n <template v-if=\"name\">\n <input v-for=\"(v, k) in multiple ? values : [single]\" :key=\"k\" type=\"hidden\" :name=\"name\" :value=\"v\" />\n </template>\n <div class=\"e-combo-tail\">\n <button\n v-if=\"hasValue && clearable && !disabled\"\n type=\"button\"\n class=\"e-combo-btn\"\n :aria-label=\"t('clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <EIcon name=\"x\" />\n </button>\n <ComboboxTrigger\n v-if=\"!free\"\n class=\"e-combo-btn\"\n :aria-label=\"t('showOptions')\"\n :disabled=\"disabled\"\n @mousedown.prevent\n >\n <EIcon name=\"chevron-down\" bold />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <span class=\"e-sr\" role=\"status\">{{ announce }}</span>\n <ComboboxPortal :to=\"portal\">\n <ComboboxContent\n ref=\"content\"\n position=\"popper\"\n align=\"start\"\n :side-offset=\"6\"\n :collision-padding=\"8\"\n class=\"e-popover e-listpanel e-root\"\n :aria-label=\"listName\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <ComboboxViewport>\n <template v-if=\"shown.length\">\n <template v-for=\"(section, i) in sections\" :key=\"i\">\n <div v-if=\"section.group\" class=\"e-opt-set\" role=\"group\" :aria-labelledby=\"`${groupId}-g${i}`\">\n <div :id=\"`${groupId}-g${i}`\" class=\"e-opt-group\">{{ section.group }}</div>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </div>\n <template v-else>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </template>\n </template>\n </template>\n <div v-else class=\"e-opt-status\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n <ESpinner v-if=\"loading\" :label=\"t('searching')\" />\n <template v-else>{{ emptyText || t(\"noMatches\") }}</template>\n </div>\n </ComboboxViewport>\n </ComboboxContent>\n </ComboboxPortal>\n </ComboboxRoot>\n </template>\n </component>\n</template>\n\n<style>\n@layer e.controls {\n .e-combo-main {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-items: center;\n align-self: stretch;\n gap: var(--e-space-1);\n min-width: 0;\n }\n\n .e-combo-tail {\n display: flex;\n flex: none;\n align-items: center;\n align-self: center;\n }\n\n .e-combo--multi {\n padding: 3px var(--e-space-1) 3px var(--e-space-2);\n gap: var(--e-space-1);\n }\n\n .e-combo--multi .e-input {\n height: calc(var(--e-control-height) - 9px);\n align-self: center;\n padding-inline: var(--e-space-2);\n }\n\n .e-tag {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-1);\n height: 32px;\n padding: 0 var(--e-space-1) 0 var(--e-space-3);\n border-radius: var(--e-radius-pill);\n background: var(--e-surface-tint);\n box-shadow: inset 0 0 0 1px var(--e-primary);\n color: var(--e-ink);\n font: 500 var(--e-text-sm)/1 var(--e-font-sans);\n }\n\n .e-tag-x::after {\n content: \"\";\n position: absolute;\n inset: -10px;\n }\n\n .e-tag-x {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--e-primary);\n cursor: pointer;\n }\n\n .e-tag-x:hover {\n background: var(--e-wash-hover);\n box-shadow: inset 0 0 0 1px var(--e-primary);\n }\n\n .e-tag-x:active {\n background: var(--e-wash-press);\n }\n\n .e-tag-x:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: 1px;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BA,IAAM2C,IAAQC,GAIRC,IAAOH,GAKPI,IAAQ9C,EAA8B4C,GAAA,YAAC,GAEvCI,IAAIC,EAAY,GAChBC,KAASC,EAAgB,GACzBC,IAAQC,GAAc,GACtBC,IAAUC,EAAO,GACjBC,KAASD,QAAaZ,EAAM,EAAE,GAE9Bc,MAA6B,GAAG,EAAE,eACtCC,GAAE,OAAON,EAAM,QAAQ,GAAGO,EAAM,UAAU;GAAE,IAAIH,GAAO;GAAO,aAAa,KAAA;GAAW,iBAAiB,KAAA;EAAU,CAAC,CAAC,GAC/GI,KAAQC,QACZlB,EAAM,OACF,CAAC,IACD;GACE,IAAIA,EAAM;GACV,OAAOA,EAAM;GACb,WAAWA,EAAM;GACjB,MAAMA,EAAM;GACZ,OAAOA,EAAM;GACb,UAAUA,EAAM;GAChB,UAAUA,EAAM;EAClB,CACN,GACMmB,IAAWD,QAAgBlB,EAAM,OAAQA,EAAM,aAAaA,EAAM,QAASA,EAAM,KAAM,GAEvFoB,IAAWF,QAAelB,EAAM,SAAS,UAAU,GACnDqB,IAAOH,QAAelB,EAAM,SAAS,MAAM,GAC3CsB,IAAMJ,QAAeK,GAAiBvB,EAAM,OAAO,CAAC,GACpDwB,IAASN,QAA0BE,EAAS,SAAS,MAAM,QAAQjB,EAAM,KAAK,IAAIA,EAAM,QAAQ,CAAC,CAAE,GACnGsB,IAASP,QAAgB,OAAOf,EAAM,SAAU,WAAWA,EAAM,QAAQ,EAAG,GAC5EuB,IAAYR,QAAgBE,EAAS,QAAQI,EAAO,QAAQC,EAAO,KAAM;EAE/E,SAASE,EAAQ,GAAmB;GAClC,OAAOL,EAAI,MAAM,MAAM,MAAMM,EAAE,UAAUC,CAAC,CAAC,EAAE,UAAUR,EAAK,QAAQQ,IAAI;EAC1E;EACA,IAAMC,UAAiBV,EAAS,QAAQ,KAAKO,EAAQF,EAAO,KAAK,GAE3DM,IAAOC,EAAIF,EAAQ,CAAC,GACpBG,IAASD,EAAI,EAAK,GAClBE,IAAW7E,EAAoB4C,GAAC,MAA0B,GAC1DkC,IAASH,EAAiC,IAAI,GAC9CI,IAAQlB,QAAgBe,EAAO,QAAQF,EAAK,MAAM,KAAK,CAAC,CAAC,YAAY,IAAI,EAAG,GAE5EM,IAAQnB,QAAe;GAC3B,IAAMoB,IAAIF,EAAM;GAEhB,OADIpC,EAAM,SAAesB,EAAI,MAAM,QAAQ,MAAMtB,EAAM,OAAQ4B,GAAGU,CAAC,CAAC,IAC7DhB,EAAI,MAAM,QACd,MAAM,CAACgB,KAAKV,EAAE,MAAM,YAAY,CAAC,CAAC,SAASU,CAAC,MAAMV,EAAE,eAAe,GAAA,CAAI,YAAY,CAAC,CAAC,SAASU,CAAC,CAClG;EACF,CAAC,GACKC,KAAWrB,QAAesB,GAAeH,EAAM,KAAK,CAAC,GACrDI,KAAUvB,QAAemB,EAAM,MAAM,SAAS,KAAK,CAAC,CAACrC,EAAM,WAAW,CAACqB,EAAK,KAAK,GACjFqB,IAAOxB,QAAegB,EAAS,SAASO,GAAQ,SAAS,CAACzC,EAAM,QAAQ,GACxE2C,KAAWzB,QACfwB,EAAK,SAAS,CAACL,EAAM,MAAM,SAAUrC,EAAM,UAAUK,EAAE,WAAW,IAAIL,EAAM,aAAaK,EAAE,WAAW,IAAK,EAC7G,GACMuC,KAAW1B,QAAgBE,EAAS,QAAQI,EAAO,MAAM,SAAS,IAAI,CAAC,CAACO,EAAK,KAAM;EASzF,AAPAc,EAAMnB,SAAiB;GACrB,IAAMoB,IAAOhB,EAAQ;GACrB,AAAIgB,MAASf,EAAK,UAChB,EAAK,QAAQe,GACb,EAAO,QAAQ;EAEnB,CAAC,GACDD,EAAMvB,SAAW;GACf,AAAI,CAACW,EAAO,SAAS,CAACS,EAAK,UAAO,EAAK,QAAQZ,EAAQ;EACzD,CAAC;EAED,IAAMiB,IAASf,EAAwB,GACjCgB,IAAUhB,EAAiC,IAAI;EACrD,SAAgB;GACd,IAAI,CAACU,EAAK,OAAO;GACjB,IAAIO,IAAQ,GACNC,UAAa;IAEjB,AADA,EAAO,QAAQF,EAAQ,OAAO,KAAK,MAAM,KAAA,GACrC,CAACD,EAAO,SAAS,MAAU,MAAI,sBAAsBG,CAAI;GAC/D;GACA,GAAcA,CAAI;EACpB,CAAC;EAED,IAAMC,UAAgBhB,EAAO,OAAO,KAAK,cAAc,OAAO,KAAK,MAC7DiB,UAAmBD,EAAQ,CAAC,EAAE,MAAM;EAE1C,SAASE,EAAW,GAAwB;GAC1C,OAAOjC,EAAS,QAAQI,EAAO,MAAM,SAAS8B,CAAK,KAAIjC,EAAK,OAAQI,EAAO,UAAU6B;EACvF;EACA,IAAMC,KAAa,MAAyClC,EAAK,QAAQO,EAAE,QAAQA,EAAE;EAErF,SAAS4B,GAAO,GAAY;GAE1B,IADA,EAAO,QAAQ,IACXpC,EAAS,OAAO;IAGlB,AAFA,EAAM,QAAQ,MAAM,QAAQS,CAAC,IAAKA,IAAiB,CAAC,GACpD,EAAK,QAAQ,IACb3B,EAAK,eAAe,EAAE;IACtB;GACF;GACA,IAAMuD,IAAO,OAAO5B,KAAM,WAAWA,IAAI;GAGzC,AAFA,EAAM,QAAQ4B,GACd,EAAK,QAAQpC,EAAK,QAAQoC,IAAO9B,EAAQ8B,CAAI,GAC7CvD,EAAK,eAAe6B,EAAK,KAAK;EAChC;EAEA,SAAS2B,GAAQ,GAAU;GACzB,IAAM7B,IAAK,EAAE,OAA4B;GAKzC,AAJA,EAAK,QAAQA,GACb,EAAO,QAAQ,IACf,EAAS,QAAQ,IACjB3B,EAAK,eAAe2B,CAAC,GACjBR,EAAK,UAAO,EAAM,QAAQQ;EAChC;EAEA,SAAS8B,GAAO,GAAW;GACzB,EAAM,QAAQnC,EAAO,MAAM,QAAQ,MAAMoC,MAAM/B,CAAC;EAClD;EAEA,SAASgC,IAAQ;GAKf,AAJA,EAAM,QAAQzC,EAAS,QAAQ,CAAC,IAAI,IACpC,EAAK,QAAQ,IACb,EAAO,QAAQ,IACflB,EAAK,eAAe,EAAE,GACtBkD,EAAW;EACb;EAEA,SAASU,GAAU,GAAkB;GACnC,AAAI,EAAE,QAAQ,YAAY,CAACpB,EAAK,SAASX,EAAK,SAC5C,EAAE,eAAe,GACjB8B,EAAM,KACG,EAAE,QAAQ,eAAezC,EAAS,SAAS,CAACW,EAAK,SAASP,EAAO,MAAM,UAChFmC,GAAOnC,EAAO,MAAMA,EAAO,MAAM,SAAS,EAAG;EAEjD;EAEA,SAASuC,GAAc,GAAkB;GACvC,CAAI,EAAE,QAAQ,UAAU,EAAE,QAAQ,UAAO,EAAE,yBAAyB;EACtE;EAEA,SAASC,GAAO,GAAe;GAC7B,IAAMP,IAAO,EAAE;GACf,AAAIA,MAAStB,EAAO,OAAO,KAAK,SAASsB,CAAI,KAAKA,EAAK,UAAU,YAAY,OAC7E,EAAS,QAAQ,IACjB,EAAO,QAAQ,IACVpC,EAAK,UAAO,EAAK,QAAQS,EAAQ;EACxC;EAEA,SAASmC,GAAW,GAAe;GACjC,AAAI,EAAE,WAAW,EAAE,iBAAiB,CAACjE,EAAM,aACzC,EAAE,eAAe,GACjBoD,EAAW;EAEf;EAGA,SAASc,GAAU,GAAkB;GACnC,OAAO;IACL,IAAIC,EAAM;IACV,UAAUnE,EAAM,YAAY,EAAEoB,EAAS,SAASI,EAAO,MAAM,UAAU,KAAO,KAAA;IAC9E,aAAaJ,EAAS,SAASI,EAAO,MAAM,SAAS,KAAKxB,EAAM;IAChE,gBAAgBmE,EAAM;IACtB,cAAcnE,EAAM,OAAOmB,EAAS,QAAQ,KAAA;IAC5C,cAAc;IACd,GAAI4B,EAAO,QAAQ,EAAE,iBAAiBA,EAAO,MAAM,IAAI,CAAC;IACxD,GAAIV,EAAM,MAAM,SAAS,CAAC,IAAI,EAAE,yBAAyB,KAAA,EAAU;IACnE,GAAG5B,EAAM,MAAM0D,EAAM,eAAe;GACtC;EACF;E,OAEArE,EAAa;GACX,OAAOoB,QAAeiC,EAAQ,CAAC;GAC/B,OAAOC;EACT,CAAC,I,UAIC9F,EAAA,GAAAC,EAwHYC,GAxHIyC,EAAA,OAAOa,KAAOrD,EAAM,GAAAC,GAAAC,GAAA;GAAA,GAAeC,EAAA6C,CAAA,CAAK,CAAC,QAAO;GAAA,GAAOQ,GAAA;EAAK,CAAA,CAAA,GAAA;GAC/D,SAAOpD,GAAE,MAAK,CACvBC,EAoHeF,EAAAgH,EAAA,GAAA;IAnHb,OAAM;IACL,eAAalD,EAAA;IACb,UAAUN,EAAA;IACV,MAAMsB,EAAA;IACN,UAAUzC,EAAA;IACX,iBAAA;IACC,uBAAoBuD;IACpB,iBAAW,AAAAqB,EAAA,QAAA,MAAE,EAAA,QAAWC;;IAEzB,SAAAjH,QA4DiB;KA5DjBC,EA4DiBF,EAAAmH,EAAA,GAAA;MA3DX,SAAA;MAAJ,KAAI5C;MACJ,OAAKpE,GAAA,CAAC,wBAAsB,EAAA,kBACAqD,EAAA,MAAQ,CAAA,CAAA;MACnC,gBAAcnB,EAAA,SAAK,CAAKA,EAAA,OAAI,KAAQ,KAAA;MACpC,iBAAeA,EAAA,WAAQ,KAAQ,KAAA;MAC/B,aAAWgE;MACX,YAAUD;;MAEX,SAAAnG,QA0BM;OA1BNG,EA0BM,OA1BNgB,IA0BM,CAzBYoC,EAAA,SACd9D,EAAA,EAAA,GAAAW,EAWOC,GAAA,EAAA,KAAA,EAAA,GAAAC,EAXWqD,EAAA,QAAL,OAAblE,EAAA,GAAAW,EAWO,QAAA;QAXoB,KAAK4D;QAAG,OAAM;O,IACpCzD,EAAAC,EAAAsD,EAAQE,CAAC,CAAA,IAAI,KAChB,CAAA,GAAA7D,EAQS,UAAA;QAPP,MAAK;QACL,OAAM;QACL,cAAYJ,EAAAyC,CAAA,CAAC,CAAA,cAAA,EAAA,OAAwBsB,EAAQE,CAAC,EAAA,CAAA;QAC9C,UAAU5B,EAAA;QACV,UAAK,MAAE0D,GAAO9B,CAAC;O,IAEhB/D,EAAwBQ,GAAA;QAAjB,MAAK;QAAI,OAAA;O,oCAItBR,EAUEF,EAAA4H,EAAA,GAVFhH,GAUE;QATA,OAAM;QACL,eAAauD,EAAA;QACb,kBAAgB,MAAU,OAAaF,KAAC,WAAiBR,EAAA,QAAOQ,IAAIF,EAAQE,CAAC,IAAA;QAC7E,UAAU5B,EAAA;OACH,GAAAiE,GAAUC,CAAK,GAAA;QACtB,uBAAkB,AAAAU,EAAA,QAAA,MAAE,EAAA,QAAOC;QACpB;QACE;QACQ,kBAAAf;;;;;;OAGN9D,EAAA,QACd3C,EAAA,EAAA,GAAAW,EAAuGC,GAAA,EAAA,KAAA,EAAA,GAAAC,EAA/EiD,EAAA,QAAWI,EAAA,QAAM,CAAIC,EAAA,KAAM,IAApC,GAAG,OAAlBnE,EAAA,GAAAW,EAAuG,SAAA;QAAhD,KAAKyH;QAAG,MAAK;QAAU,MAAMzF,EAAA;QAAO,OAAO4B;;OAEpG7D,EAoBM,OApBNmB,IAoBM,CAlBIyD,GAAA,SAAY3C,EAAA,aAAS,CAAKA,EAAA,YADlC3C,EAAA,GAAAW,EASS,UAAA;;QAPP,MAAK;QACL,OAAM;QACL,cAAYL,EAAAyC,CAAA,CAAC,CAAA,OAAA;QACb,aAAS,AAAAwE,EAAA,OAAApG,QAAV,CAAA,GAAkB,CAAA,SAAA,CAAA;QACjB,SAAOoF;O,IAER/F,EAAkBQ,GAAA,EAAX,MAAK,IAAG,CAAA,C,yBAGR+C,EAAA,Q,aADT/D,EAAA,GAAAC,EAQkBK,EAAAgI,EAAA,GAAA;;QANhB,OAAM;QACL,cAAYhI,EAAAyC,CAAA,CAAC,CAAA,aAAA;QACb,UAAUJ,EAAA;QACV,aAAS,AAAA4E,EAAA,OAAApG,QAAV,CAAA,GAAkB,CAAA,SAAA,CAAA;;QAElB,SAAAZ,QAAkC,CAAlCC,EAAkCQ,GAAA;SAA3B,MAAK;SAAe,MAAA;;;;;;;;;;;KAIjCN,EAAsD,QAAtDqB,IAAsDhB,EAAlBsE,GAAA,KAAQ,GAAA,CAAA;KAC5C7E,EA2CiBF,EAAAiI,EAAA,GAAA,EA3CA,IAAIjI,EAAA2C,EAAA,EAAM,GAAA;MACzB,SAAA1C,QAyCkB,CAzClBC,EAyCkBF,EAAAkI,EAAA,GAAA;OAxCZ,SAAA;OAAJ,KAAI9C;OACJ,UAAS;OACT,OAAM;OACL,eAAa;OACb,qBAAmB;OACpB,OAAM;OACL,cAAY7B,EAAA;OACZ,aAAWlB,EAAA,UAAO,SAAY,KAAA;;OAE/B,SAAApC,QA8BmB,CA9BnBC,EA8BmBF,EAAAmI,EAAA,GAAA,MAAA;QA7BjB,SAAAlI,QAwBW,CAxBKwE,EAAA,MAAM,UACpB/E,EAAA,EAAA,GAAAW,EAsBWC,GAAA,EAAA,KAAA,EAAA,GAAAC,EAtBsBoE,GAAA,QAAf,GAAS,OAAsBjF,EAAA,GAAAW,EAAAC,GAAA,EAAA,KAAA8H,EAAC,GAAA,CACrCC,EAAQ,SAAnB3I,EAAA,GAAAW,EAUM,OAAA;;SAVoB,OAAM;SAAY,MAAK;SAAS,mBAAe,GAAKL,EAAA+C,CAAA,EAAO,IAAKqF;Q,IACxFhI,EAA2E,OAAA;SAArE,IAAE,GAAKJ,EAAA+C,CAAA,EAAO,IAAKqF;SAAK,OAAM;QAAiB,GAAA3H,EAAA4H,EAAQ,KAAK,GAAA,GAAA1G,EAAA,IAClEjC,EAAA,EAAA,GAAAW,EAOEC,GAAA,MAAAC,EANY8H,EAAQ,UAAb,OADT3I,EAAA,GAAAC,EAOEmB,GAAA;SALC,KAAKkD,EAAE;SACP,QAAQA;SACR,OAAO2B,EAAU3B,CAAC;SAClB,UAAUyB,EAAWE,EAAU3B,CAAC,CAAA;SAChC,OAAOQ,EAAA;;;;;;Q,yBAIV9E,EAAA,EAAA,GAAAW,EAOEC,GAAA,EAAA,KAAA,EAAA,GAAAC,EANY8H,EAAQ,UAAb,OADT3I,EAAA,GAAAC,EAOEmB,GAAA;SALC,KAAKkD,EAAE;SACP,QAAQA;SACR,OAAO2B,EAAU3B,CAAC;SAClB,UAAUyB,EAAWE,EAAU3B,CAAC,CAAA;SAChC,OAAOQ,EAAA;;;;;;Q,8BAKhB9E,EAAA,GAAAW,EAGM,OAHNuB,IAGM,CAFYS,EAAA,WAAhB3C,EAAA,GAAAC,EAAmDoB,IAAA;;SAAzB,OAAOf,EAAAyC,CAAA,CAAC,CAAA,WAAA;Q,2BAClC/C,EAAA,GAAAW,EAA6DC,GAAA,EAAA,KAAA,EAAA,GAAA,CAAzCE,EAAAC,EAAA4B,EAAA,aAAarC,EAAAyC,CAAA,CAAC,CAAA,WAAA,CAAA,GAAA,CAAA,C"}
1
+ {"version":3,"file":"EComboboxBase.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","_resolveDynamicComponent","EField","_normalizeProps","_guardReactiveProps","_unref","_withCtx","_createVNode","_normalizeClass","_createElementVNode","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","EIcon","_createCommentVNode","_mergeProps","_withModifiers","EComboboxOption","ESpinner","EIcon_default","EField_default","ESpinner_default","EComboboxOption_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","EComboboxBase_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"open\"","\"openModifiers\"","__expose","__emit","props","__props","emit","model","useModel","t","useMessages","portal","usePortalTarget","attrs","useFieldAttrs","groupId","useUid","bareId","Bare","h","slots","frame","computed","listName","multiple","free","all","normalizeOptions","values","single","rootValue","labelOf","o","v","resting","text","ref","typing","wantOpen","anchor","query","shown","q","sections","sectionOptions","hasList","open","announce","hasValue","watch","rest","listId","content","tries","read","inputEl","focusInput","isSelected","value","itemValue","onPick","next","onInput","remove","x","clear","onKeydown","keepCaretKeys","onBlur","onWrapDown","inputBind","field","openBlock","createBlock","resolveDynamicComponent","normalizeProps","guardReactiveProps","unref","withCtx","createVNode","ComboboxRoot","_cache","$event","ComboboxAnchor","normalizeClass","createElementVNode","createElementBlock","Fragment","renderList","createTextVNode","toDisplayString","createCommentVNode","ComboboxInput","mergeProps","k","withModifiers","ComboboxTrigger","ComboboxPortal","ComboboxContent","ComboboxViewport","i","section"],"sources":["../../../src/components/Combobox/EComboboxBase.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onMounted, ref, watch, type FunctionalComponent } from \"vue\";\nimport {\n ComboboxAnchor,\n ComboboxContent,\n ComboboxInput,\n ComboboxPortal,\n ComboboxRoot,\n ComboboxTrigger,\n ComboboxViewport,\n} from \"reka-ui\";\nimport EField from \"../Field/EField.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport ESpinner from \"../Spinner/ESpinner.vue\";\nimport EComboboxOption from \"./EComboboxOption.vue\";\nimport { normalizeOptions, sectionOptions } from \"../Select/options.js\";\nimport type { EComboboxProps } from \"./types.js\";\nimport { useMessages, usePortalTarget } from \"../../config.js\";\nimport { useFieldAttrs } from \"../../composables/useFieldAttrs.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport \"../../styles/base.css\";\nimport \"../TextField/input.css\";\nimport \"../Select/panel.css\";\nimport \"./combo.css\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(defineProps<EComboboxProps>(), {\n clearable: true,\n});\n\nconst emit = defineEmits<{\n /** The text in the input changed, by typing or by choosing. Use it to fetch options from a server. */\n inputChange: [text: string];\n}>();\n\nconst model = defineModel<string | string[]>();\n\nconst t = useMessages();\nconst portal = usePortalTarget();\nconst attrs = useFieldAttrs();\nconst groupId = useUid();\nconst bareId = useUid(() => props.id);\n\nconst Bare: FunctionalComponent = (_, { slots }) =>\n h(\"div\", attrs.wrapper(), slots.default?.({ id: bareId.value, ariaInvalid: undefined, ariaDescribedby: undefined }));\nconst frame = computed(() =>\n props.bare\n ? {}\n : {\n id: props.id,\n label: props.label,\n hideLabel: props.hideLabel,\n hint: props.hint,\n error: props.error,\n required: props.required,\n optional: props.optional,\n },\n);\nconst listName = computed(() => (props.bare ? (props.ariaLabel ?? props.label) : props.label));\n\nconst multiple = computed(() => props.multiple);\n// Free text is for one value; with `multiple` it is ignored.\nconst free = computed(() => props.freeform && !props.multiple);\nconst all = computed(() => normalizeOptions(props.options));\nconst values = computed<string[]>(() => (multiple.value && Array.isArray(model.value) ? model.value : []));\nconst single = computed(() => (typeof model.value === \"string\" ? model.value : \"\"));\nconst rootValue = computed(() => (multiple.value ? values.value : single.value));\n\nfunction labelOf(v: string): string {\n return all.value.find((o) => o.value === v)?.label ?? (free.value ? v : \"\");\n}\nconst resting = () => (multiple.value ? \"\" : labelOf(single.value));\n\nconst text = ref(resting());\nconst typing = ref(false);\nconst wantOpen = defineModel<boolean>(\"open\", { default: false });\nconst anchor = ref<{ $el: HTMLElement } | null>(null);\nconst query = computed(() => (typing.value ? text.value.trim().toLowerCase() : \"\"));\n\nconst shown = computed(() => {\n const q = query.value;\n if (props.filter) return all.value.filter((o) => props.filter!(o, q));\n return all.value.filter(\n (o) => !q || o.label.toLowerCase().includes(q) || (o.description ?? \"\").toLowerCase().includes(q),\n );\n});\nconst sections = computed(() => sectionOptions(shown.value));\nconst hasList = computed(() => shown.value.length > 0 || !!props.loading || !free.value);\nconst open = computed(() => wantOpen.value && hasList.value && !props.disabled);\nconst announce = computed(() =>\n open.value && !shown.value.length ? (props.loading ? t(\"searching\") : props.emptyText || t(\"noMatches\")) : \"\",\n);\nconst hasValue = computed(() => (multiple.value ? values.value.length > 0 : !!text.value));\n\nwatch(rootValue, () => {\n const rest = resting();\n if (rest !== text.value) {\n text.value = rest;\n typing.value = false;\n }\n});\nwatch(all, () => {\n if (!typing.value && !open.value) text.value = resting();\n});\n\nconst listId = ref<string | undefined>();\nconst content = ref<{ $el: HTMLElement } | null>(null);\nonMounted(() => {\n if (!open.value) return;\n let tries = 0;\n const read = () => {\n listId.value = content.value?.$el?.id || undefined;\n if (!listId.value && tries++ < 10) requestAnimationFrame(read);\n };\n void nextTick(read);\n});\n\nconst inputEl = () => anchor.value?.$el?.querySelector(\"input\") ?? null;\nconst focusInput = () => inputEl()?.focus();\n\nfunction isSelected(value: string): boolean {\n return multiple.value ? values.value.includes(value) : free.value ? single.value === value : single.value === value;\n}\nconst itemValue = (o: { value: string; label: string }) => (free.value ? o.label : o.value);\n\nfunction onPick(v: unknown) {\n typing.value = false;\n if (multiple.value) {\n model.value = Array.isArray(v) ? (v as string[]) : [];\n text.value = \"\";\n emit(\"inputChange\", \"\");\n return;\n }\n const next = typeof v === \"string\" ? v : \"\";\n model.value = next;\n text.value = free.value ? next : labelOf(next);\n emit(\"inputChange\", text.value);\n}\n\nfunction onInput(e: Event) {\n const v = (e.target as HTMLInputElement).value;\n text.value = v;\n typing.value = true;\n wantOpen.value = true;\n emit(\"inputChange\", v);\n if (free.value) model.value = v;\n}\n\nfunction remove(v: string) {\n model.value = values.value.filter((x) => x !== v);\n}\n\nfunction clear() {\n model.value = multiple.value ? [] : \"\";\n text.value = \"\";\n typing.value = false;\n emit(\"inputChange\", \"\");\n focusInput();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && !open.value && text.value) {\n e.preventDefault();\n clear();\n } else if (e.key === \"Backspace\" && multiple.value && !text.value && values.value.length) {\n remove(values.value[values.value.length - 1]!);\n }\n}\n\nfunction keepCaretKeys(e: KeyboardEvent) {\n if (e.key === \"Home\" || e.key === \"End\") e.stopImmediatePropagation();\n}\n\nfunction onBlur(e: FocusEvent) {\n const next = e.relatedTarget as Element | null;\n if (next && (anchor.value?.$el?.contains(next) || next.closest?.(\".e-popover\"))) return;\n wantOpen.value = false;\n typing.value = false;\n if (!free.value) text.value = resting();\n}\n\nfunction onWrapDown(e: MouseEvent) {\n if (e.target === e.currentTarget && !props.disabled) {\n e.preventDefault();\n focusInput();\n }\n}\n\ntype FieldSlot = { id: string; ariaInvalid: \"true\" | undefined; ariaDescribedby: string | undefined };\nfunction inputBind(field: FieldSlot) {\n return {\n id: field.id,\n required: props.required && !(multiple.value && values.value.length) ? true : undefined,\n placeholder: multiple.value && values.value.length ? \"\" : props.placeholder,\n \"aria-invalid\": field.ariaInvalid,\n \"aria-label\": props.bare ? listName.value : undefined,\n autocomplete: \"off\",\n ...(listId.value ? { \"aria-controls\": listId.value } : {}),\n ...(shown.value.length ? {} : { \"aria-activedescendant\": undefined }),\n ...attrs.input(field.ariaDescribedby),\n };\n}\n\ndefineExpose({\n input: computed(() => inputEl()),\n focus: focusInput,\n});\n</script>\n\n<template>\n <component :is=\"bare ? Bare : EField\" v-bind=\"{ ...attrs.wrapper(), ...frame }\">\n <template #default=\"field\">\n <ComboboxRoot\n class=\"e-combo-root\"\n :model-value=\"rootValue\"\n :multiple=\"multiple\"\n :open=\"open\"\n :disabled=\"disabled\"\n ignore-filter\n @update:model-value=\"onPick\"\n @update:open=\"wantOpen = $event\"\n >\n <ComboboxAnchor\n ref=\"anchor\"\n class=\"e-input-wrap e-combo\"\n :class=\"{ 'e-combo--multi': multiple }\"\n :data-invalid=\"error && !bare ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n @mousedown=\"onWrapDown\"\n @focusout=\"onBlur\"\n >\n <div class=\"e-combo-main\">\n <template v-if=\"multiple\">\n <span v-for=\"v in values\" :key=\"v\" class=\"e-tag\">\n {{ labelOf(v) }}\n <button\n type=\"button\"\n class=\"e-tag-x\"\n :aria-label=\"t('removeItem', { label: labelOf(v) })\"\n :disabled=\"disabled\"\n @click=\"remove(v)\"\n >\n <EIcon name=\"x\" small />\n </button>\n </span>\n </template>\n <ComboboxInput\n class=\"e-input e-combo-input\"\n :model-value=\"text\"\n :display-value=\"(v: unknown) => (typeof v === 'string' ? (free ? v : labelOf(v)) : '')\"\n :disabled=\"disabled\"\n v-bind=\"inputBind(field)\"\n @update:model-value=\"text = $event\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @keydown.capture=\"keepCaretKeys\"\n />\n </div>\n <template v-if=\"name\">\n <input v-for=\"(v, k) in multiple ? values : [single]\" :key=\"k\" type=\"hidden\" :name=\"name\" :value=\"v\" />\n </template>\n <div class=\"e-combo-tail\">\n <button\n v-if=\"hasValue && clearable && !disabled\"\n type=\"button\"\n class=\"e-combo-btn\"\n :aria-label=\"t('clear')\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <EIcon name=\"x\" />\n </button>\n <ComboboxTrigger\n v-if=\"!free\"\n class=\"e-combo-btn\"\n :aria-label=\"t('showOptions')\"\n :disabled=\"disabled\"\n @mousedown.prevent\n >\n <EIcon name=\"chevron-down\" bold />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <span class=\"e-sr\" role=\"status\">{{ announce }}</span>\n <ComboboxPortal :to=\"portal\">\n <ComboboxContent\n ref=\"content\"\n position=\"popper\"\n align=\"start\"\n :side-offset=\"6\"\n :collision-padding=\"8\"\n class=\"e-popover e-listpanel e-root\"\n :aria-label=\"listName\"\n :aria-busy=\"loading ? 'true' : undefined\"\n >\n <ComboboxViewport>\n <template v-if=\"shown.length\">\n <template v-for=\"(section, i) in sections\" :key=\"i\">\n <div v-if=\"section.group\" class=\"e-opt-set\" role=\"group\" :aria-labelledby=\"`${groupId}-g${i}`\">\n <div :id=\"`${groupId}-g${i}`\" class=\"e-opt-group\">{{ section.group }}</div>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </div>\n <template v-else>\n <EComboboxOption\n v-for=\"o in section.options\"\n :key=\"o.value\"\n :option=\"o\"\n :value=\"itemValue(o)\"\n :selected=\"isSelected(itemValue(o))\"\n :query=\"query\"\n />\n </template>\n </template>\n </template>\n <div v-else class=\"e-opt-status\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">\n <ESpinner v-if=\"loading\" :label=\"t('searching')\" />\n <template v-else>{{ emptyText || t(\"noMatches\") }}</template>\n </div>\n </ComboboxViewport>\n </ComboboxContent>\n </ComboboxPortal>\n </ComboboxRoot>\n </template>\n </component>\n</template>\n\n<style>\n@layer e.controls {\n .e-combo-main {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-items: center;\n align-self: stretch;\n gap: var(--e-space-1);\n min-width: 0;\n }\n\n .e-combo-tail {\n display: flex;\n flex: none;\n align-items: center;\n align-self: center;\n }\n\n .e-combo--multi {\n padding: 3px var(--e-space-1) 3px var(--e-space-2);\n gap: var(--e-space-1);\n }\n\n .e-combo--multi .e-input {\n height: calc(var(--e-control-height) - 9px);\n align-self: center;\n padding-inline: var(--e-space-2);\n }\n\n .e-tag {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-1);\n height: var(--e-space-8);\n padding: 0 var(--e-space-1) 0 var(--e-space-3);\n border-radius: var(--e-radius-pill);\n background: var(--e-surface-tint);\n box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-primary);\n color: var(--e-ink);\n font: 500 var(--e-text-sm)/1 var(--e-font-sans);\n }\n\n .e-tag-x::after {\n content: \"\";\n position: absolute;\n inset: calc((var(--e-tap) - var(--e-space-6)) / -2);\n }\n\n .e-tag-x {\n position: relative;\n display: inline-grid;\n place-items: center;\n width: var(--e-space-6);\n height: var(--e-space-6);\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--e-primary);\n cursor: pointer;\n }\n\n .e-tag-x:hover {\n background: var(--e-wash-hover);\n box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-primary);\n }\n\n .e-tag-x:active {\n background: var(--e-wash-press);\n }\n\n .e-tag-x:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (forced-colors: active) {\n .e-tag {\n outline: var(--e-stroke-card) solid CanvasText;\n }\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EComboboxOption.js","names":["_sfc_main","EComboboxOption_vue_vue_type_script_setup_true_lang_default","EComboboxOption_default"],"sources":["../../../src/components/Combobox/EComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ComboboxItem } from \"reka-ui\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EHighlight from \"./EHighlight.js\";\nimport type { EOption } from \"../Select/options.js\";\n\ndefineProps<{\n /** The option to show. */\n option: EOption;\n /** What the item carries as its value. */\n value: string;\n /** Whether it is chosen: bold, with a check. */\n selected: boolean;\n /** The lower-case text people typed; the first match in the label and description is marked. */\n query: string;\n}>();\n</script>\n\n<template>\n <ComboboxItem\n :value=\"value\"\n :disabled=\"option.disabled\"\n class=\"e-opt\"\n :class=\"{ 'e-opt--selected': selected, 'e-opt--disabled': option.disabled }\"\n @mousedown.prevent\n >\n <EIcon v-if=\"option.icon\" :name=\"option.icon\" />\n <span class=\"e-opt-text\">\n <span class=\"e-opt-label\"><EHighlight :text=\"option.label\" :query=\"query\" /></span>\n <span v-if=\"option.description\" class=\"e-opt-desc\">\n <EHighlight :text=\"option.description\" :query=\"query\" />\n </span>\n </span>\n <EIcon v-if=\"selected\" name=\"check\" bold />\n </ComboboxItem>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"EComboboxOption.js","names":["_sfc_main","EComboboxOption_vue_vue_type_script_setup_true_lang_default","EComboboxOption_default"],"sources":["../../../src/components/Combobox/EComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ComboboxItem } from \"reka-ui\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EMatchHighlight from \"./matchHighlight.js\";\nimport type { EOption } from \"../Select/options.js\";\n\ndefineProps<{\n /** The option to show. */\n option: EOption;\n /** What the item carries as its value. */\n value: string;\n /** Whether it is chosen: bold, with a check. */\n selected: boolean;\n /** The lower-case text people typed; the first match in the label and description is marked. */\n query: string;\n}>();\n</script>\n\n<template>\n <ComboboxItem\n :value=\"value\"\n :disabled=\"option.disabled\"\n class=\"e-opt\"\n :class=\"{ 'e-opt--selected': selected, 'e-opt--disabled': option.disabled }\"\n @mousedown.prevent\n >\n <EIcon v-if=\"option.icon\" :name=\"option.icon\" />\n <span class=\"e-opt-text\">\n <span class=\"e-opt-label\"><EMatchHighlight :text=\"option.label\" :query=\"query\" /></span>\n <span v-if=\"option.description\" class=\"e-opt-desc\">\n <EMatchHighlight :text=\"option.description\" :query=\"query\" />\n </span>\n </span>\n <EIcon v-if=\"selected\" name=\"check\" bold />\n </ComboboxItem>\n</template>\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import e from "../Icon/EIcon.js";
2
- import t from "./EHighlight.js";
2
+ import t from "./matchHighlight.js";
3
3
  import { createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, normalizeClass as c, openBlock as l, unref as u, withCtx as d, withModifiers as f } from "vue";
4
4
  import { ComboboxItem as p } from "reka-ui";
5
5
  //#region src/components/Combobox/EComboboxOption.vue?vue&type=script&setup=true&lang.ts
@@ -1 +1 @@
1
- {"version":3,"file":"EComboboxOption.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","EIcon","_createCommentVNode","_createElementVNode","_createVNode","EHighlight","_createElementBlock","EIcon_default","EHighlight_default","_hoisted_1","_hoisted_2","_hoisted_3","EComboboxOption_vue_vue_type_script_setup_true_lang_default","openBlock","createBlock","unref","ComboboxItem","__props","normalizeClass","_cache","withModifiers","withCtx","createCommentVNode","createElementVNode","createVNode","createElementBlock"],"sources":["../../../src/components/Combobox/EComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ComboboxItem } from \"reka-ui\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EHighlight from \"./EHighlight.js\";\nimport type { EOption } from \"../Select/options.js\";\n\ndefineProps<{\n /** The option to show. */\n option: EOption;\n /** What the item carries as its value. */\n value: string;\n /** Whether it is chosen: bold, with a check. */\n selected: boolean;\n /** The lower-case text people typed; the first match in the label and description is marked. */\n query: string;\n}>();\n</script>\n\n<template>\n <ComboboxItem\n :value=\"value\"\n :disabled=\"option.disabled\"\n class=\"e-opt\"\n :class=\"{ 'e-opt--selected': selected, 'e-opt--disabled': option.disabled }\"\n @mousedown.prevent\n >\n <EIcon v-if=\"option.icon\" :name=\"option.icon\" />\n <span class=\"e-opt-text\">\n <span class=\"e-opt-label\"><EHighlight :text=\"option.label\" :query=\"query\" /></span>\n <span v-if=\"option.description\" class=\"e-opt-desc\">\n <EHighlight :text=\"option.description\" :query=\"query\" />\n </span>\n </span>\n <EIcon v-if=\"selected\" name=\"check\" bold />\n </ComboboxItem>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;E,kBAmBEA,EAAA,GAAAC,EAeeC,EAAAmB,CAAA,GAAA;GAdZ,OAAOC,EAAA;GACP,UAAUA,EAAA,OAAO;GAClB,OAAKnB,EAAA,CAAC,SAAO;IAAA,mBACgBmB,EAAA;IAAQ,mBAAqBA,EAAA,OAAO;GAAQ,CAAA,CAAA;GACxE,aAAS,AAAAE,EAAA,OAAApB,QAAV,CAAA,GAAkB,CAAA,SAAA,CAAA;;GAElB,SAAAC,QAAgD;IAAnCiB,EAAA,OAAO,QAApBtB,EAAA,GAAAC,EAAgDK,GAAA;;KAArB,MAAMgB,EAAA,OAAO;;IACxCd,EAKO,QALPM,GAKO,CAJLN,EAAmF,QAAnFO,GAAmF,CAAzDN,EAAkDP,EAAAQ,CAAA,GAAA;KAArC,MAAMY,EAAA,OAAO;KAAQ,OAAOA,EAAA;I,kCACvDA,EAAA,OAAO,eAAnBtB,EAAA,GAAAW,EAEO,QAFPK,GAEO,CADLP,EAAwDP,EAAAQ,CAAA,GAAA;KAA3C,MAAMY,EAAA,OAAO;KAAc,OAAOA,EAAA;;IAGtCA,EAAA,YAAbtB,EAAA,GAAAC,EAA2CK,GAAA;;KAApB,MAAK;KAAQ,MAAA"}
1
+ {"version":3,"file":"EComboboxOption.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_unref","_normalizeClass","_withModifiers","_withCtx","EIcon","_createCommentVNode","_createElementVNode","_createVNode","EMatchHighlight","_createElementBlock","EIcon_default","matchHighlight_default","_hoisted_1","_hoisted_2","_hoisted_3","EComboboxOption_vue_vue_type_script_setup_true_lang_default","openBlock","createBlock","unref","ComboboxItem","__props","normalizeClass","_cache","withModifiers","withCtx","createCommentVNode","createElementVNode","createVNode","createElementBlock"],"sources":["../../../src/components/Combobox/EComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ComboboxItem } from \"reka-ui\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EMatchHighlight from \"./matchHighlight.js\";\nimport type { EOption } from \"../Select/options.js\";\n\ndefineProps<{\n /** The option to show. */\n option: EOption;\n /** What the item carries as its value. */\n value: string;\n /** Whether it is chosen: bold, with a check. */\n selected: boolean;\n /** The lower-case text people typed; the first match in the label and description is marked. */\n query: string;\n}>();\n</script>\n\n<template>\n <ComboboxItem\n :value=\"value\"\n :disabled=\"option.disabled\"\n class=\"e-opt\"\n :class=\"{ 'e-opt--selected': selected, 'e-opt--disabled': option.disabled }\"\n @mousedown.prevent\n >\n <EIcon v-if=\"option.icon\" :name=\"option.icon\" />\n <span class=\"e-opt-text\">\n <span class=\"e-opt-label\"><EMatchHighlight :text=\"option.label\" :query=\"query\" /></span>\n <span v-if=\"option.description\" class=\"e-opt-desc\">\n <EMatchHighlight :text=\"option.description\" :query=\"query\" />\n </span>\n </span>\n <EIcon v-if=\"selected\" name=\"check\" bold />\n </ComboboxItem>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;E,kBAmBEA,EAAA,GAAAC,EAeeC,EAAAmB,CAAA,GAAA;GAdZ,OAAOC,EAAA;GACP,UAAUA,EAAA,OAAO;GAClB,OAAKnB,EAAA,CAAC,SAAO;IAAA,mBACgBmB,EAAA;IAAQ,mBAAqBA,EAAA,OAAO;GAAQ,CAAA,CAAA;GACxE,aAAS,AAAAE,EAAA,OAAApB,QAAV,CAAA,GAAkB,CAAA,SAAA,CAAA;;GAElB,SAAAC,QAAgD;IAAnCiB,EAAA,OAAO,QAApBtB,EAAA,GAAAC,EAAgDK,GAAA;;KAArB,MAAMgB,EAAA,OAAO;;IACxCd,EAKO,QALPM,GAKO,CAJLN,EAAwF,QAAxFO,GAAwF,CAA9DN,EAAuDP,EAAAQ,CAAA,GAAA;KAArC,MAAMY,EAAA,OAAO;KAAQ,OAAOA,EAAA;I,kCAC5DA,EAAA,OAAO,eAAnBtB,EAAA,GAAAW,EAEO,QAFPK,GAEO,CADLP,EAA6DP,EAAAQ,CAAA,GAAA;KAA3C,MAAMY,EAAA,OAAO;KAAc,OAAOA,EAAA;;IAG3CA,EAAA,YAAbtB,EAAA,GAAAC,EAA2CK,GAAA;;KAApB,MAAK;KAAQ,MAAA"}
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as e, h as t } from "vue";
2
- //#region src/components/Combobox/EHighlight.ts
2
+ //#region src/components/Combobox/matchHighlight.ts
3
3
  var n = e({
4
- name: "EHighlight",
4
+ name: "EMatchHighlight",
5
5
  props: {
6
6
  text: {
7
7
  type: String,
@@ -26,4 +26,4 @@ var n = e({
26
26
  //#endregion
27
27
  export { n as default };
28
28
 
29
- //# sourceMappingURL=EHighlight.js.map
29
+ //# sourceMappingURL=matchHighlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchHighlight.js","names":["matchHighlight_default","defineComponent","i","props","h"],"sources":["../../../src/components/Combobox/matchHighlight.ts"],"sourcesContent":["import { defineComponent, h } from \"vue\";\n\nexport default defineComponent({\n name: \"EMatchHighlight\",\n props: {\n text: { type: String, required: true },\n query: { type: String, required: true },\n },\n setup(props) {\n return () => {\n const i = props.query ? props.text.toLowerCase().indexOf(props.query) : -1;\n if (i < 0) return props.text;\n return [\n props.text.slice(0, i),\n h(\"mark\", props.text.slice(i, i + props.query.length)),\n props.text.slice(i + props.query.length),\n ];\n };\n },\n});\n"],"mappings":";;AAEA,IAAAA,IAAeC,EAAgB;CAC7B,MAAM;CACN,OAAO;EACL,MAAM;GAAE,MAAM;GAAQ,UAAU;EAAK;EACrC,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;CACxC;CACA,MAAM,GAAO;EACX,aAAa;GACX,IAAMC,IAAIC,EAAM,QAAQA,EAAM,KAAK,YAAY,CAAC,CAAC,QAAQA,EAAM,KAAK,IAAI;GAExE,OADID,IAAI,IAAUC,EAAM,OACjB;IACLA,EAAM,KAAK,MAAM,GAAGD,CAAC;IACrBE,EAAE,QAAQD,EAAM,KAAK,MAAMD,GAAGA,IAAIC,EAAM,MAAM,MAAM,CAAC;IACrDA,EAAM,KAAK,MAAMD,IAAIC,EAAM,MAAM,MAAM;GACzC;EACF;CACF;AACF,CAAC"}
@@ -1,31 +1,36 @@
1
1
  import { EOption, EOptionInput } from '../Select/options.js';
2
2
  import { ELabelProps } from '../Field/labelProps.js';
3
- /** What ECombobox, EAutocomplete and EMultiSelect take besides their `v-model`. */
3
+ /** What ECombobox takes besides its `v-model`. */
4
4
  export type EComboboxProps = ELabelProps & EComboboxFields;
5
5
  export interface EComboboxFields {
6
- /** Strings, or `{ value, label, description, icon, group, disabled }`. A value is never an empty string. */
6
+ /** Choose several: `v-model` is a `string[]`, shown as removable tags. The list stays open while choosing, `placeholder` shows only while nothing is chosen, and `name` submits one hidden input per value. */
7
+ multiple?: boolean;
8
+ /** Accept any typed text, not only an option: `v-model` is the text and options are suggestions, and choosing one puts its `label` in the field. No Show options button, and the list stays closed when nothing matches. Ignored with `multiple`. */
9
+ freeform?: boolean;
10
+ /** Strings, or `{ value, label, description, icon, group, disabled }` as in `ESelect`. A value is never an empty string. */
7
11
  options: readonly EOptionInput[];
8
12
  /** An example, never the label. */
9
13
  placeholder?: string;
10
14
  /** Help that stays under the field. */
11
15
  hint?: string;
12
- /** What to fix. Replaces the hint, marks the input invalid and is announced. */
16
+ /** What to fix. Replaces the hint, marks the input `aria-invalid` and is announced. */
13
17
  error?: string;
14
- /** A word beside the label. A chosen value satisfies it. */
18
+ /** The `required` attribute and a word beside the label. A chosen value satisfies it. */
15
19
  required?: boolean;
16
20
  /** A word beside the label. Flag whichever is rarer. */
17
21
  optional?: boolean;
22
+ /** Disables the field; a disabled field never opens. */
18
23
  disabled?: boolean;
19
- /** Submits the value with a form (hidden inputs carry it, one per chosen value). */
24
+ /** Submits the value with a form, through a hidden input (hidden inputs carry it, one per chosen value). */
20
25
  name?: string;
21
26
  /** Show the Searching spinner in the list instead of the options, while a server answers. */
22
27
  loading?: boolean;
23
- /** What the list says when nothing matches. Default "No matches". */
28
+ /** What the list says when nothing matches. @default "No matches" */
24
29
  emptyText?: string;
25
30
  /** The clear button, shown when there is something to clear. On by default. */
26
31
  clearable?: boolean;
27
- /** Replaces the default match (the typed text appears in the label or description). `query` is trimmed and lower case. */
32
+ /** Replaces the default match (the typed text appears in the label or description). `query` is trimmed and lower case. Return `true` when the server filters. @default label or description contains query */
28
33
  filter?: (option: EOption, query: string) => boolean;
29
- /** The id of the input; the label points at it. Generated when left out. */
34
+ /** The id of the input; the label points at it. @default generated */
30
35
  id?: string;
31
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ECurrencyField.js","names":["_sfc_main","ECurrencyField_vue_vue_type_script_setup_true_lang_default","ECurrencyField_default"],"sources":["../../../src/components/CurrencyField/ECurrencyField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\nimport ENumberField from \"../NumberField/ENumberField.vue\";\nimport { useConfig } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nconst props = defineProps<{\n /** The visible label, a mono kicker above the field. The symbol is decoration, so say what the amount is for. */\n label: string;\n /** Keep the label for screen readers and remove it from the page. */\n hideLabel?: boolean;\n /** ISO 4217 code for the symbol. Default: the configured currency. */\n currency?: string;\n /** BCP 47 tag for the symbol. Default: the configured locale. */\n locale?: string;\n /** The lowest value. Default 0, so no negatives. */\n min?: number;\n /** The highest value. */\n max?: number;\n /** How far a button or arrow key moves the amount. Default 0.01. */\n step?: number;\n /** Replaces the currency symbol before the value. */\n prefix?: string;\n /** A unit after the value. */\n suffix?: string;\n /** The name submitted with a form (the number, or empty). */\n name?: string;\n /** Help that stays under the field. */\n hint?: string;\n /** What to fix. Replaces the hint, marks the field invalid and is announced. */\n error?: string;\n /** A word beside the label. */\n required?: boolean;\n /** A word beside the label. Flag whichever is rarer. */\n optional?: boolean;\n disabled?: boolean;\n /** The id of the input; the label points at it. Generated when left out. */\n id?: string;\n}>();\n\nconst model = defineModel<number | null>({ default: null });\n\nconst config = useConfig();\nconst field = ref<InstanceType<typeof ENumberField> | null>(null);\n\nfunction symbolOf(locale: string, currency: string): string | undefined {\n try {\n const parts = new Intl.NumberFormat(locale, { style: \"currency\", currency }).formatToParts(0);\n return parts.find((p) => p.type === \"currency\")?.value;\n } catch {\n return undefined;\n }\n}\n\nconst symbol = computed(\n () =>\n symbolOf(props.locale || config.locale, props.currency || config.currency) ??\n symbolOf(config.locale, config.currency) ??\n config.currency,\n);\n\ndefineExpose({\n input: computed(() => field.value?.input ?? null),\n focus: () => field.value?.focus(),\n});\n</script>\n\n<template>\n <ENumberField\n :id=\"id\"\n ref=\"field\"\n v-model=\"model\"\n class=\"e-currency\"\n :label=\"label\"\n :hide-label=\"hideLabel\"\n :min=\"min ?? 0\"\n :max=\"max\"\n :step=\"step ?? 0.01\"\n :prefix=\"prefix ?? symbol\"\n :suffix=\"suffix\"\n :name=\"name\"\n :hint=\"hint\"\n :error=\"error\"\n :required=\"required\"\n :optional=\"optional\"\n :disabled=\"disabled\"\n />\n</template>\n\n<style>\n@layer e.composites {\n .e-currency .e-input {\n font-variant-numeric: tabular-nums;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ECurrencyField.js","names":["_sfc_main","ECurrencyField_vue_vue_type_script_setup_true_lang_default","ECurrencyField_default"],"sources":["../../../src/components/CurrencyField/ECurrencyField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\nimport ENumberField from \"../NumberField/ENumberField.vue\";\nimport { useConfig } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nconst props = defineProps<{\n /** The visible label, a mono kicker above the field. The symbol is decoration, so say what the amount is for. */\n label: string;\n /** Keep the label for screen readers and remove it from the page. */\n hideLabel?: boolean;\n /** ISO 4217 code. An unknown code falls back to the configured currency's symbol. @default configured currency */\n currency?: string;\n /** BCP 47 tag used for the symbol. @default configured locale */\n locale?: string;\n /** The lowest value, so no negatives by default. @default 0 */\n min?: number;\n /** The highest value. */\n max?: number;\n /** The size of one step of the buttons and arrow keys. Decimals shown follow the step. @default 0.01 */\n step?: number;\n /** Replaces the currency symbol before the value. */\n prefix?: string;\n /** A unit after the value. */\n suffix?: string;\n /** The name submitted with a form (the number, or empty). */\n name?: string;\n /** Help that stays under the field. */\n hint?: string;\n /** What to fix. Replaces the hint, marks the field invalid and is announced. */\n error?: string;\n /** The `required` attribute and a word beside the label. */\n required?: boolean;\n /** A word beside the label. Flag whichever is rarer. */\n optional?: boolean;\n /** Disables the field and its buttons. */\n disabled?: boolean;\n /** The id of the input; the label points at it. @default generated */\n id?: string;\n}>();\n\n/** The amount; round to the cent in code. */\nconst model = defineModel<number | null>({ default: null });\n\nconst config = useConfig();\nconst field = ref<InstanceType<typeof ENumberField> | null>(null);\n\nfunction symbolOf(locale: string, currency: string): string | undefined {\n try {\n const parts = new Intl.NumberFormat(locale, { style: \"currency\", currency }).formatToParts(0);\n return parts.find((p) => p.type === \"currency\")?.value;\n } catch {\n return undefined;\n }\n}\n\nconst symbol = computed(\n () =>\n symbolOf(props.locale || config.locale, props.currency || config.currency) ??\n symbolOf(config.locale, config.currency) ??\n config.currency,\n);\n\ndefineExpose({\n input: computed(() => field.value?.input ?? null),\n focus: () => field.value?.focus(),\n});\n</script>\n\n<template>\n <ENumberField\n :id=\"id\"\n ref=\"field\"\n v-model=\"model\"\n class=\"e-currency\"\n :label=\"label\"\n :hide-label=\"hideLabel\"\n :min=\"min ?? 0\"\n :max=\"max\"\n :step=\"step ?? 0.01\"\n :prefix=\"prefix ?? symbol\"\n :suffix=\"suffix\"\n :name=\"name\"\n :hint=\"hint\"\n :error=\"error\"\n :required=\"required\"\n :optional=\"optional\"\n :disabled=\"disabled\"\n />\n</template>\n\n<style>\n@layer e.composites {\n .e-currency .e-input {\n font-variant-numeric: tabular-nums;\n }\n}\n</style>\n"],"mappings":""}
@@ -3,15 +3,15 @@ type __VLS_Props = {
3
3
  label: string;
4
4
  /** Keep the label for screen readers and remove it from the page. */
5
5
  hideLabel?: boolean;
6
- /** ISO 4217 code for the symbol. Default: the configured currency. */
6
+ /** ISO 4217 code. An unknown code falls back to the configured currency's symbol. @default configured currency */
7
7
  currency?: string;
8
- /** BCP 47 tag for the symbol. Default: the configured locale. */
8
+ /** BCP 47 tag used for the symbol. @default configured locale */
9
9
  locale?: string;
10
- /** The lowest value. Default 0, so no negatives. */
10
+ /** The lowest value, so no negatives by default. @default 0 */
11
11
  min?: number;
12
12
  /** The highest value. */
13
13
  max?: number;
14
- /** How far a button or arrow key moves the amount. Default 0.01. */
14
+ /** The size of one step of the buttons and arrow keys. Decimals shown follow the step. @default 0.01 */
15
15
  step?: number;
16
16
  /** Replaces the currency symbol before the value. */
17
17
  prefix?: string;
@@ -23,15 +23,17 @@ type __VLS_Props = {
23
23
  hint?: string;
24
24
  /** What to fix. Replaces the hint, marks the field invalid and is announced. */
25
25
  error?: string;
26
- /** A word beside the label. */
26
+ /** The `required` attribute and a word beside the label. */
27
27
  required?: boolean;
28
28
  /** A word beside the label. Flag whichever is rarer. */
29
29
  optional?: boolean;
30
+ /** Disables the field and its buttons. */
30
31
  disabled?: boolean;
31
- /** The id of the input; the label points at it. Generated when left out. */
32
+ /** The id of the input; the label points at it. @default generated */
32
33
  id?: string;
33
34
  };
34
35
  type __VLS_ModelProps = {
36
+ /** The amount; round to the cent in code. */
35
37
  modelValue?: number | null;
36
38
  };
37
39
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
@@ -1 +1 @@
1
- {"version":3,"file":"ECurrencyField.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ENumberField","ENumberField_default","ECurrencyField_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__expose","props","__props","model","useModel","config","useConfig","field","ref","symbolOf","locale","p","symbol","computed","openBlock","createBlock","_cache","$event"],"sources":["../../../src/components/CurrencyField/ECurrencyField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\nimport ENumberField from \"../NumberField/ENumberField.vue\";\nimport { useConfig } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nconst props = defineProps<{\n /** The visible label, a mono kicker above the field. The symbol is decoration, so say what the amount is for. */\n label: string;\n /** Keep the label for screen readers and remove it from the page. */\n hideLabel?: boolean;\n /** ISO 4217 code for the symbol. Default: the configured currency. */\n currency?: string;\n /** BCP 47 tag for the symbol. Default: the configured locale. */\n locale?: string;\n /** The lowest value. Default 0, so no negatives. */\n min?: number;\n /** The highest value. */\n max?: number;\n /** How far a button or arrow key moves the amount. Default 0.01. */\n step?: number;\n /** Replaces the currency symbol before the value. */\n prefix?: string;\n /** A unit after the value. */\n suffix?: string;\n /** The name submitted with a form (the number, or empty). */\n name?: string;\n /** Help that stays under the field. */\n hint?: string;\n /** What to fix. Replaces the hint, marks the field invalid and is announced. */\n error?: string;\n /** A word beside the label. */\n required?: boolean;\n /** A word beside the label. Flag whichever is rarer. */\n optional?: boolean;\n disabled?: boolean;\n /** The id of the input; the label points at it. Generated when left out. */\n id?: string;\n}>();\n\nconst model = defineModel<number | null>({ default: null });\n\nconst config = useConfig();\nconst field = ref<InstanceType<typeof ENumberField> | null>(null);\n\nfunction symbolOf(locale: string, currency: string): string | undefined {\n try {\n const parts = new Intl.NumberFormat(locale, { style: \"currency\", currency }).formatToParts(0);\n return parts.find((p) => p.type === \"currency\")?.value;\n } catch {\n return undefined;\n }\n}\n\nconst symbol = computed(\n () =>\n symbolOf(props.locale || config.locale, props.currency || config.currency) ??\n symbolOf(config.locale, config.currency) ??\n config.currency,\n);\n\ndefineExpose({\n input: computed(() => field.value?.input ?? null),\n focus: () => field.value?.focus(),\n});\n</script>\n\n<template>\n <ENumberField\n :id=\"id\"\n ref=\"field\"\n v-model=\"model\"\n class=\"e-currency\"\n :label=\"label\"\n :hide-label=\"hideLabel\"\n :min=\"min ?? 0\"\n :max=\"max\"\n :step=\"step ?? 0.01\"\n :prefix=\"prefix ?? symbol\"\n :suffix=\"suffix\"\n :name=\"name\"\n :hint=\"hint\"\n :error=\"error\"\n :required=\"required\"\n :optional=\"optional\"\n :disabled=\"disabled\"\n />\n</template>\n\n<style>\n@layer e.composites {\n .e-currency .e-input {\n font-variant-numeric: tabular-nums;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMA,IAAMS,IAAQC,GAkCRC,IAAQX,EAA0BU,GAAA,YAAkB,GAEpDG,IAASC,EAAU,GACnBC,IAAQC,EAA8C,IAAI;EAEhE,SAASC,EAAS,GAAgB,GAAsC;GACtE,IAAI;IAEF,OADc,IAAI,KAAK,aAAaC,GAAQ;KAAE,OAAO;KAAY;IAAS,CAAC,CAAC,CAAC,cAAc,CACpF,CAAA,CAAM,MAAM,MAAMC,EAAE,SAAS,UAAU,CAAC,EAAE;GACnD,QAAQ;IACN;GACF;EACF;EAEA,IAAMC,IAASC,QAEXJ,EAASR,EAAM,UAAUI,EAAO,QAAQJ,EAAM,YAAYI,EAAO,QAAQ,KACzEI,EAASJ,EAAO,QAAQA,EAAO,QAAQ,KACvCA,EAAO,QACX;E,OAEAL,EAAa;GACX,OAAOa,QAAeN,EAAM,OAAO,SAAS,IAAI;GAChD,aAAaA,EAAM,OAAO,MAAM;EAClC,CAAC,I,UAICd,EAAA,GAAAC,EAkBEC,GAAA;GAjBC,IAAIO,EAAA;GACD,SAAA;GAAJ,KAAIK;GACK,YAAAJ,EAAA;GAAA,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAK,QAAAC;GACd,OAAM;GACL,OAAOf,EAAA;GACP,cAAYA,EAAA;GACZ,KAAKA,EAAA,OAAG;GACR,KAAKA,EAAA;GACL,MAAMA,EAAA,QAAI;GACV,QAAQA,EAAA,UAAUU,EAAA;GAClB,QAAQV,EAAA;GACR,MAAMA,EAAA;GACN,MAAMA,EAAA;GACN,OAAOA,EAAA;GACP,UAAUA,EAAA;GACV,UAAUA,EAAA;GACV,UAAUA,EAAA"}
1
+ {"version":3,"file":"ECurrencyField.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","ENumberField","ENumberField_default","ECurrencyField_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","__expose","props","__props","model","useModel","config","useConfig","field","ref","symbolOf","locale","p","symbol","computed","openBlock","createBlock","_cache","$event"],"sources":["../../../src/components/CurrencyField/ECurrencyField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\nimport ENumberField from \"../NumberField/ENumberField.vue\";\nimport { useConfig } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nconst props = defineProps<{\n /** The visible label, a mono kicker above the field. The symbol is decoration, so say what the amount is for. */\n label: string;\n /** Keep the label for screen readers and remove it from the page. */\n hideLabel?: boolean;\n /** ISO 4217 code. An unknown code falls back to the configured currency's symbol. @default configured currency */\n currency?: string;\n /** BCP 47 tag used for the symbol. @default configured locale */\n locale?: string;\n /** The lowest value, so no negatives by default. @default 0 */\n min?: number;\n /** The highest value. */\n max?: number;\n /** The size of one step of the buttons and arrow keys. Decimals shown follow the step. @default 0.01 */\n step?: number;\n /** Replaces the currency symbol before the value. */\n prefix?: string;\n /** A unit after the value. */\n suffix?: string;\n /** The name submitted with a form (the number, or empty). */\n name?: string;\n /** Help that stays under the field. */\n hint?: string;\n /** What to fix. Replaces the hint, marks the field invalid and is announced. */\n error?: string;\n /** The `required` attribute and a word beside the label. */\n required?: boolean;\n /** A word beside the label. Flag whichever is rarer. */\n optional?: boolean;\n /** Disables the field and its buttons. */\n disabled?: boolean;\n /** The id of the input; the label points at it. @default generated */\n id?: string;\n}>();\n\n/** The amount; round to the cent in code. */\nconst model = defineModel<number | null>({ default: null });\n\nconst config = useConfig();\nconst field = ref<InstanceType<typeof ENumberField> | null>(null);\n\nfunction symbolOf(locale: string, currency: string): string | undefined {\n try {\n const parts = new Intl.NumberFormat(locale, { style: \"currency\", currency }).formatToParts(0);\n return parts.find((p) => p.type === \"currency\")?.value;\n } catch {\n return undefined;\n }\n}\n\nconst symbol = computed(\n () =>\n symbolOf(props.locale || config.locale, props.currency || config.currency) ??\n symbolOf(config.locale, config.currency) ??\n config.currency,\n);\n\ndefineExpose({\n input: computed(() => field.value?.input ?? null),\n focus: () => field.value?.focus(),\n});\n</script>\n\n<template>\n <ENumberField\n :id=\"id\"\n ref=\"field\"\n v-model=\"model\"\n class=\"e-currency\"\n :label=\"label\"\n :hide-label=\"hideLabel\"\n :min=\"min ?? 0\"\n :max=\"max\"\n :step=\"step ?? 0.01\"\n :prefix=\"prefix ?? symbol\"\n :suffix=\"suffix\"\n :name=\"name\"\n :hint=\"hint\"\n :error=\"error\"\n :required=\"required\"\n :optional=\"optional\"\n :disabled=\"disabled\"\n />\n</template>\n\n<style>\n@layer e.composites {\n .e-currency .e-input {\n font-variant-numeric: tabular-nums;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMA,IAAMS,IAAQC,GAoCRC,IAAQX,EAA0BU,GAAA,YAAkB,GAEpDG,IAASC,EAAU,GACnBC,IAAQC,EAA8C,IAAI;EAEhE,SAASC,EAAS,GAAgB,GAAsC;GACtE,IAAI;IAEF,OADc,IAAI,KAAK,aAAaC,GAAQ;KAAE,OAAO;KAAY;IAAS,CAAC,CAAC,CAAC,cAAc,CACpF,CAAA,CAAM,MAAM,MAAMC,EAAE,SAAS,UAAU,CAAC,EAAE;GACnD,QAAQ;IACN;GACF;EACF;EAEA,IAAMC,IAASC,QAEXJ,EAASR,EAAM,UAAUI,EAAO,QAAQJ,EAAM,YAAYI,EAAO,QAAQ,KACzEI,EAASJ,EAAO,QAAQA,EAAO,QAAQ,KACvCA,EAAO,QACX;E,OAEAL,EAAa;GACX,OAAOa,QAAeN,EAAM,OAAO,SAAS,IAAI;GAChD,aAAaA,EAAM,OAAO,MAAM;EAClC,CAAC,I,UAICd,EAAA,GAAAC,EAkBEC,GAAA;GAjBC,IAAIO,EAAA;GACD,SAAA;GAAJ,KAAIK;GACK,YAAAJ,EAAA;GAAA,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAK,QAAAC;GACd,OAAM;GACL,OAAOf,EAAA;GACP,cAAYA,EAAA;GACZ,KAAKA,EAAA,OAAG;GACR,KAAKA,EAAA;GACL,MAAMA,EAAA,QAAI;GACV,QAAQA,EAAA,UAAUU,EAAA;GAClB,QAAQV,EAAA;GACR,MAAMA,EAAA;GACN,MAAMA,EAAA;GACN,OAAOA,EAAA;GACP,UAAUA,EAAA;GACV,UAAUA,EAAA;GACV,UAAUA,EAAA"}