oxy-uni-ui 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/attributes.json +1 -0
  4. package/components/common/AbortablePromise.ts +28 -0
  5. package/components/common/abstracts/_config.scss +7 -0
  6. package/components/common/abstracts/_function.scss +89 -0
  7. package/components/common/abstracts/_mixin.scss +385 -0
  8. package/components/common/abstracts/variable.scss +974 -0
  9. package/components/common/base64.ts +29 -0
  10. package/components/common/canvasHelper.ts +49 -0
  11. package/components/common/clickoutside.ts +25 -0
  12. package/components/common/event.ts +8 -0
  13. package/components/common/interceptor.ts +43 -0
  14. package/components/common/props.ts +51 -0
  15. package/components/common/util.ts +778 -0
  16. package/components/composables/index.ts +11 -0
  17. package/components/composables/useCell.ts +13 -0
  18. package/components/composables/useChildren.ts +113 -0
  19. package/components/composables/useCountDown.ts +138 -0
  20. package/components/composables/useLockScroll.ts +37 -0
  21. package/components/composables/useParent.ts +41 -0
  22. package/components/composables/usePopover.ts +176 -0
  23. package/components/composables/useQueue.ts +52 -0
  24. package/components/composables/useRaf.ts +37 -0
  25. package/components/composables/useTouch.ts +43 -0
  26. package/components/composables/useTranslate.ts +12 -0
  27. package/components/composables/useUpload.ts +364 -0
  28. package/components/oxy-action-sheet/index.scss +204 -0
  29. package/components/oxy-action-sheet/oxy-action-sheet.vue +155 -0
  30. package/components/oxy-action-sheet/types.ts +118 -0
  31. package/components/oxy-backtop/index.scss +25 -0
  32. package/components/oxy-backtop/oxy-backtop.vue +45 -0
  33. package/components/oxy-backtop/types.ts +37 -0
  34. package/components/oxy-badge/index.scss +63 -0
  35. package/components/oxy-badge/oxy-badge.vue +61 -0
  36. package/components/oxy-badge/types.ts +41 -0
  37. package/components/oxy-button/index.scss +336 -0
  38. package/components/oxy-button/oxy-button.vue +195 -0
  39. package/components/oxy-button/types.ts +133 -0
  40. package/components/oxy-calendar/index.scss +158 -0
  41. package/components/oxy-calendar/oxy-calendar.vue +451 -0
  42. package/components/oxy-calendar/types.ts +217 -0
  43. package/components/oxy-calendar-view/index.scss +0 -0
  44. package/components/oxy-calendar-view/month/index.scss +162 -0
  45. package/components/oxy-calendar-view/month/month.vue +389 -0
  46. package/components/oxy-calendar-view/month/types.ts +20 -0
  47. package/components/oxy-calendar-view/monthPanel/index.scss +89 -0
  48. package/components/oxy-calendar-view/monthPanel/month-panel.vue +374 -0
  49. package/components/oxy-calendar-view/monthPanel/types.ts +48 -0
  50. package/components/oxy-calendar-view/oxy-calendar-view.vue +111 -0
  51. package/components/oxy-calendar-view/types.ts +109 -0
  52. package/components/oxy-calendar-view/utils.ts +429 -0
  53. package/components/oxy-calendar-view/year/index.scss +153 -0
  54. package/components/oxy-calendar-view/year/types.ts +20 -0
  55. package/components/oxy-calendar-view/year/year.vue +202 -0
  56. package/components/oxy-calendar-view/yearPanel/index.scss +24 -0
  57. package/components/oxy-calendar-view/yearPanel/types.ts +38 -0
  58. package/components/oxy-calendar-view/yearPanel/year-panel.vue +135 -0
  59. package/components/oxy-card/index.scss +71 -0
  60. package/components/oxy-card/oxy-card.vue +37 -0
  61. package/components/oxy-card/types.ts +30 -0
  62. package/components/oxy-cell/index.scss +206 -0
  63. package/components/oxy-cell/oxy-cell.vue +140 -0
  64. package/components/oxy-cell/types.ts +111 -0
  65. package/components/oxy-cell-group/index.scss +56 -0
  66. package/components/oxy-cell-group/oxy-cell-group.vue +45 -0
  67. package/components/oxy-cell-group/types.ts +32 -0
  68. package/components/oxy-checkbox/index.scss +285 -0
  69. package/components/oxy-checkbox/oxy-checkbox.vue +177 -0
  70. package/components/oxy-checkbox/types.ts +68 -0
  71. package/components/oxy-checkbox-group/index.scss +20 -0
  72. package/components/oxy-checkbox-group/oxy-checkbox-group.vue +100 -0
  73. package/components/oxy-checkbox-group/types.ts +59 -0
  74. package/components/oxy-circle/index.scss +18 -0
  75. package/components/oxy-circle/oxy-circle.vue +296 -0
  76. package/components/oxy-circle/types.ts +54 -0
  77. package/components/oxy-col/index.scss +19 -0
  78. package/components/oxy-col/oxy-col.vue +49 -0
  79. package/components/oxy-col/types.ts +15 -0
  80. package/components/oxy-col-picker/index.scss +168 -0
  81. package/components/oxy-col-picker/oxy-col-picker.vue +498 -0
  82. package/components/oxy-col-picker/types.ts +166 -0
  83. package/components/oxy-collapse/index.scss +55 -0
  84. package/components/oxy-collapse/oxy-collapse.vue +151 -0
  85. package/components/oxy-collapse/types.ts +58 -0
  86. package/components/oxy-collapse-item/index.scss +90 -0
  87. package/components/oxy-collapse-item/oxy-collapse-item.vue +171 -0
  88. package/components/oxy-collapse-item/types.ts +48 -0
  89. package/components/oxy-config-provider/oxy-config-provider.vue +73 -0
  90. package/components/oxy-config-provider/types.ts +1052 -0
  91. package/components/oxy-count-down/index.scss +15 -0
  92. package/components/oxy-count-down/oxy-count-down.vue +60 -0
  93. package/components/oxy-count-down/types.ts +41 -0
  94. package/components/oxy-count-down/utils.ts +52 -0
  95. package/components/oxy-count-to/index.scss +7 -0
  96. package/components/oxy-count-to/oxy-count-to.vue +125 -0
  97. package/components/oxy-count-to/types.ts +117 -0
  98. package/components/oxy-curtain/index.scss +85 -0
  99. package/components/oxy-curtain/oxy-curtain.vue +172 -0
  100. package/components/oxy-curtain/types.ts +73 -0
  101. package/components/oxy-datetime-picker/index.scss +164 -0
  102. package/components/oxy-datetime-picker/oxy-datetime-picker.vue +801 -0
  103. package/components/oxy-datetime-picker/types.ts +231 -0
  104. package/components/oxy-datetime-picker-view/oxy-datetime-picker-view.vue +499 -0
  105. package/components/oxy-datetime-picker-view/types.ts +120 -0
  106. package/components/oxy-datetime-picker-view/util.ts +30 -0
  107. package/components/oxy-design-uni/oxy-design-uni.vue +5 -0
  108. package/components/oxy-divider/index.scss +100 -0
  109. package/components/oxy-divider/oxy-divider.vue +52 -0
  110. package/components/oxy-divider/types.ts +35 -0
  111. package/components/oxy-drop-menu/index.scss +86 -0
  112. package/components/oxy-drop-menu/oxy-drop-menu.vue +166 -0
  113. package/components/oxy-drop-menu/types.ts +38 -0
  114. package/components/oxy-drop-menu-item/index.scss +66 -0
  115. package/components/oxy-drop-menu-item/oxy-drop-menu-item.vue +221 -0
  116. package/components/oxy-drop-menu-item/types.ts +94 -0
  117. package/components/oxy-fab/index.scss +116 -0
  118. package/components/oxy-fab/oxy-fab.vue +276 -0
  119. package/components/oxy-fab/types.ts +66 -0
  120. package/components/oxy-floating-panel/index.scss +64 -0
  121. package/components/oxy-floating-panel/oxy-floating-panel.vue +140 -0
  122. package/components/oxy-floating-panel/type.ts +32 -0
  123. package/components/oxy-form/oxy-form.vue +207 -0
  124. package/components/oxy-form/types.ts +76 -0
  125. package/components/oxy-form-item/index.scss +18 -0
  126. package/components/oxy-form-item/oxy-form-item.vue +56 -0
  127. package/components/oxy-form-item/types.ts +16 -0
  128. package/components/oxy-gap/index.scss +9 -0
  129. package/components/oxy-gap/oxy-gap.vue +36 -0
  130. package/components/oxy-gap/types.ts +17 -0
  131. package/components/oxy-grid/index.scss +9 -0
  132. package/components/oxy-grid/oxy-grid.vue +106 -0
  133. package/components/oxy-grid/types.ts +50 -0
  134. package/components/oxy-grid-item/index.scss +148 -0
  135. package/components/oxy-grid-item/oxy-grid-item.vue +176 -0
  136. package/components/oxy-grid-item/types.ts +77 -0
  137. package/components/oxy-icon/index.scss +1230 -0
  138. package/components/oxy-icon/oxy-icon.vue +53 -0
  139. package/components/oxy-icon/oxy-icons.ttf +0 -0
  140. package/components/oxy-icon/types.ts +21 -0
  141. package/components/oxy-img/index.scss +19 -0
  142. package/components/oxy-img/oxy-img.vue +81 -0
  143. package/components/oxy-img/types.ts +61 -0
  144. package/components/oxy-img-cropper/index.scss +231 -0
  145. package/components/oxy-img-cropper/oxy-img-cropper.vue +664 -0
  146. package/components/oxy-img-cropper/types.ts +76 -0
  147. package/components/oxy-index-anchor/index.scss +35 -0
  148. package/components/oxy-index-anchor/oxy-index-anchor.vue +55 -0
  149. package/components/oxy-index-anchor/type.ts +9 -0
  150. package/components/oxy-index-bar/index.scss +39 -0
  151. package/components/oxy-index-bar/oxy-index-bar.vue +156 -0
  152. package/components/oxy-index-bar/type.ts +23 -0
  153. package/components/oxy-input/index.scss +323 -0
  154. package/components/oxy-input/oxy-input.vue +300 -0
  155. package/components/oxy-input/placeholder.scss +21 -0
  156. package/components/oxy-input/types.ts +189 -0
  157. package/components/oxy-input-number/index.scss +132 -0
  158. package/components/oxy-input-number/oxy-input-number.vue +464 -0
  159. package/components/oxy-input-number/types.ts +101 -0
  160. package/components/oxy-keyboard/constants.ts +81 -0
  161. package/components/oxy-keyboard/index.scss +102 -0
  162. package/components/oxy-keyboard/key/index.scss +79 -0
  163. package/components/oxy-keyboard/key/index.vue +76 -0
  164. package/components/oxy-keyboard/key/types.ts +11 -0
  165. package/components/oxy-keyboard/oxy-keyboard.vue +206 -0
  166. package/components/oxy-keyboard/types.ts +92 -0
  167. package/components/oxy-loading/index.scss +37 -0
  168. package/components/oxy-loading/oxy-loading.vue +90 -0
  169. package/components/oxy-loading/types.ts +22 -0
  170. package/components/oxy-loadmore/index.scss +39 -0
  171. package/components/oxy-loadmore/oxy-loadmore.vue +59 -0
  172. package/components/oxy-loadmore/types.ts +30 -0
  173. package/components/oxy-message-box/index.scss +108 -0
  174. package/components/oxy-message-box/index.ts +87 -0
  175. package/components/oxy-message-box/oxy-message-box.vue +291 -0
  176. package/components/oxy-message-box/types.ts +132 -0
  177. package/components/oxy-navbar/index.scss +93 -0
  178. package/components/oxy-navbar/oxy-navbar.vue +111 -0
  179. package/components/oxy-navbar/types.ts +52 -0
  180. package/components/oxy-navbar-capsule/index.scss +66 -0
  181. package/components/oxy-navbar-capsule/oxy-navbar-capsule.vue +35 -0
  182. package/components/oxy-navbar-capsule/types.ts +8 -0
  183. package/components/oxy-notice-bar/index.scss +68 -0
  184. package/components/oxy-notice-bar/oxy-notice-bar.vue +266 -0
  185. package/components/oxy-notice-bar/types.ts +67 -0
  186. package/components/oxy-notify/index.scss +34 -0
  187. package/components/oxy-notify/index.ts +61 -0
  188. package/components/oxy-notify/oxy-notify.vue +85 -0
  189. package/components/oxy-notify/types.ts +66 -0
  190. package/components/oxy-number-keyboard/index.scss +78 -0
  191. package/components/oxy-number-keyboard/key/index.scss +81 -0
  192. package/components/oxy-number-keyboard/key/index.vue +78 -0
  193. package/components/oxy-number-keyboard/key/types.ts +11 -0
  194. package/components/oxy-number-keyboard/oxy-number-keyboard.vue +151 -0
  195. package/components/oxy-number-keyboard/types.ts +83 -0
  196. package/components/oxy-overlay/index.scss +17 -0
  197. package/components/oxy-overlay/oxy-overlay.vue +47 -0
  198. package/components/oxy-overlay/types.ts +25 -0
  199. package/components/oxy-pagination/index.scss +57 -0
  200. package/components/oxy-pagination/oxy-pagination.vue +110 -0
  201. package/components/oxy-pagination/types.ts +41 -0
  202. package/components/oxy-password-input/index.scss +124 -0
  203. package/components/oxy-password-input/oxy-password-input.vue +49 -0
  204. package/components/oxy-password-input/types.ts +33 -0
  205. package/components/oxy-picker/index.scss +110 -0
  206. package/components/oxy-picker/oxy-picker.vue +412 -0
  207. package/components/oxy-picker/types.ts +189 -0
  208. package/components/oxy-picker-view/index.scss +92 -0
  209. package/components/oxy-picker-view/oxy-picker-view.vue +369 -0
  210. package/components/oxy-picker-view/types.ts +152 -0
  211. package/components/oxy-popover/index.scss +116 -0
  212. package/components/oxy-popover/oxy-popover.vue +180 -0
  213. package/components/oxy-popover/types.ts +69 -0
  214. package/components/oxy-popup/index.scss +84 -0
  215. package/components/oxy-popup/oxy-popup.vue +169 -0
  216. package/components/oxy-popup/types.ts +95 -0
  217. package/components/oxy-progress/index.scss +68 -0
  218. package/components/oxy-progress/oxy-progress.vue +197 -0
  219. package/components/oxy-progress/types.ts +35 -0
  220. package/components/oxy-radio/index.scss +301 -0
  221. package/components/oxy-radio/oxy-radio.vue +118 -0
  222. package/components/oxy-radio/types.ts +42 -0
  223. package/components/oxy-radio-group/index.scss +23 -0
  224. package/components/oxy-radio-group/oxy-radio-group.vue +51 -0
  225. package/components/oxy-radio-group/types.ts +39 -0
  226. package/components/oxy-rate/index.scss +25 -0
  227. package/components/oxy-rate/oxy-rate.vue +178 -0
  228. package/components/oxy-rate/types.ts +103 -0
  229. package/components/oxy-resize/index.scss +27 -0
  230. package/components/oxy-resize/oxy-resize.vue +144 -0
  231. package/components/oxy-resize/types.ts +6 -0
  232. package/components/oxy-root-portal/oxy-root-portal.vue +50 -0
  233. package/components/oxy-row/index.scss +10 -0
  234. package/components/oxy-row/oxy-row.vue +42 -0
  235. package/components/oxy-row/types.ts +16 -0
  236. package/components/oxy-search/index.scss +148 -0
  237. package/components/oxy-search/oxy-search.vue +187 -0
  238. package/components/oxy-search/types.ts +93 -0
  239. package/components/oxy-segmented/index.scss +101 -0
  240. package/components/oxy-segmented/oxy-segmented.vue +143 -0
  241. package/components/oxy-segmented/types.ts +71 -0
  242. package/components/oxy-select-picker/index.scss +102 -0
  243. package/components/oxy-select-picker/oxy-select-picker.vue +432 -0
  244. package/components/oxy-select-picker/types.ts +123 -0
  245. package/components/oxy-sidebar/index.scss +25 -0
  246. package/components/oxy-sidebar/oxy-sidebar.vue +63 -0
  247. package/components/oxy-sidebar/types.ts +38 -0
  248. package/components/oxy-sidebar-item/index.scss +97 -0
  249. package/components/oxy-sidebar-item/oxy-sidebar-item.vue +116 -0
  250. package/components/oxy-sidebar-item/types.ts +31 -0
  251. package/components/oxy-signature/index.scss +31 -0
  252. package/components/oxy-signature/oxy-signature.vue +630 -0
  253. package/components/oxy-signature/types.ts +108 -0
  254. package/components/oxy-skeleton/index.scss +96 -0
  255. package/components/oxy-skeleton/index.ts +1 -0
  256. package/components/oxy-skeleton/oxy-skeleton.vue +110 -0
  257. package/components/oxy-skeleton/types.ts +69 -0
  258. package/components/oxy-slider/index.scss +98 -0
  259. package/components/oxy-slider/oxy-slider.vue +356 -0
  260. package/components/oxy-slider/types.ts +138 -0
  261. package/components/oxy-sort-button/index.scss +89 -0
  262. package/components/oxy-sort-button/oxy-sort-button.vue +69 -0
  263. package/components/oxy-sort-button/types.ts +43 -0
  264. package/components/oxy-status-tip/images/collect.png +0 -0
  265. package/components/oxy-status-tip/images/content.png +0 -0
  266. package/components/oxy-status-tip/images/network.png +0 -0
  267. package/components/oxy-status-tip/images/search.png +0 -0
  268. package/components/oxy-status-tip/index.scss +37 -0
  269. package/components/oxy-status-tip/oxy-status-tip.vue +71 -0
  270. package/components/oxy-status-tip/types.ts +50 -0
  271. package/components/oxy-step/index.scss +235 -0
  272. package/components/oxy-step/oxy-step.vue +150 -0
  273. package/components/oxy-step/types.ts +33 -0
  274. package/components/oxy-steps/index.scss +10 -0
  275. package/components/oxy-steps/oxy-steps.vue +28 -0
  276. package/components/oxy-steps/types.ts +50 -0
  277. package/components/oxy-sticky/index.scss +9 -0
  278. package/components/oxy-sticky/oxy-sticky.vue +190 -0
  279. package/components/oxy-sticky/types.ts +13 -0
  280. package/components/oxy-sticky-box/index.scss +6 -0
  281. package/components/oxy-sticky-box/oxy-sticky-box.vue +155 -0
  282. package/components/oxy-sticky-box/types.ts +11 -0
  283. package/components/oxy-swipe-action/index.scss +22 -0
  284. package/components/oxy-swipe-action/oxy-swipe-action.vue +294 -0
  285. package/components/oxy-swipe-action/types.ts +40 -0
  286. package/components/oxy-swiper/index.scss +53 -0
  287. package/components/oxy-swiper/oxy-swiper.vue +318 -0
  288. package/components/oxy-swiper/types.ts +264 -0
  289. package/components/oxy-swiper-nav/index.scss +159 -0
  290. package/components/oxy-swiper-nav/oxy-swiper-nav.vue +37 -0
  291. package/components/oxy-swiper-nav/types.ts +42 -0
  292. package/components/oxy-switch/index.scss +58 -0
  293. package/components/oxy-switch/oxy-switch.vue +83 -0
  294. package/components/oxy-switch/types.ts +58 -0
  295. package/components/oxy-tab/index.scss +16 -0
  296. package/components/oxy-tab/oxy-tab.vue +88 -0
  297. package/components/oxy-tab/types.ts +30 -0
  298. package/components/oxy-tabbar/index.scss +62 -0
  299. package/components/oxy-tabbar/oxy-tabbar.vue +91 -0
  300. package/components/oxy-tabbar/types.ts +73 -0
  301. package/components/oxy-tabbar-item/index.scss +55 -0
  302. package/components/oxy-tabbar-item/oxy-tabbar-item.vue +99 -0
  303. package/components/oxy-tabbar-item/types.ts +51 -0
  304. package/components/oxy-table/index.scss +163 -0
  305. package/components/oxy-table/oxy-table.vue +283 -0
  306. package/components/oxy-table/types.ts +58 -0
  307. package/components/oxy-table-col/index.scss +46 -0
  308. package/components/oxy-table-col/oxy-table-col.vue +149 -0
  309. package/components/oxy-table-col/types.ts +54 -0
  310. package/components/oxy-tabs/index.scss +299 -0
  311. package/components/oxy-tabs/oxy-tabs.vue +443 -0
  312. package/components/oxy-tabs/types.ts +107 -0
  313. package/components/oxy-tag/index.scss +115 -0
  314. package/components/oxy-tag/oxy-tag.vue +148 -0
  315. package/components/oxy-tag/types.ts +81 -0
  316. package/components/oxy-text/index.scss +37 -0
  317. package/components/oxy-text/oxy-text.vue +139 -0
  318. package/components/oxy-text/types.ts +98 -0
  319. package/components/oxy-textarea/index.scss +340 -0
  320. package/components/oxy-textarea/oxy-textarea.vue +296 -0
  321. package/components/oxy-textarea/placeholder.scss +20 -0
  322. package/components/oxy-textarea/types.ts +288 -0
  323. package/components/oxy-toast/index.scss +75 -0
  324. package/components/oxy-toast/index.ts +92 -0
  325. package/components/oxy-toast/oxy-toast.vue +198 -0
  326. package/components/oxy-toast/types.ts +181 -0
  327. package/components/oxy-tooltip/index.scss +66 -0
  328. package/components/oxy-tooltip/oxy-tooltip.vue +141 -0
  329. package/components/oxy-tooltip/types.ts +107 -0
  330. package/components/oxy-transition/index.scss +95 -0
  331. package/components/oxy-transition/oxy-transition.vue +232 -0
  332. package/components/oxy-transition/types.ts +98 -0
  333. package/components/oxy-upload/index.scss +175 -0
  334. package/components/oxy-upload/oxy-upload.vue +673 -0
  335. package/components/oxy-upload/types.ts +391 -0
  336. package/components/oxy-video-preview/index.scss +34 -0
  337. package/components/oxy-video-preview/oxy-video-preview.vue +72 -0
  338. package/components/oxy-video-preview/types.ts +23 -0
  339. package/components/oxy-watermark/index.scss +18 -0
  340. package/components/oxy-watermark/oxy-watermark.vue +486 -0
  341. package/components/oxy-watermark/types.ts +76 -0
  342. package/dayjs/constant.js +26 -0
  343. package/dayjs/index.d.ts +430 -0
  344. package/dayjs/index.js +542 -0
  345. package/dayjs/locale/en.js +13 -0
  346. package/dayjs/utils.js +59 -0
  347. package/global.d.ts +101 -0
  348. package/index.ts +12 -0
  349. package/locale/index.ts +32 -0
  350. package/locale/lang/ar-SA.ts +133 -0
  351. package/locale/lang/en-US.ts +133 -0
  352. package/locale/lang/zh-CN.ts +137 -0
  353. package/package.json +1 -0
  354. package/tags.json +1 -0
  355. package/web-types.json +1 -0
@@ -0,0 +1,158 @@
1
+ @import '../common/abstracts/variable';
2
+ @import '../common/abstracts/mixin';
3
+
4
+ .oxy-theme-dark {
5
+ @include b(calendar) {
6
+
7
+ @include e(title) {
8
+ color: $-dark-color;
9
+ }
10
+
11
+ :deep(.oxy-calendar__arrow),
12
+ :deep(.oxy-calendar__close),
13
+ :deep(.oxy-calendar__clear) {
14
+ color: $-dark-color;
15
+ }
16
+
17
+ @include e(range-label-item) {
18
+ color: $-dark-color;
19
+
20
+ @include when(placeholder) {
21
+ color: $-dark-color-gray;
22
+ }
23
+ }
24
+
25
+ @include e(range-sperator) {
26
+ color: $-dark-color-gray;
27
+ }
28
+
29
+ :deep(.oxy-calendar__cell--placeholder) {
30
+ .oxy-cell__value {
31
+ color: $-dark-color-gray;
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+ @include b(calendar) {
38
+
39
+ @include e(header) {
40
+ position: relative;
41
+ overflow: hidden;
42
+ }
43
+
44
+ @include e(title) {
45
+ color: $-action-sheet-color;
46
+ height: $-action-sheet-title-height;
47
+ line-height: $-action-sheet-title-height;
48
+ text-align: center;
49
+ font-size: $-action-sheet-title-fs;
50
+ font-weight: $-action-sheet-weight;
51
+ }
52
+
53
+ @include edeep(close) {
54
+ position: absolute;
55
+ top: $-action-sheet-close-top;
56
+ right: $-action-sheet-close-right;
57
+ color: $-action-sheet-close-color;
58
+ font-size: $-action-sheet-close-fs;
59
+ transform: rotate(-45deg);
60
+ line-height: 1.1;
61
+ }
62
+
63
+ @include e(tabs) {
64
+ width: 222px;
65
+ margin: 10px auto 12px;
66
+ }
67
+
68
+ @include e(shortcuts) {
69
+ padding: 20px 0;
70
+ text-align: center;
71
+ }
72
+
73
+ @include edeep(tag) {
74
+ margin-right: 8px;
75
+ }
76
+
77
+ @include e(view) {
78
+ @include when(show-confirm) {
79
+ height: 394px;
80
+
81
+ @include when(range) {
82
+ height: 384px;
83
+ }
84
+ }
85
+ }
86
+
87
+ @include e(range-label) {
88
+ display: flex;
89
+ justify-content: center;
90
+ align-items: center;
91
+ font-size: 14px;
92
+
93
+ @include when(monthrange) {
94
+ padding-bottom: 10px;
95
+ box-shadow: 0px 4px 8px 0 rgba(0, 0, 0, 0.02);
96
+ }
97
+ }
98
+
99
+ @include e(range-label-item) {
100
+ flex: 1;
101
+ color: rgba(0, 0, 0, 0.85);
102
+
103
+ @include when(placeholder) {
104
+ color: rgba(0, 0, 0, 0.25);
105
+ }
106
+ }
107
+
108
+ @include e(range-sperator) {
109
+ margin: 0 24px;
110
+ color: rgba(0, 0, 0, 0.25);
111
+ }
112
+
113
+ @include e(confirm) {
114
+ padding: 12px 25px 14px;
115
+ }
116
+
117
+ @include edeep(cell) {
118
+ @include when(disabled) {
119
+ .oxy-cell__value {
120
+ color: $-input-disabled-color;
121
+ cursor: not-allowed;
122
+ }
123
+ }
124
+ @include when(error) {
125
+ .oxy-cell__value {
126
+ color: $-input-error-color;
127
+ }
128
+ :deep(.oxy-calendar__arrow) {
129
+ color: $-input-error-color;
130
+ }
131
+ }
132
+ @include when(large) {
133
+ .oxy-calendar__arrow {
134
+ font-size: $-cell-icon-size-large;
135
+ }
136
+ }
137
+
138
+ @include m(placeholder) {
139
+ .oxy-cell__value {
140
+ color: $-input-placeholder-color;
141
+ }
142
+ }
143
+ }
144
+
145
+ @include edeep(arrow) {
146
+ display: block;
147
+ font-size: $-cell-icon-size;
148
+ color: $-cell-arrow-color;
149
+ line-height: $-cell-line-height;
150
+ }
151
+
152
+ @include edeep(clear) {
153
+ display: block;
154
+ font-size: $-cell-icon-size;
155
+ color: $-cell-clear-color;
156
+ line-height: $-cell-line-height;
157
+ }
158
+ }
@@ -0,0 +1,451 @@
1
+ <template>
2
+ <view :class="`oxy-calendar ${customClass}`">
3
+ <template v-if="withCell">
4
+ <oxy-cell
5
+ v-if="!$slots.default"
6
+ :title="label"
7
+ :value="showValue || placeholder || translate('placeholder')"
8
+ :required="required"
9
+ :size="size"
10
+ :title-width="labelWidth"
11
+ :prop="prop"
12
+ :rules="rules"
13
+ :clickable="!disabled && !readonly"
14
+ :value-align="alignRight ? 'right' : 'left'"
15
+ :center="center"
16
+ :custom-class="cellClass"
17
+ :custom-style="customStyle"
18
+ :custom-title-class="customLabelClass"
19
+ :custom-value-class="customValueClass"
20
+ :ellipsis="ellipsis"
21
+ :use-title-slot="!!$slots.label"
22
+ :marker-side="markerSide"
23
+ @click="open"
24
+ >
25
+ <template #title v-if="$slots.label">
26
+ <slot name="label"></slot>
27
+ </template>
28
+
29
+ <template #right-icon>
30
+ <oxy-icon v-if="showArrow" custom-class="oxy-calendar__arrow" name="arrow-right" />
31
+ <view v-else-if="showClear" @click.stop="handleClear">
32
+ <oxy-icon custom-class="oxy-calendar__clear" name="error-fill" />
33
+ </view>
34
+ </template>
35
+ </oxy-cell>
36
+ <view v-else @click="open">
37
+ <slot></slot>
38
+ </view>
39
+ </template>
40
+ <oxy-action-sheet
41
+ v-model="pickerShow"
42
+ :duration="250"
43
+ :close-on-click-modal="closeOnClickModal"
44
+ :safe-area-inset-bottom="safeAreaInsetBottom"
45
+ :z-index="zIndex"
46
+ :root-portal="rootPortal"
47
+ @close="close"
48
+ >
49
+ <view class="oxy-calendar__header">
50
+ <view v-if="!showTypeSwitch && shortcuts.length === 0" class="oxy-calendar__title">{{ title || translate('title') }}</view>
51
+ <view v-if="showTypeSwitch" class="oxy-calendar__tabs">
52
+ <oxy-tabs ref="calendarTabs" v-model="currentTab" @change="handleTypeChange">
53
+ <oxy-tab :title="translate('day')" :name="translate('day')" />
54
+ <oxy-tab :title="translate('week')" :name="translate('week')" />
55
+ <oxy-tab :title="translate('month')" :name="translate('month')" />
56
+ </oxy-tabs>
57
+ </view>
58
+ <view v-if="shortcuts.length > 0" class="oxy-calendar__shortcuts">
59
+ <oxy-tag
60
+ v-for="(item, index) in shortcuts"
61
+ :key="index"
62
+ custom-class="oxy-calendar__tag"
63
+ type="primary"
64
+ plain
65
+ round
66
+ @click="handleShortcutClick(index)"
67
+ >
68
+ {{ item.text }}
69
+ </oxy-tag>
70
+ </view>
71
+ <oxy-icon custom-class="oxy-calendar__close" name="add" @click="close" />
72
+ </view>
73
+ <view
74
+ v-if="inited"
75
+ :class="`oxy-calendar__view ${currentType.indexOf('range') > -1 ? 'is-range' : ''} ${showConfirm ? 'is-show-confirm' : ''}`"
76
+ >
77
+ <view v-if="range(type)" :class="`oxy-calendar__range-label ${type === 'monthrange' ? 'is-monthrange' : ''}`">
78
+ <view
79
+ :class="`oxy-calendar__range-label-item ${!calendarValue || !isArray(calendarValue) || !calendarValue[0] ? 'is-placeholder' : ''}`"
80
+ style="text-align: right"
81
+ >
82
+ {{ rangeLabel[0] }}
83
+ </view>
84
+ <view class="oxy-calendar__range-sperator">/</view>
85
+ <view :class="`oxy-calendar__range-label-item ${!calendarValue || !isArray(calendarValue) || !calendarValue[1] ? 'is-placeholder' : ''}`">
86
+ {{ rangeLabel[1] }}
87
+ </view>
88
+ </view>
89
+ <oxy-calendar-view
90
+ ref="calendarView"
91
+ v-model="calendarValue"
92
+ :type="currentType"
93
+ :min-date="minDate"
94
+ :max-date="maxDate"
95
+ :first-day-of-week="firstDayOfWeek"
96
+ :formatter="formatter"
97
+ :panel-height="panelHeight"
98
+ :max-range="maxRange"
99
+ :range-prompt="rangePrompt"
100
+ :allow-same-day="allowSameDay"
101
+ :default-time="defaultTime"
102
+ :time-filter="timeFilter"
103
+ :hide-second="hideSecond"
104
+ :show-panel-title="!range(type)"
105
+ :immediate-change="immediateChange"
106
+ @change="handleChange"
107
+ />
108
+ </view>
109
+ <view v-if="showConfirm" class="oxy-calendar__confirm">
110
+ <oxy-button block :disabled="confirmBtnDisabled" @click="handleConfirm">{{ confirmText || translate('confirm') }}</oxy-button>
111
+ </view>
112
+ </oxy-action-sheet>
113
+ </view>
114
+ </template>
115
+
116
+ <script lang="ts">
117
+ export default {
118
+ name: 'oxy-calendar',
119
+ options: {
120
+ addGlobalClass: true,
121
+ virtualHost: true,
122
+ styleIsolation: 'shared'
123
+ }
124
+ }
125
+ </script>
126
+
127
+ <script lang="ts" setup>
128
+ import OxyIcon from '../oxy-icon/oxy-icon.vue'
129
+ import OxyCalendarView from '../oxy-calendar-view/oxy-calendar-view.vue'
130
+ import OxyActionSheet from '../oxy-action-sheet/oxy-action-sheet.vue'
131
+ import OxyButton from '../oxy-button/oxy-button.vue'
132
+ import OxyCell from '../oxy-cell/oxy-cell.vue'
133
+ import { ref, computed, watch } from 'vue'
134
+ import dayjs from '../../dayjs'
135
+ import { deepClone, isArray, isEqual, padZero, pause } from '../common/util'
136
+ import { getWeekNumber, isRange } from '../oxy-calendar-view/utils'
137
+ import { FORM_KEY, type FormItemRule } from '../oxy-form/types'
138
+ import { useParent } from '../composables/useParent'
139
+ import { useTranslate } from '../composables/useTranslate'
140
+ import { calendarProps, type CalendarExpose } from './types'
141
+ import type { CalendarType } from '../oxy-calendar-view/types'
142
+ const { translate } = useTranslate('calendar')
143
+
144
+ const defaultDisplayFormat = (value: number | number[], type: CalendarType): string => {
145
+ switch (type) {
146
+ case 'date':
147
+ return dayjs(value as number).format('YYYY-MM-DD')
148
+ case 'dates':
149
+ return (value as number[])
150
+ .map((item) => {
151
+ return dayjs(item).format('YYYY-MM-DD')
152
+ })
153
+ .join(', ')
154
+ case 'daterange':
155
+ return `${(value as number[])[0] ? dayjs((value as number[])[0]).format('YYYY-MM-DD') : translate('startTime')} ${translate('to')} ${
156
+ (value as number[])[1] ? dayjs((value as number[])[1]).format('YYYY-MM-DD') : translate('endTime')
157
+ }`
158
+ case 'datetime':
159
+ return dayjs(value as number).format('YYYY-MM-DD HH:mm:ss')
160
+ case 'datetimerange':
161
+ return `${(value as number[])[0] ? dayjs((value as number[])[0]).format(translate('timeFormat')) : translate('startTime')} ${translate(
162
+ 'to'
163
+ )}\n${(value as number[])[1] ? dayjs((value as number[])[1]).format(translate('timeFormat')) : translate('endTime')}`
164
+ case 'week': {
165
+ const date = new Date(value as number)
166
+ const year = date.getFullYear()
167
+ const week = getWeekNumber(value as number)
168
+ const weekStart = new Date(date)
169
+ weekStart.setDate(date.getDate() - date.getDay() + 1)
170
+ const weekEnd = new Date(date)
171
+ weekEnd.setDate(date.getDate() + (7 - date.getDay()))
172
+ const adjustedYear = weekEnd.getFullYear() > year ? weekEnd.getFullYear() : year
173
+ return translate('weekFormat', adjustedYear, padZero(week))
174
+ }
175
+ case 'weekrange': {
176
+ const date1 = new Date((value as number[])[0])
177
+ const date2 = new Date((value as number[])[1])
178
+ const year1 = date1.getFullYear()
179
+ const year2 = date2.getFullYear()
180
+ const week1 = getWeekNumber((value as number[])[0])
181
+ const week2 = getWeekNumber((value as number[])[1])
182
+ const weekStart1 = new Date(date1)
183
+ weekStart1.setDate(date1.getDate() - date1.getDay() + 1)
184
+ const weekEnd1 = new Date(date1)
185
+ weekEnd1.setDate(date1.getDate() + (7 - date1.getDay()))
186
+ const weekStart2 = new Date(date2)
187
+ weekStart2.setDate(date2.getDate() - date2.getDay() + 1)
188
+ const weekEnd2 = new Date(date2)
189
+ weekEnd2.setDate(date2.getDate() + (7 - date2.getDay()))
190
+ const adjustedYear1 = weekEnd1.getFullYear() > year1 ? weekEnd1.getFullYear() : year1
191
+ const adjustedYear2 = weekEnd2.getFullYear() > year2 ? weekEnd2.getFullYear() : year2
192
+ return `${(value as number[])[0] ? translate('weekFormat', adjustedYear1, padZero(week1)) : translate('startWeek')} - ${
193
+ (value as number[])[1] ? translate('weekFormat', adjustedYear2, padZero(week2)) : translate('endWeek')
194
+ }`
195
+ }
196
+ case 'month':
197
+ return dayjs(value as number).format('YYYY / MM')
198
+ case 'monthrange':
199
+ return `${(value as number[])[0] ? dayjs((value as number[])[0]).format('YYYY / MM') : translate('startMonth')} ${translate('to')} ${
200
+ (value as number[])[1] ? dayjs((value as number[])[1]).format('YYYY / MM') : translate('endMonth')
201
+ }`
202
+ }
203
+ }
204
+
205
+ const formatRange = (value: number, rangeType: 'start' | 'end', type: CalendarType) => {
206
+ switch (type) {
207
+ case 'daterange':
208
+ if (!value) {
209
+ return rangeType === 'end' ? translate('endTime') : translate('startTime')
210
+ }
211
+ return dayjs(value).format(translate('dateFormat'))
212
+ case 'datetimerange':
213
+ if (!value) {
214
+ return rangeType === 'end' ? translate('endTime') : translate('startTime')
215
+ }
216
+ return dayjs(value).format(translate('timeFormat'))
217
+ case 'weekrange': {
218
+ if (!value) {
219
+ return rangeType === 'end' ? translate('endWeek') : translate('startWeek')
220
+ }
221
+ const date = new Date(value)
222
+ const year = date.getFullYear()
223
+ const week = getWeekNumber(value)
224
+ return translate('weekFormat', year, padZero(week))
225
+ }
226
+ case 'monthrange':
227
+ if (!value) {
228
+ return rangeType === 'end' ? translate('endMonth') : translate('startMonth')
229
+ }
230
+ return dayjs(value).format(translate('monthFormat'))
231
+ }
232
+ }
233
+
234
+ const props = defineProps(calendarProps)
235
+ const emit = defineEmits(['cancel', 'change', 'update:modelValue', 'confirm', 'open', 'clear'])
236
+
237
+ const pickerShow = ref<boolean>(false)
238
+ const calendarValue = ref<null | number | number[]>(null)
239
+ const lastCalendarValue = ref<null | number | number[]>(null)
240
+ const panelHeight = ref<number>(338)
241
+ const confirmBtnDisabled = ref<boolean>(true)
242
+ const currentTab = ref<number>(0)
243
+ const lastTab = ref<number>(0)
244
+ const currentType = ref<CalendarType>('date')
245
+ const lastCurrentType = ref<CalendarType>()
246
+ const inited = ref<boolean>(false)
247
+ const calendarView = ref()
248
+ const calendarTabs = ref()
249
+
250
+ const rangeLabel = computed(() => {
251
+ const [start, end] = deepClone(isArray(calendarValue.value) ? calendarValue.value : [])
252
+ return [start, end].map((item, index) => {
253
+ return (props.innerDisplayFormat || formatRange)(item, index === 0 ? 'start' : 'end', currentType.value)
254
+ })
255
+ })
256
+
257
+ const showValue = computed(() => {
258
+ if ((!isArray(props.modelValue) && props.modelValue) || (isArray(props.modelValue) && props.modelValue.length)) {
259
+ return (props.displayFormat || defaultDisplayFormat)(props.modelValue, lastCurrentType.value || currentType.value)
260
+ } else {
261
+ return ''
262
+ }
263
+ })
264
+
265
+ const cellClass = computed(() => {
266
+ const classes = ['oxy-calendar__cell']
267
+ if (props.disabled) classes.push('is-disabled')
268
+ if (props.readonly) classes.push('is-readonly')
269
+ if (props.error) classes.push('is-error')
270
+ if (!showValue.value) classes.push('oxy-calendar__cell--placeholder')
271
+ return classes.join(' ')
272
+ })
273
+
274
+ watch(
275
+ () => props.modelValue,
276
+ (val, oldVal) => {
277
+ if (isEqual(val, oldVal)) return
278
+ calendarValue.value = deepClone(val)
279
+ confirmBtnDisabled.value = getConfirmBtnStatus(val)
280
+ },
281
+ {
282
+ immediate: true
283
+ }
284
+ )
285
+
286
+ watch(
287
+ () => props.type,
288
+ (newValue, oldValue) => {
289
+ if (props.showTypeSwitch) {
290
+ const tabs = ['date', 'week', 'month']
291
+ const rangeTabs = ['daterange', 'weekrange', 'monthrange']
292
+
293
+ const index = newValue.indexOf('range') > -1 ? rangeTabs.indexOf(newValue) || 0 : tabs.indexOf(newValue)
294
+ currentTab.value = index
295
+ }
296
+ panelHeight.value = props.showConfirm ? 338 : 400
297
+ currentType.value = deepClone(newValue)
298
+ },
299
+ {
300
+ deep: true,
301
+ immediate: true
302
+ }
303
+ )
304
+
305
+ watch(
306
+ () => props.showConfirm,
307
+ (val) => {
308
+ panelHeight.value = val ? 338 : 400
309
+ },
310
+ {
311
+ deep: true,
312
+ immediate: true
313
+ }
314
+ )
315
+
316
+ const range = computed(() => {
317
+ return (type: CalendarType) => {
318
+ return isRange(type)
319
+ }
320
+ })
321
+
322
+ // 是否展示清除按钮
323
+ const showClear = computed(() => {
324
+ return props.clearable && !props.disabled && !props.readonly && showValue.value.length > 0
325
+ })
326
+
327
+ // 是否展示箭头
328
+ const showArrow = computed(() => {
329
+ return !props.disabled && !props.readonly && !showClear.value
330
+ })
331
+
332
+ function handleClear() {
333
+ emit('clear')
334
+ emit('update:modelValue', null)
335
+ }
336
+
337
+ function scrollIntoView() {
338
+ calendarView.value && calendarView.value && calendarView.value.$.exposed.scrollIntoView()
339
+ }
340
+ // 对外暴露方法
341
+ async function open() {
342
+ const { disabled, readonly } = props
343
+
344
+ if (disabled || readonly) return
345
+
346
+ inited.value = true
347
+ pickerShow.value = true
348
+ lastCalendarValue.value = deepClone(calendarValue.value)
349
+ lastTab.value = currentTab.value
350
+ lastCurrentType.value = currentType.value
351
+ // 等待渲染完毕
352
+ await pause()
353
+ scrollIntoView()
354
+ setTimeout(() => {
355
+ if (props.showTypeSwitch) {
356
+ calendarTabs.value.scrollIntoView()
357
+ calendarTabs.value.updateLineStyle(false)
358
+ }
359
+ }, 250)
360
+ emit('open')
361
+ }
362
+ // 对外暴露方法
363
+ function close() {
364
+ pickerShow.value = false
365
+ setTimeout(() => {
366
+ calendarValue.value = deepClone(lastCalendarValue.value)
367
+ currentTab.value = lastTab.value
368
+ currentType.value = lastCurrentType.value || 'date'
369
+ confirmBtnDisabled.value = getConfirmBtnStatus(lastCalendarValue.value)
370
+ }, 250)
371
+ emit('cancel')
372
+ }
373
+ function handleTypeChange({ index }: { index: number }) {
374
+ const tabs = ['date', 'week', 'month']
375
+ const rangeTabs = ['daterange', 'weekrange', 'monthrange']
376
+ const type = props.type.indexOf('range') > -1 ? rangeTabs[index] : tabs[index]
377
+ currentTab.value = index
378
+ currentType.value = type as CalendarType
379
+ }
380
+ function getConfirmBtnStatus(value: number | number[] | null) {
381
+ let confirmBtnDisabled = false
382
+ // 范围选择未选择满,或者多日期选择未选择日期,按钮置灰不可点击
383
+ if (
384
+ (props.type.indexOf('range') > -1 && (!isArray(value) || !value[0] || !value[1] || !value)) ||
385
+ (props.type === 'dates' && (!isArray(value) || value.length === 0 || !value)) ||
386
+ !value
387
+ ) {
388
+ confirmBtnDisabled = true
389
+ }
390
+
391
+ return confirmBtnDisabled
392
+ }
393
+ function handleChange({ value }: { value: number | number[] | null }) {
394
+ calendarValue.value = deepClone(value)
395
+ confirmBtnDisabled.value = getConfirmBtnStatus(value)
396
+
397
+ emit('change', {
398
+ value
399
+ })
400
+
401
+ if (!props.showConfirm && !confirmBtnDisabled.value) {
402
+ handleConfirm()
403
+ }
404
+ }
405
+ function handleConfirm() {
406
+ if (props.beforeConfirm) {
407
+ props.beforeConfirm({
408
+ value: calendarValue.value,
409
+ resolve: (isPass: boolean) => {
410
+ isPass && onConfirm()
411
+ }
412
+ })
413
+ } else {
414
+ onConfirm()
415
+ }
416
+ }
417
+ function onConfirm() {
418
+ pickerShow.value = false
419
+ lastCurrentType.value = currentType.value
420
+ emit('update:modelValue', calendarValue.value)
421
+ emit('confirm', {
422
+ value: calendarValue.value,
423
+ type: currentType.value
424
+ })
425
+ }
426
+
427
+ function handleShortcutClick(index: number) {
428
+ if (props.onShortcutsClick && typeof props.onShortcutsClick === 'function') {
429
+ calendarValue.value = deepClone(
430
+ props.onShortcutsClick({
431
+ item: props.shortcuts[index],
432
+ index
433
+ })
434
+ )
435
+ confirmBtnDisabled.value = getConfirmBtnStatus(calendarValue.value)
436
+ }
437
+
438
+ if (!props.showConfirm) {
439
+ handleConfirm()
440
+ }
441
+ }
442
+
443
+ defineExpose<CalendarExpose>({
444
+ close,
445
+ open
446
+ })
447
+ </script>
448
+
449
+ <style lang="scss" scoped>
450
+ @import './index.scss';
451
+ </style>