quasar 2.9.2 → 2.10.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 (337) hide show
  1. package/dist/api/Dialog.json +25 -68
  2. package/dist/api/Intersection.json +25 -100
  3. package/dist/api/Loading.json +5 -20
  4. package/dist/api/LoadingBar.json +1 -7
  5. package/dist/api/LocalStorage.json +4 -16
  6. package/dist/api/Morph.json +2 -14
  7. package/dist/api/Notify.json +0 -3
  8. package/dist/api/Platform.json +1 -4
  9. package/dist/api/QAjaxBar.json +1 -11
  10. package/dist/api/QBreadcrumbs.json +0 -8
  11. package/dist/api/QBreadcrumbsEl.json +0 -14
  12. package/dist/api/QBtn.json +0 -3
  13. package/dist/api/QBtnDropdown.json +32 -8
  14. package/dist/api/QCarousel.json +0 -10
  15. package/dist/api/QCarouselControl.json +0 -3
  16. package/dist/api/QCircularProgress.json +0 -23
  17. package/dist/api/QColor.json +0 -3
  18. package/dist/api/QDialog.json +18 -9
  19. package/dist/api/QDrawer.json +0 -6
  20. package/dist/api/QExpansionItem.json +0 -3
  21. package/dist/api/QFab.json +1 -6
  22. package/dist/api/QFabAction.json +1 -3
  23. package/dist/api/QField.json +1 -6
  24. package/dist/api/QFile.json +12 -29
  25. package/dist/api/QFooter.json +0 -3
  26. package/dist/api/QHeader.json +0 -6
  27. package/dist/api/QInfiniteScroll.json +9 -16
  28. package/dist/api/QInnerLoading.json +0 -4
  29. package/dist/api/QInput.json +8 -15
  30. package/dist/api/QIntersection.json +0 -4
  31. package/dist/api/QItemLabel.json +0 -5
  32. package/dist/api/QKnob.json +3 -36
  33. package/dist/api/QLayout.json +6 -24
  34. package/dist/api/QLinearProgress.json +0 -6
  35. package/dist/api/QList.json +15 -0
  36. package/dist/api/QMenu.json +7 -12
  37. package/dist/api/QOptionGroup.json +0 -3
  38. package/dist/api/QPage.json +2 -8
  39. package/dist/api/QPageScroller.json +0 -9
  40. package/dist/api/QPageSticky.json +0 -3
  41. package/dist/api/QPagination.json +138 -127
  42. package/dist/api/QParallax.json +2 -14
  43. package/dist/api/QPopupEdit.json +0 -8
  44. package/dist/api/QPopupProxy.json +0 -4
  45. package/dist/api/QRange.json +5 -32
  46. package/dist/api/QRating.json +0 -4
  47. package/dist/api/QResizeObserver.json +2 -8
  48. package/dist/api/QScrollArea.json +8 -36
  49. package/dist/api/QScrollObserver.json +6 -24
  50. package/dist/api/QSelect.json +18 -108
  51. package/dist/api/QSlideItem.json +1 -6
  52. package/dist/api/QSlideTransition.json +0 -4
  53. package/dist/api/QSlider.json +3 -24
  54. package/dist/api/QSpinner.json +0 -4
  55. package/dist/api/QSplitter.json +1 -4
  56. package/dist/api/QStepper.json +0 -7
  57. package/dist/api/QTabPanels.json +0 -7
  58. package/dist/api/QTable.json +43 -191
  59. package/dist/api/QTabs.json +1 -7
  60. package/dist/api/QTime.json +3 -12
  61. package/dist/api/QTooltip.json +7 -18
  62. package/dist/api/QTree.json +0 -3
  63. package/dist/api/QUploader.json +5 -16
  64. package/dist/api/QVirtualScroll.json +11 -56
  65. package/dist/api/Screen.json +9 -36
  66. package/dist/api/Scroll.json +2 -8
  67. package/dist/api/SessionStorage.json +4 -16
  68. package/dist/api/TouchHold.json +3 -12
  69. package/dist/api/TouchPan.json +7 -28
  70. package/dist/api/TouchRepeat.json +6 -24
  71. package/dist/api/TouchSwipe.json +3 -12
  72. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  73. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  74. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  75. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  76. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  77. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  78. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  79. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  80. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  81. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  82. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  83. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  84. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  85. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  86. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  87. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  88. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  89. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  90. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  91. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  92. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  93. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  94. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  95. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  96. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  97. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  98. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  99. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  100. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  101. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  102. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  103. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  104. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  105. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  106. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  107. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  108. package/dist/icon-set/themify.umd.prod.js +1 -1
  109. package/dist/lang/ar-TN.umd.prod.js +1 -1
  110. package/dist/lang/ar.umd.prod.js +1 -1
  111. package/dist/lang/az-Latn.umd.prod.js +1 -1
  112. package/dist/lang/bg.umd.prod.js +1 -1
  113. package/dist/lang/bn.umd.prod.js +1 -1
  114. package/dist/lang/ca.umd.prod.js +1 -1
  115. package/dist/lang/cs.umd.prod.js +1 -1
  116. package/dist/lang/da.umd.prod.js +1 -1
  117. package/dist/lang/de.umd.prod.js +1 -1
  118. package/dist/lang/el.umd.prod.js +1 -1
  119. package/dist/lang/en-GB.umd.prod.js +1 -1
  120. package/dist/lang/en-US.umd.prod.js +1 -1
  121. package/dist/lang/eo.umd.prod.js +1 -1
  122. package/dist/lang/es.umd.prod.js +1 -1
  123. package/dist/lang/et.umd.prod.js +1 -1
  124. package/dist/lang/eu.umd.prod.js +1 -1
  125. package/dist/lang/fa-IR.umd.prod.js +1 -1
  126. package/dist/lang/fa.umd.prod.js +1 -1
  127. package/dist/lang/fi.umd.prod.js +1 -1
  128. package/dist/lang/fr.umd.prod.js +1 -1
  129. package/dist/lang/gn.umd.prod.js +1 -1
  130. package/dist/lang/he.umd.prod.js +1 -1
  131. package/dist/lang/hr.umd.prod.js +1 -1
  132. package/dist/lang/hu.umd.prod.js +1 -1
  133. package/dist/lang/id.umd.prod.js +1 -1
  134. package/dist/lang/is.umd.prod.js +1 -1
  135. package/dist/lang/it.umd.prod.js +1 -1
  136. package/dist/lang/ja.umd.prod.js +1 -1
  137. package/dist/lang/km.umd.prod.js +1 -1
  138. package/dist/lang/ko-KR.umd.prod.js +1 -1
  139. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  140. package/dist/lang/kz.umd.prod.js +1 -1
  141. package/dist/lang/lt.umd.prod.js +1 -1
  142. package/dist/lang/lu.umd.prod.js +1 -1
  143. package/dist/lang/lv.umd.prod.js +1 -1
  144. package/dist/lang/ml.umd.prod.js +1 -1
  145. package/dist/lang/mm.umd.prod.js +1 -1
  146. package/dist/lang/ms.umd.prod.js +1 -1
  147. package/dist/lang/my.umd.prod.js +1 -1
  148. package/dist/lang/nb-NO.umd.prod.js +1 -1
  149. package/dist/lang/nl.umd.prod.js +1 -1
  150. package/dist/lang/pl.umd.prod.js +1 -1
  151. package/dist/lang/pt-BR.umd.prod.js +1 -1
  152. package/dist/lang/pt.umd.prod.js +1 -1
  153. package/dist/lang/ro.umd.prod.js +1 -1
  154. package/dist/lang/ru.umd.prod.js +1 -1
  155. package/dist/lang/sk.umd.prod.js +1 -1
  156. package/dist/lang/sl.umd.prod.js +1 -1
  157. package/dist/lang/sm.umd.prod.js +1 -1
  158. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  159. package/dist/lang/sr.umd.prod.js +1 -1
  160. package/dist/lang/sv.umd.prod.js +1 -1
  161. package/dist/lang/ta.umd.prod.js +1 -1
  162. package/dist/lang/th.umd.prod.js +1 -1
  163. package/dist/lang/tr.umd.prod.js +1 -1
  164. package/dist/lang/ug.umd.prod.js +1 -1
  165. package/dist/lang/uk.umd.prod.js +1 -1
  166. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  167. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  168. package/dist/lang/vi.umd.prod.js +1 -1
  169. package/dist/lang/zh-CN.umd.prod.js +1 -1
  170. package/dist/lang/zh-TW.umd.prod.js +1 -1
  171. package/dist/quasar.cjs.prod.js +2 -2
  172. package/dist/quasar.css +12 -2
  173. package/dist/quasar.esm.js +603 -445
  174. package/dist/quasar.esm.prod.js +2 -2
  175. package/dist/quasar.prod.css +1 -1
  176. package/dist/quasar.rtl.css +28 -2
  177. package/dist/quasar.rtl.prod.css +1 -1
  178. package/dist/quasar.sass +13 -3
  179. package/dist/quasar.umd.js +603 -445
  180. package/dist/quasar.umd.prod.js +2 -2
  181. package/dist/transforms/auto-import.json +7 -3
  182. package/dist/transforms/import-map.json +2 -0
  183. package/dist/types/index.d.ts +116 -106
  184. package/dist/vetur/quasar-attributes.json +65 -49
  185. package/dist/vetur/quasar-tags.json +18 -14
  186. package/dist/web-types/web-types.json +261 -222
  187. package/package.json +3 -3
  188. package/src/api.extends.json +1 -2
  189. package/src/components/ajax-bar/QAjaxBar.json +5 -11
  190. package/src/components/badge/QBadge.js +1 -1
  191. package/src/components/breadcrumbs/QBreadcrumbs.json +0 -2
  192. package/src/components/breadcrumbs/QBreadcrumbsEl.json +1 -6
  193. package/src/components/breadcrumbs/__tests__/BasicBreadcrumbs.vue +7 -0
  194. package/src/components/breadcrumbs/__tests__/BreadcrumbWithSeparatorSlot.vue +11 -0
  195. package/src/components/breadcrumbs/__tests__/QBreadcrumbs.spec.js +112 -0
  196. package/src/components/breadcrumbs/__tests__/QBreadcrumbsEl.spec.js +87 -0
  197. package/src/components/btn/QBtn.json +1 -3
  198. package/src/components/btn/__tests__/QBtn.spec.js +87 -14
  199. package/src/components/btn/__tests__/use-btn.spec.js +385 -58
  200. package/src/components/btn/use-btn.js +24 -14
  201. package/src/components/btn-dropdown/QBtnDropdown.js +34 -18
  202. package/src/components/btn-dropdown/QBtnDropdown.json +1 -3
  203. package/src/components/btn-toggle/QBtnToggle.js +14 -14
  204. package/src/components/btn-toggle/QBtnToggle.json +2 -4
  205. package/src/components/carousel/QCarousel.json +4 -9
  206. package/src/components/carousel/QCarouselControl.json +0 -1
  207. package/src/components/checkbox/use-checkbox.js +1 -1
  208. package/src/components/checkbox/use-checkbox.json +1 -2
  209. package/src/components/chip/QChip.js +14 -11
  210. package/src/components/circular-progress/QCircularProgress.json +0 -5
  211. package/src/components/color/QColor.json +0 -1
  212. package/src/components/date/QDate.js +3 -3
  213. package/src/components/date/QDate.json +28 -56
  214. package/src/components/dialog/QDialog.js +32 -41
  215. package/src/components/dialog/QDialog.json +9 -2
  216. package/src/components/dialog-bottom-sheet/BottomSheet.js +7 -4
  217. package/src/components/dialog-plugin/DialogPlugin.js +4 -4
  218. package/src/components/drawer/QDrawer.js +10 -8
  219. package/src/components/drawer/QDrawer.json +0 -4
  220. package/src/components/editor/QEditor.json +3 -6
  221. package/src/components/expansion-item/QExpansionItem.js +3 -3
  222. package/src/components/expansion-item/QExpansionItem.json +3 -8
  223. package/src/components/fab/QFab.json +0 -1
  224. package/src/components/fab/use-fab.json +0 -1
  225. package/src/components/field/QField.json +0 -1
  226. package/src/components/file/QFile.js +4 -1
  227. package/src/components/file/QFile.json +19 -20
  228. package/src/components/footer/QFooter.js +5 -3
  229. package/src/components/footer/QFooter.json +0 -1
  230. package/src/components/form/QForm.js +5 -3
  231. package/src/components/form/QForm.json +2 -4
  232. package/src/components/header/QHeader.js +5 -3
  233. package/src/components/header/QHeader.json +0 -4
  234. package/src/components/infinite-scroll/QInfiniteScroll.json +9 -6
  235. package/src/components/inner-loading/QInnerLoading.js +2 -5
  236. package/src/components/input/QInput.js +4 -1
  237. package/src/components/input/QInput.json +11 -7
  238. package/src/components/input/use-mask.js +2 -2
  239. package/src/components/intersection/QIntersection.json +0 -1
  240. package/src/components/item/QItem.js +1 -0
  241. package/src/components/item/QItem.json +1 -2
  242. package/src/components/item/QItemLabel.json +0 -1
  243. package/src/components/item/QList.js +7 -2
  244. package/src/components/item/QList.json +7 -0
  245. package/src/components/knob/QKnob.js +3 -3
  246. package/src/components/knob/QKnob.json +3 -12
  247. package/src/components/layout/QLayout.js +1 -1
  248. package/src/components/layout/QLayout.json +6 -12
  249. package/src/components/linear-progress/QLinearProgress.json +0 -2
  250. package/src/components/menu/QMenu.js +8 -5
  251. package/src/components/menu/QMenu.json +0 -2
  252. package/src/components/option-group/QOptionGroup.js +1 -1
  253. package/src/components/option-group/QOptionGroup.json +2 -5
  254. package/src/components/page/QPage.js +11 -4
  255. package/src/components/page/QPage.json +3 -6
  256. package/src/components/page/QPageContainer.js +5 -3
  257. package/src/components/page-scroller/QPageScroller.json +0 -2
  258. package/src/components/page-sticky/QPageSticky.json +0 -1
  259. package/src/components/page-sticky/use-page-sticky.js +5 -3
  260. package/src/components/pagination/QPagination.js +265 -188
  261. package/src/components/pagination/QPagination.json +87 -78
  262. package/src/components/pagination/QPagination.sass +14 -0
  263. package/src/components/parallax/QParallax.json +2 -6
  264. package/src/components/popup-edit/QPopupEdit.js +3 -3
  265. package/src/components/popup-edit/QPopupEdit.json +4 -10
  266. package/src/components/popup-proxy/QPopupProxy.json +0 -1
  267. package/src/components/radio/QRadio.json +1 -2
  268. package/src/components/range/QRange.json +2 -4
  269. package/src/components/rating/QRating.json +0 -1
  270. package/src/components/resize-observer/QResizeObserver.js +14 -10
  271. package/src/components/resize-observer/QResizeObserver.json +2 -4
  272. package/src/components/scroll-area/QScrollArea.js +15 -4
  273. package/src/components/scroll-area/QScrollArea.json +24 -50
  274. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  275. package/src/components/scroll-observer/QScrollObserver.json +6 -12
  276. package/src/components/select/QSelect.js +20 -24
  277. package/src/components/select/QSelect.json +30 -65
  278. package/src/components/select/QSelect.sass +2 -2
  279. package/src/components/slide-item/QSlideItem.json +1 -2
  280. package/src/components/slide-transition/QSlideTransition.json +0 -1
  281. package/src/components/slider/use-slider.json +33 -70
  282. package/src/components/spinner/QSpinner.json +0 -1
  283. package/src/components/splitter/QSplitter.json +1 -2
  284. package/src/components/stepper/QStep.js +7 -5
  285. package/src/components/tab-panels/QTabPanel.js +1 -1
  286. package/src/components/table/QTable.js +3 -3
  287. package/src/components/table/QTable.json +118 -239
  288. package/src/components/tabs/QRouteTab.json +0 -1
  289. package/src/components/tabs/QTabs.js +0 -7
  290. package/src/components/tabs/QTabs.json +1 -3
  291. package/src/components/tabs/use-tab.js +5 -3
  292. package/src/components/time/QTime.json +10 -20
  293. package/src/components/timeline/QTimelineEntry.js +5 -3
  294. package/src/components/toolbar/QToolbar.js +1 -1
  295. package/src/components/tooltip/QTooltip.js +3 -6
  296. package/src/components/tooltip/QTooltip.json +0 -4
  297. package/src/components/tree/QTree.js +6 -6
  298. package/src/components/tree/QTree.json +15 -31
  299. package/src/components/uploader/QUploader.json +13 -22
  300. package/src/components/uploader/QUploaderAddTrigger.js +7 -3
  301. package/src/components/uploader/xhr-uploader-plugin.js +1 -1
  302. package/src/components/uploader/xhr-uploader-plugin.json +25 -50
  303. package/src/components/virtual-scroll/QVirtualScroll.json +5 -10
  304. package/src/components/virtual-scroll/use-virtual-scroll.js +1 -1
  305. package/src/components/virtual-scroll/use-virtual-scroll.json +8 -19
  306. package/src/composables/private/use-field.js +1 -1
  307. package/src/composables/private/use-field.json +2 -3
  308. package/src/composables/private/use-file.js +10 -1
  309. package/src/composables/private/use-file.json +4 -13
  310. package/src/composables/private/use-model-toggle.js +3 -3
  311. package/src/composables/private/use-panel.js +2 -2
  312. package/src/composables/private/use-panel.json +0 -2
  313. package/src/composables/private/use-portal.js +5 -1
  314. package/src/composables/private/use-portal.json +7 -1
  315. package/src/composables/private/use-transition.js +17 -11
  316. package/src/composables/private/use-transition.json +0 -1
  317. package/src/composables/private/use-validate.json +1 -3
  318. package/src/directives/Intersection.json +26 -53
  319. package/src/directives/Morph.json +4 -8
  320. package/src/directives/Mutation.json +6 -12
  321. package/src/directives/Scroll.json +2 -4
  322. package/src/directives/TouchHold.json +3 -6
  323. package/src/directives/TouchPan.json +7 -14
  324. package/src/directives/TouchRepeat.json +6 -12
  325. package/src/directives/TouchSwipe.json +3 -6
  326. package/src/plugins/BottomSheet.json +1 -2
  327. package/src/plugins/Cookies.json +2 -4
  328. package/src/plugins/Dialog.json +32 -72
  329. package/src/plugins/Loading.json +6 -11
  330. package/src/plugins/LoadingBar.json +3 -6
  331. package/src/plugins/Notify.json +4 -5
  332. package/src/plugins/Platform.json +3 -6
  333. package/src/plugins/Screen.json +9 -18
  334. package/src/utils/private/global-dialog.json +6 -12
  335. package/src/utils/private/portal.js +4 -4
  336. package/src/utils/private/symbols.js +2 -0
  337. package/src/utils/private/web-storage.json +6 -10
@@ -1,7 +1,7 @@
1
1
  import { h, computed, inject, getCurrentInstance } from 'vue'
2
2
 
3
3
  import { hSlot } from '../../utils/private/render.js'
4
- import { layoutKey } from '../../utils/private/symbols.js'
4
+ import { layoutKey, emptyRenderFn } from '../../utils/private/symbols.js'
5
5
 
6
6
  export const usePageStickyProps = {
7
7
  position: {
@@ -23,9 +23,11 @@ export const usePageStickyProps = {
23
23
  export default function () {
24
24
  const { props, proxy: { $q } } = getCurrentInstance()
25
25
 
26
- const $layout = inject(layoutKey, () => {
26
+ const $layout = inject(layoutKey, emptyRenderFn)
27
+ if ($layout === emptyRenderFn) {
27
28
  console.error('QPageSticky needs to be child of QLayout')
28
- })
29
+ return emptyRenderFn
30
+ }
29
31
 
30
32
  const attach = computed(() => {
31
33
  const pos = props.position
@@ -4,11 +4,18 @@ import QBtn from '../btn/QBtn.js'
4
4
  import QInput from '../input/QInput.js'
5
5
 
6
6
  import useDark, { useDarkProps } from '../../composables/private/use-dark.js'
7
+ import { btnDesignOptions, btnPadding, getBtnDesign } from '../btn/use-btn.js'
7
8
 
8
9
  import { createComponent } from '../../utils/private/create.js'
9
10
  import { between } from '../../utils/format.js'
10
11
  import { isKeyCode } from '../../utils/private/key-composition.js'
11
12
 
13
+ function getBool (val, otherwise) {
14
+ return [ true, false ].includes(val)
15
+ ? val
16
+ : otherwise
17
+ }
18
+
12
19
  export default createComponent({
13
20
  name: 'QPagination',
14
21
 
@@ -20,22 +27,20 @@ export default createComponent({
20
27
  required: true
21
28
  },
22
29
  min: {
23
- type: Number,
30
+ type: [ Number, String ],
24
31
  default: 1
25
32
  },
26
33
  max: {
27
- type: Number,
34
+ type: [ Number, String ],
28
35
  required: true
29
36
  },
30
-
31
- color: {
32
- type: String,
33
- default: 'primary'
37
+ maxPages: {
38
+ type: [ Number, String ],
39
+ default: 0,
40
+ validator: v => (
41
+ (typeof v === 'string' ? parseInt(v, 10) : v) >= 0
42
+ )
34
43
  },
35
- textColor: String,
36
-
37
- activeColor: String,
38
- activeTextColor: String,
39
44
 
40
45
  inputStyle: [ Array, String, Object ],
41
46
  inputClass: [ Array, String, Object ],
@@ -69,11 +74,6 @@ export default createComponent({
69
74
  type: Boolean,
70
75
  default: null
71
76
  },
72
- maxPages: {
73
- type: Number,
74
- default: 0,
75
- validator: v => v >= 0
76
- },
77
77
 
78
78
  ripple: {
79
79
  type: [ Boolean, Object ],
@@ -89,7 +89,21 @@ export default createComponent({
89
89
  push: Boolean,
90
90
  glossy: Boolean,
91
91
 
92
- dense: Boolean,
92
+ color: {
93
+ type: String,
94
+ default: 'primary'
95
+ },
96
+ textColor: String,
97
+
98
+ activeDesign: {
99
+ type: String,
100
+ default: '',
101
+ values: v => v === '' || btnDesignOptions.includes(v)
102
+ },
103
+ activeColor: String,
104
+ activeTextColor: String,
105
+
106
+ gutter: String,
93
107
  padding: {
94
108
  type: String,
95
109
  default: '3px 2px'
@@ -104,6 +118,16 @@ export default createComponent({
104
118
 
105
119
  const isDark = useDark(props, $q)
106
120
 
121
+ const minProp = computed(() => parseInt(props.min, 10))
122
+ const maxProp = computed(() => parseInt(props.max, 10))
123
+ const maxPagesProp = computed(() => parseInt(props.maxPages, 10))
124
+
125
+ const inputPlaceholder = computed(() => model.value + ' / ' + maxProp.value)
126
+ const boundaryLinksProp = computed(() => getBool(props.boundaryLinks, props.input))
127
+ const boundaryNumbersProp = computed(() => getBool(props.boundaryNumbers, !props.input))
128
+ const directionLinksProp = computed(() => getBool(props.directionLinks, props.input))
129
+ const ellipsesProp = computed(() => getBool(props.ellipses, !props.input))
130
+
107
131
  const newPage = ref(null)
108
132
  const model = computed({
109
133
  get: () => props.modelValue,
@@ -112,32 +136,33 @@ export default createComponent({
112
136
  if (props.disable || isNaN(val)) {
113
137
  return
114
138
  }
115
- const value = between(val, props.min, props.max)
139
+ const value = between(val, minProp.value, maxProp.value)
116
140
  if (props.modelValue !== value) {
117
141
  emit('update:modelValue', value)
118
142
  }
119
143
  }
120
144
  })
121
145
 
122
- watch(() => props.min + props.max, () => {
146
+ watch(() => `${ minProp.value }|${ maxProp.value }`, () => {
123
147
  model.value = props.modelValue
124
148
  })
125
149
 
126
- function getBool (val, otherwise) {
127
- return [ true, false ].includes(val)
128
- ? val
129
- : otherwise
130
- }
131
-
132
150
  const classes = computed(() =>
133
151
  'q-pagination row no-wrap items-center'
134
152
  + (props.disable === true ? ' disabled' : '')
135
153
  )
136
- const inputPlaceholder = computed(() => model.value + ' / ' + props.max)
137
- const __boundaryLinks = computed(() => getBool(props.boundaryLinks, props.input))
138
- const __boundaryNumbers = computed(() => getBool(props.boundaryNumbers, !props.input))
139
- const __directionLinks = computed(() => getBool(props.directionLinks, props.input))
140
- const __ellipses = computed(() => getBool(props.ellipses, !props.input))
154
+
155
+ const gutterProp = computed(() => (
156
+ props.gutter in btnPadding
157
+ ? `${ btnPadding[ props.gutter ] }px`
158
+ : props.gutter || null
159
+ ))
160
+ const gutterStyle = computed(() => (
161
+ gutterProp.value !== null
162
+ ? `--q-pagination-gutter-parent:-${ gutterProp.value };--q-pagination-gutter-child:${ gutterProp.value }`
163
+ : null
164
+ ))
165
+
141
166
  const icons = computed(() => {
142
167
  const ico = [
143
168
  props.iconFirst || $q.iconSet.pagination.first,
@@ -148,38 +173,90 @@ export default createComponent({
148
173
  return $q.lang.rtl === true ? ico.reverse() : ico
149
174
  })
150
175
 
151
- const attrs = computed(() => (
152
- props.disable === true
153
- ? { 'aria-disabled': 'true' }
154
- : {}
155
- ))
176
+ const attrs = computed(() => ({
177
+ 'aria-disabled': props.disable === true ? 'true' : 'false',
178
+ role: 'navigation'
179
+ }))
156
180
 
181
+ const btnDesignProp = computed(() => getBtnDesign(props, 'flat'))
157
182
  const btnProps = computed(() => ({
183
+ [ btnDesignProp.value ]: true,
184
+
158
185
  round: props.round,
159
186
  rounded: props.rounded,
160
187
 
161
- outline: props.outline,
162
- unelevated: props.unelevated,
163
- push: props.push,
164
- glossy: props.glossy,
165
-
166
- dense: props.dense,
167
188
  padding: props.padding,
168
189
 
169
190
  color: props.color,
170
- flat: true,
191
+ textColor: props.textColor,
192
+
171
193
  size: props.size,
172
194
  ripple: props.ripple !== null
173
195
  ? props.ripple
174
196
  : true
175
197
  }))
176
198
 
199
+ const btnActiveDesignProp = computed(() => {
200
+ // we also reset non-active design
201
+ const acc = { [ btnDesignProp.value ]: false }
202
+ if (props.activeDesign !== '') {
203
+ acc[ props.activeDesign ] = true
204
+ }
205
+ return acc
206
+ })
177
207
  const activeBtnProps = computed(() => ({
178
- flat: props.flat,
208
+ ...btnActiveDesignProp.value,
179
209
  color: props.activeColor || props.color,
180
210
  textColor: props.activeTextColor || props.textColor
181
211
  }))
182
212
 
213
+ const btnConfig = computed(() => {
214
+ let maxPages = Math.max(
215
+ maxPagesProp.value,
216
+ 1 + (ellipsesProp.value ? 2 : 0) + (boundaryNumbersProp.value ? 2 : 0)
217
+ )
218
+
219
+ const acc = {
220
+ pgFrom: minProp.value,
221
+ pgTo: maxProp.value,
222
+ ellipsesStart: false,
223
+ ellipsesEnd: false,
224
+ boundaryStart: false,
225
+ boundaryEnd: false,
226
+ marginalStyle: {
227
+ minWidth: `${ Math.max(2, String(maxProp.value).length) }em`
228
+ }
229
+ }
230
+
231
+ if (maxPagesProp.value && maxPages < (maxProp.value - minProp.value + 1)) {
232
+ maxPages = 1 + Math.floor(maxPages / 2) * 2
233
+ acc.pgFrom = Math.max(minProp.value, Math.min(maxProp.value - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)))
234
+ acc.pgTo = Math.min(maxProp.value, acc.pgFrom + maxPages - 1)
235
+
236
+ if (boundaryNumbersProp.value) {
237
+ acc.boundaryStart = true
238
+ acc.pgFrom++
239
+ }
240
+
241
+ if (ellipsesProp.value && acc.pgFrom > (minProp.value + (boundaryNumbersProp.value ? 1 : 0))) {
242
+ acc.ellipsesStart = true
243
+ acc.pgFrom++
244
+ }
245
+
246
+ if (boundaryNumbersProp.value) {
247
+ acc.boundaryEnd = true
248
+ acc.pgTo--
249
+ }
250
+
251
+ if (ellipsesProp.value && acc.pgTo < (maxProp.value - (boundaryNumbersProp.value ? 1 : 0))) {
252
+ acc.ellipsesEnd = true
253
+ acc.pgTo--
254
+ }
255
+ }
256
+
257
+ return acc
258
+ })
259
+
183
260
  function set (value) {
184
261
  model.value = value
185
262
  }
@@ -188,20 +265,40 @@ export default createComponent({
188
265
  model.value = model.value + offset
189
266
  }
190
267
 
191
- function updateModel () {
192
- model.value = newPage.value
193
- newPage.value = null
194
- }
268
+ const inputEvents = computed(() => {
269
+ function updateModel () {
270
+ model.value = newPage.value
271
+ newPage.value = null
272
+ }
273
+
274
+ return {
275
+ 'onUpdate:modelValue': val => { newPage.value = val },
276
+ onKeyup: e => { isKeyCode(e, 13) === true && updateModel() },
277
+ onBlur: updateModel
278
+ }
279
+ })
280
+
281
+ function getBtn (cfg, page, active) {
282
+ const data = {
283
+ 'aria-label': page,
284
+ 'aria-current': 'false',
285
+ ...btnProps.value,
286
+ ...cfg
287
+ }
195
288
 
196
- function getBtn (cfg, page) {
197
- const data = { ...btnProps.value, ...cfg }
289
+ if (active === true) {
290
+ Object.assign(data, {
291
+ 'aria-current': 'true',
292
+ ...activeBtnProps.value
293
+ })
294
+ }
198
295
 
199
296
  if (page !== void 0) {
200
297
  if (props.toFn !== void 0) {
201
298
  data.to = props.toFn(page)
202
299
  }
203
300
  else {
204
- data.onClick = () => set(page)
301
+ data.onClick = () => { set(page) }
205
302
  }
206
303
  }
207
304
 
@@ -212,147 +309,107 @@ export default createComponent({
212
309
  Object.assign(proxy, { set, setByOffset })
213
310
 
214
311
  return () => {
215
- const
216
- contentStart = [],
217
- contentEnd = [],
218
- contentMiddle = []
219
-
220
- if (__boundaryLinks.value) {
221
- contentStart.push(getBtn({
222
- key: 'bls',
223
- disable: props.disable || props.modelValue <= props.min,
224
- icon: icons.value[ 0 ]
225
- }, props.min))
226
- contentEnd.unshift(getBtn({
227
- key: 'ble',
228
- disable: props.disable || props.modelValue >= props.max,
229
- icon: icons.value[ 3 ]
230
- }, props.max))
312
+ const contentStart = []
313
+ const contentEnd = []
314
+ let contentMiddle
315
+
316
+ if (boundaryLinksProp.value === true) {
317
+ contentStart.push(
318
+ getBtn({
319
+ key: 'bls',
320
+ disable: props.disable || props.modelValue <= minProp.value,
321
+ icon: icons.value[ 0 ]
322
+ }, minProp.value)
323
+ )
324
+
325
+ contentEnd.unshift(
326
+ getBtn({
327
+ key: 'ble',
328
+ disable: props.disable || props.modelValue >= maxProp.value,
329
+ icon: icons.value[ 3 ]
330
+ }, maxProp.value)
331
+ )
231
332
  }
232
333
 
233
- if (__directionLinks.value) {
234
- contentStart.push(getBtn({
235
- key: 'bdp',
236
- disable: props.disable || props.modelValue <= props.min,
237
- icon: icons.value[ 1 ]
238
- }, props.modelValue - 1))
239
- contentEnd.unshift(getBtn({
240
- key: 'bdn',
241
- disable: props.disable || props.modelValue >= props.max,
242
- icon: icons.value[ 2 ]
243
- }, props.modelValue + 1))
334
+ if (directionLinksProp.value === true) {
335
+ contentStart.push(
336
+ getBtn({
337
+ key: 'bdp',
338
+ disable: props.disable || props.modelValue <= minProp.value,
339
+ icon: icons.value[ 1 ]
340
+ }, props.modelValue - 1)
341
+ )
342
+
343
+ contentEnd.unshift(
344
+ getBtn({
345
+ key: 'bdn',
346
+ disable: props.disable || props.modelValue >= maxProp.value,
347
+ icon: icons.value[ 2 ]
348
+ }, props.modelValue + 1)
349
+ )
244
350
  }
245
351
 
246
- if (props.input === true) {
247
- contentMiddle.push(h(QInput, {
248
- class: 'inline',
249
- style: {
250
- width: `${ inputPlaceholder.value.length / 1.5 }em`
251
- },
252
- type: 'number',
253
- dense: true,
254
- value: newPage.value,
255
- disable: props.disable,
256
- dark: isDark.value,
257
- borderless: true,
258
- inputClass: props.inputClass,
259
- inputStyle: props.inputStyle,
260
- placeholder: inputPlaceholder.value,
261
- min: props.min,
262
- max: props.max,
263
- 'onUpdate:modelValue' (value) { newPage.value = value },
264
- onKeyup (e) { isKeyCode(e, 13) === true && updateModel() },
265
- onBlur: updateModel
266
- }))
267
- }
268
- else { // is type select
269
- let
270
- maxPages = Math.max(
271
- props.maxPages,
272
- 1 + (__ellipses.value ? 2 : 0) + (__boundaryNumbers.value ? 2 : 0)
273
- ),
274
- pgFrom = props.min,
275
- pgTo = props.max,
276
- ellipsesStart = false,
277
- ellipsesEnd = false,
278
- boundaryStart = false,
279
- boundaryEnd = false
280
-
281
- if (props.maxPages && maxPages < (props.max - props.min + 1)) {
282
- maxPages = 1 + Math.floor(maxPages / 2) * 2
283
- pgFrom = Math.max(props.min, Math.min(props.max - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)))
284
- pgTo = Math.min(props.max, pgFrom + maxPages - 1)
285
- if (__boundaryNumbers.value) {
286
- boundaryStart = true
287
- pgFrom += 1
288
- }
289
- if (__ellipses.value && pgFrom > (props.min + (__boundaryNumbers.value ? 1 : 0))) {
290
- ellipsesStart = true
291
- pgFrom += 1
292
- }
293
- if (__boundaryNumbers.value) {
294
- boundaryEnd = true
295
- pgTo -= 1
296
- }
297
- if (__ellipses.value && pgTo < (props.max - (__boundaryNumbers.value ? 1 : 0))) {
298
- ellipsesEnd = true
299
- pgTo -= 1
300
- }
301
- }
302
- const style = {
303
- minWidth: `${ Math.max(2, String(props.max).length) }em`
304
- }
305
- if (boundaryStart) {
306
- const active = props.min === props.modelValue
307
- contentStart.push(getBtn({
308
- key: 'bns',
309
- style,
310
- disable: props.disable,
311
- flat: !active,
312
- label: props.min,
313
- ...(active ? activeBtnProps.value : {})
314
- }, props.min))
352
+ if (props.input !== true) { // has buttons instead of inputbox
353
+ contentMiddle = []
354
+ const { pgFrom, pgTo, marginalStyle: style } = btnConfig.value
355
+
356
+ if (btnConfig.value.boundaryStart === true) {
357
+ const active = minProp.value === props.modelValue
358
+ contentStart.push(
359
+ getBtn({
360
+ key: 'bns',
361
+ style,
362
+ disable: props.disable,
363
+ label: minProp.value
364
+ }, minProp.value, active)
365
+ )
315
366
  }
316
- if (boundaryEnd) {
317
- const active = props.max === props.modelValue
318
- contentEnd.unshift(getBtn({
319
- key: 'bne',
320
- style,
321
- disable: props.disable,
322
- flat: !active,
323
- label: props.max,
324
- ...(active ? activeBtnProps.value : {})
325
- }, props.max))
367
+
368
+ if (btnConfig.value.boundaryEnd === true) {
369
+ const active = maxProp.value === props.modelValue
370
+ contentEnd.unshift(
371
+ getBtn({
372
+ key: 'bne',
373
+ style,
374
+ disable: props.disable,
375
+ label: maxProp.value
376
+ }, maxProp.value, active)
377
+ )
326
378
  }
327
- if (ellipsesStart) {
328
- contentStart.push(getBtn({
329
- key: 'bes',
330
- style,
331
- disable: props.disable,
332
- label: '…',
333
- ripple: false
334
- }, pgFrom - 1))
379
+
380
+ if (btnConfig.value.ellipsesStart === true) {
381
+ contentStart.push(
382
+ getBtn({
383
+ key: 'bes',
384
+ style,
385
+ disable: props.disable,
386
+ label: '…',
387
+ ripple: false
388
+ }, pgFrom - 1)
389
+ )
335
390
  }
336
- if (ellipsesEnd) {
337
- contentEnd.unshift(getBtn({
338
- key: 'bee',
339
- style,
340
- disable: props.disable,
341
- label: '…',
342
- ripple: false
343
- }, pgTo + 1))
391
+
392
+ if (btnConfig.value.ellipsesEnd === true) {
393
+ contentEnd.unshift(
394
+ getBtn({
395
+ key: 'bee',
396
+ style,
397
+ disable: props.disable,
398
+ label: '…',
399
+ ripple: false
400
+ }, pgTo + 1)
401
+ )
344
402
  }
403
+
345
404
  for (let i = pgFrom; i <= pgTo; i++) {
346
- const btn = {
347
- key: `bpg${ i }`,
348
- style,
349
- disable: props.disable,
350
- label: i
351
- }
352
- if (i === props.modelValue) {
353
- Object.assign(btn, activeBtnProps.value)
354
- }
355
- contentMiddle.push(getBtn(btn, i))
405
+ contentMiddle.push(
406
+ getBtn({
407
+ key: `bpg${ i }`,
408
+ style,
409
+ disable: props.disable,
410
+ label: i
411
+ }, i, i === props.modelValue)
412
+ )
356
413
  }
357
414
  }
358
415
 
@@ -360,15 +417,35 @@ export default createComponent({
360
417
  class: classes.value,
361
418
  ...attrs.value
362
419
  }, [
363
- contentStart,
364
-
365
420
  h('div', {
366
- class: 'row justify-center'
421
+ class: 'q-pagination__content row no-wrap items-center',
422
+ style: gutterStyle.value
367
423
  }, [
368
- contentMiddle
369
- ]),
370
-
371
- contentEnd
424
+ ...contentStart,
425
+
426
+ props.input === true
427
+ ? h(QInput, {
428
+ class: 'inline',
429
+ style: { width: `${ inputPlaceholder.value.length / 1.5 }em` },
430
+ type: 'number',
431
+ dense: true,
432
+ value: newPage.value,
433
+ disable: props.disable,
434
+ dark: isDark.value,
435
+ borderless: true,
436
+ inputClass: props.inputClass,
437
+ inputStyle: props.inputStyle,
438
+ placeholder: inputPlaceholder.value,
439
+ min: minProp.value,
440
+ max: maxProp.value,
441
+ ...inputEvents.value
442
+ })
443
+ : h('div', {
444
+ class: 'q-pagination__middle row justify-center'
445
+ }, contentMiddle),
446
+
447
+ ...contentEnd
448
+ ])
372
449
  ])
373
450
  }
374
451
  }