@treeui/vue 0.8.0 → 0.10.0

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 (545) hide show
  1. package/README.md +1 -1
  2. package/dist/components/TAccordion.cjs +2 -0
  3. package/dist/components/TAccordion.cjs.map +1 -0
  4. package/dist/components/TAccordion.js +7 -0
  5. package/dist/components/TAccordion.js.map +1 -0
  6. package/dist/components/TAccordion.vue_vue_type_script_setup_true_lang.cjs +2 -0
  7. package/dist/components/TAccordion.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  8. package/dist/components/TAccordion.vue_vue_type_script_setup_true_lang.js +97 -0
  9. package/dist/components/TAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -0
  10. package/dist/components/TAccordionItem.cjs +2 -0
  11. package/dist/components/TAccordionItem.cjs.map +1 -0
  12. package/dist/components/TAccordionItem.js +7 -0
  13. package/dist/components/TAccordionItem.js.map +1 -0
  14. package/dist/components/TAccordionItem.vue_vue_type_script_setup_true_lang.cjs +2 -0
  15. package/dist/components/TAccordionItem.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  16. package/dist/components/TAccordionItem.vue_vue_type_script_setup_true_lang.js +83 -0
  17. package/dist/components/TAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/TAlert.cjs +2 -0
  19. package/dist/components/TAlert.cjs.map +1 -0
  20. package/dist/components/TAlert.js +7 -0
  21. package/dist/components/TAlert.js.map +1 -0
  22. package/dist/components/TAlert.vue_vue_type_script_setup_true_lang.cjs +2 -0
  23. package/dist/components/TAlert.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  24. package/dist/components/TAlert.vue_vue_type_script_setup_true_lang.js +57 -0
  25. package/dist/components/TAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/TAvatar.cjs +2 -0
  27. package/dist/components/TAvatar.cjs.map +1 -0
  28. package/dist/components/TAvatar.js +7 -0
  29. package/dist/components/TAvatar.js.map +1 -0
  30. package/dist/components/TAvatar.vue_vue_type_script_setup_true_lang.cjs +2 -0
  31. package/dist/components/TAvatar.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  32. package/dist/components/TAvatar.vue_vue_type_script_setup_true_lang.js +46 -0
  33. package/dist/components/TAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/TBadge.cjs +2 -0
  35. package/dist/components/TBadge.cjs.map +1 -0
  36. package/dist/components/TBadge.js +7 -0
  37. package/dist/components/TBadge.js.map +1 -0
  38. package/dist/components/TBadge.vue_vue_type_script_setup_true_lang.cjs +2 -0
  39. package/dist/components/TBadge.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  40. package/dist/components/TBadge.vue_vue_type_script_setup_true_lang.js +27 -0
  41. package/dist/components/TBadge.vue_vue_type_script_setup_true_lang.js.map +1 -0
  42. package/dist/components/TBreadcrumb.cjs +2 -0
  43. package/dist/components/TBreadcrumb.cjs.map +1 -0
  44. package/dist/components/TBreadcrumb.js +7 -0
  45. package/dist/components/TBreadcrumb.js.map +1 -0
  46. package/dist/components/TBreadcrumb.vue_vue_type_script_setup_true_lang.cjs +2 -0
  47. package/dist/components/TBreadcrumb.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  48. package/dist/components/TBreadcrumb.vue_vue_type_script_setup_true_lang.js +20 -0
  49. package/dist/components/TBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -0
  50. package/dist/components/TBreadcrumbItem.cjs +2 -0
  51. package/dist/components/TBreadcrumbItem.cjs.map +1 -0
  52. package/dist/components/TBreadcrumbItem.js +7 -0
  53. package/dist/components/TBreadcrumbItem.js.map +1 -0
  54. package/dist/components/TBreadcrumbItem.vue_vue_type_script_setup_true_lang.cjs +2 -0
  55. package/dist/components/TBreadcrumbItem.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  56. package/dist/components/TBreadcrumbItem.vue_vue_type_script_setup_true_lang.js +28 -0
  57. package/dist/components/TBreadcrumbItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  58. package/dist/components/TButton.cjs +2 -0
  59. package/dist/components/TButton.cjs.map +1 -0
  60. package/dist/components/TButton.js +7 -0
  61. package/dist/components/TButton.js.map +1 -0
  62. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs +2 -0
  63. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  64. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js +91 -0
  65. package/dist/components/TButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  66. package/dist/components/TCard.cjs +2 -0
  67. package/dist/components/TCard.cjs.map +1 -0
  68. package/dist/components/TCard.js +7 -0
  69. package/dist/components/TCard.js.map +1 -0
  70. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.cjs +2 -0
  71. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  72. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.js +42 -0
  73. package/dist/components/TCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  74. package/dist/components/TCheckbox.cjs +2 -0
  75. package/dist/components/TCheckbox.cjs.map +1 -0
  76. package/dist/components/TCheckbox.js +7 -0
  77. package/dist/components/TCheckbox.js.map +1 -0
  78. package/dist/components/TCheckbox.vue_vue_type_script_setup_true_lang.cjs +2 -0
  79. package/dist/components/TCheckbox.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  80. package/dist/components/TCheckbox.vue_vue_type_script_setup_true_lang.js +106 -0
  81. package/dist/components/TCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  82. package/dist/components/TCombobox.cjs +2 -0
  83. package/dist/components/TCombobox.cjs.map +1 -0
  84. package/dist/components/TCombobox.js +7 -0
  85. package/dist/components/TCombobox.js.map +1 -0
  86. package/dist/components/TCombobox.vue_vue_type_script_setup_true_lang.cjs +2 -0
  87. package/dist/components/TCombobox.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  88. package/dist/components/TCombobox.vue_vue_type_script_setup_true_lang.js +282 -0
  89. package/dist/components/TCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/TConfirmDialog.cjs +2 -0
  91. package/dist/components/TConfirmDialog.cjs.map +1 -0
  92. package/dist/components/TConfirmDialog.js +7 -0
  93. package/dist/components/TConfirmDialog.js.map +1 -0
  94. package/dist/components/TConfirmDialog.vue_vue_type_script_setup_true_lang.cjs +2 -0
  95. package/dist/components/TConfirmDialog.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  96. package/dist/components/TConfirmDialog.vue_vue_type_script_setup_true_lang.js +145 -0
  97. package/dist/components/TConfirmDialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  98. package/dist/components/TContainer.cjs +2 -0
  99. package/dist/components/TContainer.cjs.map +1 -0
  100. package/dist/components/TContainer.js +7 -0
  101. package/dist/components/TContainer.js.map +1 -0
  102. package/dist/components/TContainer.vue_vue_type_script_setup_true_lang.cjs +2 -0
  103. package/dist/components/TContainer.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  104. package/dist/components/TContainer.vue_vue_type_script_setup_true_lang.js +43 -0
  105. package/dist/components/TContainer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  106. package/dist/components/TContextMenu.cjs +2 -0
  107. package/dist/components/TContextMenu.cjs.map +1 -0
  108. package/dist/components/TContextMenu.js +7 -0
  109. package/dist/components/TContextMenu.js.map +1 -0
  110. package/dist/components/TContextMenu.vue_vue_type_script_setup_true_lang.cjs +2 -0
  111. package/dist/components/TContextMenu.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  112. package/dist/components/TContextMenu.vue_vue_type_script_setup_true_lang.js +149 -0
  113. package/dist/components/TContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  114. package/dist/components/TDatePicker.cjs +2 -0
  115. package/dist/components/TDatePicker.cjs.map +1 -0
  116. package/dist/components/TDatePicker.js +7 -0
  117. package/dist/components/TDatePicker.js.map +1 -0
  118. package/dist/components/TDatePicker.vue_vue_type_script_setup_true_lang.cjs +2 -0
  119. package/dist/components/TDatePicker.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  120. package/dist/components/TDatePicker.vue_vue_type_script_setup_true_lang.js +305 -0
  121. package/dist/components/TDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  122. package/dist/components/TDateTimePicker.cjs +2 -0
  123. package/dist/components/TDateTimePicker.cjs.map +1 -0
  124. package/dist/components/TDateTimePicker.js +7 -0
  125. package/dist/components/TDateTimePicker.js.map +1 -0
  126. package/dist/components/TDateTimePicker.vue_vue_type_script_setup_true_lang.cjs +2 -0
  127. package/dist/components/TDateTimePicker.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  128. package/dist/components/TDateTimePicker.vue_vue_type_script_setup_true_lang.js +409 -0
  129. package/dist/components/TDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  130. package/dist/components/TDivider.cjs +2 -0
  131. package/dist/components/TDivider.cjs.map +1 -0
  132. package/dist/components/TDivider.js +7 -0
  133. package/dist/components/TDivider.js.map +1 -0
  134. package/dist/components/TDivider.vue_vue_type_script_setup_true_lang.cjs +2 -0
  135. package/dist/components/TDivider.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  136. package/dist/components/TDivider.vue_vue_type_script_setup_true_lang.js +30 -0
  137. package/dist/components/TDivider.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/TDrawer.cjs +2 -0
  139. package/dist/components/TDrawer.cjs.map +1 -0
  140. package/dist/components/TDrawer.js +7 -0
  141. package/dist/components/TDrawer.js.map +1 -0
  142. package/dist/components/TDrawer.vue_vue_type_script_setup_true_lang.cjs +2 -0
  143. package/dist/components/TDrawer.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  144. package/dist/components/TDrawer.vue_vue_type_script_setup_true_lang.js +168 -0
  145. package/dist/components/TDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/TDropdown.cjs +2 -0
  147. package/dist/components/TDropdown.cjs.map +1 -0
  148. package/dist/components/TDropdown.js +7 -0
  149. package/dist/components/TDropdown.js.map +1 -0
  150. package/dist/components/TDropdown.vue.d.ts +3 -0
  151. package/dist/components/TDropdown.vue.d.ts.map +1 -1
  152. package/dist/components/TDropdown.vue_vue_type_script_setup_true_lang.cjs +2 -0
  153. package/dist/components/TDropdown.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  154. package/dist/components/TDropdown.vue_vue_type_script_setup_true_lang.js +176 -0
  155. package/dist/components/TDropdown.vue_vue_type_script_setup_true_lang.js.map +1 -0
  156. package/dist/components/TEmptyState.cjs +2 -0
  157. package/dist/components/TEmptyState.cjs.map +1 -0
  158. package/dist/components/TEmptyState.js +7 -0
  159. package/dist/components/TEmptyState.js.map +1 -0
  160. package/dist/components/TEmptyState.vue_vue_type_script_setup_true_lang.cjs +2 -0
  161. package/dist/components/TEmptyState.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  162. package/dist/components/TEmptyState.vue_vue_type_script_setup_true_lang.js +64 -0
  163. package/dist/components/TEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  164. package/dist/components/TFileUpload.cjs +2 -0
  165. package/dist/components/TFileUpload.cjs.map +1 -0
  166. package/dist/components/TFileUpload.js +7 -0
  167. package/dist/components/TFileUpload.js.map +1 -0
  168. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.cjs +2 -0
  169. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  170. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.js +284 -0
  171. package/dist/components/TFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -0
  172. package/dist/components/TFormField.cjs +2 -0
  173. package/dist/components/TFormField.cjs.map +1 -0
  174. package/dist/components/TFormField.js +7 -0
  175. package/dist/components/TFormField.js.map +1 -0
  176. package/dist/components/TFormField.vue_vue_type_script_setup_true_lang.cjs +2 -0
  177. package/dist/components/TFormField.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  178. package/dist/components/TFormField.vue_vue_type_script_setup_true_lang.js +63 -0
  179. package/dist/components/TFormField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  180. package/dist/components/TGrid.cjs +2 -0
  181. package/dist/components/TGrid.cjs.map +1 -0
  182. package/dist/components/TGrid.js +7 -0
  183. package/dist/components/TGrid.js.map +1 -0
  184. package/dist/components/TGrid.vue.d.ts +1 -1
  185. package/dist/components/TGrid.vue.d.ts.map +1 -1
  186. package/dist/components/TGrid.vue_vue_type_script_setup_true_lang.cjs +2 -0
  187. package/dist/components/TGrid.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  188. package/dist/components/TGrid.vue_vue_type_script_setup_true_lang.js +47 -0
  189. package/dist/components/TGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  190. package/dist/components/TIcon.cjs +2 -0
  191. package/dist/components/TIcon.cjs.map +1 -0
  192. package/dist/components/TIcon.js +7 -0
  193. package/dist/components/TIcon.js.map +1 -0
  194. package/dist/components/TIcon.vue_vue_type_script_setup_true_lang.cjs +2 -0
  195. package/dist/components/TIcon.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  196. package/dist/components/TIcon.vue_vue_type_script_setup_true_lang.js +39 -0
  197. package/dist/components/TIcon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  198. package/dist/components/TInput.cjs +2 -0
  199. package/dist/components/TInput.cjs.map +1 -0
  200. package/dist/components/TInput.js +7 -0
  201. package/dist/components/TInput.js.map +1 -0
  202. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.cjs +2 -0
  203. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  204. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.js +80 -0
  205. package/dist/components/TInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  206. package/dist/components/TLink.cjs +2 -0
  207. package/dist/components/TLink.cjs.map +1 -0
  208. package/dist/components/TLink.js +7 -0
  209. package/dist/components/TLink.js.map +1 -0
  210. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.cjs +2 -0
  211. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  212. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.js +47 -0
  213. package/dist/components/TLink.vue_vue_type_script_setup_true_lang.js.map +1 -0
  214. package/dist/components/TMarkdownEditor.cjs +2 -0
  215. package/dist/components/TMarkdownEditor.cjs.map +1 -0
  216. package/dist/components/TMarkdownEditor.js +7 -0
  217. package/dist/components/TMarkdownEditor.js.map +1 -0
  218. package/dist/components/TMarkdownEditor.vue_vue_type_script_setup_true_lang.cjs +12 -0
  219. package/dist/components/TMarkdownEditor.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  220. package/dist/components/TMarkdownEditor.vue_vue_type_script_setup_true_lang.js +315 -0
  221. package/dist/components/TMarkdownEditor.vue_vue_type_script_setup_true_lang.js.map +1 -0
  222. package/dist/components/TModal.cjs +2 -0
  223. package/dist/components/TModal.cjs.map +1 -0
  224. package/dist/components/TModal.js +7 -0
  225. package/dist/components/TModal.js.map +1 -0
  226. package/dist/components/TModal.vue_vue_type_script_setup_true_lang.cjs +2 -0
  227. package/dist/components/TModal.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  228. package/dist/components/TModal.vue_vue_type_script_setup_true_lang.js +163 -0
  229. package/dist/components/TModal.vue_vue_type_script_setup_true_lang.js.map +1 -0
  230. package/dist/components/TMultiSelect.cjs +2 -0
  231. package/dist/components/TMultiSelect.cjs.map +1 -0
  232. package/dist/components/TMultiSelect.js +7 -0
  233. package/dist/components/TMultiSelect.js.map +1 -0
  234. package/dist/components/TMultiSelect.vue_vue_type_script_setup_true_lang.cjs +2 -0
  235. package/dist/components/TMultiSelect.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  236. package/dist/components/TMultiSelect.vue_vue_type_script_setup_true_lang.js +282 -0
  237. package/dist/components/TMultiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -0
  238. package/dist/components/TNavMenu.cjs +2 -0
  239. package/dist/components/TNavMenu.cjs.map +1 -0
  240. package/dist/components/TNavMenu.js +7 -0
  241. package/dist/components/TNavMenu.js.map +1 -0
  242. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.cjs +2 -0
  243. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  244. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.js +151 -0
  245. package/dist/components/TNavMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  246. package/dist/components/TNavbar.cjs +2 -0
  247. package/dist/components/TNavbar.cjs.map +1 -0
  248. package/dist/components/TNavbar.js +7 -0
  249. package/dist/components/TNavbar.js.map +1 -0
  250. package/dist/components/TNavbar.vue_vue_type_script_setup_true_lang.cjs +2 -0
  251. package/dist/components/TNavbar.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  252. package/dist/components/TNavbar.vue_vue_type_script_setup_true_lang.js +61 -0
  253. package/dist/components/TNavbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  254. package/dist/components/TNumberInput.cjs +2 -0
  255. package/dist/components/TNumberInput.cjs.map +1 -0
  256. package/dist/components/TNumberInput.js +7 -0
  257. package/dist/components/TNumberInput.js.map +1 -0
  258. package/dist/components/TNumberInput.vue_vue_type_script_setup_true_lang.cjs +2 -0
  259. package/dist/components/TNumberInput.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  260. package/dist/components/TNumberInput.vue_vue_type_script_setup_true_lang.js +145 -0
  261. package/dist/components/TNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  262. package/dist/components/TPagination.cjs +2 -0
  263. package/dist/components/TPagination.cjs.map +1 -0
  264. package/dist/components/TPagination.js +7 -0
  265. package/dist/components/TPagination.js.map +1 -0
  266. package/dist/components/TPagination.vue_vue_type_script_setup_true_lang.cjs +2 -0
  267. package/dist/components/TPagination.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  268. package/dist/components/TPagination.vue_vue_type_script_setup_true_lang.js +105 -0
  269. package/dist/components/TPagination.vue_vue_type_script_setup_true_lang.js.map +1 -0
  270. package/dist/components/TPopover.cjs +2 -0
  271. package/dist/components/TPopover.cjs.map +1 -0
  272. package/dist/components/TPopover.js +7 -0
  273. package/dist/components/TPopover.js.map +1 -0
  274. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.cjs +2 -0
  275. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  276. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.js +106 -0
  277. package/dist/components/TPopover.vue_vue_type_script_setup_true_lang.js.map +1 -0
  278. package/dist/components/TPricing.cjs +2 -0
  279. package/dist/components/TPricing.cjs.map +1 -0
  280. package/dist/components/TPricing.js +7 -0
  281. package/dist/components/TPricing.js.map +1 -0
  282. package/dist/components/TPricing.vue_vue_type_script_setup_true_lang.cjs +2 -0
  283. package/dist/components/TPricing.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  284. package/dist/components/TPricing.vue_vue_type_script_setup_true_lang.js +33 -0
  285. package/dist/components/TPricing.vue_vue_type_script_setup_true_lang.js.map +1 -0
  286. package/dist/components/TPricingCard.cjs +2 -0
  287. package/dist/components/TPricingCard.cjs.map +1 -0
  288. package/dist/components/TPricingCard.js +7 -0
  289. package/dist/components/TPricingCard.js.map +1 -0
  290. package/dist/components/TPricingCard.vue_vue_type_script_setup_true_lang.cjs +2 -0
  291. package/dist/components/TPricingCard.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  292. package/dist/components/TPricingCard.vue_vue_type_script_setup_true_lang.js +93 -0
  293. package/dist/components/TPricingCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  294. package/dist/components/TProgress.cjs +2 -0
  295. package/dist/components/TProgress.cjs.map +1 -0
  296. package/dist/components/TProgress.js +7 -0
  297. package/dist/components/TProgress.js.map +1 -0
  298. package/dist/components/TProgress.vue_vue_type_script_setup_true_lang.cjs +2 -0
  299. package/dist/components/TProgress.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  300. package/dist/components/TProgress.vue_vue_type_script_setup_true_lang.js +33 -0
  301. package/dist/components/TProgress.vue_vue_type_script_setup_true_lang.js.map +1 -0
  302. package/dist/components/TRadio.cjs +2 -0
  303. package/dist/components/TRadio.cjs.map +1 -0
  304. package/dist/components/TRadio.js +7 -0
  305. package/dist/components/TRadio.js.map +1 -0
  306. package/dist/components/TRadio.vue_vue_type_script_setup_true_lang.cjs +2 -0
  307. package/dist/components/TRadio.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  308. package/dist/components/TRadio.vue_vue_type_script_setup_true_lang.js +73 -0
  309. package/dist/components/TRadio.vue_vue_type_script_setup_true_lang.js.map +1 -0
  310. package/dist/components/TRadioGroup.cjs +2 -0
  311. package/dist/components/TRadioGroup.cjs.map +1 -0
  312. package/dist/components/TRadioGroup.js +7 -0
  313. package/dist/components/TRadioGroup.js.map +1 -0
  314. package/dist/components/TRadioGroup.vue_vue_type_script_setup_true_lang.cjs +2 -0
  315. package/dist/components/TRadioGroup.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  316. package/dist/components/TRadioGroup.vue_vue_type_script_setup_true_lang.js +46 -0
  317. package/dist/components/TRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  318. package/dist/components/TSelect.cjs +2 -0
  319. package/dist/components/TSelect.cjs.map +1 -0
  320. package/dist/components/TSelect.js +7 -0
  321. package/dist/components/TSelect.js.map +1 -0
  322. package/dist/components/TSelect.vue.d.ts +2 -0
  323. package/dist/components/TSelect.vue.d.ts.map +1 -1
  324. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.cjs +2 -0
  325. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  326. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.js +238 -0
  327. package/dist/components/TSelect.vue_vue_type_script_setup_true_lang.js.map +1 -0
  328. package/dist/components/TSelectableList.cjs +2 -0
  329. package/dist/components/TSelectableList.cjs.map +1 -0
  330. package/dist/components/TSelectableList.js +7 -0
  331. package/dist/components/TSelectableList.js.map +1 -0
  332. package/dist/components/TSelectableList.vue_vue_type_script_setup_true_lang.cjs +2 -0
  333. package/dist/components/TSelectableList.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  334. package/dist/components/TSelectableList.vue_vue_type_script_setup_true_lang.js +133 -0
  335. package/dist/components/TSelectableList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  336. package/dist/components/TSidebar.cjs +2 -0
  337. package/dist/components/TSidebar.cjs.map +1 -0
  338. package/dist/components/TSidebar.js +7 -0
  339. package/dist/components/TSidebar.js.map +1 -0
  340. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.cjs +2 -0
  341. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  342. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.js +98 -0
  343. package/dist/components/TSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  344. package/dist/components/TSkeleton.cjs +2 -0
  345. package/dist/components/TSkeleton.cjs.map +1 -0
  346. package/dist/components/TSkeleton.js +7 -0
  347. package/dist/components/TSkeleton.js.map +1 -0
  348. package/dist/components/TSkeleton.vue_vue_type_script_setup_true_lang.cjs +2 -0
  349. package/dist/components/TSkeleton.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  350. package/dist/components/TSkeleton.vue_vue_type_script_setup_true_lang.js +25 -0
  351. package/dist/components/TSkeleton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  352. package/dist/components/TSpinner.cjs +2 -0
  353. package/dist/components/TSpinner.cjs.map +1 -0
  354. package/dist/components/TSpinner.js +7 -0
  355. package/dist/components/TSpinner.js.map +1 -0
  356. package/dist/components/TSpinner.vue_vue_type_script_setup_true_lang.cjs +2 -0
  357. package/dist/components/TSpinner.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  358. package/dist/components/TSpinner.vue_vue_type_script_setup_true_lang.js +24 -0
  359. package/dist/components/TSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  360. package/dist/components/TStack.cjs +2 -0
  361. package/dist/components/TStack.cjs.map +1 -0
  362. package/dist/components/TStack.js +7 -0
  363. package/dist/components/TStack.js.map +1 -0
  364. package/dist/components/TStack.vue.d.ts +1 -1
  365. package/dist/components/TStack.vue.d.ts.map +1 -1
  366. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs +2 -0
  367. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  368. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js +50 -0
  369. package/dist/components/TStack.vue_vue_type_script_setup_true_lang.js.map +1 -0
  370. package/dist/components/TStat.cjs +2 -0
  371. package/dist/components/TStat.cjs.map +1 -0
  372. package/dist/components/TStat.js +7 -0
  373. package/dist/components/TStat.js.map +1 -0
  374. package/dist/components/TStat.vue_vue_type_script_setup_true_lang.cjs +2 -0
  375. package/dist/components/TStat.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  376. package/dist/components/TStat.vue_vue_type_script_setup_true_lang.js +72 -0
  377. package/dist/components/TStat.vue_vue_type_script_setup_true_lang.js.map +1 -0
  378. package/dist/components/TSteps.cjs +2 -0
  379. package/dist/components/TSteps.cjs.map +1 -0
  380. package/dist/components/TSteps.js +7 -0
  381. package/dist/components/TSteps.js.map +1 -0
  382. package/dist/components/TSteps.vue_vue_type_script_setup_true_lang.cjs +2 -0
  383. package/dist/components/TSteps.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  384. package/dist/components/TSteps.vue_vue_type_script_setup_true_lang.js +83 -0
  385. package/dist/components/TSteps.vue_vue_type_script_setup_true_lang.js.map +1 -0
  386. package/dist/components/TSwitch.cjs +2 -0
  387. package/dist/components/TSwitch.cjs.map +1 -0
  388. package/dist/components/TSwitch.js +7 -0
  389. package/dist/components/TSwitch.js.map +1 -0
  390. package/dist/components/TSwitch.vue_vue_type_script_setup_true_lang.cjs +2 -0
  391. package/dist/components/TSwitch.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  392. package/dist/components/TSwitch.vue_vue_type_script_setup_true_lang.js +71 -0
  393. package/dist/components/TSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -0
  394. package/dist/components/TTab.cjs +2 -0
  395. package/dist/components/TTab.cjs.map +1 -0
  396. package/dist/components/TTab.js +7 -0
  397. package/dist/components/TTab.js.map +1 -0
  398. package/dist/components/TTab.vue_vue_type_script_setup_true_lang.cjs +2 -0
  399. package/dist/components/TTab.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  400. package/dist/components/TTab.vue_vue_type_script_setup_true_lang.js +55 -0
  401. package/dist/components/TTab.vue_vue_type_script_setup_true_lang.js.map +1 -0
  402. package/dist/components/TTabList.cjs +2 -0
  403. package/dist/components/TTabList.cjs.map +1 -0
  404. package/dist/components/TTabList.js +7 -0
  405. package/dist/components/TTabList.js.map +1 -0
  406. package/dist/components/TTabList.vue_vue_type_script_setup_true_lang.cjs +2 -0
  407. package/dist/components/TTabList.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  408. package/dist/components/TTabList.vue_vue_type_script_setup_true_lang.js +73 -0
  409. package/dist/components/TTabList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  410. package/dist/components/TTabPanel.cjs +2 -0
  411. package/dist/components/TTabPanel.cjs.map +1 -0
  412. package/dist/components/TTabPanel.js +7 -0
  413. package/dist/components/TTabPanel.js.map +1 -0
  414. package/dist/components/TTabPanel.vue_vue_type_script_setup_true_lang.cjs +2 -0
  415. package/dist/components/TTabPanel.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  416. package/dist/components/TTabPanel.vue_vue_type_script_setup_true_lang.js +24 -0
  417. package/dist/components/TTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  418. package/dist/components/TTable.cjs +2 -0
  419. package/dist/components/TTable.cjs.map +1 -0
  420. package/dist/components/TTable.js +7 -0
  421. package/dist/components/TTable.js.map +1 -0
  422. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.cjs +2 -0
  423. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  424. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.js +118 -0
  425. package/dist/components/TTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  426. package/dist/components/TTabs.cjs +2 -0
  427. package/dist/components/TTabs.cjs.map +1 -0
  428. package/dist/components/TTabs.js +7 -0
  429. package/dist/components/TTabs.js.map +1 -0
  430. package/dist/components/TTabs.vue_vue_type_script_setup_true_lang.cjs +2 -0
  431. package/dist/components/TTabs.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  432. package/dist/components/TTabs.vue_vue_type_script_setup_true_lang.js +51 -0
  433. package/dist/components/TTabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  434. package/dist/components/TTag.cjs +2 -0
  435. package/dist/components/TTag.cjs.map +1 -0
  436. package/dist/components/TTag.js +7 -0
  437. package/dist/components/TTag.js.map +1 -0
  438. package/dist/components/TTag.vue_vue_type_script_setup_true_lang.cjs +2 -0
  439. package/dist/components/TTag.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  440. package/dist/components/TTag.vue_vue_type_script_setup_true_lang.js +60 -0
  441. package/dist/components/TTag.vue_vue_type_script_setup_true_lang.js.map +1 -0
  442. package/dist/components/TTextarea.cjs +2 -0
  443. package/dist/components/TTextarea.cjs.map +1 -0
  444. package/dist/components/TTextarea.js +7 -0
  445. package/dist/components/TTextarea.js.map +1 -0
  446. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.cjs +2 -0
  447. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  448. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.js +81 -0
  449. package/dist/components/TTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -0
  450. package/dist/components/TTimeline.cjs +2 -0
  451. package/dist/components/TTimeline.cjs.map +1 -0
  452. package/dist/components/TTimeline.js +7 -0
  453. package/dist/components/TTimeline.js.map +1 -0
  454. package/dist/components/TTimeline.vue_vue_type_script_setup_true_lang.cjs +2 -0
  455. package/dist/components/TTimeline.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  456. package/dist/components/TTimeline.vue_vue_type_script_setup_true_lang.js +58 -0
  457. package/dist/components/TTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  458. package/dist/components/TToast.cjs +2 -0
  459. package/dist/components/TToast.cjs.map +1 -0
  460. package/dist/components/TToast.js +7 -0
  461. package/dist/components/TToast.js.map +1 -0
  462. package/dist/components/TToast.vue_vue_type_script_setup_true_lang.cjs +2 -0
  463. package/dist/components/TToast.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  464. package/dist/components/TToast.vue_vue_type_script_setup_true_lang.js +50 -0
  465. package/dist/components/TToast.vue_vue_type_script_setup_true_lang.js.map +1 -0
  466. package/dist/components/TToastProvider.cjs +2 -0
  467. package/dist/components/TToastProvider.cjs.map +1 -0
  468. package/dist/components/TToastProvider.js +7 -0
  469. package/dist/components/TToastProvider.js.map +1 -0
  470. package/dist/components/TToastProvider.vue_vue_type_script_setup_true_lang.cjs +2 -0
  471. package/dist/components/TToastProvider.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  472. package/dist/components/TToastProvider.vue_vue_type_script_setup_true_lang.js +33 -0
  473. package/dist/components/TToastProvider.vue_vue_type_script_setup_true_lang.js.map +1 -0
  474. package/dist/components/TToggleGroup.cjs +2 -0
  475. package/dist/components/TToggleGroup.cjs.map +1 -0
  476. package/dist/components/TToggleGroup.js +7 -0
  477. package/dist/components/TToggleGroup.js.map +1 -0
  478. package/dist/components/TToggleGroup.vue_vue_type_script_setup_true_lang.cjs +2 -0
  479. package/dist/components/TToggleGroup.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  480. package/dist/components/TToggleGroup.vue_vue_type_script_setup_true_lang.js +119 -0
  481. package/dist/components/TToggleGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  482. package/dist/components/TTooltip.cjs +2 -0
  483. package/dist/components/TTooltip.cjs.map +1 -0
  484. package/dist/components/TTooltip.js +7 -0
  485. package/dist/components/TTooltip.js.map +1 -0
  486. package/dist/components/TTooltip.vue_vue_type_script_setup_true_lang.cjs +2 -0
  487. package/dist/components/TTooltip.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  488. package/dist/components/TTooltip.vue_vue_type_script_setup_true_lang.js +75 -0
  489. package/dist/components/TTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  490. package/dist/components/TTreeView.cjs +2 -0
  491. package/dist/components/TTreeView.cjs.map +1 -0
  492. package/dist/components/TTreeView.js +7 -0
  493. package/dist/components/TTreeView.js.map +1 -0
  494. package/dist/components/TTreeView.vue_vue_type_script_setup_true_lang.cjs +2 -0
  495. package/dist/components/TTreeView.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  496. package/dist/components/TTreeView.vue_vue_type_script_setup_true_lang.js +161 -0
  497. package/dist/components/TTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  498. package/dist/components/TTreeViewItem.cjs +2 -0
  499. package/dist/components/TTreeViewItem.cjs.map +1 -0
  500. package/dist/components/TTreeViewItem.js +7 -0
  501. package/dist/components/TTreeViewItem.js.map +1 -0
  502. package/dist/components/TTreeViewItem.vue_vue_type_script_setup_true_lang.cjs +2 -0
  503. package/dist/components/TTreeViewItem.vue_vue_type_script_setup_true_lang.cjs.map +1 -0
  504. package/dist/components/TTreeViewItem.vue_vue_type_script_setup_true_lang.js +101 -0
  505. package/dist/components/TTreeViewItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  506. package/dist/components/accordion.cjs +2 -0
  507. package/dist/components/accordion.cjs.map +1 -0
  508. package/dist/components/accordion.js +6 -0
  509. package/dist/components/accordion.js.map +1 -0
  510. package/dist/components/index.d.ts +1 -0
  511. package/dist/components/index.d.ts.map +1 -1
  512. package/dist/components/sidebar.cjs +2 -0
  513. package/dist/components/sidebar.cjs.map +1 -0
  514. package/dist/components/sidebar.js +6 -0
  515. package/dist/components/sidebar.js.map +1 -0
  516. package/dist/components/tabs-context.cjs +2 -0
  517. package/dist/components/tabs-context.cjs.map +1 -0
  518. package/dist/components/tabs-context.js +6 -0
  519. package/dist/components/tabs-context.js.map +1 -0
  520. package/dist/components/tree-view.cjs +2 -0
  521. package/dist/components/tree-view.cjs.map +1 -0
  522. package/dist/components/tree-view.js +6 -0
  523. package/dist/components/tree-view.js.map +1 -0
  524. package/dist/composables/useControllableOpen.cjs +2 -0
  525. package/dist/composables/useControllableOpen.cjs.map +1 -0
  526. package/dist/composables/useControllableOpen.js +15 -0
  527. package/dist/composables/useControllableOpen.js.map +1 -0
  528. package/dist/composables/useToast.cjs +2 -0
  529. package/dist/composables/useToast.cjs.map +1 -0
  530. package/dist/composables/useToast.js +41 -0
  531. package/dist/composables/useToast.js.map +1 -0
  532. package/dist/index.cjs +1 -12
  533. package/dist/index.js +66 -5992
  534. package/dist/plugin.cjs +2 -0
  535. package/dist/plugin.cjs.map +1 -0
  536. package/dist/plugin.js +135 -0
  537. package/dist/plugin.js.map +1 -0
  538. package/dist/style.css +1 -1
  539. package/dist/types/contracts.cjs +2 -0
  540. package/dist/types/contracts.cjs.map +1 -0
  541. package/dist/types/contracts.js +31 -0
  542. package/dist/types/contracts.js.map +1 -0
  543. package/package.json +2 -2
  544. package/dist/index.cjs.map +0 -1
  545. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDatePicker.vue_vue_type_script_setup_true_lang.cjs","names":["$slots"],"sources":["../../src/components/TDatePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n addDays,\n addMonths,\n createId,\n isActivationKey,\n isEscapeKey,\n isSameDay,\n parseDateValue,\n startOfDay,\n startOfMonth,\n startOfWeek,\n toDateValue,\n} from '@treeui/utils';\nimport { getTreeIcon, treeIconDefaults } from '@treeui/icons';\nimport {\n type ComponentPublicInstance,\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n toRef,\n useAttrs,\n watch,\n} from 'vue';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ninterface CalendarCell {\n date: Date;\n dayLabel: number;\n disabled: boolean;\n inMonth: boolean;\n isFocused: boolean;\n isSelected: boolean;\n isToday: boolean;\n key: string;\n}\n\nconst CalendarIcon = getTreeIcon('calendar');\nconst ChevronLeftIcon = getTreeIcon('chevron-left');\nconst ChevronRightIcon = getTreeIcon('chevron-right');\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n open?: boolean;\n defaultOpen?: boolean;\n size?: TSize;\n disabled?: boolean;\n invalid?: boolean;\n placeholder?: string;\n locale?: string;\n min?: string;\n max?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n id?: string;\n }>(),\n {\n modelValue: '',\n open: undefined,\n defaultOpen: false,\n size: 'md',\n disabled: false,\n invalid: false,\n placeholder: 'Select date',\n locale: 'en-US',\n min: '',\n max: '',\n weekStartsOn: 0,\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n select: [value: string];\n}>();\n\nconst attrs = useAttrs();\nconst today = startOfDay(new Date());\nconst selectedDate = computed(() => parseDateValue(props.modelValue));\nconst minDate = computed(() => parseDateValue(props.min));\nconst maxDate = computed(() => parseDateValue(props.max));\nconst calendarId = props.id ?? createId('t-date-picker');\nconst captionId = `${calendarId}-caption`;\nconst rootRef = ref<HTMLElement | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst dayRefs = new Map<string, HTMLButtonElement>();\nconst viewMonth = ref(startOfMonth(selectedDate.value ?? today));\nconst focusedDate = ref<Date>(selectedDate.value ?? today);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, name: _name, ...rest } = attrs;\n return rest;\n});\n\nconst hiddenInputName = computed(() =>\n typeof attrs.name === 'string' ? attrs.name : undefined,\n);\n\nconst rootClasses = computed(() => [\n 't-date-picker',\n `t-date-picker--${props.size}`,\n {\n 'is-disabled': props.disabled,\n 'is-invalid': props.invalid,\n 'is-open': isOpen.value,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst triggerText = computed(() => {\n if (!selectedDate.value) {\n return props.placeholder;\n }\n\n return new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(selectedDate.value);\n});\n\nconst monthLabel = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth.value),\n);\n\nconst weekdayLabels = computed(() => {\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' });\n const weekBase = startOfWeek(new Date(2024, 0, 7), props.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) =>\n formatter.format(addDays(weekBase, index)),\n );\n});\n\nconst isDateDisabled = (date: Date) => {\n if (props.disabled) {\n return true;\n }\n\n if (minDate.value && date < minDate.value) {\n return true;\n }\n\n if (maxDate.value && date > maxDate.value) {\n return true;\n }\n\n return false;\n};\n\nconst syncCalendarView = (date: Date) => {\n focusedDate.value = startOfDay(date);\n viewMonth.value = startOfMonth(date);\n};\n\nwatch(\n selectedDate,\n (value) => {\n if (value) {\n syncCalendarView(value);\n return;\n }\n\n if (!isOpen.value) {\n syncCalendarView(today);\n }\n },\n { immediate: true },\n);\n\nconst cells = computed(() => {\n const startDate = startOfWeek(startOfMonth(viewMonth.value), props.weekStartsOn);\n\n return Array.from({ length: 6 }, (_, weekIndex) =>\n Array.from({ length: 7 }, (_, dayIndex) => {\n const date = addDays(startDate, weekIndex * 7 + dayIndex);\n const key = toDateValue(date);\n\n return {\n date,\n dayLabel: date.getDate(),\n disabled: isDateDisabled(date),\n inMonth: date.getMonth() === viewMonth.value.getMonth(),\n isFocused: isSameDay(date, focusedDate.value),\n isSelected: isSameDay(date, selectedDate.value),\n isToday: isSameDay(date, today),\n key,\n } satisfies CalendarCell;\n }),\n );\n});\n\nconst canMovePrev = computed(() => {\n if (!minDate.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) > startOfMonth(minDate.value);\n});\n\nconst canMoveNext = computed(() => {\n if (!maxDate.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) < startOfMonth(maxDate.value);\n});\n\nconst focusCurrentDay = () => {\n const key = toDateValue(focusedDate.value);\n nextTick(() => {\n dayRefs.get(key)?.focus();\n });\n};\n\nconst setDayRef = (\n element: Element | ComponentPublicInstance | null,\n key: string,\n) => {\n if (element instanceof HTMLButtonElement) {\n dayRefs.set(key, element);\n return;\n }\n\n dayRefs.delete(key);\n};\n\nconst openCalendar = () => {\n if (props.disabled) {\n return;\n }\n\n syncCalendarView(selectedDate.value ?? focusedDate.value ?? today);\n setValue(true);\n focusCurrentDay();\n};\n\nconst closeCalendar = (restoreFocus = false) => {\n setValue(false);\n\n if (restoreFocus) {\n nextTick(() => {\n triggerRef.value?.focus();\n });\n }\n};\n\nconst toggleCalendar = () => {\n if (isOpen.value) {\n closeCalendar();\n return;\n }\n\n openCalendar();\n};\n\nconst moveCalendar = (direction: 1 | -1) => {\n const nextMonth = addMonths(viewMonth.value, direction);\n syncCalendarView(nextMonth);\n focusCurrentDay();\n};\n\nconst moveFocus = (nextDate: Date) => {\n if (isDateDisabled(nextDate)) {\n return;\n }\n\n syncCalendarView(nextDate);\n focusCurrentDay();\n};\n\nconst selectDate = (date: Date) => {\n if (isDateDisabled(date)) {\n return;\n }\n\n const normalizedDate = startOfDay(date);\n const value = toDateValue(normalizedDate);\n\n syncCalendarView(normalizedDate);\n emit('update:modelValue', value);\n emit('select', value);\n closeCalendar(true);\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) {\n return;\n }\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closeCalendar();\n return;\n }\n\n if (\n isActivationKey(event) ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n event.preventDefault();\n openCalendar();\n }\n};\n\nconst onDayKeydown = (event: KeyboardEvent, date: Date) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closeCalendar(true);\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectDate(date);\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(addDays(date, -1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(addDays(date, 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(addDays(date, -7));\n break;\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(addDays(date, 7));\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(startOfWeek(date, props.weekStartsOn));\n break;\n case 'End':\n event.preventDefault();\n moveFocus(addDays(startOfWeek(date, props.weekStartsOn), 6));\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? -12 : -1));\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? 12 : 1));\n break;\n default:\n break;\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (rootRef.value?.contains(target)) {\n return;\n }\n\n closeCalendar();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <input\n v-if=\"hiddenInputName\"\n type=\"hidden\"\n :name=\"hiddenInputName\"\n :value=\"modelValue\"\n >\n <button\n ref=\"triggerRef\"\n v-bind=\"triggerAttrs\"\n type=\"button\"\n class=\"t-date-picker__trigger\"\n :disabled=\"disabled\"\n :aria-controls=\"isOpen ? calendarId : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-invalid=\"invalid || undefined\"\n @click=\"toggleCalendar\"\n @keydown=\"onTriggerKeydown\"\n >\n <span\n v-if=\"$slots.prefix\"\n class=\"t-date-picker__slot t-date-picker__slot--prefix\"\n >\n <slot name=\"prefix\" />\n </span>\n <span\n class=\"t-date-picker__value\"\n :data-placeholder=\"selectedDate ? undefined : true\"\n >\n {{ triggerText }}\n </span>\n <span class=\"t-date-picker__slot t-date-picker__slot--suffix\">\n <slot name=\"suffix\">\n <CalendarIcon v-bind=\"treeIconDefaults\" />\n </slot>\n </span>\n </button>\n\n <transition name=\"t-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"calendarId\"\n class=\"t-date-picker__content\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-labelledby=\"captionId\"\n >\n <div class=\"t-date-picker__header\">\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMovePrev\"\n aria-label=\"Previous month\"\n @click=\"moveCalendar(-1)\"\n >\n <ChevronLeftIcon v-bind=\"treeIconDefaults\" />\n </button>\n <p\n :id=\"captionId\"\n class=\"t-date-picker__month\"\n >\n {{ monthLabel }}\n </p>\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMoveNext\"\n aria-label=\"Next month\"\n @click=\"moveCalendar(1)\"\n >\n <ChevronRightIcon v-bind=\"treeIconDefaults\" />\n </button>\n </div>\n\n <div\n class=\"t-date-picker__weekdays\"\n aria-hidden=\"true\"\n >\n <span\n v-for=\"label in weekdayLabels\"\n :key=\"label\"\n class=\"t-date-picker__weekday\"\n >\n {{ label }}\n </span>\n </div>\n\n <div\n class=\"t-date-picker__grid\"\n role=\"grid\"\n :aria-labelledby=\"captionId\"\n >\n <div\n v-for=\"(week, weekIndex) in cells\"\n :key=\"weekIndex\"\n class=\"t-date-picker__row\"\n role=\"row\"\n >\n <div\n v-for=\"cell in week\"\n :key=\"cell.key\"\n class=\"t-date-picker__cell\"\n role=\"gridcell\"\n :aria-selected=\"cell.isSelected\"\n >\n <button\n :ref=\"(element) => setDayRef(element, cell.key)\"\n type=\"button\"\n class=\"t-date-picker__day\"\n :class=\"{\n 'is-muted': !cell.inMonth,\n 'is-selected': cell.isSelected,\n 'is-today': cell.isToday,\n }\"\n :data-date=\"cell.key\"\n :disabled=\"cell.disabled\"\n :tabindex=\"cell.isFocused ? 0 : -1\"\n :aria-current=\"cell.isToday ? 'date' : undefined\"\n :aria-label=\"cell.key\"\n @click=\"selectDate(cell.date)\"\n @keydown=\"onDayKeydown($event, cell.date)\"\n >\n {{ cell.dayLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ import { useControllableOpen as e } from "../composables/useControllableOpen.js";
2
+ import { Fragment as t, Transition as n, computed as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, guardReactiveProps as l, mergeProps as ee, nextTick as te, normalizeClass as u, normalizeProps as d, normalizeStyle as ne, onBeforeUnmount as re, openBlock as f, ref as p, renderList as m, renderSlot as h, toDisplayString as g, toRef as ie, unref as _, useAttrs as ae, watch as v, withCtx as oe } from "vue";
3
+ import { addDays as y, addMonths as b, createId as se, isActivationKey as x, isEscapeKey as S, isSameDay as C, parseDateValue as w, startOfDay as T, startOfMonth as E, startOfWeek as D, toDateValue as O } from "@treeui/utils";
4
+ import { getTreeIcon as k, treeIconDefaults as A } from "@treeui/icons";
5
+ //#region src/components/TDatePicker.vue?vue&type=script&setup=true&lang.ts
6
+ var ce = ["data-state"], le = ["name", "value"], ue = [
7
+ "disabled",
8
+ "aria-controls",
9
+ "aria-expanded",
10
+ "aria-invalid"
11
+ ], de = {
12
+ key: 0,
13
+ class: "t-date-picker__slot t-date-picker__slot--prefix"
14
+ }, fe = ["data-placeholder"], pe = { class: "t-date-picker__slot t-date-picker__slot--suffix" }, me = ["id"], he = { class: "t-date-picker__header" }, ge = ["disabled"], _e = ["disabled"], ve = {
15
+ class: "t-date-picker__weekdays",
16
+ "aria-hidden": "true"
17
+ }, ye = ["aria-selected"], be = [
18
+ "data-date",
19
+ "disabled",
20
+ "tabindex",
21
+ "aria-current",
22
+ "aria-label",
23
+ "onClick",
24
+ "onKeydown"
25
+ ], j = /*@__PURE__*/ c({
26
+ inheritAttrs: !1,
27
+ __name: "TDatePicker",
28
+ props: {
29
+ modelValue: { default: "" },
30
+ open: {
31
+ type: Boolean,
32
+ default: void 0
33
+ },
34
+ defaultOpen: {
35
+ type: Boolean,
36
+ default: !1
37
+ },
38
+ size: { default: "md" },
39
+ disabled: {
40
+ type: Boolean,
41
+ default: !1
42
+ },
43
+ invalid: {
44
+ type: Boolean,
45
+ default: !1
46
+ },
47
+ placeholder: { default: "Select date" },
48
+ locale: { default: "en-US" },
49
+ min: { default: "" },
50
+ max: { default: "" },
51
+ weekStartsOn: { default: 0 },
52
+ id: { default: void 0 }
53
+ },
54
+ emits: [
55
+ "update:modelValue",
56
+ "update:open",
57
+ "open-change",
58
+ "select"
59
+ ],
60
+ setup(c, { emit: j }) {
61
+ let xe = k("calendar"), Se = k("chevron-left"), Ce = k("chevron-right"), M = c, N = j, P = ae(), F = T(/* @__PURE__ */ new Date()), I = r(() => w(M.modelValue)), L = r(() => w(M.min)), R = r(() => w(M.max)), z = M.id ?? se("t-date-picker"), B = `${z}-caption`, V = p(null), H = p(null), U = /* @__PURE__ */ new Map(), W = p(E(I.value ?? F)), G = p(I.value ?? F), we = r(() => {
62
+ let { class: e, style: t, name: n, ...r } = P;
63
+ return r;
64
+ }), K = r(() => typeof P.name == "string" ? P.name : void 0), Te = r(() => [
65
+ "t-date-picker",
66
+ `t-date-picker--${M.size}`,
67
+ {
68
+ "is-disabled": M.disabled,
69
+ "is-invalid": M.invalid,
70
+ "is-open": q.value
71
+ },
72
+ P.class
73
+ ]), Ee = r(() => P.style), { value: q, setValue: De } = e(ie(M, "open"), M.defaultOpen, (e) => {
74
+ N("update:open", e), N("open-change", e);
75
+ }), Oe = r(() => I.value ? new Intl.DateTimeFormat(M.locale, {
76
+ day: "numeric",
77
+ month: "long",
78
+ year: "numeric"
79
+ }).format(I.value) : M.placeholder), ke = r(() => new Intl.DateTimeFormat(M.locale, {
80
+ month: "long",
81
+ year: "numeric"
82
+ }).format(W.value)), Ae = r(() => {
83
+ let e = new Intl.DateTimeFormat(M.locale, { weekday: "short" }), t = D(new Date(2024, 0, 7), M.weekStartsOn);
84
+ return Array.from({ length: 7 }, (n, r) => e.format(y(t, r)));
85
+ }), J = (e) => !!(M.disabled || L.value && e < L.value || R.value && e > R.value), Y = (e) => {
86
+ G.value = T(e), W.value = E(e);
87
+ };
88
+ v(I, (e) => {
89
+ if (e) {
90
+ Y(e);
91
+ return;
92
+ }
93
+ q.value || Y(F);
94
+ }, { immediate: !0 });
95
+ let je = r(() => {
96
+ let e = D(E(W.value), M.weekStartsOn);
97
+ return Array.from({ length: 6 }, (t, n) => Array.from({ length: 7 }, (t, r) => {
98
+ let i = y(e, n * 7 + r), a = O(i);
99
+ return {
100
+ date: i,
101
+ dayLabel: i.getDate(),
102
+ disabled: J(i),
103
+ inMonth: i.getMonth() === W.value.getMonth(),
104
+ isFocused: C(i, G.value),
105
+ isSelected: C(i, I.value),
106
+ isToday: C(i, F),
107
+ key: a
108
+ };
109
+ }));
110
+ }), Me = r(() => !L.value || E(W.value) > E(L.value)), Ne = r(() => !R.value || E(W.value) < E(R.value)), X = () => {
111
+ let e = O(G.value);
112
+ te(() => {
113
+ U.get(e)?.focus();
114
+ });
115
+ }, Pe = (e, t) => {
116
+ if (e instanceof HTMLButtonElement) {
117
+ U.set(t, e);
118
+ return;
119
+ }
120
+ U.delete(t);
121
+ }, Fe = () => {
122
+ M.disabled || (Y(I.value ?? G.value ?? F), De(!0), X());
123
+ }, Z = (e = !1) => {
124
+ De(!1), e && te(() => {
125
+ H.value?.focus();
126
+ });
127
+ }, Ie = () => {
128
+ if (q.value) {
129
+ Z();
130
+ return;
131
+ }
132
+ Fe();
133
+ }, Le = (e) => {
134
+ let t = b(W.value, e);
135
+ Y(t), X();
136
+ }, Q = (e) => {
137
+ J(e) || (Y(e), X());
138
+ }, Re = (e) => {
139
+ if (J(e)) return;
140
+ let t = T(e), n = O(t);
141
+ Y(t), N("update:modelValue", n), N("select", n), Z(!0);
142
+ }, ze = (e) => {
143
+ if (!M.disabled) {
144
+ if (S(e) && q.value) {
145
+ e.preventDefault(), Z();
146
+ return;
147
+ }
148
+ (x(e) || e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), Fe());
149
+ }
150
+ }, Be = (e, t) => {
151
+ if (S(e)) {
152
+ e.preventDefault(), Z(!0);
153
+ return;
154
+ }
155
+ if (x(e)) {
156
+ e.preventDefault(), Re(t);
157
+ return;
158
+ }
159
+ switch (e.key) {
160
+ case "ArrowLeft":
161
+ e.preventDefault(), Q(y(t, -1));
162
+ break;
163
+ case "ArrowRight":
164
+ e.preventDefault(), Q(y(t, 1));
165
+ break;
166
+ case "ArrowUp":
167
+ e.preventDefault(), Q(y(t, -7));
168
+ break;
169
+ case "ArrowDown":
170
+ e.preventDefault(), Q(y(t, 7));
171
+ break;
172
+ case "Home":
173
+ e.preventDefault(), Q(D(t, M.weekStartsOn));
174
+ break;
175
+ case "End":
176
+ e.preventDefault(), Q(y(D(t, M.weekStartsOn), 6));
177
+ break;
178
+ case "PageUp":
179
+ e.preventDefault(), Q(b(t, e.shiftKey ? -12 : -1));
180
+ break;
181
+ case "PageDown":
182
+ e.preventDefault(), Q(b(t, e.shiftKey ? 12 : 1));
183
+ break;
184
+ default: break;
185
+ }
186
+ }, $ = (e) => {
187
+ if (!q.value) return;
188
+ let t = e.target;
189
+ t instanceof Node && (V.value?.contains(t) || Z());
190
+ };
191
+ return v(q, (e) => {
192
+ if (e) {
193
+ document.addEventListener("pointerdown", $);
194
+ return;
195
+ }
196
+ document.removeEventListener("pointerdown", $);
197
+ }), re(() => {
198
+ document.removeEventListener("pointerdown", $);
199
+ }), (e, r) => (f(), a("div", {
200
+ ref_key: "rootRef",
201
+ ref: V,
202
+ class: u(Te.value),
203
+ style: ne(Ee.value),
204
+ "data-state": _(q) ? "open" : "closed"
205
+ }, [
206
+ K.value ? (f(), a("input", {
207
+ key: 0,
208
+ type: "hidden",
209
+ name: K.value,
210
+ value: c.modelValue
211
+ }, null, 8, le)) : i("", !0),
212
+ o("button", ee({
213
+ ref_key: "triggerRef",
214
+ ref: H
215
+ }, we.value, {
216
+ type: "button",
217
+ class: "t-date-picker__trigger",
218
+ disabled: c.disabled,
219
+ "aria-controls": _(q) ? _(z) : void 0,
220
+ "aria-haspopup": "dialog",
221
+ "aria-expanded": _(q),
222
+ "aria-invalid": c.invalid || void 0,
223
+ onClick: Ie,
224
+ onKeydown: ze
225
+ }), [
226
+ e.$slots.prefix ? (f(), a("span", de, [h(e.$slots, "prefix")])) : i("", !0),
227
+ o("span", {
228
+ class: "t-date-picker__value",
229
+ "data-placeholder": !I.value || void 0
230
+ }, g(Oe.value), 9, fe),
231
+ o("span", pe, [h(e.$slots, "suffix", {}, () => [s(_(xe), d(l(_(A))), null, 16)])])
232
+ ], 16, ue),
233
+ s(n, { name: "t-fade" }, {
234
+ default: oe(() => [_(q) && !c.disabled ? (f(), a("div", {
235
+ key: 0,
236
+ id: _(z),
237
+ class: "t-date-picker__content",
238
+ role: "dialog",
239
+ "aria-modal": "false",
240
+ "aria-labelledby": B
241
+ }, [
242
+ o("div", he, [
243
+ o("button", {
244
+ type: "button",
245
+ class: "t-date-picker__nav",
246
+ disabled: !Me.value,
247
+ "aria-label": "Previous month",
248
+ onClick: r[0] ||= (e) => Le(-1)
249
+ }, [s(_(Se), d(l(_(A))), null, 16)], 8, ge),
250
+ o("p", {
251
+ id: B,
252
+ class: "t-date-picker__month"
253
+ }, g(ke.value), 1),
254
+ o("button", {
255
+ type: "button",
256
+ class: "t-date-picker__nav",
257
+ disabled: !Ne.value,
258
+ "aria-label": "Next month",
259
+ onClick: r[1] ||= (e) => Le(1)
260
+ }, [s(_(Ce), d(l(_(A))), null, 16)], 8, _e)
261
+ ]),
262
+ o("div", ve, [(f(!0), a(t, null, m(Ae.value, (e) => (f(), a("span", {
263
+ key: e,
264
+ class: "t-date-picker__weekday"
265
+ }, g(e), 1))), 128))]),
266
+ o("div", {
267
+ class: "t-date-picker__grid",
268
+ role: "grid",
269
+ "aria-labelledby": B
270
+ }, [(f(!0), a(t, null, m(je.value, (e, n) => (f(), a("div", {
271
+ key: n,
272
+ class: "t-date-picker__row",
273
+ role: "row"
274
+ }, [(f(!0), a(t, null, m(e, (e) => (f(), a("div", {
275
+ key: e.key,
276
+ class: "t-date-picker__cell",
277
+ role: "gridcell",
278
+ "aria-selected": e.isSelected
279
+ }, [o("button", {
280
+ ref_for: !0,
281
+ ref: (t) => Pe(t, e.key),
282
+ type: "button",
283
+ class: u(["t-date-picker__day", {
284
+ "is-muted": !e.inMonth,
285
+ "is-selected": e.isSelected,
286
+ "is-today": e.isToday
287
+ }]),
288
+ "data-date": e.key,
289
+ disabled: e.disabled,
290
+ tabindex: e.isFocused ? 0 : -1,
291
+ "aria-current": e.isToday ? "date" : void 0,
292
+ "aria-label": e.key,
293
+ onClick: (t) => Re(e.date),
294
+ onKeydown: (t) => Be(t, e.date)
295
+ }, g(e.dayLabel), 43, be)], 8, ye))), 128))]))), 128))])
296
+ ], 8, me)) : i("", !0)]),
297
+ _: 1
298
+ })
299
+ ], 14, ce));
300
+ }
301
+ });
302
+ //#endregion
303
+ export { j as default };
304
+
305
+ //# sourceMappingURL=TDatePicker.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDatePicker.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../src/components/TDatePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n addDays,\n addMonths,\n createId,\n isActivationKey,\n isEscapeKey,\n isSameDay,\n parseDateValue,\n startOfDay,\n startOfMonth,\n startOfWeek,\n toDateValue,\n} from '@treeui/utils';\nimport { getTreeIcon, treeIconDefaults } from '@treeui/icons';\nimport {\n type ComponentPublicInstance,\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n toRef,\n useAttrs,\n watch,\n} from 'vue';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize } from '../types/contracts';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ninterface CalendarCell {\n date: Date;\n dayLabel: number;\n disabled: boolean;\n inMonth: boolean;\n isFocused: boolean;\n isSelected: boolean;\n isToday: boolean;\n key: string;\n}\n\nconst CalendarIcon = getTreeIcon('calendar');\nconst ChevronLeftIcon = getTreeIcon('chevron-left');\nconst ChevronRightIcon = getTreeIcon('chevron-right');\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n open?: boolean;\n defaultOpen?: boolean;\n size?: TSize;\n disabled?: boolean;\n invalid?: boolean;\n placeholder?: string;\n locale?: string;\n min?: string;\n max?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n id?: string;\n }>(),\n {\n modelValue: '',\n open: undefined,\n defaultOpen: false,\n size: 'md',\n disabled: false,\n invalid: false,\n placeholder: 'Select date',\n locale: 'en-US',\n min: '',\n max: '',\n weekStartsOn: 0,\n id: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n select: [value: string];\n}>();\n\nconst attrs = useAttrs();\nconst today = startOfDay(new Date());\nconst selectedDate = computed(() => parseDateValue(props.modelValue));\nconst minDate = computed(() => parseDateValue(props.min));\nconst maxDate = computed(() => parseDateValue(props.max));\nconst calendarId = props.id ?? createId('t-date-picker');\nconst captionId = `${calendarId}-caption`;\nconst rootRef = ref<HTMLElement | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst dayRefs = new Map<string, HTMLButtonElement>();\nconst viewMonth = ref(startOfMonth(selectedDate.value ?? today));\nconst focusedDate = ref<Date>(selectedDate.value ?? today);\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, name: _name, ...rest } = attrs;\n return rest;\n});\n\nconst hiddenInputName = computed(() =>\n typeof attrs.name === 'string' ? attrs.name : undefined,\n);\n\nconst rootClasses = computed(() => [\n 't-date-picker',\n `t-date-picker--${props.size}`,\n {\n 'is-disabled': props.disabled,\n 'is-invalid': props.invalid,\n 'is-open': isOpen.value,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst triggerText = computed(() => {\n if (!selectedDate.value) {\n return props.placeholder;\n }\n\n return new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(selectedDate.value);\n});\n\nconst monthLabel = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth.value),\n);\n\nconst weekdayLabels = computed(() => {\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' });\n const weekBase = startOfWeek(new Date(2024, 0, 7), props.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) =>\n formatter.format(addDays(weekBase, index)),\n );\n});\n\nconst isDateDisabled = (date: Date) => {\n if (props.disabled) {\n return true;\n }\n\n if (minDate.value && date < minDate.value) {\n return true;\n }\n\n if (maxDate.value && date > maxDate.value) {\n return true;\n }\n\n return false;\n};\n\nconst syncCalendarView = (date: Date) => {\n focusedDate.value = startOfDay(date);\n viewMonth.value = startOfMonth(date);\n};\n\nwatch(\n selectedDate,\n (value) => {\n if (value) {\n syncCalendarView(value);\n return;\n }\n\n if (!isOpen.value) {\n syncCalendarView(today);\n }\n },\n { immediate: true },\n);\n\nconst cells = computed(() => {\n const startDate = startOfWeek(startOfMonth(viewMonth.value), props.weekStartsOn);\n\n return Array.from({ length: 6 }, (_, weekIndex) =>\n Array.from({ length: 7 }, (_, dayIndex) => {\n const date = addDays(startDate, weekIndex * 7 + dayIndex);\n const key = toDateValue(date);\n\n return {\n date,\n dayLabel: date.getDate(),\n disabled: isDateDisabled(date),\n inMonth: date.getMonth() === viewMonth.value.getMonth(),\n isFocused: isSameDay(date, focusedDate.value),\n isSelected: isSameDay(date, selectedDate.value),\n isToday: isSameDay(date, today),\n key,\n } satisfies CalendarCell;\n }),\n );\n});\n\nconst canMovePrev = computed(() => {\n if (!minDate.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) > startOfMonth(minDate.value);\n});\n\nconst canMoveNext = computed(() => {\n if (!maxDate.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) < startOfMonth(maxDate.value);\n});\n\nconst focusCurrentDay = () => {\n const key = toDateValue(focusedDate.value);\n nextTick(() => {\n dayRefs.get(key)?.focus();\n });\n};\n\nconst setDayRef = (\n element: Element | ComponentPublicInstance | null,\n key: string,\n) => {\n if (element instanceof HTMLButtonElement) {\n dayRefs.set(key, element);\n return;\n }\n\n dayRefs.delete(key);\n};\n\nconst openCalendar = () => {\n if (props.disabled) {\n return;\n }\n\n syncCalendarView(selectedDate.value ?? focusedDate.value ?? today);\n setValue(true);\n focusCurrentDay();\n};\n\nconst closeCalendar = (restoreFocus = false) => {\n setValue(false);\n\n if (restoreFocus) {\n nextTick(() => {\n triggerRef.value?.focus();\n });\n }\n};\n\nconst toggleCalendar = () => {\n if (isOpen.value) {\n closeCalendar();\n return;\n }\n\n openCalendar();\n};\n\nconst moveCalendar = (direction: 1 | -1) => {\n const nextMonth = addMonths(viewMonth.value, direction);\n syncCalendarView(nextMonth);\n focusCurrentDay();\n};\n\nconst moveFocus = (nextDate: Date) => {\n if (isDateDisabled(nextDate)) {\n return;\n }\n\n syncCalendarView(nextDate);\n focusCurrentDay();\n};\n\nconst selectDate = (date: Date) => {\n if (isDateDisabled(date)) {\n return;\n }\n\n const normalizedDate = startOfDay(date);\n const value = toDateValue(normalizedDate);\n\n syncCalendarView(normalizedDate);\n emit('update:modelValue', value);\n emit('select', value);\n closeCalendar(true);\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) {\n return;\n }\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closeCalendar();\n return;\n }\n\n if (\n isActivationKey(event) ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n event.preventDefault();\n openCalendar();\n }\n};\n\nconst onDayKeydown = (event: KeyboardEvent, date: Date) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closeCalendar(true);\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectDate(date);\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(addDays(date, -1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(addDays(date, 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(addDays(date, -7));\n break;\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(addDays(date, 7));\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(startOfWeek(date, props.weekStartsOn));\n break;\n case 'End':\n event.preventDefault();\n moveFocus(addDays(startOfWeek(date, props.weekStartsOn), 6));\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? -12 : -1));\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? 12 : 1));\n break;\n default:\n break;\n }\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (rootRef.value?.contains(target)) {\n return;\n }\n\n closeCalendar();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <input\n v-if=\"hiddenInputName\"\n type=\"hidden\"\n :name=\"hiddenInputName\"\n :value=\"modelValue\"\n >\n <button\n ref=\"triggerRef\"\n v-bind=\"triggerAttrs\"\n type=\"button\"\n class=\"t-date-picker__trigger\"\n :disabled=\"disabled\"\n :aria-controls=\"isOpen ? calendarId : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-invalid=\"invalid || undefined\"\n @click=\"toggleCalendar\"\n @keydown=\"onTriggerKeydown\"\n >\n <span\n v-if=\"$slots.prefix\"\n class=\"t-date-picker__slot t-date-picker__slot--prefix\"\n >\n <slot name=\"prefix\" />\n </span>\n <span\n class=\"t-date-picker__value\"\n :data-placeholder=\"selectedDate ? undefined : true\"\n >\n {{ triggerText }}\n </span>\n <span class=\"t-date-picker__slot t-date-picker__slot--suffix\">\n <slot name=\"suffix\">\n <CalendarIcon v-bind=\"treeIconDefaults\" />\n </slot>\n </span>\n </button>\n\n <transition name=\"t-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"calendarId\"\n class=\"t-date-picker__content\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-labelledby=\"captionId\"\n >\n <div class=\"t-date-picker__header\">\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMovePrev\"\n aria-label=\"Previous month\"\n @click=\"moveCalendar(-1)\"\n >\n <ChevronLeftIcon v-bind=\"treeIconDefaults\" />\n </button>\n <p\n :id=\"captionId\"\n class=\"t-date-picker__month\"\n >\n {{ monthLabel }}\n </p>\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMoveNext\"\n aria-label=\"Next month\"\n @click=\"moveCalendar(1)\"\n >\n <ChevronRightIcon v-bind=\"treeIconDefaults\" />\n </button>\n </div>\n\n <div\n class=\"t-date-picker__weekdays\"\n aria-hidden=\"true\"\n >\n <span\n v-for=\"label in weekdayLabels\"\n :key=\"label\"\n class=\"t-date-picker__weekday\"\n >\n {{ label }}\n </span>\n </div>\n\n <div\n class=\"t-date-picker__grid\"\n role=\"grid\"\n :aria-labelledby=\"captionId\"\n >\n <div\n v-for=\"(week, weekIndex) in cells\"\n :key=\"weekIndex\"\n class=\"t-date-picker__row\"\n role=\"row\"\n >\n <div\n v-for=\"cell in week\"\n :key=\"cell.key\"\n class=\"t-date-picker__cell\"\n role=\"gridcell\"\n :aria-selected=\"cell.isSelected\"\n >\n <button\n :ref=\"(element) => setDayRef(element, cell.key)\"\n type=\"button\"\n class=\"t-date-picker__day\"\n :class=\"{\n 'is-muted': !cell.inMonth,\n 'is-selected': cell.isSelected,\n 'is-today': cell.isToday,\n }\"\n :data-date=\"cell.key\"\n :disabled=\"cell.disabled\"\n :tabindex=\"cell.isFocused ? 0 : -1\"\n :aria-current=\"cell.isToday ? 'date' : undefined\"\n :aria-label=\"cell.key\"\n @click=\"selectDate(cell.date)\"\n @keydown=\"onDayKeydown($event, cell.date)\"\n >\n {{ cell.dayLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=require("./TDateTimePicker.vue_vue_type_script_setup_true_lang.cjs").default;exports.default=e;
2
+ //# sourceMappingURL=TDateTimePicker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDateTimePicker.cjs","names":[],"sources":["../../src/components/TDateTimePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n addDays,\n addMonths,\n createId,\n isActivationKey,\n isEscapeKey,\n isSameDay,\n startOfDay,\n startOfMonth,\n startOfWeek,\n toDateValue,\n} from '@treeui/utils';\nimport { getTreeIcon, treeIconDefaults } from '@treeui/icons';\nimport {\n type ComponentPublicInstance,\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n toRef,\n useAttrs,\n watch,\n} from 'vue';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize } from '../types/contracts';\nimport TSpinner from './TSpinner.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ninterface CalendarCell {\n date: Date;\n dayLabel: number;\n disabled: boolean;\n inMonth: boolean;\n isFocused: boolean;\n isSelected: boolean;\n isToday: boolean;\n key: string;\n}\n\ninterface TimeOption {\n disabled: boolean;\n label: string;\n value: number;\n}\n\nconst CalendarIcon = getTreeIcon('calendar');\nconst ChevronLeftIcon = getTreeIcon('chevron-left');\nconst ChevronRightIcon = getTreeIcon('chevron-right');\n\nconst dateOnlyPattern = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst dateTimePattern = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/;\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n open?: boolean;\n defaultOpen?: boolean;\n size?: TSize;\n disabled?: boolean;\n loading?: boolean;\n invalid?: boolean;\n placeholder?: string;\n locale?: string;\n min?: string;\n max?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n id?: string;\n step?: number;\n }>(),\n {\n modelValue: '',\n open: undefined,\n defaultOpen: false,\n size: 'md',\n disabled: false,\n loading: false,\n invalid: false,\n placeholder: 'Select date and time',\n locale: 'en-US',\n min: '',\n max: '',\n weekStartsOn: 0,\n id: undefined,\n step: 60,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n change: [value: string];\n select: [value: string];\n}>();\n\nconst attrs = useAttrs();\n\nconst cloneDate = (value: Date) => new Date(value.getTime());\n\nconst formatPart = (value: number) => `${value}`.padStart(2, '0');\n\nconst endOfDay = (date: Date) =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n\nconst parseBoundaryValue = (\n value: string | null | undefined,\n boundary: 'exact' | 'start' | 'end' = 'exact',\n) => {\n if (!value) {\n return null;\n }\n\n const dateOnlyMatch = value.match(dateOnlyPattern);\n if (dateOnlyMatch) {\n const [, yearToken, monthToken, dayToken] = dateOnlyMatch;\n const year = Number.parseInt(yearToken, 10);\n const month = Number.parseInt(monthToken, 10);\n const day = Number.parseInt(dayToken, 10);\n const hour = boundary === 'end' ? 23 : 0;\n const minute = boundary === 'end' ? 59 : 0;\n const second = boundary === 'end' ? 59 : 0;\n const millisecond = boundary === 'end' ? 999 : 0;\n const date = new Date(year, month - 1, day, hour, minute, second, millisecond);\n\n if (\n Number.isNaN(date.getTime()) ||\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return date;\n }\n\n const dateTimeMatch = value.match(dateTimePattern);\n if (!dateTimeMatch) {\n return null;\n }\n\n const [, yearToken, monthToken, dayToken, hourToken, minuteToken, secondToken] =\n dateTimeMatch;\n const year = Number.parseInt(yearToken, 10);\n const month = Number.parseInt(monthToken, 10);\n const day = Number.parseInt(dayToken, 10);\n const hour = Number.parseInt(hourToken, 10);\n const minute = Number.parseInt(minuteToken, 10);\n const second = secondToken ? Number.parseInt(secondToken, 10) : 0;\n const date = new Date(year, month - 1, day, hour, minute, second, 0);\n\n if (\n Number.isNaN(date.getTime()) ||\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day ||\n date.getHours() !== hour ||\n date.getMinutes() !== minute ||\n date.getSeconds() !== second\n ) {\n return null;\n }\n\n return date;\n};\n\nconst toDateTimeValue = (date: Date) =>\n `${toDateValue(date)}T${formatPart(date.getHours())}:${formatPart(date.getMinutes())}`;\n\nconst setDatePart = (source: Date, targetDate: Date) =>\n new Date(\n targetDate.getFullYear(),\n targetDate.getMonth(),\n targetDate.getDate(),\n source.getHours(),\n source.getMinutes(),\n 0,\n 0,\n );\n\nconst setTimePart = (source: Date, hour: number, minute: number) =>\n new Date(\n source.getFullYear(),\n source.getMonth(),\n source.getDate(),\n hour,\n minute,\n 0,\n 0,\n );\n\nconst resolveMinuteStep = (step: number) => {\n if (!Number.isFinite(step) || step <= 0 || step % 60 !== 0) {\n return 1;\n }\n\n const minuteStep = step / 60;\n return minuteStep >= 60 ? 1 : minuteStep;\n};\n\nconst today = startOfDay(new Date());\nconst selectedDateTime = computed(() => parseBoundaryValue(props.modelValue, 'exact'));\nconst minDateTime = computed(() => parseBoundaryValue(props.min, 'start'));\nconst maxDateTime = computed(() => parseBoundaryValue(props.max, 'end'));\nconst pickerId = props.id ?? createId('t-date-time-picker');\nconst captionId = `${pickerId}-caption`;\nconst rootRef = ref<HTMLElement | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst dayRefs = new Map<string, HTMLButtonElement>();\n\nconst clampToRange = (value: Date) => {\n let nextValue = cloneDate(value);\n\n if (minDateTime.value && nextValue < minDateTime.value) {\n nextValue = cloneDate(minDateTime.value);\n }\n\n if (maxDateTime.value && nextValue > maxDateTime.value) {\n nextValue = cloneDate(maxDateTime.value);\n }\n\n return nextValue;\n};\n\nconst createDefaultDraftDateTime = () => {\n const reference = new Date();\n const stepMilliseconds = Math.max(props.step, 60) * 1000;\n const rounded = new Date(Math.ceil(reference.getTime() / stepMilliseconds) * stepMilliseconds);\n\n rounded.setSeconds(0, 0);\n return clampToRange(rounded);\n};\n\nconst initialDateTime = selectedDateTime.value ?? createDefaultDraftDateTime();\nconst draftDateTime = ref(initialDateTime);\nconst focusedDate = ref(startOfDay(initialDateTime));\nconst viewMonth = ref(startOfMonth(initialDateTime));\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, name: _name, ...rest } = attrs;\n return rest;\n});\n\nconst hiddenInputName = computed(() =>\n typeof attrs.name === 'string' ? attrs.name : undefined,\n);\n\nconst rootClasses = computed(() => [\n 't-date-picker',\n 't-date-time-picker',\n `t-date-picker--${props.size}`,\n {\n 'is-disabled': props.disabled,\n 'is-invalid': props.invalid,\n 'is-loading': props.loading,\n 'is-open': isOpen.value,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst triggerText = computed(() => {\n if (!selectedDateTime.value) {\n return props.placeholder;\n }\n\n return new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(selectedDateTime.value);\n});\n\nconst draftPreview = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(draftDateTime.value),\n);\n\nconst monthLabel = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth.value),\n);\n\nconst weekdayLabels = computed(() => {\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' });\n const weekBase = startOfWeek(new Date(2024, 0, 7), props.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) =>\n formatter.format(addDays(weekBase, index)),\n );\n});\n\nconst minuteStep = computed(() => resolveMinuteStep(props.step));\n\nconst minuteValues = computed(() => {\n const values = new Set<number>();\n\n for (let minute = 0; minute < 60; minute += minuteStep.value) {\n values.add(minute);\n }\n\n values.add(draftDateTime.value.getMinutes());\n\n return [...values].sort((left, right) => left - right);\n});\n\nconst isDateDisabled = (date: Date) => {\n if (props.disabled) {\n return true;\n }\n\n const dayStart = startOfDay(date);\n const dayEnd = endOfDay(date);\n\n if (minDateTime.value && dayEnd < minDateTime.value) {\n return true;\n }\n\n if (maxDateTime.value && dayStart > maxDateTime.value) {\n return true;\n }\n\n return false;\n};\n\nconst isDateTimeDisabled = (value: Date) => {\n if (props.disabled) {\n return true;\n }\n\n if (minDateTime.value && value < minDateTime.value) {\n return true;\n }\n\n if (maxDateTime.value && value > maxDateTime.value) {\n return true;\n }\n\n return false;\n};\n\nconst syncCalendarView = (date: Date) => {\n focusedDate.value = startOfDay(date);\n viewMonth.value = startOfMonth(date);\n};\n\nconst syncDraftState = (dateTime: Date) => {\n const nextValue = clampToRange(dateTime);\n draftDateTime.value = nextValue;\n syncCalendarView(nextValue);\n};\n\nwatch(\n selectedDateTime,\n (value) => {\n if (isOpen.value) {\n return;\n }\n\n syncDraftState(value ?? createDefaultDraftDateTime());\n },\n { immediate: true },\n);\n\nconst draftDate = computed(() => startOfDay(draftDateTime.value));\n\nconst cells = computed(() => {\n const startDate = startOfWeek(startOfMonth(viewMonth.value), props.weekStartsOn);\n\n return Array.from({ length: 6 }, (_, weekIndex) =>\n Array.from({ length: 7 }, (_, dayIndex) => {\n const date = addDays(startDate, weekIndex * 7 + dayIndex);\n const key = toDateValue(date);\n\n return {\n date,\n dayLabel: date.getDate(),\n disabled: isDateDisabled(date),\n inMonth: date.getMonth() === viewMonth.value.getMonth(),\n isFocused: isSameDay(date, focusedDate.value),\n isSelected: isSameDay(date, draftDate.value),\n isToday: isSameDay(date, today),\n key,\n } satisfies CalendarCell;\n }),\n );\n});\n\nconst canMovePrev = computed(() => {\n if (!minDateTime.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) > startOfMonth(minDateTime.value);\n});\n\nconst canMoveNext = computed(() => {\n if (!maxDateTime.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) < startOfMonth(maxDateTime.value);\n});\n\nconst isTimeOptionEnabled = (hour: number, minute: number) => {\n const candidate = setTimePart(draftDateTime.value, hour, minute);\n return !isDateTimeDisabled(candidate);\n};\n\nconst hourOptions = computed<TimeOption[]>(() =>\n Array.from({ length: 24 }, (_, hour) => ({\n disabled: !minuteValues.value.some((minute) => isTimeOptionEnabled(hour, minute)),\n label: formatPart(hour),\n value: hour,\n })),\n);\n\nconst minuteOptions = computed<TimeOption[]>(() =>\n minuteValues.value.map((minute) => ({\n disabled: !isTimeOptionEnabled(draftDateTime.value.getHours(), minute),\n label: formatPart(minute),\n value: minute,\n })),\n);\n\nconst focusCurrentDay = () => {\n const key = toDateValue(focusedDate.value);\n nextTick(() => {\n dayRefs.get(key)?.focus();\n });\n};\n\nconst setDayRef = (\n element: Element | ComponentPublicInstance | null,\n key: string,\n) => {\n if (element instanceof HTMLButtonElement) {\n dayRefs.set(key, element);\n return;\n }\n\n dayRefs.delete(key);\n};\n\nconst openCalendar = () => {\n if (props.disabled) {\n return;\n }\n\n syncDraftState(selectedDateTime.value ?? createDefaultDraftDateTime());\n setValue(true);\n focusCurrentDay();\n};\n\nconst closeCalendar = (restoreFocus = false) => {\n setValue(false);\n\n if (restoreFocus) {\n nextTick(() => {\n triggerRef.value?.focus();\n });\n }\n};\n\nconst toggleCalendar = () => {\n if (isOpen.value) {\n closeCalendar();\n return;\n }\n\n openCalendar();\n};\n\nconst moveCalendar = (direction: 1 | -1) => {\n const nextMonth = addMonths(viewMonth.value, direction);\n syncCalendarView(nextMonth);\n focusCurrentDay();\n};\n\nconst moveFocus = (nextDate: Date) => {\n if (isDateDisabled(nextDate)) {\n return;\n }\n\n syncCalendarView(nextDate);\n focusCurrentDay();\n};\n\nconst selectDate = (date: Date) => {\n if (isDateDisabled(date)) {\n return;\n }\n\n const candidate = clampToRange(setDatePart(draftDateTime.value, date));\n draftDateTime.value = candidate;\n syncCalendarView(candidate);\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) {\n return;\n }\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closeCalendar();\n return;\n }\n\n if (\n isActivationKey(event) ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n event.preventDefault();\n openCalendar();\n }\n};\n\nconst onDayKeydown = (event: KeyboardEvent, date: Date) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closeCalendar(true);\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectDate(date);\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(addDays(date, -1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(addDays(date, 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(addDays(date, -7));\n break;\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(addDays(date, 7));\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(startOfWeek(date, props.weekStartsOn));\n break;\n case 'End':\n event.preventDefault();\n moveFocus(addDays(startOfWeek(date, props.weekStartsOn), 6));\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? -12 : -1));\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? 12 : 1));\n break;\n default:\n break;\n }\n};\n\nconst updateHour = (event: Event) => {\n const nextHour = Number.parseInt((event.target as HTMLSelectElement).value, 10);\n const currentMinute = draftDateTime.value.getMinutes();\n\n if (Number.isNaN(nextHour)) {\n return;\n }\n\n const availableMinutes = minuteValues.value.filter((minute) =>\n isTimeOptionEnabled(nextHour, minute),\n );\n\n if (!availableMinutes.length) {\n return;\n }\n\n const nextMinute = availableMinutes.includes(currentMinute)\n ? currentMinute\n : availableMinutes[0];\n\n draftDateTime.value = setTimePart(draftDateTime.value, nextHour, nextMinute);\n};\n\nconst updateMinute = (event: Event) => {\n const nextMinute = Number.parseInt((event.target as HTMLSelectElement).value, 10);\n const nextHour = draftDateTime.value.getHours();\n\n if (Number.isNaN(nextMinute) || !isTimeOptionEnabled(nextHour, nextMinute)) {\n return;\n }\n\n draftDateTime.value = setTimePart(draftDateTime.value, nextHour, nextMinute);\n};\n\nconst commitDraft = () => {\n const value = toDateTimeValue(draftDateTime.value);\n\n emit('update:modelValue', value);\n emit('change', value);\n emit('select', value);\n closeCalendar(true);\n};\n\nconst clearSelection = () => {\n emit('update:modelValue', '');\n emit('change', '');\n emit('select', '');\n closeCalendar(true);\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (rootRef.value?.contains(target)) {\n return;\n }\n\n closeCalendar();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <input\n v-if=\"hiddenInputName\"\n type=\"hidden\"\n :name=\"hiddenInputName\"\n :value=\"modelValue\"\n >\n\n <button\n ref=\"triggerRef\"\n v-bind=\"triggerAttrs\"\n type=\"button\"\n class=\"t-date-picker__trigger t-date-time-picker__trigger\"\n :disabled=\"disabled\"\n :aria-controls=\"isOpen ? pickerId : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-invalid=\"invalid || undefined\"\n @click=\"toggleCalendar\"\n @keydown=\"onTriggerKeydown\"\n >\n <span\n v-if=\"$slots.prefix\"\n class=\"t-date-picker__slot t-date-picker__slot--prefix\"\n >\n <slot name=\"prefix\" />\n </span>\n\n <span\n class=\"t-date-picker__value\"\n :data-placeholder=\"selectedDateTime ? undefined : true\"\n >\n {{ triggerText }}\n </span>\n\n <span class=\"t-date-picker__slot t-date-picker__slot--suffix\">\n <slot name=\"suffix\">\n <TSpinner\n v-if=\"loading\"\n size=\"sm\"\n label=\"Loading\"\n />\n <CalendarIcon\n v-else\n v-bind=\"treeIconDefaults\"\n />\n </slot>\n </span>\n </button>\n\n <transition name=\"t-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"pickerId\"\n class=\"t-date-picker__content t-date-time-picker__content\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-labelledby=\"captionId\"\n >\n <div class=\"t-date-time-picker__calendar\">\n <div class=\"t-date-picker__header\">\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMovePrev\"\n aria-label=\"Previous month\"\n @click=\"moveCalendar(-1)\"\n >\n <ChevronLeftIcon v-bind=\"treeIconDefaults\" />\n </button>\n\n <p\n :id=\"captionId\"\n class=\"t-date-picker__month\"\n >\n {{ monthLabel }}\n </p>\n\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMoveNext\"\n aria-label=\"Next month\"\n @click=\"moveCalendar(1)\"\n >\n <ChevronRightIcon v-bind=\"treeIconDefaults\" />\n </button>\n </div>\n\n <div\n class=\"t-date-picker__weekdays\"\n aria-hidden=\"true\"\n >\n <span\n v-for=\"label in weekdayLabels\"\n :key=\"label\"\n class=\"t-date-picker__weekday\"\n >\n {{ label }}\n </span>\n </div>\n\n <div\n class=\"t-date-picker__grid\"\n role=\"grid\"\n :aria-labelledby=\"captionId\"\n >\n <div\n v-for=\"(week, weekIndex) in cells\"\n :key=\"weekIndex\"\n class=\"t-date-picker__row\"\n role=\"row\"\n >\n <div\n v-for=\"cell in week\"\n :key=\"cell.key\"\n class=\"t-date-picker__cell\"\n role=\"gridcell\"\n :aria-selected=\"cell.isSelected\"\n >\n <button\n :ref=\"(element) => setDayRef(element, cell.key)\"\n type=\"button\"\n class=\"t-date-picker__day\"\n :class=\"{\n 'is-muted': !cell.inMonth,\n 'is-selected': cell.isSelected,\n 'is-today': cell.isToday,\n }\"\n :data-date=\"cell.key\"\n :tabindex=\"cell.isFocused ? 0 : -1\"\n :disabled=\"cell.disabled\"\n :aria-pressed=\"cell.isSelected\"\n @click=\"selectDate(cell.date)\"\n @keydown=\"onDayKeydown($event, cell.date)\"\n >\n {{ cell.dayLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"t-date-time-picker__summary\">\n <p class=\"t-date-time-picker__eyebrow\">\n Selected slot\n </p>\n <p class=\"t-date-time-picker__summary-value\">\n {{ draftPreview }}\n </p>\n </div>\n\n <div class=\"t-date-time-picker__time\">\n <label class=\"t-date-time-picker__time-field\">\n <span class=\"t-date-time-picker__time-label\">Hour</span>\n <select\n class=\"t-date-time-picker__select\"\n :value=\"draftDateTime.getHours()\"\n aria-label=\"Select hour\"\n @change=\"updateHour\"\n >\n <option\n v-for=\"option in hourOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </label>\n\n <label class=\"t-date-time-picker__time-field\">\n <span class=\"t-date-time-picker__time-label\">Minute</span>\n <select\n class=\"t-date-time-picker__select\"\n :value=\"draftDateTime.getMinutes()\"\n aria-label=\"Select minute\"\n @change=\"updateMinute\"\n >\n <option\n v-for=\"option in minuteOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </label>\n </div>\n\n <div class=\"t-date-time-picker__footer\">\n <button\n type=\"button\"\n class=\"t-button t-button--ghost t-button--sm\"\n @click=\"clearSelection\"\n >\n Clear\n </button>\n <button\n type=\"button\"\n class=\"t-button t-button--solid t-button--sm\"\n @click=\"commitDraft\"\n >\n Apply\n </button>\n </div>\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import e from "./TDateTimePicker.vue_vue_type_script_setup_true_lang.js";
2
+ //#region src/components/TDateTimePicker.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
6
+
7
+ //# sourceMappingURL=TDateTimePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TDateTimePicker.js","names":[],"sources":["../../src/components/TDateTimePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n addDays,\n addMonths,\n createId,\n isActivationKey,\n isEscapeKey,\n isSameDay,\n startOfDay,\n startOfMonth,\n startOfWeek,\n toDateValue,\n} from '@treeui/utils';\nimport { getTreeIcon, treeIconDefaults } from '@treeui/icons';\nimport {\n type ComponentPublicInstance,\n computed,\n nextTick,\n onBeforeUnmount,\n ref,\n toRef,\n useAttrs,\n watch,\n} from 'vue';\nimport { useControllableOpen } from '../composables/useControllableOpen';\nimport type { TSize } from '../types/contracts';\nimport TSpinner from './TSpinner.vue';\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ninterface CalendarCell {\n date: Date;\n dayLabel: number;\n disabled: boolean;\n inMonth: boolean;\n isFocused: boolean;\n isSelected: boolean;\n isToday: boolean;\n key: string;\n}\n\ninterface TimeOption {\n disabled: boolean;\n label: string;\n value: number;\n}\n\nconst CalendarIcon = getTreeIcon('calendar');\nconst ChevronLeftIcon = getTreeIcon('chevron-left');\nconst ChevronRightIcon = getTreeIcon('chevron-right');\n\nconst dateOnlyPattern = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst dateTimePattern = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?$/;\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string;\n open?: boolean;\n defaultOpen?: boolean;\n size?: TSize;\n disabled?: boolean;\n loading?: boolean;\n invalid?: boolean;\n placeholder?: string;\n locale?: string;\n min?: string;\n max?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n id?: string;\n step?: number;\n }>(),\n {\n modelValue: '',\n open: undefined,\n defaultOpen: false,\n size: 'md',\n disabled: false,\n loading: false,\n invalid: false,\n placeholder: 'Select date and time',\n locale: 'en-US',\n min: '',\n max: '',\n weekStartsOn: 0,\n id: undefined,\n step: 60,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n 'update:open': [value: boolean];\n 'open-change': [value: boolean];\n change: [value: string];\n select: [value: string];\n}>();\n\nconst attrs = useAttrs();\n\nconst cloneDate = (value: Date) => new Date(value.getTime());\n\nconst formatPart = (value: number) => `${value}`.padStart(2, '0');\n\nconst endOfDay = (date: Date) =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n\nconst parseBoundaryValue = (\n value: string | null | undefined,\n boundary: 'exact' | 'start' | 'end' = 'exact',\n) => {\n if (!value) {\n return null;\n }\n\n const dateOnlyMatch = value.match(dateOnlyPattern);\n if (dateOnlyMatch) {\n const [, yearToken, monthToken, dayToken] = dateOnlyMatch;\n const year = Number.parseInt(yearToken, 10);\n const month = Number.parseInt(monthToken, 10);\n const day = Number.parseInt(dayToken, 10);\n const hour = boundary === 'end' ? 23 : 0;\n const minute = boundary === 'end' ? 59 : 0;\n const second = boundary === 'end' ? 59 : 0;\n const millisecond = boundary === 'end' ? 999 : 0;\n const date = new Date(year, month - 1, day, hour, minute, second, millisecond);\n\n if (\n Number.isNaN(date.getTime()) ||\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day\n ) {\n return null;\n }\n\n return date;\n }\n\n const dateTimeMatch = value.match(dateTimePattern);\n if (!dateTimeMatch) {\n return null;\n }\n\n const [, yearToken, monthToken, dayToken, hourToken, minuteToken, secondToken] =\n dateTimeMatch;\n const year = Number.parseInt(yearToken, 10);\n const month = Number.parseInt(monthToken, 10);\n const day = Number.parseInt(dayToken, 10);\n const hour = Number.parseInt(hourToken, 10);\n const minute = Number.parseInt(minuteToken, 10);\n const second = secondToken ? Number.parseInt(secondToken, 10) : 0;\n const date = new Date(year, month - 1, day, hour, minute, second, 0);\n\n if (\n Number.isNaN(date.getTime()) ||\n date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day ||\n date.getHours() !== hour ||\n date.getMinutes() !== minute ||\n date.getSeconds() !== second\n ) {\n return null;\n }\n\n return date;\n};\n\nconst toDateTimeValue = (date: Date) =>\n `${toDateValue(date)}T${formatPart(date.getHours())}:${formatPart(date.getMinutes())}`;\n\nconst setDatePart = (source: Date, targetDate: Date) =>\n new Date(\n targetDate.getFullYear(),\n targetDate.getMonth(),\n targetDate.getDate(),\n source.getHours(),\n source.getMinutes(),\n 0,\n 0,\n );\n\nconst setTimePart = (source: Date, hour: number, minute: number) =>\n new Date(\n source.getFullYear(),\n source.getMonth(),\n source.getDate(),\n hour,\n minute,\n 0,\n 0,\n );\n\nconst resolveMinuteStep = (step: number) => {\n if (!Number.isFinite(step) || step <= 0 || step % 60 !== 0) {\n return 1;\n }\n\n const minuteStep = step / 60;\n return minuteStep >= 60 ? 1 : minuteStep;\n};\n\nconst today = startOfDay(new Date());\nconst selectedDateTime = computed(() => parseBoundaryValue(props.modelValue, 'exact'));\nconst minDateTime = computed(() => parseBoundaryValue(props.min, 'start'));\nconst maxDateTime = computed(() => parseBoundaryValue(props.max, 'end'));\nconst pickerId = props.id ?? createId('t-date-time-picker');\nconst captionId = `${pickerId}-caption`;\nconst rootRef = ref<HTMLElement | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst dayRefs = new Map<string, HTMLButtonElement>();\n\nconst clampToRange = (value: Date) => {\n let nextValue = cloneDate(value);\n\n if (minDateTime.value && nextValue < minDateTime.value) {\n nextValue = cloneDate(minDateTime.value);\n }\n\n if (maxDateTime.value && nextValue > maxDateTime.value) {\n nextValue = cloneDate(maxDateTime.value);\n }\n\n return nextValue;\n};\n\nconst createDefaultDraftDateTime = () => {\n const reference = new Date();\n const stepMilliseconds = Math.max(props.step, 60) * 1000;\n const rounded = new Date(Math.ceil(reference.getTime() / stepMilliseconds) * stepMilliseconds);\n\n rounded.setSeconds(0, 0);\n return clampToRange(rounded);\n};\n\nconst initialDateTime = selectedDateTime.value ?? createDefaultDraftDateTime();\nconst draftDateTime = ref(initialDateTime);\nconst focusedDate = ref(startOfDay(initialDateTime));\nconst viewMonth = ref(startOfMonth(initialDateTime));\n\nconst triggerAttrs = computed(() => {\n const { class: _class, style: _style, name: _name, ...rest } = attrs;\n return rest;\n});\n\nconst hiddenInputName = computed(() =>\n typeof attrs.name === 'string' ? attrs.name : undefined,\n);\n\nconst rootClasses = computed(() => [\n 't-date-picker',\n 't-date-time-picker',\n `t-date-picker--${props.size}`,\n {\n 'is-disabled': props.disabled,\n 'is-invalid': props.invalid,\n 'is-loading': props.loading,\n 'is-open': isOpen.value,\n },\n attrs.class,\n]);\n\nconst rootStyle = computed(() => attrs.style);\n\nconst { value: isOpen, setValue } = useControllableOpen(\n toRef(props, 'open'),\n props.defaultOpen,\n (value) => {\n emit('update:open', value);\n emit('open-change', value);\n },\n);\n\nconst triggerText = computed(() => {\n if (!selectedDateTime.value) {\n return props.placeholder;\n }\n\n return new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(selectedDateTime.value);\n});\n\nconst draftPreview = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(draftDateTime.value),\n);\n\nconst monthLabel = computed(() =>\n new Intl.DateTimeFormat(props.locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth.value),\n);\n\nconst weekdayLabels = computed(() => {\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' });\n const weekBase = startOfWeek(new Date(2024, 0, 7), props.weekStartsOn);\n\n return Array.from({ length: 7 }, (_, index) =>\n formatter.format(addDays(weekBase, index)),\n );\n});\n\nconst minuteStep = computed(() => resolveMinuteStep(props.step));\n\nconst minuteValues = computed(() => {\n const values = new Set<number>();\n\n for (let minute = 0; minute < 60; minute += minuteStep.value) {\n values.add(minute);\n }\n\n values.add(draftDateTime.value.getMinutes());\n\n return [...values].sort((left, right) => left - right);\n});\n\nconst isDateDisabled = (date: Date) => {\n if (props.disabled) {\n return true;\n }\n\n const dayStart = startOfDay(date);\n const dayEnd = endOfDay(date);\n\n if (minDateTime.value && dayEnd < minDateTime.value) {\n return true;\n }\n\n if (maxDateTime.value && dayStart > maxDateTime.value) {\n return true;\n }\n\n return false;\n};\n\nconst isDateTimeDisabled = (value: Date) => {\n if (props.disabled) {\n return true;\n }\n\n if (minDateTime.value && value < minDateTime.value) {\n return true;\n }\n\n if (maxDateTime.value && value > maxDateTime.value) {\n return true;\n }\n\n return false;\n};\n\nconst syncCalendarView = (date: Date) => {\n focusedDate.value = startOfDay(date);\n viewMonth.value = startOfMonth(date);\n};\n\nconst syncDraftState = (dateTime: Date) => {\n const nextValue = clampToRange(dateTime);\n draftDateTime.value = nextValue;\n syncCalendarView(nextValue);\n};\n\nwatch(\n selectedDateTime,\n (value) => {\n if (isOpen.value) {\n return;\n }\n\n syncDraftState(value ?? createDefaultDraftDateTime());\n },\n { immediate: true },\n);\n\nconst draftDate = computed(() => startOfDay(draftDateTime.value));\n\nconst cells = computed(() => {\n const startDate = startOfWeek(startOfMonth(viewMonth.value), props.weekStartsOn);\n\n return Array.from({ length: 6 }, (_, weekIndex) =>\n Array.from({ length: 7 }, (_, dayIndex) => {\n const date = addDays(startDate, weekIndex * 7 + dayIndex);\n const key = toDateValue(date);\n\n return {\n date,\n dayLabel: date.getDate(),\n disabled: isDateDisabled(date),\n inMonth: date.getMonth() === viewMonth.value.getMonth(),\n isFocused: isSameDay(date, focusedDate.value),\n isSelected: isSameDay(date, draftDate.value),\n isToday: isSameDay(date, today),\n key,\n } satisfies CalendarCell;\n }),\n );\n});\n\nconst canMovePrev = computed(() => {\n if (!minDateTime.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) > startOfMonth(minDateTime.value);\n});\n\nconst canMoveNext = computed(() => {\n if (!maxDateTime.value) {\n return true;\n }\n\n return startOfMonth(viewMonth.value) < startOfMonth(maxDateTime.value);\n});\n\nconst isTimeOptionEnabled = (hour: number, minute: number) => {\n const candidate = setTimePart(draftDateTime.value, hour, minute);\n return !isDateTimeDisabled(candidate);\n};\n\nconst hourOptions = computed<TimeOption[]>(() =>\n Array.from({ length: 24 }, (_, hour) => ({\n disabled: !minuteValues.value.some((minute) => isTimeOptionEnabled(hour, minute)),\n label: formatPart(hour),\n value: hour,\n })),\n);\n\nconst minuteOptions = computed<TimeOption[]>(() =>\n minuteValues.value.map((minute) => ({\n disabled: !isTimeOptionEnabled(draftDateTime.value.getHours(), minute),\n label: formatPart(minute),\n value: minute,\n })),\n);\n\nconst focusCurrentDay = () => {\n const key = toDateValue(focusedDate.value);\n nextTick(() => {\n dayRefs.get(key)?.focus();\n });\n};\n\nconst setDayRef = (\n element: Element | ComponentPublicInstance | null,\n key: string,\n) => {\n if (element instanceof HTMLButtonElement) {\n dayRefs.set(key, element);\n return;\n }\n\n dayRefs.delete(key);\n};\n\nconst openCalendar = () => {\n if (props.disabled) {\n return;\n }\n\n syncDraftState(selectedDateTime.value ?? createDefaultDraftDateTime());\n setValue(true);\n focusCurrentDay();\n};\n\nconst closeCalendar = (restoreFocus = false) => {\n setValue(false);\n\n if (restoreFocus) {\n nextTick(() => {\n triggerRef.value?.focus();\n });\n }\n};\n\nconst toggleCalendar = () => {\n if (isOpen.value) {\n closeCalendar();\n return;\n }\n\n openCalendar();\n};\n\nconst moveCalendar = (direction: 1 | -1) => {\n const nextMonth = addMonths(viewMonth.value, direction);\n syncCalendarView(nextMonth);\n focusCurrentDay();\n};\n\nconst moveFocus = (nextDate: Date) => {\n if (isDateDisabled(nextDate)) {\n return;\n }\n\n syncCalendarView(nextDate);\n focusCurrentDay();\n};\n\nconst selectDate = (date: Date) => {\n if (isDateDisabled(date)) {\n return;\n }\n\n const candidate = clampToRange(setDatePart(draftDateTime.value, date));\n draftDateTime.value = candidate;\n syncCalendarView(candidate);\n};\n\nconst onTriggerKeydown = (event: KeyboardEvent) => {\n if (props.disabled) {\n return;\n }\n\n if (isEscapeKey(event) && isOpen.value) {\n event.preventDefault();\n closeCalendar();\n return;\n }\n\n if (\n isActivationKey(event) ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp'\n ) {\n event.preventDefault();\n openCalendar();\n }\n};\n\nconst onDayKeydown = (event: KeyboardEvent, date: Date) => {\n if (isEscapeKey(event)) {\n event.preventDefault();\n closeCalendar(true);\n return;\n }\n\n if (isActivationKey(event)) {\n event.preventDefault();\n selectDate(date);\n return;\n }\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n moveFocus(addDays(date, -1));\n break;\n case 'ArrowRight':\n event.preventDefault();\n moveFocus(addDays(date, 1));\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(addDays(date, -7));\n break;\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(addDays(date, 7));\n break;\n case 'Home':\n event.preventDefault();\n moveFocus(startOfWeek(date, props.weekStartsOn));\n break;\n case 'End':\n event.preventDefault();\n moveFocus(addDays(startOfWeek(date, props.weekStartsOn), 6));\n break;\n case 'PageUp':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? -12 : -1));\n break;\n case 'PageDown':\n event.preventDefault();\n moveFocus(addMonths(date, event.shiftKey ? 12 : 1));\n break;\n default:\n break;\n }\n};\n\nconst updateHour = (event: Event) => {\n const nextHour = Number.parseInt((event.target as HTMLSelectElement).value, 10);\n const currentMinute = draftDateTime.value.getMinutes();\n\n if (Number.isNaN(nextHour)) {\n return;\n }\n\n const availableMinutes = minuteValues.value.filter((minute) =>\n isTimeOptionEnabled(nextHour, minute),\n );\n\n if (!availableMinutes.length) {\n return;\n }\n\n const nextMinute = availableMinutes.includes(currentMinute)\n ? currentMinute\n : availableMinutes[0];\n\n draftDateTime.value = setTimePart(draftDateTime.value, nextHour, nextMinute);\n};\n\nconst updateMinute = (event: Event) => {\n const nextMinute = Number.parseInt((event.target as HTMLSelectElement).value, 10);\n const nextHour = draftDateTime.value.getHours();\n\n if (Number.isNaN(nextMinute) || !isTimeOptionEnabled(nextHour, nextMinute)) {\n return;\n }\n\n draftDateTime.value = setTimePart(draftDateTime.value, nextHour, nextMinute);\n};\n\nconst commitDraft = () => {\n const value = toDateTimeValue(draftDateTime.value);\n\n emit('update:modelValue', value);\n emit('change', value);\n emit('select', value);\n closeCalendar(true);\n};\n\nconst clearSelection = () => {\n emit('update:modelValue', '');\n emit('change', '');\n emit('select', '');\n closeCalendar(true);\n};\n\nconst onDocumentPointerDown = (event: PointerEvent) => {\n if (!isOpen.value) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (rootRef.value?.contains(target)) {\n return;\n }\n\n closeCalendar();\n};\n\nwatch(isOpen, (value) => {\n if (value) {\n document.addEventListener('pointerdown', onDocumentPointerDown);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointerDown);\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"rootClasses\"\n :style=\"rootStyle\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n >\n <input\n v-if=\"hiddenInputName\"\n type=\"hidden\"\n :name=\"hiddenInputName\"\n :value=\"modelValue\"\n >\n\n <button\n ref=\"triggerRef\"\n v-bind=\"triggerAttrs\"\n type=\"button\"\n class=\"t-date-picker__trigger t-date-time-picker__trigger\"\n :disabled=\"disabled\"\n :aria-controls=\"isOpen ? pickerId : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-invalid=\"invalid || undefined\"\n @click=\"toggleCalendar\"\n @keydown=\"onTriggerKeydown\"\n >\n <span\n v-if=\"$slots.prefix\"\n class=\"t-date-picker__slot t-date-picker__slot--prefix\"\n >\n <slot name=\"prefix\" />\n </span>\n\n <span\n class=\"t-date-picker__value\"\n :data-placeholder=\"selectedDateTime ? undefined : true\"\n >\n {{ triggerText }}\n </span>\n\n <span class=\"t-date-picker__slot t-date-picker__slot--suffix\">\n <slot name=\"suffix\">\n <TSpinner\n v-if=\"loading\"\n size=\"sm\"\n label=\"Loading\"\n />\n <CalendarIcon\n v-else\n v-bind=\"treeIconDefaults\"\n />\n </slot>\n </span>\n </button>\n\n <transition name=\"t-fade\">\n <div\n v-if=\"isOpen && !disabled\"\n :id=\"pickerId\"\n class=\"t-date-picker__content t-date-time-picker__content\"\n role=\"dialog\"\n aria-modal=\"false\"\n :aria-labelledby=\"captionId\"\n >\n <div class=\"t-date-time-picker__calendar\">\n <div class=\"t-date-picker__header\">\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMovePrev\"\n aria-label=\"Previous month\"\n @click=\"moveCalendar(-1)\"\n >\n <ChevronLeftIcon v-bind=\"treeIconDefaults\" />\n </button>\n\n <p\n :id=\"captionId\"\n class=\"t-date-picker__month\"\n >\n {{ monthLabel }}\n </p>\n\n <button\n type=\"button\"\n class=\"t-date-picker__nav\"\n :disabled=\"!canMoveNext\"\n aria-label=\"Next month\"\n @click=\"moveCalendar(1)\"\n >\n <ChevronRightIcon v-bind=\"treeIconDefaults\" />\n </button>\n </div>\n\n <div\n class=\"t-date-picker__weekdays\"\n aria-hidden=\"true\"\n >\n <span\n v-for=\"label in weekdayLabels\"\n :key=\"label\"\n class=\"t-date-picker__weekday\"\n >\n {{ label }}\n </span>\n </div>\n\n <div\n class=\"t-date-picker__grid\"\n role=\"grid\"\n :aria-labelledby=\"captionId\"\n >\n <div\n v-for=\"(week, weekIndex) in cells\"\n :key=\"weekIndex\"\n class=\"t-date-picker__row\"\n role=\"row\"\n >\n <div\n v-for=\"cell in week\"\n :key=\"cell.key\"\n class=\"t-date-picker__cell\"\n role=\"gridcell\"\n :aria-selected=\"cell.isSelected\"\n >\n <button\n :ref=\"(element) => setDayRef(element, cell.key)\"\n type=\"button\"\n class=\"t-date-picker__day\"\n :class=\"{\n 'is-muted': !cell.inMonth,\n 'is-selected': cell.isSelected,\n 'is-today': cell.isToday,\n }\"\n :data-date=\"cell.key\"\n :tabindex=\"cell.isFocused ? 0 : -1\"\n :disabled=\"cell.disabled\"\n :aria-pressed=\"cell.isSelected\"\n @click=\"selectDate(cell.date)\"\n @keydown=\"onDayKeydown($event, cell.date)\"\n >\n {{ cell.dayLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"t-date-time-picker__summary\">\n <p class=\"t-date-time-picker__eyebrow\">\n Selected slot\n </p>\n <p class=\"t-date-time-picker__summary-value\">\n {{ draftPreview }}\n </p>\n </div>\n\n <div class=\"t-date-time-picker__time\">\n <label class=\"t-date-time-picker__time-field\">\n <span class=\"t-date-time-picker__time-label\">Hour</span>\n <select\n class=\"t-date-time-picker__select\"\n :value=\"draftDateTime.getHours()\"\n aria-label=\"Select hour\"\n @change=\"updateHour\"\n >\n <option\n v-for=\"option in hourOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </label>\n\n <label class=\"t-date-time-picker__time-field\">\n <span class=\"t-date-time-picker__time-label\">Minute</span>\n <select\n class=\"t-date-time-picker__select\"\n :value=\"draftDateTime.getMinutes()\"\n aria-label=\"Select minute\"\n @change=\"updateMinute\"\n >\n <option\n v-for=\"option in minuteOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </label>\n </div>\n\n <div class=\"t-date-time-picker__footer\">\n <button\n type=\"button\"\n class=\"t-button t-button--ghost t-button--sm\"\n @click=\"clearSelection\"\n >\n Clear\n </button>\n <button\n type=\"button\"\n class=\"t-button t-button--solid t-button--sm\"\n @click=\"commitDraft\"\n >\n Apply\n </button>\n </div>\n </div>\n </transition>\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ const e=require("./TSpinner.cjs"),t=require("../composables/useControllableOpen.cjs");let n=require("vue"),r=require("@treeui/utils"),i=require("@treeui/icons");var a=[`data-state`],o=[`name`,`value`],s=[`disabled`,`aria-controls`,`aria-expanded`,`aria-invalid`],c={key:0,class:`t-date-picker__slot t-date-picker__slot--prefix`},l=[`data-placeholder`],u={class:`t-date-picker__slot t-date-picker__slot--suffix`},d=[`id`],f={class:`t-date-time-picker__calendar`},p={class:`t-date-picker__header`},m=[`disabled`],h=[`disabled`],g={class:`t-date-picker__weekdays`,"aria-hidden":`true`},ee=[`aria-selected`],te=[`data-date`,`tabindex`,`disabled`,`aria-pressed`,`onClick`,`onKeydown`],ne={class:`t-date-time-picker__summary`},re={class:`t-date-time-picker__summary-value`},ie={class:`t-date-time-picker__time`},ae={class:`t-date-time-picker__time-field`},oe=[`value`],se=[`value`,`disabled`],ce={class:`t-date-time-picker__time-field`},le=[`value`],ue=[`value`,`disabled`],_=(0,n.defineComponent)({inheritAttrs:!1,__name:`TDateTimePicker`,props:{modelValue:{default:``},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean,default:!1},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},invalid:{type:Boolean,default:!1},placeholder:{default:`Select date and time`},locale:{default:`en-US`},min:{default:``},max:{default:``},weekStartsOn:{default:0},id:{default:void 0},step:{default:60}},emits:[`update:modelValue`,`update:open`,`open-change`,`change`,`select`],setup(_,{emit:de}){let fe=(0,i.getTreeIcon)(`calendar`),pe=(0,i.getTreeIcon)(`chevron-left`),me=(0,i.getTreeIcon)(`chevron-right`),he=/^(\d{4})-(\d{2})-(\d{2})$/,ge=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/,v=_,y=de,b=(0,n.useAttrs)(),x=e=>new Date(e.getTime()),S=e=>`${e}`.padStart(2,`0`),_e=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999),C=(e,t=`exact`)=>{if(!e)return null;let n=e.match(he);if(n){let[,e,r,i]=n,a=Number.parseInt(e,10),o=Number.parseInt(r,10),s=Number.parseInt(i,10),c=t===`end`?23:0,l=t===`end`?59:0,u=t===`end`?59:0,d=t===`end`?999:0,f=new Date(a,o-1,s,c,l,u,d);return Number.isNaN(f.getTime())||f.getFullYear()!==a||f.getMonth()!==o-1||f.getDate()!==s?null:f}let r=e.match(ge);if(!r)return null;let[,i,a,o,s,c,l]=r,u=Number.parseInt(i,10),d=Number.parseInt(a,10),f=Number.parseInt(o,10),p=Number.parseInt(s,10),m=Number.parseInt(c,10),h=l?Number.parseInt(l,10):0,g=new Date(u,d-1,f,p,m,h,0);return Number.isNaN(g.getTime())||g.getFullYear()!==u||g.getMonth()!==d-1||g.getDate()!==f||g.getHours()!==p||g.getMinutes()!==m||g.getSeconds()!==h?null:g},ve=e=>`${(0,r.toDateValue)(e)}T${S(e.getHours())}:${S(e.getMinutes())}`,ye=(e,t)=>new Date(t.getFullYear(),t.getMonth(),t.getDate(),e.getHours(),e.getMinutes(),0,0),w=(e,t,n)=>new Date(e.getFullYear(),e.getMonth(),e.getDate(),t,n,0,0),be=e=>{if(!Number.isFinite(e)||e<=0||e%60!=0)return 1;let t=e/60;return t>=60?1:t},xe=(0,r.startOfDay)(new Date),T=(0,n.computed)(()=>C(v.modelValue,`exact`)),E=(0,n.computed)(()=>C(v.min,`start`)),D=(0,n.computed)(()=>C(v.max,`end`)),O=v.id??(0,r.createId)(`t-date-time-picker`),k=`${O}-caption`,A=(0,n.ref)(null),j=(0,n.ref)(null),M=new Map,N=e=>{let t=x(e);return E.value&&t<E.value&&(t=x(E.value)),D.value&&t>D.value&&(t=x(D.value)),t},P=()=>{let e=new Date,t=Math.max(v.step,60)*1e3,n=new Date(Math.ceil(e.getTime()/t)*t);return n.setSeconds(0,0),N(n)},F=T.value??P(),I=(0,n.ref)(F),L=(0,n.ref)((0,r.startOfDay)(F)),R=(0,n.ref)((0,r.startOfMonth)(F)),Se=(0,n.computed)(()=>{let{class:e,style:t,name:n,...r}=b;return r}),z=(0,n.computed)(()=>typeof b.name==`string`?b.name:void 0),Ce=(0,n.computed)(()=>[`t-date-picker`,`t-date-time-picker`,`t-date-picker--${v.size}`,{"is-disabled":v.disabled,"is-invalid":v.invalid,"is-loading":v.loading,"is-open":B.value},b.class]),we=(0,n.computed)(()=>b.style),{value:B,setValue:V}=t.useControllableOpen((0,n.toRef)(v,`open`),v.defaultOpen,e=>{y(`update:open`,e),y(`open-change`,e)}),Te=(0,n.computed)(()=>T.value?new Intl.DateTimeFormat(v.locale,{day:`numeric`,hour:`2-digit`,minute:`2-digit`,month:`long`,year:`numeric`}).format(T.value):v.placeholder),Ee=(0,n.computed)(()=>new Intl.DateTimeFormat(v.locale,{day:`numeric`,hour:`2-digit`,minute:`2-digit`,month:`long`,year:`numeric`}).format(I.value)),De=(0,n.computed)(()=>new Intl.DateTimeFormat(v.locale,{month:`long`,year:`numeric`}).format(R.value)),Oe=(0,n.computed)(()=>{let e=new Intl.DateTimeFormat(v.locale,{weekday:`short`}),t=(0,r.startOfWeek)(new Date(2024,0,7),v.weekStartsOn);return Array.from({length:7},(n,i)=>e.format((0,r.addDays)(t,i)))}),ke=(0,n.computed)(()=>be(v.step)),H=(0,n.computed)(()=>{let e=new Set;for(let t=0;t<60;t+=ke.value)e.add(t);return e.add(I.value.getMinutes()),[...e].sort((e,t)=>e-t)}),U=e=>{if(v.disabled)return!0;let t=(0,r.startOfDay)(e),n=_e(e);return!!(E.value&&n<E.value||D.value&&t>D.value)},Ae=e=>!!(v.disabled||E.value&&e<E.value||D.value&&e>D.value),W=e=>{L.value=(0,r.startOfDay)(e),R.value=(0,r.startOfMonth)(e)},G=e=>{let t=N(e);I.value=t,W(t)};(0,n.watch)(T,e=>{B.value||G(e??P())},{immediate:!0});let je=(0,n.computed)(()=>(0,r.startOfDay)(I.value)),Me=(0,n.computed)(()=>{let e=(0,r.startOfWeek)((0,r.startOfMonth)(R.value),v.weekStartsOn);return Array.from({length:6},(t,n)=>Array.from({length:7},(t,i)=>{let a=(0,r.addDays)(e,n*7+i),o=(0,r.toDateValue)(a);return{date:a,dayLabel:a.getDate(),disabled:U(a),inMonth:a.getMonth()===R.value.getMonth(),isFocused:(0,r.isSameDay)(a,L.value),isSelected:(0,r.isSameDay)(a,je.value),isToday:(0,r.isSameDay)(a,xe),key:o}}))}),Ne=(0,n.computed)(()=>!E.value||(0,r.startOfMonth)(R.value)>(0,r.startOfMonth)(E.value)),Pe=(0,n.computed)(()=>!D.value||(0,r.startOfMonth)(R.value)<(0,r.startOfMonth)(D.value)),K=(e,t)=>{let n=w(I.value,e,t);return!Ae(n)},Fe=(0,n.computed)(()=>Array.from({length:24},(e,t)=>({disabled:!H.value.some(e=>K(t,e)),label:S(t),value:t}))),Ie=(0,n.computed)(()=>H.value.map(e=>({disabled:!K(I.value.getHours(),e),label:S(e),value:e}))),q=()=>{let e=(0,r.toDateValue)(L.value);(0,n.nextTick)(()=>{M.get(e)?.focus()})},Le=(e,t)=>{if(e instanceof HTMLButtonElement){M.set(t,e);return}M.delete(t)},J=()=>{v.disabled||(G(T.value??P()),V(!0),q())},Y=(e=!1)=>{V(!1),e&&(0,n.nextTick)(()=>{j.value?.focus()})},Re=()=>{if(B.value){Y();return}J()},X=e=>{let t=(0,r.addMonths)(R.value,e);W(t),q()},Z=e=>{U(e)||(W(e),q())},Q=e=>{if(U(e))return;let t=N(ye(I.value,e));I.value=t,W(t)},ze=e=>{if(!v.disabled){if((0,r.isEscapeKey)(e)&&B.value){e.preventDefault(),Y();return}((0,r.isActivationKey)(e)||e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),J())}},Be=(e,t)=>{if((0,r.isEscapeKey)(e)){e.preventDefault(),Y(!0);return}if((0,r.isActivationKey)(e)){e.preventDefault(),Q(t);return}switch(e.key){case`ArrowLeft`:e.preventDefault(),Z((0,r.addDays)(t,-1));break;case`ArrowRight`:e.preventDefault(),Z((0,r.addDays)(t,1));break;case`ArrowUp`:e.preventDefault(),Z((0,r.addDays)(t,-7));break;case`ArrowDown`:e.preventDefault(),Z((0,r.addDays)(t,7));break;case`Home`:e.preventDefault(),Z((0,r.startOfWeek)(t,v.weekStartsOn));break;case`End`:e.preventDefault(),Z((0,r.addDays)((0,r.startOfWeek)(t,v.weekStartsOn),6));break;case`PageUp`:e.preventDefault(),Z((0,r.addMonths)(t,e.shiftKey?-12:-1));break;case`PageDown`:e.preventDefault(),Z((0,r.addMonths)(t,e.shiftKey?12:1));break;default:break}},Ve=e=>{let t=Number.parseInt(e.target.value,10),n=I.value.getMinutes();if(Number.isNaN(t))return;let r=H.value.filter(e=>K(t,e));if(!r.length)return;let i=r.includes(n)?n:r[0];I.value=w(I.value,t,i)},He=e=>{let t=Number.parseInt(e.target.value,10),n=I.value.getHours();Number.isNaN(t)||!K(n,t)||(I.value=w(I.value,n,t))},Ue=()=>{let e=ve(I.value);y(`update:modelValue`,e),y(`change`,e),y(`select`,e),Y(!0)},We=()=>{y(`update:modelValue`,``),y(`change`,``),y(`select`,``),Y(!0)},$=e=>{if(!B.value)return;let t=e.target;t instanceof Node&&(A.value?.contains(t)||Y())};return(0,n.watch)(B,e=>{if(e){document.addEventListener(`pointerdown`,$);return}document.removeEventListener(`pointerdown`,$)}),(0,n.onBeforeUnmount)(()=>{document.removeEventListener(`pointerdown`,$)}),(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{ref_key:`rootRef`,ref:A,class:(0,n.normalizeClass)(Ce.value),style:(0,n.normalizeStyle)(we.value),"data-state":(0,n.unref)(B)?`open`:`closed`},[z.value?((0,n.openBlock)(),(0,n.createElementBlock)(`input`,{key:0,type:`hidden`,name:z.value,value:_.modelValue},null,8,o)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`button`,(0,n.mergeProps)({ref_key:`triggerRef`,ref:j},Se.value,{type:`button`,class:`t-date-picker__trigger t-date-time-picker__trigger`,disabled:_.disabled,"aria-controls":(0,n.unref)(B)?(0,n.unref)(O):void 0,"aria-haspopup":`dialog`,"aria-expanded":(0,n.unref)(B),"aria-invalid":_.invalid||void 0,onClick:Re,onKeydown:ze}),[t.$slots.prefix?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,c,[(0,n.renderSlot)(t.$slots,`prefix`)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,{class:`t-date-picker__value`,"data-placeholder":!T.value||void 0},(0,n.toDisplayString)(Te.value),9,l),(0,n.createElementVNode)(`span`,u,[(0,n.renderSlot)(t.$slots,`suffix`,{},()=>[_.loading?((0,n.openBlock)(),(0,n.createBlock)(e.default,{key:0,size:`sm`,label:`Loading`})):((0,n.openBlock)(),(0,n.createBlock)((0,n.unref)(fe),(0,n.normalizeProps)((0,n.mergeProps)({key:1},(0,n.unref)(i.treeIconDefaults))),null,16))])])],16,s),(0,n.createVNode)(n.Transition,{name:`t-fade`},{default:(0,n.withCtx)(()=>[(0,n.unref)(B)&&!_.disabled?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,id:(0,n.unref)(O),class:`t-date-picker__content t-date-time-picker__content`,role:`dialog`,"aria-modal":`false`,"aria-labelledby":k},[(0,n.createElementVNode)(`div`,f,[(0,n.createElementVNode)(`div`,p,[(0,n.createElementVNode)(`button`,{type:`button`,class:`t-date-picker__nav`,disabled:!Ne.value,"aria-label":`Previous month`,onClick:r[0]||=e=>X(-1)},[(0,n.createVNode)((0,n.unref)(pe),(0,n.normalizeProps)((0,n.guardReactiveProps)((0,n.unref)(i.treeIconDefaults))),null,16)],8,m),(0,n.createElementVNode)(`p`,{id:k,class:`t-date-picker__month`},(0,n.toDisplayString)(De.value),1),(0,n.createElementVNode)(`button`,{type:`button`,class:`t-date-picker__nav`,disabled:!Pe.value,"aria-label":`Next month`,onClick:r[1]||=e=>X(1)},[(0,n.createVNode)((0,n.unref)(me),(0,n.normalizeProps)((0,n.guardReactiveProps)((0,n.unref)(i.treeIconDefaults))),null,16)],8,h)]),(0,n.createElementVNode)(`div`,g,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(Oe.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:e,class:`t-date-picker__weekday`},(0,n.toDisplayString)(e),1))),128))]),(0,n.createElementVNode)(`div`,{class:`t-date-picker__grid`,role:`grid`,"aria-labelledby":k},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(Me.value,(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:t,class:`t-date-picker__row`,role:`row`},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:e.key,class:`t-date-picker__cell`,role:`gridcell`,"aria-selected":e.isSelected},[(0,n.createElementVNode)(`button`,{ref_for:!0,ref:t=>Le(t,e.key),type:`button`,class:(0,n.normalizeClass)([`t-date-picker__day`,{"is-muted":!e.inMonth,"is-selected":e.isSelected,"is-today":e.isToday}]),"data-date":e.key,tabindex:e.isFocused?0:-1,disabled:e.disabled,"aria-pressed":e.isSelected,onClick:t=>Q(e.date),onKeydown:t=>Be(t,e.date)},(0,n.toDisplayString)(e.dayLabel),43,te)],8,ee))),128))]))),128))])]),(0,n.createElementVNode)(`div`,ne,[r[2]||=(0,n.createElementVNode)(`p`,{class:`t-date-time-picker__eyebrow`},` Selected slot `,-1),(0,n.createElementVNode)(`p`,re,(0,n.toDisplayString)(Ee.value),1)]),(0,n.createElementVNode)(`div`,ie,[(0,n.createElementVNode)(`label`,ae,[r[3]||=(0,n.createElementVNode)(`span`,{class:`t-date-time-picker__time-label`},`Hour`,-1),(0,n.createElementVNode)(`select`,{class:`t-date-time-picker__select`,value:I.value.getHours(),"aria-label":`Select hour`,onChange:Ve},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(Fe.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`option`,{key:e.value,value:e.value,disabled:e.disabled},(0,n.toDisplayString)(e.label),9,se))),128))],40,oe)]),(0,n.createElementVNode)(`label`,ce,[r[4]||=(0,n.createElementVNode)(`span`,{class:`t-date-time-picker__time-label`},`Minute`,-1),(0,n.createElementVNode)(`select`,{class:`t-date-time-picker__select`,value:I.value.getMinutes(),"aria-label":`Select minute`,onChange:He},[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(Ie.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`option`,{key:e.value,value:e.value,disabled:e.disabled},(0,n.toDisplayString)(e.label),9,ue))),128))],40,le)])]),(0,n.createElementVNode)(`div`,{class:`t-date-time-picker__footer`},[(0,n.createElementVNode)(`button`,{type:`button`,class:`t-button t-button--ghost t-button--sm`,onClick:We},` Clear `),(0,n.createElementVNode)(`button`,{type:`button`,class:`t-button t-button--solid t-button--sm`,onClick:Ue},` Apply `)])],8,d)):(0,n.createCommentVNode)(``,!0)]),_:1})],14,a))}});exports.default=_;
2
+ //# sourceMappingURL=TDateTimePicker.vue_vue_type_script_setup_true_lang.cjs.map