@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
package/THIRD_PARTY.md CHANGED
@@ -1,4 +1,4 @@
1
1
  # Third-party notices
2
2
 
3
3
  - **Phosphor Icons** (https://phosphoricons.com), MIT License, Copyright (c) 2020 Phosphor Icons. The icon paths in `packages/vue/src/icons/phosphor.ts` are taken from this set.
4
- - **Jost** and **Spline Sans Mono** are the default typefaces (SIL Open Font License 1.1). They are not bundled; `fonts.css` loads them from Google Fonts, and any other font can be set with `defineTheme({ fonts })`.
4
+ - **Bricolage Grotesque** and **Geist Mono** are the default typefaces (SIL Open Font License 1.1). They are not bundled; `fonts.css` loads them from Google Fonts, and any other font can be set with `defineTheme({ fonts })`.
@@ -1,5 +1,5 @@
1
1
  //#region src/component-names.ts
2
- var e = /* @__PURE__ */ new Set(/* @__PURE__ */ "EAccordion.EActions.EAddressField.EAmount.EAppFooter.EAppHeader.EAppShell.EAutocomplete.EAvatar.EBackLink.EBookingCard.EBreadcrumb.EButton.EButtonGroup.ECalendar.ECardField.ECheckbox.EChip.ECodeBlock.EColorField.ECombobox.ECurrencyField.EDataGrid.EDatePicker.EDescriptionList.EDetailRow.EDialog.EDisclosure.EDivider.EDrawer.EEmptyState.EErrorSummary.EField.EFieldset.EFormSection.EGrid.EHeading.EHighlight.EIcon.EIconButton.EInline.EItemList.EItemRow.EKbd.EKicker.ELink.ELinkCard.ELoadingBar.EMenu.EMetaList.EMultiSelect.ENavList.ENotice.ENumberField.EOtpField.EPageHeader.EPagination.EPanel.EPasswordField.EPhoneField.EPopover.EProgress.ERadioGroup.ERangePicker.ESearchBar.ESearchResults.ESegmented.ESelect.ESignatureField.ESignaturePad.ESkeleton.ESkipLink.ESlotPicker.ESpinner.EStack.EStamp.EStatementCard.EStatementRow.EStepper.ESurface.ESwitch.ETabs.EText.ETextField.ETextarea.ETimeline.EToast.EToastProvider.EToggle.ETooltip.EUpload.EVisuallyHidden".split("."));
2
+ var e = /* @__PURE__ */ new Set(/* @__PURE__ */ "EActions.EAppFooter.EAppHeader.EAppShell.EAvatar.EBreadcrumb.EButton.ECalendar.ECheckbox.ECodeBlock.EColorField.ECombobox.ECurrencyField.EDataGrid.EDatePicker.EDefinition.EDescriptionList.EDialog.EDisclosure.EDivider.EDrawer.EEmptyState.EExpandableRow.EField.EFieldset.EGrid.EHeading.EHighlight.EIcon.EIconButton.EInline.EKbd.EKicker.ELink.EMenu.ENavList.ENotice.ENumberField.EOtpField.EPageHeader.EPagination.EPasswordField.EPhoneField.EProgress.ERadioGroup.ERangePicker.ESearchBar.ESearchResults.ESegmented.ESelect.ESignatureField.ESignaturePad.ESkeleton.ESkipLink.ESpinner.EStack.EStamp.EStepper.ESurface.ESwitch.ETabs.EText.ETextField.ETextarea.EToast.EToastProvider.ETooltip.EUpload.EVisuallyHidden".split("."));
3
3
  //#endregion
4
4
  export { e as componentNames };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"component-names.js","names":["componentNames"],"sources":["../src/component-names.ts"],"sourcesContent":["// Generated by scripts/gen-index.mjs. Do not edit.\nexport const componentNames: ReadonlySet<string> = new Set([\"EAccordion\",\"EActions\",\"EAddressField\",\"EAmount\",\"EAppFooter\",\"EAppHeader\",\"EAppShell\",\"EAutocomplete\",\"EAvatar\",\"EBackLink\",\"EBookingCard\",\"EBreadcrumb\",\"EButton\",\"EButtonGroup\",\"ECalendar\",\"ECardField\",\"ECheckbox\",\"EChip\",\"ECodeBlock\",\"EColorField\",\"ECombobox\",\"ECurrencyField\",\"EDataGrid\",\"EDatePicker\",\"EDescriptionList\",\"EDetailRow\",\"EDialog\",\"EDisclosure\",\"EDivider\",\"EDrawer\",\"EEmptyState\",\"EErrorSummary\",\"EField\",\"EFieldset\",\"EFormSection\",\"EGrid\",\"EHeading\",\"EHighlight\",\"EIcon\",\"EIconButton\",\"EInline\",\"EItemList\",\"EItemRow\",\"EKbd\",\"EKicker\",\"ELink\",\"ELinkCard\",\"ELoadingBar\",\"EMenu\",\"EMetaList\",\"EMultiSelect\",\"ENavList\",\"ENotice\",\"ENumberField\",\"EOtpField\",\"EPageHeader\",\"EPagination\",\"EPanel\",\"EPasswordField\",\"EPhoneField\",\"EPopover\",\"EProgress\",\"ERadioGroup\",\"ERangePicker\",\"ESearchBar\",\"ESearchResults\",\"ESegmented\",\"ESelect\",\"ESignatureField\",\"ESignaturePad\",\"ESkeleton\",\"ESkipLink\",\"ESlotPicker\",\"ESpinner\",\"EStack\",\"EStamp\",\"EStatementCard\",\"EStatementRow\",\"EStepper\",\"ESurface\",\"ESwitch\",\"ETabs\",\"EText\",\"ETextField\",\"ETextarea\",\"ETimeline\",\"EToast\",\"EToastProvider\",\"EToggle\",\"ETooltip\",\"EUpload\",\"EVisuallyHidden\"]);\n"],"mappings":";AACA,IAAaA,oBAAsC,IAAI,IAAI,q9BAAknC,CAAC"}
1
+ {"version":3,"file":"component-names.js","names":["componentNames"],"sources":["../src/component-names.ts"],"sourcesContent":["// Generated by scripts/gen-index.mjs. Do not edit.\nexport const componentNames: ReadonlySet<string> = new Set([\"EActions\",\"EAppFooter\",\"EAppHeader\",\"EAppShell\",\"EAvatar\",\"EBreadcrumb\",\"EButton\",\"ECalendar\",\"ECheckbox\",\"ECodeBlock\",\"EColorField\",\"ECombobox\",\"ECurrencyField\",\"EDataGrid\",\"EDatePicker\",\"EDefinition\",\"EDescriptionList\",\"EDialog\",\"EDisclosure\",\"EDivider\",\"EDrawer\",\"EEmptyState\",\"EExpandableRow\",\"EField\",\"EFieldset\",\"EGrid\",\"EHeading\",\"EHighlight\",\"EIcon\",\"EIconButton\",\"EInline\",\"EKbd\",\"EKicker\",\"ELink\",\"EMenu\",\"ENavList\",\"ENotice\",\"ENumberField\",\"EOtpField\",\"EPageHeader\",\"EPagination\",\"EPasswordField\",\"EPhoneField\",\"EProgress\",\"ERadioGroup\",\"ERangePicker\",\"ESearchBar\",\"ESearchResults\",\"ESegmented\",\"ESelect\",\"ESignatureField\",\"ESignaturePad\",\"ESkeleton\",\"ESkipLink\",\"ESpinner\",\"EStack\",\"EStamp\",\"EStepper\",\"ESurface\",\"ESwitch\",\"ETabs\",\"EText\",\"ETextField\",\"ETextarea\",\"EToast\",\"EToastProvider\",\"ETooltip\",\"EUpload\",\"EVisuallyHidden\"]);\n"],"mappings":";AACA,IAAaA,oBAAsC,IAAI,IAAI,2tBAA00B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EActions.js","names":["_sfc_main","EActions_vue_vue_type_script_setup_true_lang_default","EActions_default"],"sources":["../../../src/components/Actions/EActions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The element to render, `div` by default. Use `footer` for a bar at the end of a card. */\n as?: string;\n /** Puts the group on a tinted footer bar with a rule above. Use it for a group that ends a card or an overlay. */\n bar?: boolean;\n }>(),\n { as: \"div\" },\n);\n\ndefineSlots<{\n /** The Buttons, in the order of the content, the main action first. */\n default(): unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"as\" class=\"e-actions\" :class=\"bar && 'e-actions--bar'\">\n <slot />\n </component>\n</template>\n\n<style>\n@layer e.blocks {\n .e-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-actions--bar {\n padding: var(--e-space-3) var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n background: var(--e-surface-tint);\n }\n\n @media (max-width: 32rem) {\n .e-actions--bar > .e-btn {\n flex: 1 1 100%;\n }\n }\n\n @media print {\n .e-actions {\n display: none;\n }\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EActions.js","names":["_sfc_main","EActions_vue_vue_type_script_setup_true_lang_default","EActions_default"],"sources":["../../../src/components/Actions/EActions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The element to render, `div` by default. Use `footer` for a bar at the end of a card. */\n as?: string;\n /** Puts the group on a tinted footer bar with a rule above, for actions that end a card or an overlay. Buttons stack full width up to 32rem. Leave it off for the next step on a page. */\n bar?: boolean;\n /** Names the group for screen readers (for example \"Record actions\"): renders `role=\"group\"` with `aria-label`. Use it for buttons that belong together, such as a filter row. */\n label?: string;\n }>(),\n { as: \"div\" },\n);\n\ndefineSlots<{\n /** The Buttons, in the order of the content, the main action first. */\n default(): unknown;\n}>();\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-actions\"\n :class=\"bar && 'e-actions--bar'\"\n :role=\"label ? 'group' : undefined\"\n :aria-label=\"label\"\n >\n <slot />\n </component>\n</template>\n\n<style>\n@layer e.blocks {\n .e-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-actions--bar {\n padding: var(--e-space-3) var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n background: var(--e-surface-tint);\n }\n\n @media (max-width: 32rem) {\n .e-actions--bar > .e-btn {\n flex: 1 1 100%;\n }\n }\n\n @media print {\n .e-actions {\n display: none;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -1,8 +1,10 @@
1
1
  type __VLS_Props = {
2
2
  /** The element to render, `div` by default. Use `footer` for a bar at the end of a card. */
3
3
  as?: string;
4
- /** Puts the group on a tinted footer bar with a rule above. Use it for a group that ends a card or an overlay. */
4
+ /** Puts the group on a tinted footer bar with a rule above, for actions that end a card or an overlay. Buttons stack full width up to 32rem. Leave it off for the next step on a page. */
5
5
  bar?: boolean;
6
+ /** Names the group for screen readers (for example "Record actions"): renders `role="group"` with `aria-label`. Use it for buttons that belong together, such as a filter row. */
7
+ label?: string;
6
8
  };
7
9
  type __VLS_Slots = {
8
10
  /** The Buttons, in the order of the content, the main action first. */
@@ -5,13 +5,22 @@ var s = /*@__PURE__*/ t({
5
5
  __name: "EActions",
6
6
  props: {
7
7
  as: { default: "div" },
8
- bar: { type: Boolean }
8
+ bar: { type: Boolean },
9
+ label: {}
9
10
  },
10
11
  setup(t) {
11
- return (s, c) => (r(), e(a(t.as), { class: n(["e-actions", t.bar && "e-actions--bar"]) }, {
12
+ return (s, c) => (r(), e(a(t.as), {
13
+ class: n(["e-actions", t.bar && "e-actions--bar"]),
14
+ role: t.label ? "group" : void 0,
15
+ "aria-label": t.label
16
+ }, {
12
17
  default: o(() => [i(s.$slots, "default")]),
13
18
  _: 3
14
- }, 8, ["class"]));
19
+ }, 8, [
20
+ "class",
21
+ "role",
22
+ "aria-label"
23
+ ]));
15
24
  }
16
25
  });
17
26
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"EActions.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","EActions_vue_vue_type_script_setup_true_lang_default","openBlock","createBlock","resolveDynamicComponent","__props","normalizeClass","withCtx","renderSlot","_ctx"],"sources":["../../../src/components/Actions/EActions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The element to render, `div` by default. Use `footer` for a bar at the end of a card. */\n as?: string;\n /** Puts the group on a tinted footer bar with a rule above. Use it for a group that ends a card or an overlay. */\n bar?: boolean;\n }>(),\n { as: \"div\" },\n);\n\ndefineSlots<{\n /** The Buttons, in the order of the content, the main action first. */\n default(): unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"as\" class=\"e-actions\" :class=\"bar && 'e-actions--bar'\">\n <slot />\n </component>\n</template>\n\n<style>\n@layer e.blocks {\n .e-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-actions--bar {\n padding: var(--e-space-3) var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n background: var(--e-surface-tint);\n }\n\n @media (max-width: 32rem) {\n .e-actions--bar > .e-btn {\n flex: 1 1 100%;\n }\n }\n\n @media print {\n .e-actions {\n display: none;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;E,kBAoBEA,EAAA,GAAAC,EAEYC,EAFIQ,EAAA,EAAE,GAAA,EAAE,OAAKP,EAAA,CAAC,aAAoBO,EAAA,OAAG,gBAAA,CAAA,E;GAC/C,SAAAN,QAAQ,CAARC,EAAQS,EAAA,QAAA,SAAA,C"}
1
+ {"version":3,"file":"EActions.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","EActions_vue_vue_type_script_setup_true_lang_default","openBlock","createBlock","resolveDynamicComponent","__props","normalizeClass","withCtx","renderSlot","_ctx"],"sources":["../../../src/components/Actions/EActions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The element to render, `div` by default. Use `footer` for a bar at the end of a card. */\n as?: string;\n /** Puts the group on a tinted footer bar with a rule above, for actions that end a card or an overlay. Buttons stack full width up to 32rem. Leave it off for the next step on a page. */\n bar?: boolean;\n /** Names the group for screen readers (for example \"Record actions\"): renders `role=\"group\"` with `aria-label`. Use it for buttons that belong together, such as a filter row. */\n label?: string;\n }>(),\n { as: \"div\" },\n);\n\ndefineSlots<{\n /** The Buttons, in the order of the content, the main action first. */\n default(): unknown;\n}>();\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-actions\"\n :class=\"bar && 'e-actions--bar'\"\n :role=\"label ? 'group' : undefined\"\n :aria-label=\"label\"\n >\n <slot />\n </component>\n</template>\n\n<style>\n@layer e.blocks {\n .e-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-actions--bar {\n padding: var(--e-space-3) var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n background: var(--e-surface-tint);\n }\n\n @media (max-width: 32rem) {\n .e-actions--bar > .e-btn {\n flex: 1 1 100%;\n }\n }\n\n @media print {\n .e-actions {\n display: none;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;E,kBAsBEA,EAAA,GAAAC,EAQYC,EAPLQ,EAAA,EAAE,GAAA;GACP,OAAKP,EAAA,CAAC,aACEO,EAAA,OAAG,gBAAA,CAAA;GACV,MAAMA,EAAA,QAAK,UAAa,KAAA;GACxB,cAAYA,EAAA;;GAEb,SAAAN,QAAQ,CAARC,EAAQS,EAAA,QAAA,SAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"EAppHeader.js","names":["_sfc_main","EAppHeader_vue_vue_type_script_setup_true_lang_default","EAppHeader_default"],"sources":["../../../src/components/AppHeader/EAppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\nimport \"./shell.css\";\n\ndefineProps<{\n /** Pins the header to the top while the page scrolls. */\n sticky?: boolean;\n}>();\n\ndefineSlots<{\n /** The logo or the name, usually a link to the home page. */\n logo?(): unknown;\n /** The person's menu or a sign-in Button, at the end of the bar. */\n actions?(): unknown;\n /** The navigation, usually an ENavList. It sits on its own row and scrolls sideways when it does not fit. */\n default?(): unknown;\n}>();\n</script>\n\n<template>\n <header class=\"e-appheader\" :class=\"sticky && 'e-appheader--sticky'\">\n <div class=\"e-appheader-bar e-shell-inner\">\n <div class=\"e-appheader-logo\"><slot name=\"logo\" /></div>\n <div v-if=\"$slots.actions\" class=\"e-appheader-actions\"><slot name=\"actions\" /></div>\n </div>\n <div v-if=\"$slots.default\" class=\"e-appheader-nav\">\n <div class=\"e-shell-inner\"><slot /></div>\n </div>\n </header>\n</template>\n\n<style>\n@layer e.page {\n .e-appheader {\n background: var(--e-surface);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-appheader--sticky {\n position: sticky;\n top: 0;\n z-index: var(--e-z-sticky);\n }\n\n .e-appheader-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-4);\n min-height: 64px;\n padding: 0 var(--e-space-4);\n }\n\n .e-appheader-logo {\n display: flex;\n align-items: center;\n min-width: 0;\n font: 600 var(--e-text-xl) / 1.2 var(--e-font-sans);\n }\n\n .e-appheader-logo a {\n color: var(--e-ink);\n text-decoration: none;\n }\n\n .e-appheader-logo a:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-appheader-actions {\n display: flex;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-appheader-nav {\n padding: 0 var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n overflow-x: auto;\n padding-block: var(--e-space-2);\n padding-inline: 0;\n }\n\n @media print {\n .e-appheader-nav {\n display: none;\n }\n }\n\n .e-appheader-nav .e-nav {\n margin-inline-start: calc(-1 * var(--e-space-3));\n }\n\n .e-appheader-nav .e-nav > ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--e-space-1);\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EAppHeader.js","names":["_sfc_main","EAppHeader_vue_vue_type_script_setup_true_lang_default","EAppHeader_default"],"sources":["../../../src/components/AppHeader/EAppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\nimport \"./shell.css\";\n\ndefineProps<{\n /** Pins the header to the top while the page scrolls. */\n sticky?: boolean;\n}>();\n\ndefineSlots<{\n /** The logo or the name, usually a link to the home page. */\n logo?(): unknown;\n /** The person's menu or a sign-in Button, at the end of the bar. */\n actions?(): unknown;\n /** The navigation, usually an ENavList. It sits on its own row and scrolls sideways when it does not fit. */\n default?(): unknown;\n}>();\n</script>\n\n<template>\n <header class=\"e-appheader\" :class=\"sticky && 'e-appheader--sticky'\">\n <div class=\"e-appheader-bar e-shell-inner\">\n <div class=\"e-appheader-logo\"><slot name=\"logo\" /></div>\n <div v-if=\"$slots.actions\" class=\"e-appheader-actions\"><slot name=\"actions\" /></div>\n </div>\n <div v-if=\"$slots.default\" class=\"e-appheader-nav\">\n <div class=\"e-shell-inner\"><slot /></div>\n </div>\n </header>\n</template>\n\n<style>\n@layer e.page {\n .e-appheader {\n background: var(--e-surface);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-appheader--sticky {\n position: sticky;\n top: 0;\n z-index: var(--e-z-sticky);\n }\n\n .e-appheader-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-4);\n min-height: calc(var(--e-control-height) + var(--e-space-4));\n padding: 0 var(--e-space-4);\n }\n\n .e-appheader-logo {\n display: flex;\n align-items: center;\n min-width: 0;\n font: 600 var(--e-text-xl) / 1.2 var(--e-font-sans);\n }\n\n .e-appheader-logo a {\n color: var(--e-ink);\n text-decoration: none;\n }\n\n .e-appheader-logo a:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-appheader-actions {\n display: flex;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-appheader-nav {\n padding: 0 var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n overflow-x: auto;\n padding-block: var(--e-space-2);\n padding-inline: 0;\n }\n\n @media print {\n .e-appheader-nav {\n display: none;\n }\n }\n\n .e-appheader-nav .e-nav {\n margin-inline-start: calc(-1 * var(--e-space-3));\n }\n\n .e-appheader-nav .e-nav > ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--e-space-1);\n }\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"EAppHeader.vue_vue_type_script_setup_true_lang.js","names":["$slots","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createCommentVNode","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","EAppHeader_vue_vue_type_script_setup_true_lang_default","openBlock","createElementBlock","normalizeClass","__props","createElementVNode","renderSlot","_ctx","createCommentVNode"],"sources":["../../../src/components/AppHeader/EAppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\nimport \"./shell.css\";\n\ndefineProps<{\n /** Pins the header to the top while the page scrolls. */\n sticky?: boolean;\n}>();\n\ndefineSlots<{\n /** The logo or the name, usually a link to the home page. */\n logo?(): unknown;\n /** The person's menu or a sign-in Button, at the end of the bar. */\n actions?(): unknown;\n /** The navigation, usually an ENavList. It sits on its own row and scrolls sideways when it does not fit. */\n default?(): unknown;\n}>();\n</script>\n\n<template>\n <header class=\"e-appheader\" :class=\"sticky && 'e-appheader--sticky'\">\n <div class=\"e-appheader-bar e-shell-inner\">\n <div class=\"e-appheader-logo\"><slot name=\"logo\" /></div>\n <div v-if=\"$slots.actions\" class=\"e-appheader-actions\"><slot name=\"actions\" /></div>\n </div>\n <div v-if=\"$slots.default\" class=\"e-appheader-nav\">\n <div class=\"e-shell-inner\"><slot /></div>\n </div>\n </header>\n</template>\n\n<style>\n@layer e.page {\n .e-appheader {\n background: var(--e-surface);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-appheader--sticky {\n position: sticky;\n top: 0;\n z-index: var(--e-z-sticky);\n }\n\n .e-appheader-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-4);\n min-height: 64px;\n padding: 0 var(--e-space-4);\n }\n\n .e-appheader-logo {\n display: flex;\n align-items: center;\n min-width: 0;\n font: 600 var(--e-text-xl) / 1.2 var(--e-font-sans);\n }\n\n .e-appheader-logo a {\n color: var(--e-ink);\n text-decoration: none;\n }\n\n .e-appheader-logo a:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-appheader-actions {\n display: flex;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-appheader-nav {\n padding: 0 var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n overflow-x: auto;\n padding-block: var(--e-space-2);\n padding-inline: 0;\n }\n\n @media print {\n .e-appheader-nav {\n display: none;\n }\n }\n\n .e-appheader-nav .e-nav {\n margin-inline-start: calc(-1 * var(--e-space-3));\n }\n\n .e-appheader-nav .e-nav > ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--e-space-1);\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;E,kBAoBEC,EAAA,GAAAC,EAQS,UAAA,EARD,OAAKC,EAAA,CAAC,eAAsBa,EAAA,UAAM,qBAAA,CAAA,E,IACxCZ,EAGM,OAHNG,GAGM,CAFJH,EAAwD,OAAxDI,GAAwD,CAA1BH,EAAoBc,EAAA,QAAA,MAAA,C,IACvCnB,EAAAA,OAAO,WAAlBC,EAAA,GAAAC,EAAoF,OAApFO,GAAoF,CAA7BJ,EAAuBc,EAAA,QAAA,SAAA,C,mBAErEnB,EAAAA,OAAO,WAAlBC,EAAA,GAAAC,EAEM,OAFNQ,GAEM,CADJN,EAAyC,OAAzCO,GAAyC,CAAdN,EAAQc,EAAA,QAAA,SAAA,C"}
1
+ {"version":3,"file":"EAppHeader.vue_vue_type_script_setup_true_lang.js","names":["$slots","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createCommentVNode","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","EAppHeader_vue_vue_type_script_setup_true_lang_default","openBlock","createElementBlock","normalizeClass","__props","createElementVNode","renderSlot","_ctx","createCommentVNode"],"sources":["../../../src/components/AppHeader/EAppHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport \"../../styles/base.css\";\nimport \"./shell.css\";\n\ndefineProps<{\n /** Pins the header to the top while the page scrolls. */\n sticky?: boolean;\n}>();\n\ndefineSlots<{\n /** The logo or the name, usually a link to the home page. */\n logo?(): unknown;\n /** The person's menu or a sign-in Button, at the end of the bar. */\n actions?(): unknown;\n /** The navigation, usually an ENavList. It sits on its own row and scrolls sideways when it does not fit. */\n default?(): unknown;\n}>();\n</script>\n\n<template>\n <header class=\"e-appheader\" :class=\"sticky && 'e-appheader--sticky'\">\n <div class=\"e-appheader-bar e-shell-inner\">\n <div class=\"e-appheader-logo\"><slot name=\"logo\" /></div>\n <div v-if=\"$slots.actions\" class=\"e-appheader-actions\"><slot name=\"actions\" /></div>\n </div>\n <div v-if=\"$slots.default\" class=\"e-appheader-nav\">\n <div class=\"e-shell-inner\"><slot /></div>\n </div>\n </header>\n</template>\n\n<style>\n@layer e.page {\n .e-appheader {\n background: var(--e-surface);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-appheader--sticky {\n position: sticky;\n top: 0;\n z-index: var(--e-z-sticky);\n }\n\n .e-appheader-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-4);\n min-height: calc(var(--e-control-height) + var(--e-space-4));\n padding: 0 var(--e-space-4);\n }\n\n .e-appheader-logo {\n display: flex;\n align-items: center;\n min-width: 0;\n font: 600 var(--e-text-xl) / 1.2 var(--e-font-sans);\n }\n\n .e-appheader-logo a {\n color: var(--e-ink);\n text-decoration: none;\n }\n\n .e-appheader-logo a:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-appheader-actions {\n display: flex;\n align-items: center;\n gap: var(--e-space-2);\n }\n\n .e-appheader-nav {\n padding: 0 var(--e-space-4);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n overflow-x: auto;\n padding-block: var(--e-space-2);\n padding-inline: 0;\n }\n\n @media print {\n .e-appheader-nav {\n display: none;\n }\n }\n\n .e-appheader-nav .e-nav {\n margin-inline-start: calc(-1 * var(--e-space-3));\n }\n\n .e-appheader-nav .e-nav > ul {\n display: flex;\n flex-wrap: wrap;\n gap: var(--e-space-1);\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;E,kBAoBEC,EAAA,GAAAC,EAQS,UAAA,EARD,OAAKC,EAAA,CAAC,eAAsBa,EAAA,UAAM,qBAAA,CAAA,E,IACxCZ,EAGM,OAHNG,GAGM,CAFJH,EAAwD,OAAxDI,GAAwD,CAA1BH,EAAoBc,EAAA,QAAA,MAAA,C,IACvCnB,EAAAA,OAAO,WAAlBC,EAAA,GAAAC,EAAoF,OAApFO,GAAoF,CAA7BJ,EAAuBc,EAAA,QAAA,SAAA,C,mBAErEnB,EAAAA,OAAO,WAAlBC,EAAA,GAAAC,EAEM,OAFNQ,GAEM,CADJN,EAAyC,OAAzCO,GAAyC,CAAdN,EAAQc,EAAA,QAAA,SAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"EAppShell.js","names":["_sfc_main","EAppShell_vue_vue_type_script_setup_true_lang_default","EAppShell_default"],"sources":["../../../src/components/AppShell/EAppShell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ESkipLink from \"../SkipLink/ESkipLink.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The `id` of the main content, which the skip link targets. */\n mainId?: string;\n /** The sidebar landmark's name. Defaults to \"Main\". */\n sidebarLabel?: string;\n }>(),\n { mainId: \"main\" },\n);\n\ndefineSlots<{\n /** An EAppHeader. */\n header?(): unknown;\n /** The side navigation, usually an ENavList. Two columns from 48rem wide; above the content below that. */\n sidebar?(): unknown;\n /** An EAppFooter. */\n footer?(): unknown;\n /** The page: start it with an EPageHeader. */\n default?(): unknown;\n}>();\n\nconst t = useMessages();\n</script>\n\n<template>\n <div class=\"e-shell\" :class=\"$slots.sidebar && 'e-shell--side'\">\n <ESkipLink :href=\"`#${mainId}`\" />\n <slot name=\"header\" />\n <div class=\"e-shell-body\">\n <aside v-if=\"$slots.sidebar\" class=\"e-shell-side\" :aria-label=\"sidebarLabel || t('mainNav')\">\n <slot name=\"sidebar\" />\n </aside>\n <main :id=\"mainId\" class=\"e-shell-main\" tabindex=\"-1\">\n <slot />\n </main>\n </div>\n <slot name=\"footer\" />\n </div>\n</template>\n\n<style>\n@layer e.page {\n .e-shell {\n display: grid;\n grid-template-rows: auto 1fr auto;\n min-height: 100%;\n background: var(--e-background);\n }\n\n .e-shell-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--e-space-6);\n width: 100%;\n max-width: 72rem;\n margin-inline: auto;\n padding: var(--e-space-6) var(--e-space-4);\n }\n\n @media (min-width: 48rem) {\n .e-shell--side .e-shell-body {\n grid-template-columns: 15rem minmax(0, 1fr);\n }\n }\n\n .e-shell-main {\n min-width: 0;\n }\n\n .e-shell-main:focus {\n outline: none;\n }\n\n @media print {\n .e-root,\n body {\n background: #fff;\n color: #000;\n }\n\n .e-shell-side {\n display: none;\n }\n\n .e-shell-body {\n max-width: none;\n padding: 0;\n }\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EAppShell.js","names":["_sfc_main","EAppShell_vue_vue_type_script_setup_true_lang_default","EAppShell_default"],"sources":["../../../src/components/AppShell/EAppShell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ESkipLink from \"../SkipLink/ESkipLink.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The `id` of the `main` element, which the skip link targets. Keep it unique. */\n mainId?: string;\n /** The name of the sidebar landmark. @default \"Main\" */\n sidebarLabel?: string;\n }>(),\n { mainId: \"main\" },\n);\n\ndefineSlots<{\n /** An EAppHeader. */\n header?(): unknown;\n /** The side navigation, usually an ENavList. Two columns from 48rem wide; above the content below that. */\n sidebar?(): unknown;\n /** An EAppFooter. */\n footer?(): unknown;\n /** The page: start it with an EPageHeader. */\n default?(): unknown;\n}>();\n\nconst t = useMessages();\n</script>\n\n<template>\n <div class=\"e-shell\" :class=\"$slots.sidebar && 'e-shell--side'\">\n <ESkipLink :href=\"`#${mainId}`\" />\n <slot name=\"header\" />\n <div class=\"e-shell-body\">\n <aside v-if=\"$slots.sidebar\" class=\"e-shell-side\" :aria-label=\"sidebarLabel || t('mainNav')\">\n <slot name=\"sidebar\" />\n </aside>\n <main :id=\"mainId\" class=\"e-shell-main\" tabindex=\"-1\">\n <slot />\n </main>\n </div>\n <slot name=\"footer\" />\n </div>\n</template>\n\n<style>\n@layer e.page {\n .e-shell {\n position: relative;\n display: grid;\n grid-template-rows: auto 1fr auto;\n min-height: 100%;\n background: var(--e-background);\n }\n\n .e-shell-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--e-space-6);\n width: 100%;\n max-width: var(--e-shell-width, 72rem);\n margin-inline: auto;\n padding: var(--e-space-6) var(--e-space-4);\n }\n\n /* Hairlines down both edges of the page column, drawn over the header and footer. */\n @media (min-width: 64rem) {\n .e-shell::after {\n content: \"\";\n position: absolute;\n inset-block: 0;\n inset-inline: 0;\n z-index: var(--e-z-sticky);\n box-sizing: border-box;\n width: min(100%, var(--e-shell-width, 72rem));\n margin-inline: auto;\n border-inline: var(--e-stroke-hair) solid var(--e-shell-rail, var(--e-border));\n pointer-events: none;\n }\n }\n\n @media (min-width: 48rem) {\n .e-shell--side .e-shell-body {\n grid-template-columns: 15rem minmax(0, 1fr);\n }\n }\n\n .e-shell-main {\n min-width: 0;\n }\n\n .e-shell-main:focus:not(:focus-visible) {\n outline: none;\n }\n\n .e-shell-main:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n @media print {\n .e-root,\n body {\n background: var(--e-print-paper, #fff);\n color: var(--e-print-ink, #000);\n }\n\n .e-shell::after,\n .e-shell-side {\n display: none;\n }\n\n .e-shell-body {\n max-width: none;\n padding: 0;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -1,7 +1,7 @@
1
1
  type __VLS_Props = {
2
- /** The `id` of the main content, which the skip link targets. */
2
+ /** The `id` of the `main` element, which the skip link targets. Keep it unique. */
3
3
  mainId?: string;
4
- /** The sidebar landmark's name. Defaults to "Main". */
4
+ /** The name of the sidebar landmark. @default "Main" */
5
5
  sidebarLabel?: string;
6
6
  };
7
7
  type __VLS_Slots = {
@@ -1 +1 @@
1
- {"version":3,"file":"EAppShell.vue_vue_type_script_setup_true_lang.js","names":["$slots","_openBlock","_createElementBlock","_normalizeClass","_createVNode","ESkipLink","_renderSlot","_createElementVNode","_unref","_createCommentVNode","ESkipLink_default","_hoisted_1","_hoisted_2","_hoisted_3","EAppShell_vue_vue_type_script_setup_true_lang_default","t","useMessages","openBlock","createElementBlock","normalizeClass","_ctx","createVNode","__props","renderSlot","createElementVNode","unref","createCommentVNode"],"sources":["../../../src/components/AppShell/EAppShell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ESkipLink from \"../SkipLink/ESkipLink.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The `id` of the main content, which the skip link targets. */\n mainId?: string;\n /** The sidebar landmark's name. Defaults to \"Main\". */\n sidebarLabel?: string;\n }>(),\n { mainId: \"main\" },\n);\n\ndefineSlots<{\n /** An EAppHeader. */\n header?(): unknown;\n /** The side navigation, usually an ENavList. Two columns from 48rem wide; above the content below that. */\n sidebar?(): unknown;\n /** An EAppFooter. */\n footer?(): unknown;\n /** The page: start it with an EPageHeader. */\n default?(): unknown;\n}>();\n\nconst t = useMessages();\n</script>\n\n<template>\n <div class=\"e-shell\" :class=\"$slots.sidebar && 'e-shell--side'\">\n <ESkipLink :href=\"`#${mainId}`\" />\n <slot name=\"header\" />\n <div class=\"e-shell-body\">\n <aside v-if=\"$slots.sidebar\" class=\"e-shell-side\" :aria-label=\"sidebarLabel || t('mainNav')\">\n <slot name=\"sidebar\" />\n </aside>\n <main :id=\"mainId\" class=\"e-shell-main\" tabindex=\"-1\">\n <slot />\n </main>\n </div>\n <slot name=\"footer\" />\n </div>\n</template>\n\n<style>\n@layer e.page {\n .e-shell {\n display: grid;\n grid-template-rows: auto 1fr auto;\n min-height: 100%;\n background: var(--e-background);\n }\n\n .e-shell-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--e-space-6);\n width: 100%;\n max-width: 72rem;\n margin-inline: auto;\n padding: var(--e-space-6) var(--e-space-4);\n }\n\n @media (min-width: 48rem) {\n .e-shell--side .e-shell-body {\n grid-template-columns: 15rem minmax(0, 1fr);\n }\n }\n\n .e-shell-main {\n min-width: 0;\n }\n\n .e-shell-main:focus {\n outline: none;\n }\n\n @media print {\n .e-root,\n body {\n background: #fff;\n color: #000;\n }\n\n .e-shell-side {\n display: none;\n }\n\n .e-shell-body {\n max-width: none;\n padding: 0;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EA0BA,IAAMe,IAAIC,EAAY;E,kBAIpBf,EAAA,GAAAC,EAYM,OAAA,EAZD,OAAKC,EAAA,CAAC,WAAkBH,EAAAA,OAAO,WAAO,eAAA,CAAA,E;GACzCI,EAAkCC,GAAA,EAAtB,MAAI,IAAMiB,EAAA,S;GACtBhB,EAAsBc,EAAA,QAAA,QAAA;GACtBb,EAOM,OAPNI,GAOM,CANSX,EAAAA,OAAO,WAApBC,EAAA,GAAAC,EAEQ,SAAA;;IAFqB,OAAM;IAAgB,cAAYoB,EAAA,gBAAgBd,EAAAO,CAAA,CAAC,CAAA,SAAA;G,IAC9ET,EAAuBc,EAAA,QAAA,SAAA,C,uBAEzBb,EAEO,QAAA;IAFA,IAAIe,EAAA;IAAQ,OAAM;IAAe,UAAS;G,IAC/ChB,EAAQc,EAAA,QAAA,SAAA,C;GAGZd,EAAsBc,EAAA,QAAA,QAAA"}
1
+ {"version":3,"file":"EAppShell.vue_vue_type_script_setup_true_lang.js","names":["$slots","_openBlock","_createElementBlock","_normalizeClass","_createVNode","ESkipLink","_renderSlot","_createElementVNode","_unref","_createCommentVNode","ESkipLink_default","_hoisted_1","_hoisted_2","_hoisted_3","EAppShell_vue_vue_type_script_setup_true_lang_default","t","useMessages","openBlock","createElementBlock","normalizeClass","_ctx","createVNode","__props","renderSlot","createElementVNode","unref","createCommentVNode"],"sources":["../../../src/components/AppShell/EAppShell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ESkipLink from \"../SkipLink/ESkipLink.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nwithDefaults(\n defineProps<{\n /** The `id` of the `main` element, which the skip link targets. Keep it unique. */\n mainId?: string;\n /** The name of the sidebar landmark. @default \"Main\" */\n sidebarLabel?: string;\n }>(),\n { mainId: \"main\" },\n);\n\ndefineSlots<{\n /** An EAppHeader. */\n header?(): unknown;\n /** The side navigation, usually an ENavList. Two columns from 48rem wide; above the content below that. */\n sidebar?(): unknown;\n /** An EAppFooter. */\n footer?(): unknown;\n /** The page: start it with an EPageHeader. */\n default?(): unknown;\n}>();\n\nconst t = useMessages();\n</script>\n\n<template>\n <div class=\"e-shell\" :class=\"$slots.sidebar && 'e-shell--side'\">\n <ESkipLink :href=\"`#${mainId}`\" />\n <slot name=\"header\" />\n <div class=\"e-shell-body\">\n <aside v-if=\"$slots.sidebar\" class=\"e-shell-side\" :aria-label=\"sidebarLabel || t('mainNav')\">\n <slot name=\"sidebar\" />\n </aside>\n <main :id=\"mainId\" class=\"e-shell-main\" tabindex=\"-1\">\n <slot />\n </main>\n </div>\n <slot name=\"footer\" />\n </div>\n</template>\n\n<style>\n@layer e.page {\n .e-shell {\n position: relative;\n display: grid;\n grid-template-rows: auto 1fr auto;\n min-height: 100%;\n background: var(--e-background);\n }\n\n .e-shell-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--e-space-6);\n width: 100%;\n max-width: var(--e-shell-width, 72rem);\n margin-inline: auto;\n padding: var(--e-space-6) var(--e-space-4);\n }\n\n /* Hairlines down both edges of the page column, drawn over the header and footer. */\n @media (min-width: 64rem) {\n .e-shell::after {\n content: \"\";\n position: absolute;\n inset-block: 0;\n inset-inline: 0;\n z-index: var(--e-z-sticky);\n box-sizing: border-box;\n width: min(100%, var(--e-shell-width, 72rem));\n margin-inline: auto;\n border-inline: var(--e-stroke-hair) solid var(--e-shell-rail, var(--e-border));\n pointer-events: none;\n }\n }\n\n @media (min-width: 48rem) {\n .e-shell--side .e-shell-body {\n grid-template-columns: 15rem minmax(0, 1fr);\n }\n }\n\n .e-shell-main {\n min-width: 0;\n }\n\n .e-shell-main:focus:not(:focus-visible) {\n outline: none;\n }\n\n .e-shell-main:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n @media print {\n .e-root,\n body {\n background: var(--e-print-paper, #fff);\n color: var(--e-print-ink, #000);\n }\n\n .e-shell::after,\n .e-shell-side {\n display: none;\n }\n\n .e-shell-body {\n max-width: none;\n padding: 0;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EA0BA,IAAMe,IAAIC,EAAY;E,kBAIpBf,EAAA,GAAAC,EAYM,OAAA,EAZD,OAAKC,EAAA,CAAC,WAAkBH,EAAAA,OAAO,WAAO,eAAA,CAAA,E;GACzCI,EAAkCC,GAAA,EAAtB,MAAI,IAAMiB,EAAA,S;GACtBhB,EAAsBc,EAAA,QAAA,QAAA;GACtBb,EAOM,OAPNI,GAOM,CANSX,EAAAA,OAAO,WAApBC,EAAA,GAAAC,EAEQ,SAAA;;IAFqB,OAAM;IAAgB,cAAYoB,EAAA,gBAAgBd,EAAAO,CAAA,CAAC,CAAA,SAAA;G,IAC9ET,EAAuBc,EAAA,QAAA,SAAA,C,uBAEzBb,EAEO,QAAA;IAFA,IAAIe,EAAA;IAAQ,OAAM;IAAe,UAAS;G,IAC/ChB,EAAQc,EAAA,QAAA,SAAA,C;GAGZd,EAAsBc,EAAA,QAAA,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"EAvatar.js","names":["_sfc_main","EAvatar_vue_vue_type_script_setup_true_lang_default","EAvatar_default"],"sources":["../../../src/components/Avatar/EAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** The person's name. Screen readers read it; the initials come from it. */\n name: string;\n /** A photo URL. If it fails to load, the initials appear. */\n src?: string;\n /** 28px, for rows. */\n small?: boolean;\n /** 56px, for a practitioner on an appointment card or a profile. */\n large?: boolean;\n /** `button` makes it a control named by `name`, such as the trigger of an account menu. Default `span`. */\n as?: \"span\" | \"button\";\n }>(),\n { as: \"span\" },\n);\n\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst initials = computed(() => {\n const parts = String(props.name || \"?\")\n .split(/\\s+/)\n .filter(Boolean);\n const first = [...(parts[0] ?? \"?\")][0] ?? \"?\";\n const last = parts.length > 1 ? ([...parts[parts.length - 1]!][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-avatar\"\n :class=\"{ 'e-avatar--s': small, 'e-avatar--l': large, 'e-avatar--button': as === 'button' }\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :role=\"as === 'button' ? undefined : 'img'\"\n :aria-label=\"as === 'button' ? undefined : name\"\n >\n <img v-if=\"src && !failed\" class=\"e-avatar-img\" :src=\"src\" alt=\"\" @error=\"failed = true\" />\n <span v-else-if=\"as === 'button'\" aria-hidden=\"true\">{{ initials }}</span>\n <template v-else>{{ initials }}</template>\n <span v-if=\"as === 'button'\" class=\"e-sr\">{{ name }}</span>\n </component>\n</template>\n\n<style>\n@layer e.primitives {\n .e-avatar {\n display: inline-grid;\n place-items: center;\n flex: none;\n box-sizing: border-box;\n width: 44px;\n height: 44px;\n overflow: hidden;\n border: var(--e-stroke-edge) solid var(--e-border-strong);\n border-radius: var(--e-radius-md);\n background: var(--e-surface-tint);\n color: var(--e-primary);\n font: 600 var(--e-text-sm) / 1 var(--e-font-mono);\n letter-spacing: 0.02em;\n }\n\n .e-avatar--button {\n position: relative;\n padding: 0;\n cursor: pointer;\n transition: border-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-avatar--button:hover {\n border-color: var(--e-ink);\n }\n\n .e-avatar--button:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-avatar--button {\n transition: none;\n }\n }\n\n .e-avatar--s {\n width: 32px;\n height: 32px;\n font-size: var(--e-text-xs);\n border-radius: var(--e-radius-sm);\n }\n\n .e-avatar--l {\n width: 64px;\n height: 64px;\n font-size: var(--e-text-lg);\n }\n\n .e-avatar-img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EAvatar.js","names":["_sfc_main","EAvatar_vue_vue_type_script_setup_true_lang_default","EAvatar_default"],"sources":["../../../src/components/Avatar/EAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** The person's name. Screen readers read it; the initials are the first letters of its first and last word. */\n name: string;\n /** A photo URL. If it fails to load, the initials appear. */\n src?: string;\n /** 32px, for rows and bars. */\n small?: boolean;\n /** 64px, for a profile or practitioner on an appointment card. The default is 44px. */\n large?: boolean;\n /** `button` renders a `button` with `type=\"button\"`, a pointer cursor and a focus ring, named by `name`, such as the `trigger` of an `EMenu`. Default `span`. */\n as?: \"span\" | \"button\";\n }>(),\n { as: \"span\" },\n);\n\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst initials = computed(() => {\n const parts = String(props.name || \"?\")\n .split(/\\s+/)\n .filter(Boolean);\n const first = [...(parts[0] ?? \"?\")][0] ?? \"?\";\n const last = parts.length > 1 ? ([...parts[parts.length - 1]!][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-avatar\"\n :class=\"{ 'e-avatar--s': small, 'e-avatar--l': large, 'e-avatar--button': as === 'button' }\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :role=\"as === 'button' ? undefined : 'img'\"\n :aria-label=\"as === 'button' ? undefined : name\"\n >\n <img v-if=\"src && !failed\" class=\"e-avatar-img\" :src=\"src\" alt=\"\" @error=\"failed = true\" />\n <span v-else-if=\"as === 'button'\" aria-hidden=\"true\">{{ initials }}</span>\n <template v-else>{{ initials }}</template>\n <span v-if=\"as === 'button'\" class=\"e-sr\">{{ name }}</span>\n </component>\n</template>\n\n<style>\n@layer e.primitives {\n .e-avatar {\n display: inline-grid;\n place-items: center;\n flex: none;\n box-sizing: border-box;\n width: var(--e-tap, 44px);\n height: var(--e-tap, 44px);\n overflow: hidden;\n border: var(--e-stroke-edge) solid var(--e-border-strong);\n\n --e-bc: var(--e-border-strong);\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-radius: var(--e-radius-md);\n background: var(--e-surface-tint);\n color: var(--e-primary);\n font: 600 var(--e-text-sm) / 1 var(--e-font-mono);\n letter-spacing: 0.02em;\n }\n\n .e-avatar--button {\n position: relative;\n padding: 0;\n cursor: pointer;\n transition: border-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-avatar--button:hover {\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n }\n\n .e-avatar--button:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-avatar--button {\n transition: none;\n }\n }\n\n .e-avatar--s {\n width: 32px;\n height: 32px;\n font-size: var(--e-text-xs);\n border-radius: var(--e-radius-sm);\n }\n\n .e-avatar--l {\n width: 64px;\n height: 64px;\n font-size: var(--e-text-lg);\n }\n\n .e-avatar-img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n @media (forced-colors: active) {\n .e-avatar {\n border-color: CanvasText;\n outline-color: CanvasText;\n color: CanvasText;\n }\n\n .e-avatar--button:focus-visible {\n outline-color: Highlight;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -1,13 +1,13 @@
1
1
  type __VLS_Props = {
2
- /** The person's name. Screen readers read it; the initials come from it. */
2
+ /** The person's name. Screen readers read it; the initials are the first letters of its first and last word. */
3
3
  name: string;
4
4
  /** A photo URL. If it fails to load, the initials appear. */
5
5
  src?: string;
6
- /** 28px, for rows. */
6
+ /** 32px, for rows and bars. */
7
7
  small?: boolean;
8
- /** 56px, for a practitioner on an appointment card or a profile. */
8
+ /** 64px, for a profile or practitioner on an appointment card. The default is 44px. */
9
9
  large?: boolean;
10
- /** `button` makes it a control named by `name`, such as the trigger of an account menu. Default `span`. */
10
+ /** `button` renders a `button` with `type="button"`, a pointer cursor and a focus ring, named by `name`, such as the `trigger` of an `EMenu`. Default `span`. */
11
11
  as?: "span" | "button";
12
12
  };
13
13
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
@@ -1 +1 @@
1
- {"version":3,"file":"EAvatar.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementBlock","_toDisplayString","_Fragment","_createTextVNode","_createCommentVNode","_hoisted_1","_hoisted_2","_hoisted_3","EAvatar_vue_vue_type_script_setup_true_lang_default","props","__props","failed","ref","initials","computed","parts","openBlock","createBlock","resolveDynamicComponent","normalizeClass","withCtx","createElementBlock","_cache","toDisplayString","Fragment","createTextVNode","createCommentVNode"],"sources":["../../../src/components/Avatar/EAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** The person's name. Screen readers read it; the initials come from it. */\n name: string;\n /** A photo URL. If it fails to load, the initials appear. */\n src?: string;\n /** 28px, for rows. */\n small?: boolean;\n /** 56px, for a practitioner on an appointment card or a profile. */\n large?: boolean;\n /** `button` makes it a control named by `name`, such as the trigger of an account menu. Default `span`. */\n as?: \"span\" | \"button\";\n }>(),\n { as: \"span\" },\n);\n\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst initials = computed(() => {\n const parts = String(props.name || \"?\")\n .split(/\\s+/)\n .filter(Boolean);\n const first = [...(parts[0] ?? \"?\")][0] ?? \"?\";\n const last = parts.length > 1 ? ([...parts[parts.length - 1]!][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-avatar\"\n :class=\"{ 'e-avatar--s': small, 'e-avatar--l': large, 'e-avatar--button': as === 'button' }\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :role=\"as === 'button' ? undefined : 'img'\"\n :aria-label=\"as === 'button' ? undefined : name\"\n >\n <img v-if=\"src && !failed\" class=\"e-avatar-img\" :src=\"src\" alt=\"\" @error=\"failed = true\" />\n <span v-else-if=\"as === 'button'\" aria-hidden=\"true\">{{ initials }}</span>\n <template v-else>{{ initials }}</template>\n <span v-if=\"as === 'button'\" class=\"e-sr\">{{ name }}</span>\n </component>\n</template>\n\n<style>\n@layer e.primitives {\n .e-avatar {\n display: inline-grid;\n place-items: center;\n flex: none;\n box-sizing: border-box;\n width: 44px;\n height: 44px;\n overflow: hidden;\n border: var(--e-stroke-edge) solid var(--e-border-strong);\n border-radius: var(--e-radius-md);\n background: var(--e-surface-tint);\n color: var(--e-primary);\n font: 600 var(--e-text-sm) / 1 var(--e-font-mono);\n letter-spacing: 0.02em;\n }\n\n .e-avatar--button {\n position: relative;\n padding: 0;\n cursor: pointer;\n transition: border-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-avatar--button:hover {\n border-color: var(--e-ink);\n }\n\n .e-avatar--button:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-avatar--button {\n transition: none;\n }\n }\n\n .e-avatar--s {\n width: 32px;\n height: 32px;\n font-size: var(--e-text-xs);\n border-radius: var(--e-radius-sm);\n }\n\n .e-avatar--l {\n width: 64px;\n height: 64px;\n font-size: var(--e-text-lg);\n }\n\n .e-avatar-img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAIA,IAAMc,IAAQC,GAgBRC,IAASC,EAAI,EAAK;EACxB,QACQH,EAAM,WACL,EAAO,QAAQ,EACxB;EAEA,IAAMI,IAAWC,QAAe;GAC9B,IAAMC,IAAQ,OAAON,EAAM,QAAQ,GAAG,CAAA,CACnC,MAAM,KAAK,CAAA,CACX,OAAO,OAAO;GAGjB,SAFc,CAAC,GAAIM,EAAM,MAAM,GAAI,CAAC,CAAC,MAAM,QAC9BA,EAAM,SAAS,IAAK,CAAC,GAAGA,EAAMA,EAAM,SAAS,EAAG,CAAC,CAAC,MAAM,KAAM,IAAA,CACrD,YAAY;EACpC,CAAC;E,kBAICpB,EAAA,GAAAC,EAYYC,EAXLa,EAAA,EAAE,GAAA;GACP,OAAKZ,EAAA,CAAC,YAAU;IAAA,eACSY,EAAA;IAAK,eAAiBA,EAAA;IAAK,oBAAsBA,EAAA,OAAE;GAAA,CAAA,CAAA;GAC3E,MAAMA,EAAA,OAAE,WAAA,WAA2B,KAAA;GACnC,MAAMA,EAAA,OAAE,WAAgB,KAAA,IAAS;GACjC,cAAYA,EAAA,OAAE,WAAgB,KAAA,IAAYA,EAAA;;GAE3C,SAAAX,QAA2F,CAAhFW,EAAA,OAAG,CAAKC,EAAA,SAAnBhB,EAAA,GAAAK,EAA2F,OAAA;;IAAhE,OAAM;IAAgB,KAAKU,EAAA;IAAK,KAAI;IAAI,SAAK,AAAAY,EAAA,QAAA,MAAE,EAAA,QAAM;G,mBAC/DZ,EAAA,OAAE,YAAnBf,EAAA,GAAAK,EAA0E,QAA1EM,GAA0EL,EAAlBY,EAAA,KAAQ,GAAA,CAAA,MAChElB,EAAA,GAAAK,EAA0CE,GAAA,EAAA,KAAA,EAAA,GAAA,CAAtBC,EAAAF,EAAAY,EAAA,KAAQ,GAAA,CAAA,C,SAChBH,EAAA,OAAE,YAAdf,EAAA,GAAAK,EAA2D,QAA3DO,GAA2DN,EAAdS,EAAA,IAAI,GAAA,CAAA,K"}
1
+ {"version":3,"file":"EAvatar.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementBlock","_toDisplayString","_Fragment","_createTextVNode","_createCommentVNode","_hoisted_1","_hoisted_2","_hoisted_3","EAvatar_vue_vue_type_script_setup_true_lang_default","props","__props","failed","ref","initials","computed","parts","openBlock","createBlock","resolveDynamicComponent","normalizeClass","withCtx","createElementBlock","_cache","toDisplayString","Fragment","createTextVNode","createCommentVNode"],"sources":["../../../src/components/Avatar/EAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** The person's name. Screen readers read it; the initials are the first letters of its first and last word. */\n name: string;\n /** A photo URL. If it fails to load, the initials appear. */\n src?: string;\n /** 32px, for rows and bars. */\n small?: boolean;\n /** 64px, for a profile or practitioner on an appointment card. The default is 44px. */\n large?: boolean;\n /** `button` renders a `button` with `type=\"button\"`, a pointer cursor and a focus ring, named by `name`, such as the `trigger` of an `EMenu`. Default `span`. */\n as?: \"span\" | \"button\";\n }>(),\n { as: \"span\" },\n);\n\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst initials = computed(() => {\n const parts = String(props.name || \"?\")\n .split(/\\s+/)\n .filter(Boolean);\n const first = [...(parts[0] ?? \"?\")][0] ?? \"?\";\n const last = parts.length > 1 ? ([...parts[parts.length - 1]!][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n});\n</script>\n\n<template>\n <component\n :is=\"as\"\n class=\"e-avatar\"\n :class=\"{ 'e-avatar--s': small, 'e-avatar--l': large, 'e-avatar--button': as === 'button' }\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :role=\"as === 'button' ? undefined : 'img'\"\n :aria-label=\"as === 'button' ? undefined : name\"\n >\n <img v-if=\"src && !failed\" class=\"e-avatar-img\" :src=\"src\" alt=\"\" @error=\"failed = true\" />\n <span v-else-if=\"as === 'button'\" aria-hidden=\"true\">{{ initials }}</span>\n <template v-else>{{ initials }}</template>\n <span v-if=\"as === 'button'\" class=\"e-sr\">{{ name }}</span>\n </component>\n</template>\n\n<style>\n@layer e.primitives {\n .e-avatar {\n display: inline-grid;\n place-items: center;\n flex: none;\n box-sizing: border-box;\n width: var(--e-tap, 44px);\n height: var(--e-tap, 44px);\n overflow: hidden;\n border: var(--e-stroke-edge) solid var(--e-border-strong);\n\n --e-bc: var(--e-border-strong);\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-radius: var(--e-radius-md);\n background: var(--e-surface-tint);\n color: var(--e-primary);\n font: 600 var(--e-text-sm) / 1 var(--e-font-mono);\n letter-spacing: 0.02em;\n }\n\n .e-avatar--button {\n position: relative;\n padding: 0;\n cursor: pointer;\n transition: border-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-avatar--button:hover {\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n }\n\n .e-avatar--button:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-avatar--button {\n transition: none;\n }\n }\n\n .e-avatar--s {\n width: 32px;\n height: 32px;\n font-size: var(--e-text-xs);\n border-radius: var(--e-radius-sm);\n }\n\n .e-avatar--l {\n width: 64px;\n height: 64px;\n font-size: var(--e-text-lg);\n }\n\n .e-avatar-img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n @media (forced-colors: active) {\n .e-avatar {\n border-color: CanvasText;\n outline-color: CanvasText;\n color: CanvasText;\n }\n\n .e-avatar--button:focus-visible {\n outline-color: Highlight;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAIA,IAAMc,IAAQC,GAgBRC,IAASC,EAAI,EAAK;EACxB,QACQH,EAAM,WACL,EAAO,QAAQ,EACxB;EAEA,IAAMI,IAAWC,QAAe;GAC9B,IAAMC,IAAQ,OAAON,EAAM,QAAQ,GAAG,CAAA,CACnC,MAAM,KAAK,CAAA,CACX,OAAO,OAAO;GAGjB,SAFc,CAAC,GAAIM,EAAM,MAAM,GAAI,CAAC,CAAC,MAAM,QAC9BA,EAAM,SAAS,IAAK,CAAC,GAAGA,EAAMA,EAAM,SAAS,EAAG,CAAC,CAAC,MAAM,KAAM,IAAA,CACrD,YAAY;EACpC,CAAC;E,kBAICpB,EAAA,GAAAC,EAYYC,EAXLa,EAAA,EAAE,GAAA;GACP,OAAKZ,EAAA,CAAC,YAAU;IAAA,eACSY,EAAA;IAAK,eAAiBA,EAAA;IAAK,oBAAsBA,EAAA,OAAE;GAAA,CAAA,CAAA;GAC3E,MAAMA,EAAA,OAAE,WAAA,WAA2B,KAAA;GACnC,MAAMA,EAAA,OAAE,WAAgB,KAAA,IAAS;GACjC,cAAYA,EAAA,OAAE,WAAgB,KAAA,IAAYA,EAAA;;GAE3C,SAAAX,QAA2F,CAAhFW,EAAA,OAAG,CAAKC,EAAA,SAAnBhB,EAAA,GAAAK,EAA2F,OAAA;;IAAhE,OAAM;IAAgB,KAAKU,EAAA;IAAK,KAAI;IAAI,SAAK,AAAAY,EAAA,QAAA,MAAE,EAAA,QAAM;G,mBAC/DZ,EAAA,OAAE,YAAnBf,EAAA,GAAAK,EAA0E,QAA1EM,GAA0EL,EAAlBY,EAAA,KAAQ,GAAA,CAAA,MAChElB,EAAA,GAAAK,EAA0CE,GAAA,EAAA,KAAA,EAAA,GAAA,CAAtBC,EAAAF,EAAAY,EAAA,KAAQ,GAAA,CAAA,C,SAChBH,EAAA,OAAE,YAAdf,EAAA,GAAAK,EAA2D,QAA3DO,GAA2DN,EAAdS,EAAA,IAAI,GAAA,CAAA,K"}
@@ -1 +1 @@
1
- {"version":3,"file":"EBreadcrumb.js","names":["_sfc_main","EBreadcrumb_vue_vue_type_script_setup_true_lang_default","EBreadcrumb_default"],"sources":["../../../src/components/Breadcrumb/EBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nexport interface BreadcrumbItem {\n /** The words for this level. */\n label: string;\n /** Where it goes. Omit it on the last item, which is the current page. */\n href?: string;\n /** A router location, passed to `linkComponent` as `to` (for `RouterLink`). */\n to?: unknown;\n}\n\nwithDefaults(\n defineProps<{\n /** The path, top level first. The last item is the current page and is not a link. */\n items: BreadcrumbItem[];\n /** What renders each link: `\"a\"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). */\n linkComponent?: string | Component;\n }>(),\n { linkComponent: \"a\" },\n);\n\nconst t = useMessages();\n\nconst linkAttrs = (item: BreadcrumbItem) => ({\n ...(item.href !== undefined && { href: item.href }),\n ...(item.to !== undefined && { to: item.to }),\n});\n</script>\n\n<template>\n <nav class=\"e-crumbs\" :aria-label=\"t('breadcrumb')\">\n <ol>\n <li v-for=\"(item, i) in items\" :key=\"i\">\n <span v-if=\"i === items.length - 1\" class=\"e-crumb-current\" aria-current=\"page\">{{ item.label }}</span>\n <component\n :is=\"linkComponent\"\n v-else-if=\"item.href !== undefined || item.to !== undefined\"\n class=\"e-crumb\"\n v-bind=\"linkAttrs(item)\"\n >\n {{ item.label }}\n </component>\n <span v-else class=\"e-crumb-current\">{{ item.label }}</span>\n <EIcon v-if=\"i < items.length - 1\" name=\"chevron-right\" small />\n </li>\n </ol>\n </nav>\n</template>\n\n<style>\n@layer e.page {\n .e-crumbs ol {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-1) var(--e-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n font: 400 var(--e-text-sm) / 20px var(--e-font-sans);\n }\n\n .e-crumbs li {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-2);\n color: var(--e-muted);\n }\n\n .e-crumb,\n .e-crumb-current {\n display: inline-flex;\n align-items: center;\n }\n\n .e-crumb {\n position: relative;\n color: var(--e-primary);\n text-decoration: underline;\n text-decoration-color: var(--e-primary);\n text-underline-offset: 3px;\n }\n\n .e-crumb::after {\n content: \"\";\n position: absolute;\n inset: -12px -4px;\n }\n\n .e-crumb:hover {\n color: var(--e-ink);\n text-decoration-color: var(--e-ink);\n }\n\n .e-crumb:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-crumb-current {\n color: var(--e-ink);\n font-weight: 500;\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EBreadcrumb.js","names":["_sfc_main","EBreadcrumb_vue_vue_type_script_setup_true_lang_default","EBreadcrumb_default"],"sources":["../../../src/components/Breadcrumb/EBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nexport interface BreadcrumbItem {\n /** The words for this level. */\n label: string;\n /** Where it goes. Omit it on the last item, which is the current page. */\n href?: string;\n /** A router location, passed to `linkComponent` as `to` (for `RouterLink`). */\n to?: unknown;\n}\n\nwithDefaults(\n defineProps<{\n /** The path as `{ label, href?, to? }`, top level first. The last item is the current page and is not a link. */\n items: BreadcrumbItem[];\n /** What renders each link: `\"a\"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). With `RouterLink`, give items a `to` (items can mix `href` and `to`); it receives only the attributes the item has. */\n linkComponent?: string | Component;\n }>(),\n { linkComponent: \"a\" },\n);\n\nconst t = useMessages();\n\nconst linkAttrs = (item: BreadcrumbItem) => ({\n ...(item.href !== undefined && { href: item.href }),\n ...(item.to !== undefined && { to: item.to }),\n});\n</script>\n\n<template>\n <nav class=\"e-crumbs\" :aria-label=\"t('breadcrumb')\">\n <ol>\n <li v-for=\"(item, i) in items\" :key=\"i\">\n <span v-if=\"i === items.length - 1\" class=\"e-crumb-current\" aria-current=\"page\">{{ item.label }}</span>\n <component\n :is=\"linkComponent\"\n v-else-if=\"item.href !== undefined || item.to !== undefined\"\n class=\"e-crumb\"\n v-bind=\"linkAttrs(item)\"\n >\n {{ item.label }}\n </component>\n <span v-else class=\"e-crumb-current\">{{ item.label }}</span>\n <EIcon v-if=\"i < items.length - 1\" name=\"chevron-right\" small />\n </li>\n </ol>\n </nav>\n</template>\n\n<style>\n@layer e.page {\n .e-crumbs ol {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-1) var(--e-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n font: 400 var(--e-text-sm) / 20px var(--e-font-sans);\n }\n\n .e-crumbs li {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-2);\n color: var(--e-muted);\n }\n\n .e-crumb,\n .e-crumb-current {\n display: inline-flex;\n align-items: center;\n }\n\n .e-crumb {\n position: relative;\n color: var(--e-primary);\n text-decoration: underline;\n text-decoration-color: var(--e-primary);\n text-underline-offset: 3px;\n }\n\n .e-crumb::after {\n content: \"\";\n position: absolute;\n inset: calc((var(--e-tap, 44px) - 20px) / -2) calc(-1 * var(--e-space-1));\n }\n\n .e-crumb:hover {\n color: var(--e-ink);\n text-decoration-color: var(--e-ink);\n }\n\n .e-crumb:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-crumb-current {\n color: var(--e-ink);\n font-weight: 500;\n }\n}\n</style>\n"],"mappings":""}
@@ -8,9 +8,9 @@ export interface BreadcrumbItem {
8
8
  to?: unknown;
9
9
  }
10
10
  type __VLS_Props = {
11
- /** The path, top level first. The last item is the current page and is not a link. */
11
+ /** The path as `{ label, href?, to? }`, top level first. The last item is the current page and is not a link. */
12
12
  items: BreadcrumbItem[];
13
- /** What renders each link: `"a"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). */
13
+ /** What renders each link: `"a"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). With `RouterLink`, give items a `to` (items can mix `href` and `to`); it receives only the attributes the item has. */
14
14
  linkComponent?: string | Component;
15
15
  };
16
16
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
@@ -1 +1 @@
1
- {"version":3,"file":"EBreadcrumb.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","_createTextVNode","EIcon","_createCommentVNode","EIcon_default","_hoisted_1","_hoisted_2","_hoisted_3","EBreadcrumb_vue_vue_type_script_setup_true_lang_default","t","useMessages","linkAttrs","item","openBlock","createElementBlock","unref","createElementVNode","Fragment","renderList","__props","i","toDisplayString","createBlock","resolveDynamicComponent","mergeProps","withCtx","createTextVNode","createCommentVNode"],"sources":["../../../src/components/Breadcrumb/EBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nexport interface BreadcrumbItem {\n /** The words for this level. */\n label: string;\n /** Where it goes. Omit it on the last item, which is the current page. */\n href?: string;\n /** A router location, passed to `linkComponent` as `to` (for `RouterLink`). */\n to?: unknown;\n}\n\nwithDefaults(\n defineProps<{\n /** The path, top level first. The last item is the current page and is not a link. */\n items: BreadcrumbItem[];\n /** What renders each link: `\"a\"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). */\n linkComponent?: string | Component;\n }>(),\n { linkComponent: \"a\" },\n);\n\nconst t = useMessages();\n\nconst linkAttrs = (item: BreadcrumbItem) => ({\n ...(item.href !== undefined && { href: item.href }),\n ...(item.to !== undefined && { to: item.to }),\n});\n</script>\n\n<template>\n <nav class=\"e-crumbs\" :aria-label=\"t('breadcrumb')\">\n <ol>\n <li v-for=\"(item, i) in items\" :key=\"i\">\n <span v-if=\"i === items.length - 1\" class=\"e-crumb-current\" aria-current=\"page\">{{ item.label }}</span>\n <component\n :is=\"linkComponent\"\n v-else-if=\"item.href !== undefined || item.to !== undefined\"\n class=\"e-crumb\"\n v-bind=\"linkAttrs(item)\"\n >\n {{ item.label }}\n </component>\n <span v-else class=\"e-crumb-current\">{{ item.label }}</span>\n <EIcon v-if=\"i < items.length - 1\" name=\"chevron-right\" small />\n </li>\n </ol>\n </nav>\n</template>\n\n<style>\n@layer e.page {\n .e-crumbs ol {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-1) var(--e-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n font: 400 var(--e-text-sm) / 20px var(--e-font-sans);\n }\n\n .e-crumbs li {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-2);\n color: var(--e-muted);\n }\n\n .e-crumb,\n .e-crumb-current {\n display: inline-flex;\n align-items: center;\n }\n\n .e-crumb {\n position: relative;\n color: var(--e-primary);\n text-decoration: underline;\n text-decoration-color: var(--e-primary);\n text-underline-offset: 3px;\n }\n\n .e-crumb::after {\n content: \"\";\n position: absolute;\n inset: -12px -4px;\n }\n\n .e-crumb:hover {\n color: var(--e-ink);\n text-decoration-color: var(--e-ink);\n }\n\n .e-crumb:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-crumb-current {\n color: var(--e-ink);\n font-weight: 500;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAyBA,IAAMmB,IAAIC,EAAY,GAEhBC,KAAa,OAA0B;GAC3C,GAAIC,EAAK,SAAS,KAAA,KAAa,EAAE,MAAMA,EAAK,KAAK;GACjD,GAAIA,EAAK,OAAO,KAAA,KAAa,EAAE,IAAIA,EAAK,GAAG;EAC7C;E,kBAIEtB,EAAA,GAAAC,EAgBM,OAAA;GAhBD,OAAM;GAAY,cAAYC,EAAAiB,CAAA,CAAC,CAAA,YAAA;E,IAClChB,EAcK,MAAA,MAAA,EAbHH,EAAA,EAAA,GAAAC,EAYKG,GAAA,MAAAC,EAZmBwB,EAAA,QAAZ,GAAM,OAAlB7B,EAAA,GAAAC,EAYK,MAAA,EAZ2B,KAAK6B,EAAC,GAAA,CACxBA,MAAMD,EAAA,MAAM,SAAM,KAA9B7B,EAAA,GAAAC,EAAuG,QAAvGe,GAAuGV,EAApBgB,EAAK,KAAK,GAAA,CAAA,KAGhFA,EAAK,SAAS,KAAA,KAAaA,EAAK,OAAO,KAAA,KAFpDtB,EAAA,GAAAO,EAOYC,EANLqB,EAAA,aAAa,GADpBpB,EAOY;;GAJV,OAAM;EACE,GAAA,EAAA,SAAA,GAAA,GAAAY,EAAUC,CAAI,CAAA,GAAA;GAEtB,SAAAZ,QAAgB,CAAbC,EAAAL,EAAAgB,EAAK,KAAK,GAAA,CAAA,C;;E,aAEftB,EAAA,GAAAC,EAA4D,QAA5DgB,GAA4DX,EAApBgB,EAAK,KAAK,GAAA,CAAA,IACrCQ,IAAID,EAAA,MAAM,SAAM,KAA7B7B,EAAA,GAAAO,EAAgEK,GAAA;;GAA7B,MAAK;GAAgB,OAAA"}
1
+ {"version":3,"file":"EBreadcrumb.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","_createTextVNode","EIcon","_createCommentVNode","EIcon_default","_hoisted_1","_hoisted_2","_hoisted_3","EBreadcrumb_vue_vue_type_script_setup_true_lang_default","t","useMessages","linkAttrs","item","openBlock","createElementBlock","unref","createElementVNode","Fragment","renderList","__props","i","toDisplayString","createBlock","resolveDynamicComponent","mergeProps","withCtx","createTextVNode","createCommentVNode"],"sources":["../../../src/components/Breadcrumb/EBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from \"vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport { useMessages } from \"../../config.js\";\nimport \"../../styles/base.css\";\n\nexport interface BreadcrumbItem {\n /** The words for this level. */\n label: string;\n /** Where it goes. Omit it on the last item, which is the current page. */\n href?: string;\n /** A router location, passed to `linkComponent` as `to` (for `RouterLink`). */\n to?: unknown;\n}\n\nwithDefaults(\n defineProps<{\n /** The path as `{ label, href?, to? }`, top level first. The last item is the current page and is not a link. */\n items: BreadcrumbItem[];\n /** What renders each link: `\"a\"` by default, or `RouterLink` (or any component that takes `href` or `to` and a default slot). With `RouterLink`, give items a `to` (items can mix `href` and `to`); it receives only the attributes the item has. */\n linkComponent?: string | Component;\n }>(),\n { linkComponent: \"a\" },\n);\n\nconst t = useMessages();\n\nconst linkAttrs = (item: BreadcrumbItem) => ({\n ...(item.href !== undefined && { href: item.href }),\n ...(item.to !== undefined && { to: item.to }),\n});\n</script>\n\n<template>\n <nav class=\"e-crumbs\" :aria-label=\"t('breadcrumb')\">\n <ol>\n <li v-for=\"(item, i) in items\" :key=\"i\">\n <span v-if=\"i === items.length - 1\" class=\"e-crumb-current\" aria-current=\"page\">{{ item.label }}</span>\n <component\n :is=\"linkComponent\"\n v-else-if=\"item.href !== undefined || item.to !== undefined\"\n class=\"e-crumb\"\n v-bind=\"linkAttrs(item)\"\n >\n {{ item.label }}\n </component>\n <span v-else class=\"e-crumb-current\">{{ item.label }}</span>\n <EIcon v-if=\"i < items.length - 1\" name=\"chevron-right\" small />\n </li>\n </ol>\n </nav>\n</template>\n\n<style>\n@layer e.page {\n .e-crumbs ol {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--e-space-1) var(--e-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n font: 400 var(--e-text-sm) / 20px var(--e-font-sans);\n }\n\n .e-crumbs li {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-2);\n color: var(--e-muted);\n }\n\n .e-crumb,\n .e-crumb-current {\n display: inline-flex;\n align-items: center;\n }\n\n .e-crumb {\n position: relative;\n color: var(--e-primary);\n text-decoration: underline;\n text-decoration-color: var(--e-primary);\n text-underline-offset: 3px;\n }\n\n .e-crumb::after {\n content: \"\";\n position: absolute;\n inset: calc((var(--e-tap, 44px) - 20px) / -2) calc(-1 * var(--e-space-1));\n }\n\n .e-crumb:hover {\n color: var(--e-ink);\n text-decoration-color: var(--e-ink);\n }\n\n .e-crumb:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n border-radius: var(--e-radius-sm);\n }\n\n .e-crumb-current {\n color: var(--e-ink);\n font-weight: 500;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAyBA,IAAMmB,IAAIC,EAAY,GAEhBC,KAAa,OAA0B;GAC3C,GAAIC,EAAK,SAAS,KAAA,KAAa,EAAE,MAAMA,EAAK,KAAK;GACjD,GAAIA,EAAK,OAAO,KAAA,KAAa,EAAE,IAAIA,EAAK,GAAG;EAC7C;E,kBAIEtB,EAAA,GAAAC,EAgBM,OAAA;GAhBD,OAAM;GAAY,cAAYC,EAAAiB,CAAA,CAAC,CAAA,YAAA;E,IAClChB,EAcK,MAAA,MAAA,EAbHH,EAAA,EAAA,GAAAC,EAYKG,GAAA,MAAAC,EAZmBwB,EAAA,QAAZ,GAAM,OAAlB7B,EAAA,GAAAC,EAYK,MAAA,EAZ2B,KAAK6B,EAAC,GAAA,CACxBA,MAAMD,EAAA,MAAM,SAAM,KAA9B7B,EAAA,GAAAC,EAAuG,QAAvGe,GAAuGV,EAApBgB,EAAK,KAAK,GAAA,CAAA,KAGhFA,EAAK,SAAS,KAAA,KAAaA,EAAK,OAAO,KAAA,KAFpDtB,EAAA,GAAAO,EAOYC,EANLqB,EAAA,aAAa,GADpBpB,EAOY;;GAJV,OAAM;EACE,GAAA,EAAA,SAAA,GAAA,GAAAY,EAAUC,CAAI,CAAA,GAAA;GAEtB,SAAAZ,QAAgB,CAAbC,EAAAL,EAAAgB,EAAK,KAAK,GAAA,CAAA,C;;E,aAEftB,EAAA,GAAAC,EAA4D,QAA5DgB,GAA4DX,EAApBgB,EAAK,KAAK,GAAA,CAAA,IACrCQ,IAAID,EAAA,MAAM,SAAM,KAA7B7B,EAAA,GAAAO,EAAgEK,GAAA;;GAA7B,MAAK;GAAgB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"EButton.js","names":["_sfc_main","EButton_vue_vue_type_script_setup_true_lang_default","EButton_default"],"sources":["../../../src/components/Button/EButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport EIcon from \"../Icon/EIcon.vue\";\nimport type { IconProp } from \"../../icons/types.js\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** `primary` is the one main action on a screen; `secondary` confirms; `outline` is for the other actions beside it; `danger` cancels or removes; `quiet` is an underlined text action. */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"danger\" | \"quiet\";\n /** An icon before the label. */\n icon?: IconProp;\n /** Full width. */\n block?: boolean;\n disabled?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n /** Renders a link that looks like the button, for a destination rather than an action. */\n href?: string;\n /** With `href`: opens in a new tab. */\n external?: boolean;\n }>(),\n { variant: \"primary\", type: \"button\" },\n);\n\ndefineSlots<{\n /** The label: a verb that says what happens, like \"Pay $162.40\". */\n default(): unknown;\n}>();\n\nfunction blockWhenDisabled(event: Event) {\n if (!props.disabled) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n :href=\"href\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :target=\"external ? '_blank' : undefined\"\n :rel=\"external ? 'noreferrer' : undefined\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click.capture=\"blockWhenDisabled\"\n @auxclick.capture=\"blockWhenDisabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </a>\n <button\n v-else\n :type=\"type\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :disabled=\"disabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </button>\n</template>\n\n<style>\n@layer e.primitives {\n .e-btn {\n --e-fill: var(--e-primary);\n --e-on-fill: var(--e-on-primary);\n --e-slab: color-mix(in srgb, var(--e-fill) 58%, #000);\n --e-hover: color-mix(in srgb, var(--e-fill) 88%, #000);\n --e-press: color-mix(in srgb, var(--e-fill) 78%, #000);\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-2);\n height: var(--e-control-height);\n padding: var(--e-depth) var(--e-space-4) 0;\n border: var(--e-stroke-edge) solid var(--e-slab);\n border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));\n border-radius: var(--e-radius-md);\n background: var(--e-fill);\n color: var(--e-on-fill);\n font: 500 var(--e-text-md) / 1 var(--e-font-sans);\n letter-spacing: 0.01em;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n transition:\n box-shadow var(--e-duration-tap) var(--e-easing-out),\n background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-btn:hover {\n background: var(--e-hover);\n }\n\n .e-btn:active {\n background: var(--e-press);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 rgb(0 0 0 / 0.22);\n }\n\n .e-btn--secondary {\n --e-fill: var(--e-secondary);\n --e-on-fill: var(--e-on-secondary);\n }\n\n .e-btn--danger {\n --e-fill: var(--e-danger);\n --e-on-fill: var(--e-on-danger);\n }\n\n .e-btn--outline {\n --e-fill: var(--e-surface);\n --e-on-fill: var(--e-ink);\n --e-slab: var(--e-border-strong);\n }\n\n .e-btn--outline:hover {\n background: color-mix(in srgb, var(--e-surface) 92%, #000);\n border-color: var(--e-ink);\n }\n\n .e-btn--outline:active {\n background: color-mix(in srgb, var(--e-surface) 84%, #000);\n border-color: var(--e-ink);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 rgb(0 0 0 / 0.14);\n }\n\n .e-btn--quiet {\n border-color: transparent;\n border-bottom-width: var(--e-stroke-edge);\n background: transparent;\n color: var(--e-ink);\n box-shadow: none;\n padding-top: 0;\n padding-inline: var(--e-space-3);\n text-decoration: underline;\n text-underline-offset: 5px;\n text-decoration-thickness: var(--e-stroke-edge);\n text-decoration-color: var(--e-border-strong);\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):hover {\n border-color: var(--e-wash-ring);\n background: var(--e-wash-hover);\n text-decoration-color: currentcolor;\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):active {\n border-color: var(--e-ink);\n background: var(--e-wash-press);\n box-shadow: none;\n padding-top: 0;\n }\n\n .e-btn .e-icon {\n margin-inline-start: -2px;\n }\n\n .e-btn--block {\n width: 100%;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n cursor: not-allowed;\n background: transparent;\n color: var(--e-muted);\n border: var(--e-stroke-edge) dashed var(--e-border-strong);\n box-shadow: none;\n padding-top: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-btn {\n transition: none;\n }\n }\n\n @media print {\n .e-btn {\n display: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-btn {\n border: 2px solid ButtonText;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n border-color: GrayText;\n color: GrayText;\n }\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"EButton.js","names":["_sfc_main","EButton_vue_vue_type_script_setup_true_lang_default","EButton_default"],"sources":["../../../src/components/Button/EButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport EIcon from \"../Icon/EIcon.vue\";\nimport type { IconProp } from \"../../icons/types.js\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** `primary` is the one main action on a screen; `secondary` confirms; `outline` is for the other actions beside it; `danger` cancels or removes; `quiet` is an underlined text action. */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"danger\" | \"quiet\";\n /** An icon before the label: a name such as `download`, or a component. */\n icon?: IconProp;\n /** Full width. */\n block?: boolean;\n /** Dashed and unfilled; not focusable, ignores clicks. With `href` the link gets `aria-disabled=\"true\"` and `tabindex=\"-1\"` and does not navigate. */\n disabled?: boolean;\n /** Set `submit` on the one that submits a form. */\n type?: \"button\" | \"submit\" | \"reset\";\n /** Renders a link that looks like the button, for a destination rather than an action (a call to action that goes to a page). Space does not follow it. */\n href?: string;\n /** With `href`: opens in a new tab. */\n external?: boolean;\n }>(),\n { variant: \"primary\", type: \"button\" },\n);\n\ndefineSlots<{\n /** The label: a verb that says what happens, like \"Pay $162.40\". */\n default(): unknown;\n}>();\n\nfunction blockWhenDisabled(event: Event) {\n if (!props.disabled) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n :href=\"href\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :target=\"external ? '_blank' : undefined\"\n :rel=\"external ? 'noreferrer' : undefined\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click.capture=\"blockWhenDisabled\"\n @auxclick.capture=\"blockWhenDisabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </a>\n <button\n v-else\n :type=\"type\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :disabled=\"disabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </button>\n</template>\n\n<style>\n@layer e.primitives {\n .e-btn {\n --e-fill: var(--e-primary);\n --e-on-fill: var(--e-on-primary);\n --e-slab: color-mix(in srgb, var(--e-fill), var(--e-shade-slab));\n --e-hover: color-mix(in srgb, var(--e-fill), var(--e-shade-hover));\n --e-press: color-mix(in srgb, var(--e-fill), var(--e-shade-press));\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-2);\n height: var(--e-control-height);\n padding: var(--e-depth) var(--e-space-4) 0;\n border: var(--e-stroke-edge) solid var(--e-slab);\n\n --e-bc: var(--e-slab);\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));\n border-radius: var(--e-radius-md);\n background: var(--e-fill);\n color: var(--e-on-fill);\n font: 500 var(--e-text-md) / 1 var(--e-font-sans);\n letter-spacing: 0.01em;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n transition:\n box-shadow var(--e-duration-tap) var(--e-easing-out),\n background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-btn:hover {\n background: var(--e-hover);\n }\n\n .e-btn:active {\n background: var(--e-press);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));\n }\n\n .e-btn--secondary {\n --e-fill: var(--e-secondary);\n --e-on-fill: var(--e-on-secondary);\n }\n\n .e-btn--danger {\n --e-fill: var(--e-danger);\n --e-on-fill: var(--e-on-danger);\n }\n\n .e-btn--outline {\n --e-fill: var(--e-surface);\n --e-on-fill: var(--e-ink);\n --e-slab: var(--e-border-strong);\n }\n\n .e-btn--outline:hover {\n background: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n }\n\n .e-btn--outline:active {\n background: color-mix(in srgb, var(--e-surface), var(--e-shade-press));\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));\n }\n\n .e-btn--quiet {\n border-color: transparent;\n\n --e-bc: transparent;\n\n border-bottom-width: var(--e-stroke-edge);\n background: transparent;\n color: var(--e-ink);\n box-shadow: none;\n padding-top: 0;\n padding-inline: var(--e-space-3);\n text-decoration: underline;\n text-underline-offset: 5px;\n text-decoration-thickness: var(--e-stroke-edge);\n text-decoration-color: var(--e-border-strong);\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):hover {\n border-color: var(--e-wash-ring);\n\n --e-bc: var(--e-wash-ring);\n\n background: var(--e-wash-hover);\n text-decoration-color: currentcolor;\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):active {\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n\n background: var(--e-wash-press);\n box-shadow: none;\n padding-top: 0;\n }\n\n .e-btn .e-icon {\n margin-inline-start: calc(-0.5 * var(--e-space-1));\n }\n\n .e-btn--block {\n width: 100%;\n }\n\n /* A toggle: any button with aria-pressed=\"true\" reads as selected. */\n .e-btn[aria-pressed=\"true\"],\n .e-btn[aria-pressed=\"true\"]:hover,\n .e-btn[aria-pressed=\"true\"]:active {\n --e-slab: var(--e-primary);\n --e-bc: var(--e-primary);\n\n border-color: var(--e-primary);\n background: var(--e-surface-hover);\n color: var(--e-primary);\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n cursor: not-allowed;\n background: transparent;\n color: var(--e-muted);\n border: var(--e-stroke-edge) dashed var(--e-border-strong);\n outline: 0;\n box-shadow: none;\n padding-top: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-btn {\n transition: none;\n }\n }\n\n @media print {\n .e-btn {\n display: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-btn {\n border: var(--e-stroke-focus) solid ButtonText;\n }\n\n .e-btn[aria-pressed=\"true\"] {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n border-color: GrayText;\n color: GrayText;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -2,13 +2,15 @@ import { IconProp } from '../../icons/types.js';
2
2
  type __VLS_Props = {
3
3
  /** `primary` is the one main action on a screen; `secondary` confirms; `outline` is for the other actions beside it; `danger` cancels or removes; `quiet` is an underlined text action. */
4
4
  variant?: "primary" | "secondary" | "outline" | "danger" | "quiet";
5
- /** An icon before the label. */
5
+ /** An icon before the label: a name such as `download`, or a component. */
6
6
  icon?: IconProp;
7
7
  /** Full width. */
8
8
  block?: boolean;
9
+ /** Dashed and unfilled; not focusable, ignores clicks. With `href` the link gets `aria-disabled="true"` and `tabindex="-1"` and does not navigate. */
9
10
  disabled?: boolean;
11
+ /** Set `submit` on the one that submits a form. */
10
12
  type?: "button" | "submit" | "reset";
11
- /** Renders a link that looks like the button, for a destination rather than an action. */
13
+ /** Renders a link that looks like the button, for a destination rather than an action (a call to action that goes to a page). Space does not follow it. */
12
14
  href?: string;
13
15
  /** With `href`: opens in a new tab. */
14
16
  external?: boolean;
@@ -18,8 +20,8 @@ type __VLS_Slots = {
18
20
  default(): unknown;
19
21
  };
20
22
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
23
+ type: "button" | "submit" | "reset";
21
24
  variant: "danger" | "primary" | "secondary" | "outline" | "quiet";
22
- type: "button" | "reset" | "submit";
23
25
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
24
26
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
25
27
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- {"version":3,"file":"EButton.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createBlock","EIcon","_createCommentVNode","_renderSlot","EIcon_default","_hoisted_1","_hoisted_2","EButton_vue_vue_type_script_setup_true_lang_default","props","__props","blockWhenDisabled","event","openBlock","createElementBlock","normalizeClass","createBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../src/components/Button/EButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport EIcon from \"../Icon/EIcon.vue\";\nimport type { IconProp } from \"../../icons/types.js\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** `primary` is the one main action on a screen; `secondary` confirms; `outline` is for the other actions beside it; `danger` cancels or removes; `quiet` is an underlined text action. */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"danger\" | \"quiet\";\n /** An icon before the label. */\n icon?: IconProp;\n /** Full width. */\n block?: boolean;\n disabled?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n /** Renders a link that looks like the button, for a destination rather than an action. */\n href?: string;\n /** With `href`: opens in a new tab. */\n external?: boolean;\n }>(),\n { variant: \"primary\", type: \"button\" },\n);\n\ndefineSlots<{\n /** The label: a verb that says what happens, like \"Pay $162.40\". */\n default(): unknown;\n}>();\n\nfunction blockWhenDisabled(event: Event) {\n if (!props.disabled) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n :href=\"href\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :target=\"external ? '_blank' : undefined\"\n :rel=\"external ? 'noreferrer' : undefined\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click.capture=\"blockWhenDisabled\"\n @auxclick.capture=\"blockWhenDisabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </a>\n <button\n v-else\n :type=\"type\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :disabled=\"disabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </button>\n</template>\n\n<style>\n@layer e.primitives {\n .e-btn {\n --e-fill: var(--e-primary);\n --e-on-fill: var(--e-on-primary);\n --e-slab: color-mix(in srgb, var(--e-fill) 58%, #000);\n --e-hover: color-mix(in srgb, var(--e-fill) 88%, #000);\n --e-press: color-mix(in srgb, var(--e-fill) 78%, #000);\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-2);\n height: var(--e-control-height);\n padding: var(--e-depth) var(--e-space-4) 0;\n border: var(--e-stroke-edge) solid var(--e-slab);\n border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));\n border-radius: var(--e-radius-md);\n background: var(--e-fill);\n color: var(--e-on-fill);\n font: 500 var(--e-text-md) / 1 var(--e-font-sans);\n letter-spacing: 0.01em;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n transition:\n box-shadow var(--e-duration-tap) var(--e-easing-out),\n background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-btn:hover {\n background: var(--e-hover);\n }\n\n .e-btn:active {\n background: var(--e-press);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 rgb(0 0 0 / 0.22);\n }\n\n .e-btn--secondary {\n --e-fill: var(--e-secondary);\n --e-on-fill: var(--e-on-secondary);\n }\n\n .e-btn--danger {\n --e-fill: var(--e-danger);\n --e-on-fill: var(--e-on-danger);\n }\n\n .e-btn--outline {\n --e-fill: var(--e-surface);\n --e-on-fill: var(--e-ink);\n --e-slab: var(--e-border-strong);\n }\n\n .e-btn--outline:hover {\n background: color-mix(in srgb, var(--e-surface) 92%, #000);\n border-color: var(--e-ink);\n }\n\n .e-btn--outline:active {\n background: color-mix(in srgb, var(--e-surface) 84%, #000);\n border-color: var(--e-ink);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 rgb(0 0 0 / 0.14);\n }\n\n .e-btn--quiet {\n border-color: transparent;\n border-bottom-width: var(--e-stroke-edge);\n background: transparent;\n color: var(--e-ink);\n box-shadow: none;\n padding-top: 0;\n padding-inline: var(--e-space-3);\n text-decoration: underline;\n text-underline-offset: 5px;\n text-decoration-thickness: var(--e-stroke-edge);\n text-decoration-color: var(--e-border-strong);\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):hover {\n border-color: var(--e-wash-ring);\n background: var(--e-wash-hover);\n text-decoration-color: currentcolor;\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):active {\n border-color: var(--e-ink);\n background: var(--e-wash-press);\n box-shadow: none;\n padding-top: 0;\n }\n\n .e-btn .e-icon {\n margin-inline-start: -2px;\n }\n\n .e-btn--block {\n width: 100%;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n cursor: not-allowed;\n background: transparent;\n color: var(--e-muted);\n border: var(--e-stroke-edge) dashed var(--e-border-strong);\n box-shadow: none;\n padding-top: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-btn {\n transition: none;\n }\n }\n\n @media print {\n .e-btn {\n display: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-btn {\n border: 2px solid ButtonText;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n border-color: GrayText;\n color: GrayText;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAKA,IAAMW,IAAQC;EAuBd,SAASC,EAAkB,GAAc;GACvC,AAAKF,EAAM,aACXG,EAAM,eAAe,GACrBA,EAAM,yBAAyB;EACjC;E,iBAKUF,EAAA,QADRZ,EAAA,GAAAC,EAcI,KAAA;;GAZD,MAAMW,EAAA;GACP,OAAKV,EAAA,CAAC,SAAO,CACJU,EAAA,YAAO,aAAA,UAA4BA,EAAA,WAAWA,EAAA,SAAK,cAAA,CAAA,CAAA;GAC3D,QAAQA,EAAA,WAAQ,WAAc,KAAA;GAC9B,KAAKA,EAAA,WAAQ,eAAkB,KAAA;GAC/B,iBAAeA,EAAA,WAAQ,SAAY,KAAA;GACnC,UAAUA,EAAA,WAAQ,KAAQ,KAAA;GACX,gBAAAC;GACG,mBAAAA;E,IAEND,EAAA,QAAbZ,EAAA,GAAAG,EAAkCC,GAAA;;GAAd,MAAMQ,EAAA;E,oCAC1BN,EAAQe,EAAA,QAAA,SAAA,C,cAEVrB,EAAA,GAAAC,EASS,UAAA;;GAPN,MAAMW,EAAA;GACP,OAAKV,EAAA,CAAC,SAAO,CACJU,EAAA,YAAO,aAAA,UAA4BA,EAAA,WAAWA,EAAA,SAAK,cAAA,CAAA,CAAA;GAC3D,UAAUA,EAAA;E,IAEEA,EAAA,QAAbZ,EAAA,GAAAG,EAAkCC,GAAA;;GAAd,MAAMQ,EAAA;E,oCAC1BN,EAAQe,EAAA,QAAA,SAAA,C"}
1
+ {"version":3,"file":"EButton.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createBlock","EIcon","_createCommentVNode","_renderSlot","EIcon_default","_hoisted_1","_hoisted_2","EButton_vue_vue_type_script_setup_true_lang_default","props","__props","blockWhenDisabled","event","openBlock","createElementBlock","normalizeClass","createBlock","createCommentVNode","renderSlot","_ctx"],"sources":["../../../src/components/Button/EButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport EIcon from \"../Icon/EIcon.vue\";\nimport type { IconProp } from \"../../icons/types.js\";\nimport \"../../styles/base.css\";\n\nconst props = withDefaults(\n defineProps<{\n /** `primary` is the one main action on a screen; `secondary` confirms; `outline` is for the other actions beside it; `danger` cancels or removes; `quiet` is an underlined text action. */\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"danger\" | \"quiet\";\n /** An icon before the label: a name such as `download`, or a component. */\n icon?: IconProp;\n /** Full width. */\n block?: boolean;\n /** Dashed and unfilled; not focusable, ignores clicks. With `href` the link gets `aria-disabled=\"true\"` and `tabindex=\"-1\"` and does not navigate. */\n disabled?: boolean;\n /** Set `submit` on the one that submits a form. */\n type?: \"button\" | \"submit\" | \"reset\";\n /** Renders a link that looks like the button, for a destination rather than an action (a call to action that goes to a page). Space does not follow it. */\n href?: string;\n /** With `href`: opens in a new tab. */\n external?: boolean;\n }>(),\n { variant: \"primary\", type: \"button\" },\n);\n\ndefineSlots<{\n /** The label: a verb that says what happens, like \"Pay $162.40\". */\n default(): unknown;\n}>();\n\nfunction blockWhenDisabled(event: Event) {\n if (!props.disabled) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n :href=\"href\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :target=\"external ? '_blank' : undefined\"\n :rel=\"external ? 'noreferrer' : undefined\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click.capture=\"blockWhenDisabled\"\n @auxclick.capture=\"blockWhenDisabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </a>\n <button\n v-else\n :type=\"type\"\n class=\"e-btn\"\n :class=\"[variant !== 'primary' && `e-btn--${variant}`, block && 'e-btn--block']\"\n :disabled=\"disabled\"\n >\n <EIcon v-if=\"icon\" :name=\"icon\" />\n <slot />\n </button>\n</template>\n\n<style>\n@layer e.primitives {\n .e-btn {\n --e-fill: var(--e-primary);\n --e-on-fill: var(--e-on-primary);\n --e-slab: color-mix(in srgb, var(--e-fill), var(--e-shade-slab));\n --e-hover: color-mix(in srgb, var(--e-fill), var(--e-shade-hover));\n --e-press: color-mix(in srgb, var(--e-fill), var(--e-shade-press));\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-2);\n height: var(--e-control-height);\n padding: var(--e-depth) var(--e-space-4) 0;\n border: var(--e-stroke-edge) solid var(--e-slab);\n\n --e-bc: var(--e-slab);\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));\n border-radius: var(--e-radius-md);\n background: var(--e-fill);\n color: var(--e-on-fill);\n font: 500 var(--e-text-md) / 1 var(--e-font-sans);\n letter-spacing: 0.01em;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n transition:\n box-shadow var(--e-duration-tap) var(--e-easing-out),\n background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-btn:hover {\n background: var(--e-hover);\n }\n\n .e-btn:active {\n background: var(--e-press);\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));\n }\n\n .e-btn--secondary {\n --e-fill: var(--e-secondary);\n --e-on-fill: var(--e-on-secondary);\n }\n\n .e-btn--danger {\n --e-fill: var(--e-danger);\n --e-on-fill: var(--e-on-danger);\n }\n\n .e-btn--outline {\n --e-fill: var(--e-surface);\n --e-on-fill: var(--e-ink);\n --e-slab: var(--e-border-strong);\n }\n\n .e-btn--outline:hover {\n background: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n }\n\n .e-btn--outline:active {\n background: color-mix(in srgb, var(--e-surface), var(--e-shade-press));\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n\n border-bottom-width: var(--e-stroke-edge);\n box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));\n }\n\n .e-btn--quiet {\n border-color: transparent;\n\n --e-bc: transparent;\n\n border-bottom-width: var(--e-stroke-edge);\n background: transparent;\n color: var(--e-ink);\n box-shadow: none;\n padding-top: 0;\n padding-inline: var(--e-space-3);\n text-decoration: underline;\n text-underline-offset: 5px;\n text-decoration-thickness: var(--e-stroke-edge);\n text-decoration-color: var(--e-border-strong);\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):hover {\n border-color: var(--e-wash-ring);\n\n --e-bc: var(--e-wash-ring);\n\n background: var(--e-wash-hover);\n text-decoration-color: currentcolor;\n }\n\n .e-btn--quiet:not([disabled], [aria-disabled=\"true\"]):active {\n border-color: var(--e-ink);\n\n --e-bc: var(--e-ink);\n\n background: var(--e-wash-press);\n box-shadow: none;\n padding-top: 0;\n }\n\n .e-btn .e-icon {\n margin-inline-start: calc(-0.5 * var(--e-space-1));\n }\n\n .e-btn--block {\n width: 100%;\n }\n\n /* A toggle: any button with aria-pressed=\"true\" reads as selected. */\n .e-btn[aria-pressed=\"true\"],\n .e-btn[aria-pressed=\"true\"]:hover,\n .e-btn[aria-pressed=\"true\"]:active {\n --e-slab: var(--e-primary);\n --e-bc: var(--e-primary);\n\n border-color: var(--e-primary);\n background: var(--e-surface-hover);\n color: var(--e-primary);\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n cursor: not-allowed;\n background: transparent;\n color: var(--e-muted);\n border: var(--e-stroke-edge) dashed var(--e-border-strong);\n outline: 0;\n box-shadow: none;\n padding-top: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-btn {\n transition: none;\n }\n }\n\n @media print {\n .e-btn {\n display: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-btn {\n border: var(--e-stroke-focus) solid ButtonText;\n }\n\n .e-btn[aria-pressed=\"true\"] {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .e-btn[disabled],\n .e-btn[aria-disabled=\"true\"] {\n border-color: GrayText;\n color: GrayText;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAKA,IAAMW,IAAQC;EAyBd,SAASC,EAAkB,GAAc;GACvC,AAAKF,EAAM,aACXG,EAAM,eAAe,GACrBA,EAAM,yBAAyB;EACjC;E,iBAKUF,EAAA,QADRZ,EAAA,GAAAC,EAcI,KAAA;;GAZD,MAAMW,EAAA;GACP,OAAKV,EAAA,CAAC,SAAO,CACJU,EAAA,YAAO,aAAA,UAA4BA,EAAA,WAAWA,EAAA,SAAK,cAAA,CAAA,CAAA;GAC3D,QAAQA,EAAA,WAAQ,WAAc,KAAA;GAC9B,KAAKA,EAAA,WAAQ,eAAkB,KAAA;GAC/B,iBAAeA,EAAA,WAAQ,SAAY,KAAA;GACnC,UAAUA,EAAA,WAAQ,KAAQ,KAAA;GACX,gBAAAC;GACG,mBAAAA;E,IAEND,EAAA,QAAbZ,EAAA,GAAAG,EAAkCC,GAAA;;GAAd,MAAMQ,EAAA;E,oCAC1BN,EAAQe,EAAA,QAAA,SAAA,C,cAEVrB,EAAA,GAAAC,EASS,UAAA;;GAPN,MAAMW,EAAA;GACP,OAAKV,EAAA,CAAC,SAAO,CACJU,EAAA,YAAO,aAAA,UAA4BA,EAAA,WAAWA,EAAA,SAAK,cAAA,CAAA,CAAA;GAC3D,UAAUA,EAAA;E,IAEEA,EAAA,QAAbZ,EAAA,GAAAG,EAAkCC,GAAA;;GAAd,MAAMQ,EAAA;E,oCAC1BN,EAAQe,EAAA,QAAA,SAAA,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ECalendar.js","names":["_sfc_main","ECalendar_vue_vue_type_script_setup_true_lang_default","ECalendar_default"],"sources":["../../../src/components/Calendar/ECalendar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, ref, watch } from \"vue\";\nimport EActions from \"../Actions/EActions.vue\";\nimport EButton from \"../Button/EButton.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EIconButton from \"../IconButton/EIconButton.vue\";\nimport { useConfig, useMessages } from \"../../config.js\";\nimport { useLocale } from \"../../composables/useLocale.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport { addDays, addMonths, compareDays, dayKey, sameDay, startOfDay } from \"./dates.js\";\nimport \"../../styles/base.css\";\n\nexport interface CalendarRange {\n start: Date | null;\n end: Date | null;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** `single` chooses one day (`v-model`); `range` chooses a span (`v-model:start` and `v-model:end`). */\n mode?: \"single\" | \"range\";\n /** Days that cannot be chosen or focused, such as days with nothing to book. */\n disabledDate?: (date: Date) => boolean;\n /** Days that get a dot: a list of dates or a function. Screen readers hear `markLabel`. */\n marked?: Date[] | ((date: Date) => boolean);\n /** What screen readers hear on a marked day. Default \"times available\". */\n markLabel?: string;\n /** The earliest day that can be chosen. */\n min?: Date;\n /** The latest day that can be chosen. */\n max?: Date;\n /** The month to open on, when nothing is chosen. */\n month?: Date;\n /** `false` hides the Today and Clear buttons. */\n footer?: boolean;\n /** Forces the Clear button on or off. Left out, it shows when a `@clear` listener is attached. */\n clearable?: boolean;\n }>(),\n { mode: \"single\", footer: true, clearable: undefined },\n);\n\nconst emit = defineEmits<{\n /** In range mode, after every click that changes the span. */\n rangeChange: [range: CalendarRange];\n /** The Clear button. It is only shown when a `@clear` listener is attached. */\n clear: [];\n}>();\n\nconst value = defineModel<Date | null>({ default: null });\nconst start = defineModel<Date | null>(\"start\", { default: null });\nconst end = defineModel<Date | null>(\"end\", { default: null });\n\ntype View = \"days\" | \"months\" | \"years\";\n\nconst t = useMessages();\nconst config = useConfig();\nconst loc = useLocale();\nconst uid = useUid();\nconst root = ref<HTMLElement | null>(null);\nconst range = computed(() => props.mode === \"range\");\nconst instance = getCurrentInstance();\nconst hasClear = () => props.clearable ?? !!instance?.vnode.props?.onClear;\n\nconst today = startOfDay(new Date());\nconst focus = ref(startOfDay((range.value ? start.value : value.value) || props.month || new Date()));\nconst hover = ref<Date | null>(null);\nconst view = ref<View>(\"days\");\nconst pick = ref(0);\n\nconst cy = computed(() => focus.value.getFullYear());\nconst cm = computed(() => focus.value.getMonth());\nconst yearLow = computed(() => Math.min(cy.value, props.min ? props.min.getFullYear() : today.getFullYear() - 120));\nconst yearHigh = computed(() => Math.max(cy.value, props.max ? props.max.getFullYear() : today.getFullYear() + 20));\nconst years = computed(() => Array.from({ length: yearHigh.value - yearLow.value + 1 }, (_, i) => yearLow.value + i));\n\nfunction off(d: Date): boolean {\n return (\n (!!props.min && compareDays(d, props.min) < 0) ||\n (!!props.max && compareDays(d, props.max) > 0) ||\n !!props.disabledDate?.(d)\n );\n}\nfunction isMarked(d: Date): boolean {\n const m = props.marked;\n if (!m) return false;\n return typeof m === \"function\" ? !!m(d) : m.some((x) => sameDay(x, d));\n}\nfunction monthOff(y: number, m: number): boolean {\n return (\n (!!props.min && compareDays(new Date(y, m + 1, 0, 12), props.min) < 0) ||\n (!!props.max && compareDays(new Date(y, m, 1, 12), props.max) > 0)\n );\n}\nconst yearOff = (y: number) =>\n (!!props.min && y < props.min.getFullYear()) || (!!props.max && y > props.max.getFullYear());\nfunction clamp(d: Date): Date {\n if (props.min && compareDays(d, props.min) < 0) return startOfDay(props.min);\n if (props.max && compareDays(d, props.max) > 0) return startOfDay(props.max);\n return d;\n}\nfunction settle(d: Date, step: number): Date | null {\n let n = d;\n for (let i = 0; i < 400 && off(n); i++) n = addDays(n, step);\n return off(n) ? null : n;\n}\nfunction withMonthYear(y: number, m: number): Date {\n const last = new Date(y, m + 1, 0, 12).getDate();\n return clamp(new Date(y, m, Math.min(focus.value.getDate(), last), 12));\n}\n\nif (off(focus.value)) focus.value = settle(focus.value, 1) ?? settle(focus.value, -1) ?? focus.value;\n\nlet want: string | null = null;\nasync function focusWanted() {\n await nextTick();\n if (!want) return;\n const el = root.value?.querySelector<HTMLElement>(`[id=\"${want}\"]`);\n if (!el) return;\n el.focus();\n if (want.includes(\"-y-\")) el.scrollIntoView?.({ block: \"center\" });\n want = null;\n}\nfunction focusId(id: string) {\n want = id;\n void focusWanted();\n}\nconst dayId = (d: Date) => `${uid.value}-${dayKey(d)}`;\n\nwatch(\n () => props.month?.getTime(),\n () => {\n if (props.month) focus.value = clamp(startOfDay(props.month));\n },\n);\nwatch(\n () => (range.value ? start.value : value.value)?.getTime(),\n () => {\n const chosen = range.value ? start.value : value.value;\n if (chosen && !sameDay(chosen, focus.value)) focus.value = startOfDay(chosen);\n },\n);\n\nconst weeks = computed(() => {\n const first = new Date(cy.value, cm.value, 1, 12);\n const from = addDays(first, -((first.getDay() - loc.weekStart.value + 7) % 7));\n return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, i) => addDays(from, w * 7 + i)));\n});\nconst columns = computed(() => Array.from({ length: 7 }, (_, k) => (loc.weekStart.value + k) % 7));\nconst rangeEnd = computed(() => {\n if (!range.value) return null;\n return end.value || (start.value && hover.value && compareDays(hover.value, start.value) >= 0 ? hover.value : null);\n});\n\nfunction isSelected(d: Date): boolean {\n return range.value ? sameDay(d, start.value) || sameDay(d, end.value) : sameDay(d, value.value);\n}\nfunction inRange(d: Date): boolean {\n return !!(\n range.value &&\n start.value &&\n rangeEnd.value &&\n compareDays(d, start.value) > 0 &&\n compareDays(d, rangeEnd.value) < 0\n );\n}\nfunction dayLabel(d: Date, marked: boolean): string {\n return (\n loc.formatLong(d) +\n (sameDay(d, today) ? \", \" + t(\"todaySuffix\") : \"\") +\n (marked ? \", \" + (props.markLabel || t(\"timesAvailable\")) : \"\")\n );\n}\n\nfunction pickDay(d: Date) {\n if (off(d)) return;\n if (!range.value) {\n value.value = d;\n return;\n }\n const s = start.value;\n if (!s || end.value || compareDays(d, s) < 0) {\n start.value = d;\n end.value = null;\n emit(\"rangeChange\", { start: d, end: null });\n } else {\n end.value = d;\n emit(\"rangeChange\", { start: s, end: d });\n }\n}\nfunction clickDay(d: Date) {\n focus.value = d;\n focusId(dayId(d));\n pickDay(d);\n}\n\nfunction openView(v: \"months\" | \"years\") {\n view.value = v;\n if (v === \"months\") {\n pick.value = cm.value;\n focusId(`${uid.value}-m-${cm.value}`);\n } else {\n pick.value = cy.value;\n focusId(`${uid.value}-y-${cy.value}`);\n }\n}\nfunction backToDays() {\n view.value = \"days\";\n focusId(dayId(focus.value));\n}\nfunction back() {\n if (view.value === \"months\") openView(\"years\");\n else backToDays();\n}\nfunction chooseMonth(m: number) {\n if (monthOff(cy.value, m)) return;\n const nd = withMonthYear(cy.value, m);\n focus.value = nd;\n view.value = \"days\";\n focusId(dayId(nd));\n}\nfunction chooseYear(y: number) {\n if (yearOff(y)) return;\n const nd = withMonthYear(y, cm.value);\n focus.value = nd;\n view.value = \"months\";\n pick.value = nd.getMonth();\n focusId(`${uid.value}-m-${nd.getMonth()}`);\n}\nfunction step(n: number) {\n focus.value = clamp(addMonths(focus.value, n));\n}\n\nfunction sign(): number {\n if (config.dir) return config.dir === \"rtl\" ? -1 : 1;\n return root.value && getComputedStyle(root.value).direction === \"rtl\" ? -1 : 1;\n}\n\nfunction onDayKey(e: KeyboardEvent) {\n const f = focus.value;\n const dow = (f.getDay() - loc.weekStart.value + 7) % 7;\n const s = sign();\n let next: Date;\n let walk: number;\n switch (e.key) {\n case \"ArrowLeft\":\n walk = -s;\n next = addDays(f, walk);\n break;\n case \"ArrowRight\":\n walk = s;\n next = addDays(f, walk);\n break;\n case \"ArrowUp\":\n walk = -7;\n next = addDays(f, walk);\n break;\n case \"ArrowDown\":\n walk = 7;\n next = addDays(f, walk);\n break;\n case \"Home\":\n walk = 1;\n next = addDays(f, -dow);\n break;\n case \"End\":\n walk = -1;\n next = addDays(f, 6 - dow);\n break;\n case \"PageUp\":\n walk = -1;\n next = addMonths(f, e.shiftKey ? -12 : -1);\n break;\n case \"PageDown\":\n walk = 1;\n next = addMonths(f, e.shiftKey ? 12 : 1);\n break;\n default:\n return;\n }\n e.preventDefault();\n const target = settle(next, walk);\n if (!target) return;\n focus.value = target;\n focusId(dayId(target));\n if (range.value && start.value && !end.value) hover.value = target;\n}\n\nfunction onPickKey(e: KeyboardEvent) {\n const months = view.value === \"months\";\n const lo = months ? 0 : yearLow.value;\n const hi = months ? 11 : yearHigh.value;\n const s = sign();\n let next: number | null = null;\n switch (e.key) {\n case \"ArrowLeft\":\n next = pick.value - s;\n break;\n case \"ArrowRight\":\n next = pick.value + s;\n break;\n case \"ArrowUp\":\n next = pick.value - 3;\n break;\n case \"ArrowDown\":\n next = pick.value + 3;\n break;\n case \"Home\":\n next = lo;\n break;\n case \"End\":\n next = hi;\n break;\n case \"PageUp\":\n if (!months) next = pick.value - 12;\n break;\n case \"PageDown\":\n if (!months) next = pick.value + 12;\n break;\n }\n if (next === null) return;\n e.preventDefault();\n next = Math.max(lo, Math.min(hi, next));\n pick.value = next;\n focusId(`${uid.value}-${months ? \"m\" : \"y\"}-${next}`);\n}\n\nfunction onRootKey(e: KeyboardEvent) {\n if (e.key !== \"Escape\" || view.value === \"days\") return;\n e.preventDefault();\n e.stopPropagation();\n backToDays();\n}\n\nfunction goToday() {\n const tc = clamp(today);\n focus.value = tc;\n focusId(dayId(tc));\n if (!range.value && !off(today)) pickDay(today);\n}\n\nconst shortDate = (d: Date) => `${loc.monthsShort.value[d.getMonth()]} ${d.getDate()}`;\nconst help = computed(() => {\n if (!range.value || view.value !== \"days\") return \"\";\n if (!start.value) return t(\"rangeStart\");\n if (!end.value) return t(\"rangeEnd\", { start: shortDate(start.value) });\n return t(\"rangeDone\", {\n start: shortDate(start.value),\n end: shortDate(end.value),\n days: Math.round(compareDays(end.value, start.value) / 864e5) + 1,\n });\n});\n\nconst picking = computed(() => view.value !== \"days\");\nconst prevOff = computed(() => !!props.min && compareDays(new Date(cy.value, cm.value, 0, 12), props.min) < 0);\nconst nextOff = computed(() => !!props.max && compareDays(new Date(cy.value, cm.value + 1, 1, 12), props.max) > 0);\nconst nowYear = today.getFullYear();\nconst nowMonth = today.getMonth();\n\ndefineExpose({\n view,\n focusDay: () => focusId(dayId(focus.value)),\n});\n</script>\n\n<template>\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div ref=\"root\" class=\"e-cal\" :dir=\"config.dir ?? undefined\" @keydown=\"onRootKey\">\n <div class=\"e-cal-head\">\n <EIconButton\n v-if=\"picking\"\n icon=\"chevron-left\"\n :label=\"t(view === 'months' ? 'backToYears' : 'backToDays')\"\n @click=\"back\"\n />\n <EIconButton v-else icon=\"chevron-left\" :label=\"t('prevMonth')\" :disabled=\"prevOff\" @click=\"step(-1)\" />\n <div class=\"e-cal-title\" aria-live=\"polite\">\n <span v-if=\"picking\" class=\"e-cal-range\">{{\n t(view === \"months\" ? \"chooseAMonth\" : \"chooseAYear\", { year: cy })\n }}</span>\n <button\n v-else\n type=\"button\"\n class=\"e-cal-pick\"\n aria-expanded=\"false\"\n :aria-label=\"t('chooseDateNow', { month: loc.months.value[cm] ?? '', year: cy })\"\n @click=\"openView('years')\"\n >\n {{ loc.months.value[cm] }} {{ cy }}\n <EIcon name=\"chevron-down\" small />\n </button>\n </div>\n <span v-if=\"picking\" class=\"e-cal-gap\" />\n <EIconButton v-else icon=\"chevron-right\" :label=\"t('nextMonth')\" :disabled=\"nextOff\" @click=\"step(1)\" />\n </div>\n\n <!-- eslint-disable-next-line vuejs-accessibility/interactive-supports-focus -- the day buttons carry the roving tabindex -->\n <table\n v-if=\"view === 'days'\"\n class=\"e-cal-grid\"\n role=\"grid\"\n :aria-label=\"`${loc.months.value[cm]} ${cy}`\"\n @keydown=\"onDayKey\"\n >\n <thead>\n <tr>\n <th v-for=\"ix in columns\" :key=\"ix\" scope=\"col\" :abbr=\"loc.weekdays.value[ix]\">\n {{ loc.weekdaysShort.value[ix] }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, w) in weeks\" :key=\"w\">\n <td\n v-for=\"d in row\"\n :key=\"dayKey(d)\"\n role=\"gridcell\"\n :aria-selected=\"isSelected(d) || inRange(d) ? 'true' : 'false'\"\n :class=\"inRange(d) && 'e-cal-in'\"\n >\n <button\n :id=\"dayId(d)\"\n type=\"button\"\n class=\"e-day\"\n :class=\"[\n d.getMonth() !== cm && 'e-day--out',\n sameDay(d, today) && 'e-day--today',\n isSelected(d) && 'e-day--sel',\n !off(d) && isMarked(d) && 'e-day--mark',\n ]\"\n :tabindex=\"sameDay(d, focus) ? 0 : -1\"\n :disabled=\"off(d)\"\n :aria-label=\"dayLabel(d, !off(d) && isMarked(d))\"\n @click=\"clickDay(d)\"\n @mouseenter=\"range && start && !end && (hover = d)\"\n @focus=\"range && start && !end && (hover = d)\"\n >\n {{ d.getDate() }}\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div\n v-else-if=\"view === 'months'\"\n class=\"e-cal-cells\"\n role=\"group\"\n :aria-label=\"t('monthsOf', { year: cy })\"\n @keydown=\"onPickKey\"\n >\n <button\n v-for=\"(name, m) in loc.months.value\"\n :id=\"`${uid}-m-${m}`\"\n :key=\"m\"\n type=\"button\"\n class=\"e-cal-cell\"\n :class=\"[m === cm && 'e-day--sel', cy === nowYear && m === nowMonth && 'e-day--today']\"\n :tabindex=\"m === pick ? 0 : -1\"\n :disabled=\"monthOff(cy, m)\"\n :aria-pressed=\"m === cm ? 'true' : 'false'\"\n :aria-current=\"cy === nowYear && m === nowMonth ? 'date' : undefined\"\n @click=\"chooseMonth(m)\"\n >\n <span aria-hidden=\"true\">{{ loc.monthsShort.value[m] }}</span>\n <span class=\"e-sr\">{{ name }} {{ cy }}</span>\n </button>\n </div>\n\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div\n v-else\n class=\"e-cal-cells e-cal-years\"\n role=\"group\"\n :aria-label=\"t('yearsRange', { from: yearLow, to: yearHigh })\"\n @keydown=\"onPickKey\"\n >\n <button\n v-for=\"y in years\"\n :id=\"`${uid}-y-${y}`\"\n :key=\"y\"\n type=\"button\"\n class=\"e-cal-cell\"\n :class=\"[y === cy && 'e-day--sel', y === nowYear && 'e-day--today']\"\n :tabindex=\"y === pick ? 0 : -1\"\n :disabled=\"yearOff(y)\"\n :aria-pressed=\"y === cy ? 'true' : 'false'\"\n :aria-current=\"y === nowYear ? 'date' : undefined\"\n @click=\"chooseYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n\n <p v-if=\"range\" class=\"e-cal-help\" aria-live=\"polite\">{{ help }}</p>\n\n <EActions v-if=\"footer\" class=\"e-cal-foot\" :class=\"view !== 'days' && 'e-cal-foot--idle'\" :inert=\"view !== 'days'\">\n <EButton variant=\"quiet\" @click=\"goToday\">{{ t(\"today\") }}</EButton>\n <EButton v-if=\"hasClear()\" variant=\"quiet\" @click=\"emit('clear')\">{{ t(\"clear\") }}</EButton>\n </EActions>\n </div>\n</template>\n\n<style>\n@layer e.composites {\n .e-cal {\n width: 20.5rem;\n max-width: 100%;\n font-family: var(--e-font-sans);\n }\n\n .e-cal-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-2);\n margin-bottom: var(--e-space-2);\n padding-bottom: var(--e-space-2);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-cal-title {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-1);\n flex: 1;\n min-width: 0;\n margin: 0;\n font: 600 var(--e-text-lg) / 1.2 var(--e-font-sans);\n text-align: center;\n }\n\n .e-cal-pick {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: var(--e-control-height);\n padding: 0 var(--e-space-2);\n border: var(--e-stroke-edge) solid transparent;\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 600 var(--e-text-lg) / 1 var(--e-font-sans);\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-pick:hover {\n background: var(--e-surface-tint);\n border-color: var(--e-border-strong);\n }\n\n .e-cal-pick:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: 1px;\n }\n\n .e-cal-pick .e-icon {\n transition: transform var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-pick[aria-expanded=\"true\"] .e-icon {\n transform: rotate(180deg);\n }\n\n .e-cal-range {\n font: 600 var(--e-text-lg) / 1.2 var(--e-font-sans);\n font-variant-numeric: tabular-nums;\n }\n\n .e-cal-gap {\n display: block;\n width: 44px;\n height: 44px;\n }\n\n .e-cal-head .e-icon-btn:disabled {\n color: var(--e-muted);\n cursor: not-allowed;\n }\n\n .e-cal-head .e-icon-btn:disabled:hover {\n background: transparent;\n box-shadow: none;\n }\n\n .e-cal-grid {\n width: 100%;\n height: 312px;\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n .e-cal-grid th {\n height: 32px;\n font: 600 var(--e-text-sm) / 1 var(--e-font-sans);\n color: var(--e-muted);\n text-align: center;\n }\n\n .e-cal-grid td {\n padding: 1px 3px;\n text-align: center;\n }\n\n .e-cal-in {\n background: var(--e-surface-tint);\n }\n\n .e-day {\n position: relative;\n width: 100%;\n height: 44px;\n padding: 0;\n border: var(--e-stroke-edge) solid transparent;\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 500 var(--e-text-sm) / 1 var(--e-font-mono);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */\n .e-day:hover:not(:disabled):not(.e-day--sel) {\n background: var(--e-surface-tint);\n border-color: var(--e-border-strong);\n }\n\n .e-day:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n .e-day--out {\n color: var(--e-muted);\n font-weight: 400;\n }\n\n .e-day--today {\n box-shadow: inset 0 0 0 1.5px var(--e-ink);\n }\n\n .e-day--sel {\n background: var(--e-primary);\n border-color: var(--e-primary);\n font-weight: 700;\n color: var(--e-on-primary);\n }\n\n .e-day:disabled {\n color: var(--e-border-strong);\n font-weight: 400;\n cursor: not-allowed;\n opacity: 1;\n }\n\n .e-day--mark::after {\n content: \"\";\n position: absolute;\n inset-inline-start: 50%;\n bottom: 5px;\n width: 5px;\n height: 5px;\n margin-inline-start: -2.5px;\n border-radius: 50%;\n background: var(--e-primary);\n }\n\n .e-day--sel.e-day--mark::after {\n background: var(--e-on-primary);\n }\n\n .e-cal-cells {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n gap: 6px;\n height: 312px;\n padding-top: 4px;\n }\n\n .e-cal-years {\n overflow-y: auto;\n grid-auto-rows: 44px;\n padding-inline-end: 2px;\n align-content: start;\n }\n\n .e-cal-cell {\n width: 100%;\n height: 100%;\n min-height: 44px;\n padding: 0;\n border: var(--e-stroke-edge) solid transparent;\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 500 var(--e-text-md) / 1 var(--e-font-mono);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-years .e-cal-cell {\n height: 44px;\n }\n\n /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */\n .e-cal-cell:hover:not(:disabled):not(.e-day--sel) {\n background: var(--e-surface-tint);\n border-color: var(--e-border-strong);\n }\n\n .e-cal-cell:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n .e-cal-cell:disabled {\n color: var(--e-border-strong);\n font-weight: 400;\n cursor: not-allowed;\n }\n\n .e-cal-cell.e-day--sel {\n background: var(--e-primary);\n border-color: var(--e-primary);\n font-weight: 700;\n color: var(--e-on-primary);\n }\n\n .e-cal-help {\n min-height: calc(var(--e-text-sm) * 1.4);\n margin: var(--e-space-2) 0 0;\n font: 500 var(--e-text-sm) / 1.4 var(--e-font-sans);\n color: var(--e-muted);\n text-align: center;\n }\n\n .e-cal-foot {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--e-space-2);\n margin-top: var(--e-space-2);\n padding-top: var(--e-space-2);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-cal-foot--idle {\n visibility: hidden;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-day,\n .e-cal-pick,\n .e-cal-cell,\n .e-cal-pick .e-icon {\n transition: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-day--sel,\n .e-cal-cell.e-day--sel {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .e-day--mark::after {\n background: CanvasText;\n }\n\n .e-day--sel.e-day--mark::after {\n background: HighlightText;\n }\n }\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ECalendar.js","names":["_sfc_main","ECalendar_vue_vue_type_script_setup_true_lang_default","ECalendar_default"],"sources":["../../../src/components/Calendar/ECalendar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, nextTick, ref, watch } from \"vue\";\nimport EActions from \"../Actions/EActions.vue\";\nimport EButton from \"../Button/EButton.vue\";\nimport EIcon from \"../Icon/EIcon.vue\";\nimport EIconButton from \"../IconButton/EIconButton.vue\";\nimport { useConfig, useMessages } from \"../../config.js\";\nimport { useLocale } from \"../../composables/useLocale.js\";\nimport { useUid } from \"../../composables/useUid.js\";\nimport { addDays, addMonths, compareDays, dayKey, sameDay, startOfDay } from \"./dates.js\";\nimport \"../../styles/base.css\";\n\nexport interface CalendarRange {\n start: Date | null;\n end: Date | null;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** `single` chooses one day (`v-model`); `range` chooses a span (`v-model:start` and `v-model:end`): the first click sets the start, the second the end, and a click before the start restarts. */\n mode?: \"single\" | \"range\";\n /** Days that cannot be chosen or focused, such as days with nothing to book. Arrow keys skip them. */\n disabledDate?: (date: Date) => boolean;\n /** Days that get a dot: a list of dates or a function. Screen readers hear `markLabel`. */\n marked?: Date[] | ((date: Date) => boolean);\n /** What screen readers hear on a marked day. @default times available */\n markLabel?: string;\n /** The earliest day that can be chosen. Earlier days cannot be focused or chosen; navigation stops there. */\n min?: Date;\n /** The latest day that can be chosen. Later days cannot be focused or chosen; navigation stops there. */\n max?: Date;\n /** The month to open on, when nothing is chosen. Changing it moves the view. */\n month?: Date;\n /** `false` hides the Today and Clear buttons. */\n footer?: boolean;\n /** Forces the Clear button on or off. Left out, it shows when a `@clear` listener is attached. */\n clearable?: boolean;\n }>(),\n { mode: \"single\", footer: true, clearable: undefined },\n);\n\nconst emit = defineEmits<{\n /** In range mode, after every click that changes the span. */\n rangeChange: [range: CalendarRange];\n /** The Clear button. It is only shown when a `@clear` listener is attached. */\n clear: [];\n}>();\n\n/** The chosen day (`single` mode). */\nconst value = defineModel<Date | null>({ default: null });\n/** The first day of the span (`range` mode). */\nconst start = defineModel<Date | null>(\"start\", { default: null });\n/** The last day of the span (`range` mode). */\nconst end = defineModel<Date | null>(\"end\", { default: null });\n\ntype View = \"days\" | \"months\" | \"years\";\n\nconst t = useMessages();\nconst config = useConfig();\nconst loc = useLocale();\nconst uid = useUid();\nconst root = ref<HTMLElement | null>(null);\nconst range = computed(() => props.mode === \"range\");\nconst instance = getCurrentInstance();\nconst hasClear = () => props.clearable ?? !!instance?.vnode.props?.onClear;\n\nconst today = startOfDay(new Date());\nconst focus = ref(startOfDay((range.value ? start.value : value.value) || props.month || new Date()));\nconst hover = ref<Date | null>(null);\nconst view = ref<View>(\"days\");\nconst pick = ref(0);\n\nconst cy = computed(() => focus.value.getFullYear());\nconst cm = computed(() => focus.value.getMonth());\nconst yearLow = computed(() => Math.min(cy.value, props.min ? props.min.getFullYear() : today.getFullYear() - 120));\nconst yearHigh = computed(() => Math.max(cy.value, props.max ? props.max.getFullYear() : today.getFullYear() + 20));\nconst years = computed(() => Array.from({ length: yearHigh.value - yearLow.value + 1 }, (_, i) => yearLow.value + i));\n\nfunction off(d: Date): boolean {\n return (\n (!!props.min && compareDays(d, props.min) < 0) ||\n (!!props.max && compareDays(d, props.max) > 0) ||\n !!props.disabledDate?.(d)\n );\n}\nfunction isMarked(d: Date): boolean {\n const m = props.marked;\n if (!m) return false;\n return typeof m === \"function\" ? !!m(d) : m.some((x) => sameDay(x, d));\n}\nfunction monthOff(y: number, m: number): boolean {\n return (\n (!!props.min && compareDays(new Date(y, m + 1, 0, 12), props.min) < 0) ||\n (!!props.max && compareDays(new Date(y, m, 1, 12), props.max) > 0)\n );\n}\nconst yearOff = (y: number) =>\n (!!props.min && y < props.min.getFullYear()) || (!!props.max && y > props.max.getFullYear());\nfunction clamp(d: Date): Date {\n if (props.min && compareDays(d, props.min) < 0) return startOfDay(props.min);\n if (props.max && compareDays(d, props.max) > 0) return startOfDay(props.max);\n return d;\n}\nfunction settle(d: Date, step: number): Date | null {\n let n = d;\n for (let i = 0; i < 400 && off(n); i++) n = addDays(n, step);\n return off(n) ? null : n;\n}\nfunction withMonthYear(y: number, m: number): Date {\n const last = new Date(y, m + 1, 0, 12).getDate();\n return clamp(new Date(y, m, Math.min(focus.value.getDate(), last), 12));\n}\n\nif (off(focus.value)) focus.value = settle(focus.value, 1) ?? settle(focus.value, -1) ?? focus.value;\n\nlet want: string | null = null;\nasync function focusWanted() {\n await nextTick();\n if (!want) return;\n const el = root.value?.querySelector<HTMLElement>(`[id=\"${want}\"]`);\n if (!el) return;\n el.focus();\n if (want.includes(\"-y-\")) el.scrollIntoView?.({ block: \"center\" });\n want = null;\n}\nfunction focusId(id: string) {\n want = id;\n void focusWanted();\n}\nconst dayId = (d: Date) => `${uid.value}-${dayKey(d)}`;\n\nwatch(\n () => props.month?.getTime(),\n () => {\n if (props.month) focus.value = clamp(startOfDay(props.month));\n },\n);\nwatch(\n () => (range.value ? start.value : value.value)?.getTime(),\n () => {\n const chosen = range.value ? start.value : value.value;\n if (chosen && !sameDay(chosen, focus.value)) focus.value = startOfDay(chosen);\n },\n);\n\nconst weeks = computed(() => {\n const first = new Date(cy.value, cm.value, 1, 12);\n const from = addDays(first, -((first.getDay() - loc.weekStart.value + 7) % 7));\n return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, i) => addDays(from, w * 7 + i)));\n});\nconst columns = computed(() => Array.from({ length: 7 }, (_, k) => (loc.weekStart.value + k) % 7));\nconst rangeEnd = computed(() => {\n if (!range.value) return null;\n return end.value || (start.value && hover.value && compareDays(hover.value, start.value) >= 0 ? hover.value : null);\n});\n\nfunction isSelected(d: Date): boolean {\n return range.value ? sameDay(d, start.value) || sameDay(d, end.value) : sameDay(d, value.value);\n}\nfunction inRange(d: Date): boolean {\n return !!(\n range.value &&\n start.value &&\n rangeEnd.value &&\n compareDays(d, start.value) > 0 &&\n compareDays(d, rangeEnd.value) < 0\n );\n}\nfunction dayLabel(d: Date, marked: boolean): string {\n return (\n loc.formatLong(d) +\n (sameDay(d, today) ? \", \" + t(\"todaySuffix\") : \"\") +\n (marked ? \", \" + (props.markLabel || t(\"timesAvailable\")) : \"\")\n );\n}\n\nfunction pickDay(d: Date) {\n if (off(d)) return;\n if (!range.value) {\n value.value = d;\n return;\n }\n const s = start.value;\n if (!s || end.value || compareDays(d, s) < 0) {\n start.value = d;\n end.value = null;\n emit(\"rangeChange\", { start: d, end: null });\n } else {\n end.value = d;\n emit(\"rangeChange\", { start: s, end: d });\n }\n}\nfunction clickDay(d: Date) {\n focus.value = d;\n focusId(dayId(d));\n pickDay(d);\n}\n\nfunction openView(v: \"months\" | \"years\") {\n view.value = v;\n if (v === \"months\") {\n pick.value = cm.value;\n focusId(`${uid.value}-m-${cm.value}`);\n } else {\n pick.value = cy.value;\n focusId(`${uid.value}-y-${cy.value}`);\n }\n}\nfunction backToDays() {\n view.value = \"days\";\n focusId(dayId(focus.value));\n}\nfunction back() {\n if (view.value === \"months\") openView(\"years\");\n else backToDays();\n}\nfunction chooseMonth(m: number) {\n if (monthOff(cy.value, m)) return;\n const nd = withMonthYear(cy.value, m);\n focus.value = nd;\n view.value = \"days\";\n focusId(dayId(nd));\n}\nfunction chooseYear(y: number) {\n if (yearOff(y)) return;\n const nd = withMonthYear(y, cm.value);\n focus.value = nd;\n view.value = \"months\";\n pick.value = nd.getMonth();\n focusId(`${uid.value}-m-${nd.getMonth()}`);\n}\nfunction step(n: number) {\n focus.value = clamp(addMonths(focus.value, n));\n}\n\nfunction sign(): number {\n if (config.dir) return config.dir === \"rtl\" ? -1 : 1;\n return root.value && getComputedStyle(root.value).direction === \"rtl\" ? -1 : 1;\n}\n\nfunction onDayKey(e: KeyboardEvent) {\n const f = focus.value;\n const dow = (f.getDay() - loc.weekStart.value + 7) % 7;\n const s = sign();\n let next: Date;\n let walk: number;\n switch (e.key) {\n case \"ArrowLeft\":\n walk = -s;\n next = addDays(f, walk);\n break;\n case \"ArrowRight\":\n walk = s;\n next = addDays(f, walk);\n break;\n case \"ArrowUp\":\n walk = -7;\n next = addDays(f, walk);\n break;\n case \"ArrowDown\":\n walk = 7;\n next = addDays(f, walk);\n break;\n case \"Home\":\n walk = 1;\n next = addDays(f, -dow);\n break;\n case \"End\":\n walk = -1;\n next = addDays(f, 6 - dow);\n break;\n case \"PageUp\":\n walk = -1;\n next = addMonths(f, e.shiftKey ? -12 : -1);\n break;\n case \"PageDown\":\n walk = 1;\n next = addMonths(f, e.shiftKey ? 12 : 1);\n break;\n default:\n return;\n }\n e.preventDefault();\n const target = settle(next, walk);\n if (!target) return;\n focus.value = target;\n focusId(dayId(target));\n if (range.value && start.value && !end.value) hover.value = target;\n}\n\nfunction onPickKey(e: KeyboardEvent) {\n const months = view.value === \"months\";\n const lo = months ? 0 : yearLow.value;\n const hi = months ? 11 : yearHigh.value;\n const s = sign();\n let next: number | null = null;\n switch (e.key) {\n case \"ArrowLeft\":\n next = pick.value - s;\n break;\n case \"ArrowRight\":\n next = pick.value + s;\n break;\n case \"ArrowUp\":\n next = pick.value - 3;\n break;\n case \"ArrowDown\":\n next = pick.value + 3;\n break;\n case \"Home\":\n next = lo;\n break;\n case \"End\":\n next = hi;\n break;\n case \"PageUp\":\n if (!months) next = pick.value - 12;\n break;\n case \"PageDown\":\n if (!months) next = pick.value + 12;\n break;\n }\n if (next === null) return;\n e.preventDefault();\n next = Math.max(lo, Math.min(hi, next));\n pick.value = next;\n focusId(`${uid.value}-${months ? \"m\" : \"y\"}-${next}`);\n}\n\nfunction onRootKey(e: KeyboardEvent) {\n if (e.key !== \"Escape\" || view.value === \"days\") return;\n e.preventDefault();\n e.stopPropagation();\n backToDays();\n}\n\nfunction goToday() {\n const tc = clamp(today);\n focus.value = tc;\n focusId(dayId(tc));\n if (!range.value && !off(today)) pickDay(today);\n}\n\nconst shortDate = (d: Date) => `${loc.monthsShort.value[d.getMonth()]} ${d.getDate()}`;\nconst help = computed(() => {\n if (!range.value || view.value !== \"days\") return \"\";\n if (!start.value) return t(\"rangeStart\");\n if (!end.value) return t(\"rangeEnd\", { start: shortDate(start.value) });\n return t(\"rangeDone\", {\n start: shortDate(start.value),\n end: shortDate(end.value),\n days: Math.round(compareDays(end.value, start.value) / 864e5) + 1,\n });\n});\n\nconst picking = computed(() => view.value !== \"days\");\nconst prevOff = computed(() => !!props.min && compareDays(new Date(cy.value, cm.value, 0, 12), props.min) < 0);\nconst nextOff = computed(() => !!props.max && compareDays(new Date(cy.value, cm.value + 1, 1, 12), props.max) > 0);\nconst nowYear = today.getFullYear();\nconst nowMonth = today.getMonth();\n\ndefineExpose({\n view,\n focusDay: () => focusId(dayId(focus.value)),\n});\n</script>\n\n<template>\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div ref=\"root\" class=\"e-cal\" :dir=\"config.dir ?? undefined\" @keydown=\"onRootKey\">\n <div class=\"e-cal-head\">\n <EIconButton\n v-if=\"picking\"\n icon=\"chevron-left\"\n :label=\"t(view === 'months' ? 'backToYears' : 'backToDays')\"\n @click=\"back\"\n />\n <EIconButton v-else icon=\"chevron-left\" :label=\"t('prevMonth')\" :disabled=\"prevOff\" @click=\"step(-1)\" />\n <div class=\"e-cal-title\" aria-live=\"polite\">\n <span v-if=\"picking\" class=\"e-cal-range\">{{\n t(view === \"months\" ? \"chooseAMonth\" : \"chooseAYear\", { year: cy })\n }}</span>\n <button\n v-else\n type=\"button\"\n class=\"e-cal-pick\"\n aria-expanded=\"false\"\n :aria-label=\"t('chooseDateNow', { month: loc.months.value[cm] ?? '', year: cy })\"\n @click=\"openView('years')\"\n >\n {{ loc.months.value[cm] }} {{ cy }}\n <EIcon name=\"chevron-down\" small />\n </button>\n </div>\n <span v-if=\"picking\" class=\"e-cal-gap\" />\n <EIconButton v-else icon=\"chevron-right\" :label=\"t('nextMonth')\" :disabled=\"nextOff\" @click=\"step(1)\" />\n </div>\n\n <!-- eslint-disable-next-line vuejs-accessibility/interactive-supports-focus -- the day buttons carry the roving tabindex -->\n <table\n v-if=\"view === 'days'\"\n class=\"e-cal-grid\"\n role=\"grid\"\n :aria-label=\"`${loc.months.value[cm]} ${cy}`\"\n @keydown=\"onDayKey\"\n >\n <thead>\n <tr>\n <th v-for=\"ix in columns\" :key=\"ix\" scope=\"col\" :abbr=\"loc.weekdays.value[ix]\">\n {{ loc.weekdaysShort.value[ix] }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, w) in weeks\" :key=\"w\">\n <td\n v-for=\"d in row\"\n :key=\"dayKey(d)\"\n role=\"gridcell\"\n :aria-selected=\"isSelected(d) || inRange(d) ? 'true' : 'false'\"\n :class=\"inRange(d) && 'e-cal-in'\"\n >\n <button\n :id=\"dayId(d)\"\n type=\"button\"\n class=\"e-day\"\n :class=\"[\n d.getMonth() !== cm && 'e-day--out',\n sameDay(d, today) && 'e-day--today',\n isSelected(d) && 'e-day--sel',\n !off(d) && isMarked(d) && 'e-day--mark',\n ]\"\n :tabindex=\"sameDay(d, focus) ? 0 : -1\"\n :disabled=\"off(d)\"\n :aria-label=\"dayLabel(d, !off(d) && isMarked(d))\"\n @click=\"clickDay(d)\"\n @mouseenter=\"range && start && !end && (hover = d)\"\n @focus=\"range && start && !end && (hover = d)\"\n >\n {{ d.getDate() }}\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div\n v-else-if=\"view === 'months'\"\n class=\"e-cal-cells\"\n role=\"group\"\n :aria-label=\"t('monthsOf', { year: cy })\"\n @keydown=\"onPickKey\"\n >\n <button\n v-for=\"(name, m) in loc.months.value\"\n :id=\"`${uid}-m-${m}`\"\n :key=\"m\"\n type=\"button\"\n class=\"e-cal-cell\"\n :class=\"[m === cm && 'e-day--sel', cy === nowYear && m === nowMonth && 'e-day--today']\"\n :tabindex=\"m === pick ? 0 : -1\"\n :disabled=\"monthOff(cy, m)\"\n :aria-pressed=\"m === cm ? 'true' : 'false'\"\n :aria-current=\"cy === nowYear && m === nowMonth ? 'date' : undefined\"\n @click=\"chooseMonth(m)\"\n >\n <span aria-hidden=\"true\">{{ loc.monthsShort.value[m] }}</span>\n <span class=\"e-sr\">{{ name }} {{ cy }}</span>\n </button>\n </div>\n\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <div\n v-else\n class=\"e-cal-cells e-cal-years\"\n role=\"group\"\n :aria-label=\"t('yearsRange', { from: yearLow, to: yearHigh })\"\n @keydown=\"onPickKey\"\n >\n <button\n v-for=\"y in years\"\n :id=\"`${uid}-y-${y}`\"\n :key=\"y\"\n type=\"button\"\n class=\"e-cal-cell\"\n :class=\"[y === cy && 'e-day--sel', y === nowYear && 'e-day--today']\"\n :tabindex=\"y === pick ? 0 : -1\"\n :disabled=\"yearOff(y)\"\n :aria-pressed=\"y === cy ? 'true' : 'false'\"\n :aria-current=\"y === nowYear ? 'date' : undefined\"\n @click=\"chooseYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n\n <p v-if=\"range\" class=\"e-cal-help\" aria-live=\"polite\">{{ help }}</p>\n\n <EActions v-if=\"footer\" class=\"e-cal-foot\" :class=\"view !== 'days' && 'e-cal-foot--idle'\" :inert=\"view !== 'days'\">\n <EButton variant=\"quiet\" @click=\"goToday\">{{ t(\"today\") }}</EButton>\n <EButton v-if=\"hasClear()\" variant=\"quiet\" @click=\"emit('clear')\">{{ t(\"clear\") }}</EButton>\n </EActions>\n </div>\n</template>\n\n<style>\n@layer e.composites {\n .e-cal {\n width: 20.5rem;\n max-width: 100%;\n font-family: var(--e-font-sans);\n }\n\n .e-cal-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--e-space-2);\n margin-bottom: var(--e-space-2);\n padding-bottom: var(--e-space-2);\n border-bottom: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-cal-title {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--e-space-1);\n flex: 1;\n min-width: 0;\n margin: 0;\n font: 600 var(--e-text-lg) / 1.2 var(--e-font-sans);\n text-align: center;\n }\n\n .e-cal-pick {\n display: inline-flex;\n align-items: center;\n gap: var(--e-space-1);\n height: var(--e-control-height);\n padding: 0 var(--e-space-2);\n border: var(--e-stroke-edge) solid transparent;\n\n --e-bc: transparent;\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 600 var(--e-text-lg) / 1 var(--e-font-sans);\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-pick:hover {\n background: var(--e-surface-hover);\n border-color: var(--e-border-strong);\n\n --e-bc: var(--e-border-strong);\n }\n\n .e-cal-pick:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: var(--e-focus-gap);\n }\n\n .e-cal-pick .e-icon {\n transition: transform var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-pick[aria-expanded=\"true\"] .e-icon {\n transform: rotate(180deg);\n }\n\n .e-cal-range {\n font: 600 var(--e-text-lg) / 1.2 var(--e-font-sans);\n font-variant-numeric: tabular-nums;\n }\n\n .e-cal-gap {\n display: block;\n width: var(--e-tap);\n height: var(--e-tap);\n }\n\n .e-cal-head .e-icon-btn:disabled {\n color: var(--e-muted);\n cursor: not-allowed;\n }\n\n .e-cal-head .e-icon-btn:disabled:hover {\n background: transparent;\n box-shadow: none;\n }\n\n .e-cal-grid {\n width: 100%;\n height: calc(6 * var(--e-tap) + var(--e-space-8) + var(--e-space-4));\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n .e-cal-grid th {\n height: var(--e-space-8);\n font: 600 var(--e-text-sm) / 1 var(--e-font-sans);\n color: var(--e-muted);\n text-align: center;\n }\n\n .e-cal-grid td {\n padding: 1px 3px;\n text-align: center;\n }\n\n .e-cal-in {\n background: color-mix(in srgb, var(--e-primary) 12%, var(--e-surface));\n }\n\n .e-day {\n position: relative;\n width: 100%;\n height: var(--e-tap);\n padding: 0;\n border: var(--e-stroke-edge) solid transparent;\n\n --e-bc: transparent;\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 500 var(--e-text-sm) / 1 var(--e-font-mono);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */\n .e-day:hover:not(:disabled):not(.e-day--sel) {\n background: var(--e-surface-hover);\n border-color: var(--e-border-strong);\n\n --e-bc: var(--e-border-strong);\n }\n\n .e-day:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n .e-day--out {\n color: var(--e-muted);\n font-weight: 400;\n }\n\n .e-day--today {\n box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-primary);\n }\n\n .e-day--sel {\n background: var(--e-primary);\n border-color: var(--e-primary);\n\n --e-bc: var(--e-primary);\n\n font-weight: 700;\n color: var(--e-on-primary);\n }\n\n .e-day:disabled {\n color: var(--e-border-strong);\n font-weight: 400;\n cursor: not-allowed;\n opacity: 1;\n }\n\n .e-day--mark::after {\n content: \"\";\n position: absolute;\n inset-inline-start: 50%;\n bottom: 5px;\n width: 5px;\n height: 5px;\n margin-inline-start: -2.5px;\n border-radius: 50%;\n background: var(--e-primary);\n }\n\n .e-day--sel.e-day--mark::after {\n background: var(--e-on-primary);\n }\n\n .e-cal-cells {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n gap: 6px;\n height: calc(6 * var(--e-tap) + var(--e-space-8) + var(--e-space-4));\n padding-top: var(--e-space-1);\n }\n\n .e-cal-years {\n overflow-y: auto;\n grid-auto-rows: var(--e-tap);\n padding-inline-end: 2px;\n align-content: start;\n }\n\n .e-cal-cell {\n width: 100%;\n height: 100%;\n min-height: var(--e-tap);\n padding: 0;\n border: var(--e-stroke-edge) solid transparent;\n\n --e-bc: transparent;\n\n outline: var(--e-stroke-edge) solid var(--e-bc);\n outline-offset: calc(-1 * var(--e-stroke-edge));\n border-radius: var(--e-radius-md);\n background: transparent;\n color: var(--e-ink);\n font: 500 var(--e-text-md) / 1 var(--e-font-mono);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background-color var(--e-duration-tap) var(--e-easing-out);\n }\n\n .e-cal-years .e-cal-cell {\n height: var(--e-tap);\n }\n\n /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */\n .e-cal-cell:hover:not(:disabled):not(.e-day--sel) {\n background: var(--e-surface-hover);\n border-color: var(--e-border-strong);\n\n --e-bc: var(--e-border-strong);\n }\n\n .e-cal-cell:focus-visible {\n outline: var(--e-stroke-focus) solid var(--e-focus-ring);\n outline-offset: calc(-1 * var(--e-stroke-focus));\n }\n\n .e-cal-cell:disabled {\n color: var(--e-border-strong);\n font-weight: 400;\n cursor: not-allowed;\n }\n\n .e-cal-cell.e-day--sel {\n background: var(--e-primary);\n border-color: var(--e-primary);\n\n --e-bc: var(--e-primary);\n\n font-weight: 700;\n color: var(--e-on-primary);\n }\n\n .e-cal-help {\n min-height: calc(var(--e-text-sm) * 1.4);\n margin: var(--e-space-2) 0 0;\n font: 500 var(--e-text-sm) / 1.4 var(--e-font-sans);\n color: var(--e-muted);\n text-align: center;\n }\n\n .e-cal-foot {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--e-space-2);\n margin-top: var(--e-space-2);\n padding-top: var(--e-space-2);\n border-top: var(--e-stroke-hair) solid var(--e-border);\n }\n\n .e-cal-foot--idle {\n visibility: hidden;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .e-day,\n .e-cal-pick,\n .e-cal-cell,\n .e-cal-pick .e-icon {\n transition: none;\n }\n }\n\n @media (forced-colors: active) {\n .e-day--sel,\n .e-cal-cell.e-day--sel {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .e-day--mark::after {\n background: CanvasText;\n }\n\n .e-day--sel.e-day--mark::after {\n background: HighlightText;\n }\n }\n}\n</style>\n"],"mappings":""}