quasar 2.10.0 → 2.10.2

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 (319) hide show
  1. package/dist/api/Dialog.json +28 -69
  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/QBtn.json +0 -3
  12. package/dist/api/QBtnDropdown.json +0 -12
  13. package/dist/api/QCarousel.json +0 -10
  14. package/dist/api/QCarouselControl.json +0 -3
  15. package/dist/api/QCircularProgress.json +0 -23
  16. package/dist/api/QColor.json +0 -3
  17. package/dist/api/QDialog.json +18 -9
  18. package/dist/api/QDrawer.json +0 -6
  19. package/dist/api/QExpansionItem.json +0 -3
  20. package/dist/api/QFab.json +1 -6
  21. package/dist/api/QFabAction.json +1 -3
  22. package/dist/api/QField.json +1 -6
  23. package/dist/api/QFile.json +12 -29
  24. package/dist/api/QFooter.json +0 -3
  25. package/dist/api/QHeader.json +0 -6
  26. package/dist/api/QInfiniteScroll.json +9 -16
  27. package/dist/api/QInnerLoading.json +0 -4
  28. package/dist/api/QInput.json +8 -15
  29. package/dist/api/QIntersection.json +0 -4
  30. package/dist/api/QItemLabel.json +0 -5
  31. package/dist/api/QKnob.json +3 -36
  32. package/dist/api/QLayout.json +6 -24
  33. package/dist/api/QLinearProgress.json +0 -6
  34. package/dist/api/QList.json +15 -0
  35. package/dist/api/QMenu.json +7 -12
  36. package/dist/api/QOptionGroup.json +0 -3
  37. package/dist/api/QPage.json +2 -8
  38. package/dist/api/QPageScroller.json +0 -9
  39. package/dist/api/QPageSticky.json +0 -3
  40. package/dist/api/QPagination.json +4 -25
  41. package/dist/api/QParallax.json +2 -14
  42. package/dist/api/QPopupEdit.json +0 -8
  43. package/dist/api/QPopupProxy.json +21 -4
  44. package/dist/api/QRange.json +5 -32
  45. package/dist/api/QRating.json +0 -4
  46. package/dist/api/QResizeObserver.json +2 -8
  47. package/dist/api/QScrollArea.json +8 -36
  48. package/dist/api/QScrollObserver.json +6 -24
  49. package/dist/api/QSelect.json +18 -108
  50. package/dist/api/QSlideItem.json +1 -6
  51. package/dist/api/QSlideTransition.json +0 -4
  52. package/dist/api/QSlider.json +3 -24
  53. package/dist/api/QSpinner.json +0 -4
  54. package/dist/api/QSplitter.json +1 -4
  55. package/dist/api/QStepper.json +0 -7
  56. package/dist/api/QTabPanels.json +0 -7
  57. package/dist/api/QTable.json +43 -191
  58. package/dist/api/QTabs.json +0 -6
  59. package/dist/api/QTime.json +3 -12
  60. package/dist/api/QTooltip.json +7 -18
  61. package/dist/api/QTree.json +0 -3
  62. package/dist/api/QUploader.json +5 -16
  63. package/dist/api/QVirtualScroll.json +11 -56
  64. package/dist/api/Screen.json +9 -36
  65. package/dist/api/Scroll.json +2 -8
  66. package/dist/api/SessionStorage.json +4 -16
  67. package/dist/api/TouchHold.json +3 -12
  68. package/dist/api/TouchPan.json +7 -28
  69. package/dist/api/TouchRepeat.json +6 -24
  70. package/dist/api/TouchSwipe.json +3 -12
  71. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  72. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  73. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  74. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  75. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  76. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  77. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  78. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  79. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  80. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  81. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  82. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  83. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  84. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  85. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  86. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  87. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  88. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  89. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  90. package/dist/icon-set/mdi-v7.umd.prod.js +6 -0
  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-mdi-v7.umd.prod.js +6 -0
  108. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  109. package/dist/icon-set/themify.umd.prod.js +1 -1
  110. package/dist/lang/ar-TN.umd.prod.js +1 -1
  111. package/dist/lang/ar.umd.prod.js +1 -1
  112. package/dist/lang/az-Latn.umd.prod.js +1 -1
  113. package/dist/lang/bg.umd.prod.js +1 -1
  114. package/dist/lang/bn.umd.prod.js +1 -1
  115. package/dist/lang/ca.umd.prod.js +1 -1
  116. package/dist/lang/cs.umd.prod.js +1 -1
  117. package/dist/lang/da.umd.prod.js +1 -1
  118. package/dist/lang/de.umd.prod.js +1 -1
  119. package/dist/lang/el.umd.prod.js +1 -1
  120. package/dist/lang/en-GB.umd.prod.js +1 -1
  121. package/dist/lang/en-US.umd.prod.js +1 -1
  122. package/dist/lang/eo.umd.prod.js +1 -1
  123. package/dist/lang/es.umd.prod.js +1 -1
  124. package/dist/lang/et.umd.prod.js +1 -1
  125. package/dist/lang/eu.umd.prod.js +1 -1
  126. package/dist/lang/fa-IR.umd.prod.js +1 -1
  127. package/dist/lang/fa.umd.prod.js +1 -1
  128. package/dist/lang/fi.umd.prod.js +1 -1
  129. package/dist/lang/fr.umd.prod.js +1 -1
  130. package/dist/lang/gn.umd.prod.js +1 -1
  131. package/dist/lang/he.umd.prod.js +1 -1
  132. package/dist/lang/hr.umd.prod.js +1 -1
  133. package/dist/lang/hu.umd.prod.js +1 -1
  134. package/dist/lang/id.umd.prod.js +1 -1
  135. package/dist/lang/is.umd.prod.js +1 -1
  136. package/dist/lang/it.umd.prod.js +1 -1
  137. package/dist/lang/ja.umd.prod.js +1 -1
  138. package/dist/lang/km.umd.prod.js +1 -1
  139. package/dist/lang/ko-KR.umd.prod.js +1 -1
  140. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  141. package/dist/lang/kz.umd.prod.js +1 -1
  142. package/dist/lang/lt.umd.prod.js +1 -1
  143. package/dist/lang/lu.umd.prod.js +1 -1
  144. package/dist/lang/lv.umd.prod.js +1 -1
  145. package/dist/lang/ml.umd.prod.js +1 -1
  146. package/dist/lang/mm.umd.prod.js +1 -1
  147. package/dist/lang/ms.umd.prod.js +1 -1
  148. package/dist/lang/my.umd.prod.js +1 -1
  149. package/dist/lang/nb-NO.umd.prod.js +1 -1
  150. package/dist/lang/nl.umd.prod.js +1 -1
  151. package/dist/lang/pl.umd.prod.js +1 -1
  152. package/dist/lang/pt-BR.umd.prod.js +1 -1
  153. package/dist/lang/pt.umd.prod.js +1 -1
  154. package/dist/lang/ro.umd.prod.js +1 -1
  155. package/dist/lang/ru.umd.prod.js +1 -1
  156. package/dist/lang/sk.umd.prod.js +1 -1
  157. package/dist/lang/sl.umd.prod.js +1 -1
  158. package/dist/lang/sm.umd.prod.js +1 -1
  159. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  160. package/dist/lang/sr.umd.prod.js +1 -1
  161. package/dist/lang/sv.umd.prod.js +1 -1
  162. package/dist/lang/ta.umd.prod.js +1 -1
  163. package/dist/lang/th.umd.prod.js +1 -1
  164. package/dist/lang/tr.umd.prod.js +1 -1
  165. package/dist/lang/ug.umd.prod.js +1 -1
  166. package/dist/lang/uk.umd.prod.js +1 -1
  167. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  168. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  169. package/dist/lang/vi.umd.prod.js +1 -1
  170. package/dist/lang/zh-CN.umd.prod.js +1 -1
  171. package/dist/lang/zh-TW.umd.prod.js +1 -1
  172. package/dist/quasar.cjs.prod.js +2 -2
  173. package/dist/quasar.css +3 -3
  174. package/dist/quasar.esm.js +223 -192
  175. package/dist/quasar.esm.prod.js +2 -2
  176. package/dist/quasar.prod.css +1 -1
  177. package/dist/quasar.rtl.css +10 -3
  178. package/dist/quasar.rtl.prod.css +1 -1
  179. package/dist/quasar.sass +5 -4
  180. package/dist/quasar.umd.js +222 -191
  181. package/dist/quasar.umd.prod.js +2 -2
  182. package/dist/types/api/dialog.d.ts +101 -0
  183. package/dist/types/api/qpopupproxy.d.ts +3 -0
  184. package/dist/types/api.d.ts +2 -0
  185. package/dist/types/index.d.ts +56 -97
  186. package/dist/vetur/quasar-attributes.json +4 -0
  187. package/dist/vetur/quasar-tags.json +2 -1
  188. package/dist/web-types/web-types.json +142 -132
  189. package/icon-set/mdi-v7.js +146 -0
  190. package/icon-set/mdi-v7.mjs +141 -0
  191. package/icon-set/svg-mdi-v7.js +224 -0
  192. package/icon-set/svg-mdi-v7.mjs +224 -0
  193. package/package.json +4 -4
  194. package/src/api.extends.json +1 -2
  195. package/src/components/ajax-bar/QAjaxBar.json +5 -11
  196. package/src/components/breadcrumbs/QBreadcrumbs.json +0 -2
  197. package/src/components/breadcrumbs/QBreadcrumbsEl.json +1 -2
  198. package/src/components/btn/QBtn.json +1 -3
  199. package/src/components/btn/__tests__/QBtn.spec.js +87 -14
  200. package/src/components/btn/__tests__/use-btn.spec.js +385 -58
  201. package/src/components/btn-dropdown/QBtnDropdown.js +4 -12
  202. package/src/components/btn-dropdown/QBtnDropdown.json +0 -2
  203. package/src/components/btn-toggle/QBtnToggle.json +2 -4
  204. package/src/components/carousel/QCarousel.json +4 -9
  205. package/src/components/carousel/QCarouselControl.json +0 -1
  206. package/src/components/checkbox/use-checkbox.json +1 -2
  207. package/src/components/circular-progress/QCircularProgress.json +0 -5
  208. package/src/components/color/QColor.json +0 -1
  209. package/src/components/date/QDate.js +6 -4
  210. package/src/components/date/QDate.json +28 -56
  211. package/src/components/dialog/QDialog.js +34 -41
  212. package/src/components/dialog/QDialog.json +9 -2
  213. package/src/components/dialog-bottom-sheet/BottomSheet.js +1 -2
  214. package/src/components/dialog-plugin/DialogPlugin.js +4 -4
  215. package/src/components/drawer/QDrawer.js +5 -5
  216. package/src/components/drawer/QDrawer.json +0 -4
  217. package/src/components/editor/QEditor.json +3 -6
  218. package/src/components/expansion-item/QExpansionItem.js +3 -4
  219. package/src/components/expansion-item/QExpansionItem.json +3 -8
  220. package/src/components/fab/QFab.js +3 -6
  221. package/src/components/fab/QFab.json +0 -1
  222. package/src/components/fab/QFab.sass +2 -1
  223. package/src/components/fab/use-fab.json +0 -1
  224. package/src/components/field/QField.json +0 -1
  225. package/src/components/file/QFile.js +4 -1
  226. package/src/components/file/QFile.json +19 -20
  227. package/src/components/footer/QFooter.json +0 -1
  228. package/src/components/form/QForm.js +5 -3
  229. package/src/components/form/QForm.json +2 -4
  230. package/src/components/header/QHeader.json +0 -4
  231. package/src/components/img/QImg.js +20 -19
  232. package/src/components/infinite-scroll/QInfiniteScroll.json +9 -6
  233. package/src/components/inner-loading/QInnerLoading.js +2 -5
  234. package/src/components/input/QInput.js +12 -3
  235. package/src/components/input/QInput.json +11 -7
  236. package/src/components/input/use-mask.js +3 -1
  237. package/src/components/intersection/QIntersection.json +0 -1
  238. package/src/components/item/QItem.json +1 -2
  239. package/src/components/item/QItemLabel.json +0 -1
  240. package/src/components/item/QList.js +7 -2
  241. package/src/components/item/QList.json +7 -0
  242. package/src/components/knob/QKnob.js +3 -3
  243. package/src/components/knob/QKnob.json +3 -12
  244. package/src/components/layout/QLayout.js +1 -1
  245. package/src/components/layout/QLayout.json +6 -12
  246. package/src/components/linear-progress/QLinearProgress.json +0 -2
  247. package/src/components/menu/QMenu.js +12 -6
  248. package/src/components/menu/QMenu.json +0 -2
  249. package/src/components/option-group/QOptionGroup.json +2 -5
  250. package/src/components/page/QPage.json +3 -6
  251. package/src/components/page-scroller/QPageScroller.json +0 -2
  252. package/src/components/page-sticky/QPageSticky.json +0 -1
  253. package/src/components/pagination/QPagination.json +5 -13
  254. package/src/components/parallax/QParallax.json +2 -6
  255. package/src/components/popup-edit/QPopupEdit.js +3 -3
  256. package/src/components/popup-edit/QPopupEdit.json +4 -10
  257. package/src/components/popup-proxy/QPopupProxy.js +6 -0
  258. package/src/components/popup-proxy/QPopupProxy.json +19 -1
  259. package/src/components/radio/QRadio.json +1 -2
  260. package/src/components/range/QRange.json +2 -4
  261. package/src/components/rating/QRating.json +0 -1
  262. package/src/components/resize-observer/QResizeObserver.json +2 -4
  263. package/src/components/scroll-area/QScrollArea.js +15 -4
  264. package/src/components/scroll-area/QScrollArea.json +24 -50
  265. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  266. package/src/components/scroll-observer/QScrollObserver.json +6 -12
  267. package/src/components/select/QSelect.js +28 -27
  268. package/src/components/select/QSelect.json +30 -65
  269. package/src/components/select/QSelect.sass +2 -2
  270. package/src/components/slide-item/QSlideItem.json +1 -2
  271. package/src/components/slide-transition/QSlideTransition.json +0 -1
  272. package/src/components/slider/use-slider.json +33 -70
  273. package/src/components/spinner/QSpinner.json +0 -1
  274. package/src/components/splitter/QSplitter.json +1 -2
  275. package/src/components/table/QTable.js +3 -3
  276. package/src/components/table/QTable.json +118 -239
  277. package/src/components/tabs/QRouteTab.json +0 -1
  278. package/src/components/tabs/QTabs.json +0 -2
  279. package/src/components/time/QTime.json +10 -20
  280. package/src/components/tooltip/QTooltip.js +2 -5
  281. package/src/components/tooltip/QTooltip.json +0 -4
  282. package/src/components/tree/QTree.js +6 -6
  283. package/src/components/tree/QTree.json +15 -31
  284. package/src/components/uploader/QUploader.json +13 -22
  285. package/src/components/uploader/xhr-uploader-plugin.js +1 -1
  286. package/src/components/uploader/xhr-uploader-plugin.json +25 -50
  287. package/src/components/virtual-scroll/QVirtualScroll.json +5 -10
  288. package/src/components/virtual-scroll/use-virtual-scroll.js +1 -1
  289. package/src/components/virtual-scroll/use-virtual-scroll.json +8 -19
  290. package/src/composables/private/use-field.js +1 -1
  291. package/src/composables/private/use-field.json +2 -3
  292. package/src/composables/private/use-file.json +4 -13
  293. package/src/composables/private/use-model-toggle.js +3 -3
  294. package/src/composables/private/use-panel.js +2 -2
  295. package/src/composables/private/use-panel.json +0 -2
  296. package/src/composables/private/use-portal.js +5 -1
  297. package/src/composables/private/use-portal.json +7 -1
  298. package/src/composables/private/use-transition.js +17 -11
  299. package/src/composables/private/use-transition.json +0 -1
  300. package/src/composables/private/use-validate.json +1 -3
  301. package/src/directives/Intersection.json +26 -53
  302. package/src/directives/Morph.json +4 -8
  303. package/src/directives/Mutation.json +6 -12
  304. package/src/directives/Scroll.json +2 -4
  305. package/src/directives/TouchHold.json +3 -6
  306. package/src/directives/TouchPan.json +7 -14
  307. package/src/directives/TouchRepeat.json +6 -12
  308. package/src/directives/TouchSwipe.json +3 -6
  309. package/src/plugins/BottomSheet.json +1 -2
  310. package/src/plugins/Cookies.json +2 -4
  311. package/src/plugins/Dialog.json +35 -73
  312. package/src/plugins/Loading.json +6 -11
  313. package/src/plugins/LoadingBar.json +3 -6
  314. package/src/plugins/Notify.json +4 -5
  315. package/src/plugins/Platform.json +3 -6
  316. package/src/plugins/Screen.json +9 -18
  317. package/src/utils/private/global-dialog.json +6 -12
  318. package/src/utils/private/portal.js +4 -4
  319. package/src/utils/private/web-storage.json +6 -10
@@ -1,187 +1,514 @@
1
+ import { mount } from '@cypress/vue'
2
+ import { createMemoryHistory, createRouter } from 'vue-router'
3
+ import { alignMap, alignValues } from '../../../composables/private/use-align.js'
4
+ import QBtn from '../QBtn.js'
5
+ import { btnPadding as paddingMap } from '../use-btn.js'
6
+
7
+ const defaultOptions = {
8
+ label: 'simple Btn'
9
+ }
10
+
11
+ const typesValues = [ 'button', 'submit', 'reset' ]
12
+
13
+ const paddingValues = Object.keys(paddingMap)
14
+
15
+ function mountQBtn (options = {}) {
16
+ // Setup options object
17
+ options.global = options.global || {}
18
+ options.global.plugins = options.global.plugins || []
19
+
20
+ options.props = {
21
+ ...defaultOptions,
22
+ ...options.props
23
+ }
24
+
25
+ if (!options.router) {
26
+ options.router = createRouter({
27
+ routes: [],
28
+ history: createMemoryHistory()
29
+ })
30
+ }
31
+
32
+ // Add router plugin
33
+ options.global.plugins.push({
34
+ install (app) {
35
+ app.use(options.router)
36
+ }
37
+ })
38
+
39
+ return mount(QBtn, options)
40
+ }
41
+
1
42
  describe('use-btn API', () => {
2
43
  describe('Props', () => {
3
44
  describe('Category: behavior|state', () => {
4
45
  describe('(prop): loading', () => {
5
- it.skip(' ', () => {
6
- //
46
+ it('should render a button with "loading" slot when "loading" prop is set to true', () => {
47
+ mountQBtn({
48
+ props: {
49
+ loading: true
50
+ }
51
+ })
52
+
53
+ cy.get('.q-btn .q-spinner')
7
54
  })
8
55
  })
9
56
  })
10
57
 
11
58
  describe('Category: content', () => {
12
59
  describe('(prop): label', () => {
13
- it.skip(' ', () => {
14
- //
60
+ it('should render a label inside the button', () => {
61
+ const label = 'Custom Label'
62
+ mountQBtn({
63
+ props: {
64
+ label
65
+ }
66
+ })
67
+
68
+ cy.get('.q-btn').should('contain', label)
15
69
  })
16
70
  })
17
71
 
18
72
  describe('(prop): icon', () => {
19
- it.skip(' ', () => {
20
- //
73
+ it('should render an icon on the left', () => {
74
+ const icon = 'home'
75
+
76
+ mountQBtn({
77
+ props: {
78
+ icon
79
+ }
80
+ })
81
+
82
+ cy.get('.q-btn .on-left').should('contain', icon)
21
83
  })
22
84
  })
23
85
 
24
86
  describe('(prop): icon-right', () => {
25
- it.skip(' ', () => {
26
- //
87
+ it('should render an icon on the right', () => {
88
+ const iconRight = 'home'
89
+
90
+ mountQBtn({
91
+ props: {
92
+ iconRight
93
+ }
94
+ })
95
+
96
+ cy.get('.q-btn .on-right').should('contain', iconRight)
27
97
  })
28
98
  })
29
99
 
30
100
  describe('(prop): no-caps', () => {
31
- it.skip(' ', () => {
32
- //
101
+ it('should render a button with no uppercase text', () => {
102
+ mountQBtn({
103
+ props: {
104
+ noCaps: true
105
+ }
106
+ })
107
+
108
+ cy.get('.q-btn')
109
+ .should('have.class', 'q-btn--no-uppercase')
33
110
  })
34
111
  })
35
112
 
36
113
  describe('(prop): no-wrap', () => {
37
- it.skip(' ', () => {
38
- //
114
+ it('should render a button with no wrapping text', () => {
115
+ mountQBtn({
116
+ props: {
117
+ noWrap: true
118
+ }
119
+ })
120
+
121
+ cy.get('.q-btn .q-btn__content')
122
+ .should('have.class', 'no-wrap')
123
+ .should('have.class', 'text-no-wrap')
39
124
  })
40
125
  })
41
126
 
42
127
  describe('(prop): align', () => {
43
- it.skip(' ', () => {
44
- //
128
+ it(`should render a badge aligned based on defined values: ${ alignValues.join(', ') }`, () => {
129
+ mountQBtn()
130
+
131
+ for (const align of alignValues) {
132
+ cy.get('.q-btn .q-btn__content')
133
+ .then(() => Cypress.vueWrapper.setProps({ align }))
134
+ .should('have.class', `justify-${ alignMap[ align ] }`)
135
+ }
45
136
  })
46
137
  })
47
138
 
48
139
  describe('(prop): stack', () => {
49
- it.skip(' ', () => {
50
- //
140
+ it('should render a button with icon and label stacked vertically', () => {
141
+ mountQBtn({
142
+ props: {
143
+ stack: true
144
+ }
145
+ })
146
+
147
+ cy.get('.q-btn .q-btn__content')
148
+ .should('have.class', 'column')
51
149
  })
52
150
  })
53
151
 
54
152
  describe('(prop): stretch', () => {
55
- it.skip(' ', () => {
56
- //
153
+ it('should render stretch height button when used in flexbox container', () => {
154
+ mountQBtn({
155
+ props: {
156
+ stretch: true
157
+ }
158
+ })
159
+
160
+ cy.get('.q-btn')
161
+ .should('have.class', 'no-border-radius')
162
+ .should('have.class', 'self-stretch')
57
163
  })
58
164
  })
59
165
  })
60
166
 
61
167
  describe('Category: general', () => {
62
168
  describe('(prop): type', () => {
63
- it.skip(' ', () => {
64
- //
169
+ it(`should render a button with a type based on defined values: ${ typesValues.join(', ') }`, () => {
170
+ mountQBtn()
171
+
172
+ for (const type of typesValues) {
173
+ cy.get('.q-btn')
174
+ .then(() => Cypress.vueWrapper.setProps({ type }))
175
+ .should('have.attr', 'type', type)
176
+ }
177
+ })
178
+
179
+ it('should render a component with <a> tag when "type" prop is set to "a"', () => {
180
+ mountQBtn({
181
+ props: {
182
+ type: 'a'
183
+ }
184
+ })
185
+
186
+ cy.get('.q-btn')
187
+ .should('have.prop', 'tagName').should('eq', 'A')
65
188
  })
66
189
  })
67
190
 
68
191
  describe('(prop): tabindex', () => {
69
- it.skip(' ', () => {
70
- //
192
+ it('should set the tabindex', () => {
193
+ const tabindex = 1
194
+
195
+ mountQBtn({
196
+ props: {
197
+ tabindex
198
+ }
199
+ })
200
+
201
+ cy.get('.q-btn')
202
+ .should('have.attr', 'tabindex', tabindex)
71
203
  })
72
204
  })
73
205
  })
74
206
 
75
207
  describe('Category: navigation', () => {
76
208
  describe('(prop): to', () => {
77
- it.skip(' ', () => {
78
- //
209
+ it('should render a component with <a> tag when "to" prop is set', () => {
210
+ const link = '/test'
211
+
212
+ mountQBtn({
213
+ props: {
214
+ to: link
215
+ }
216
+ })
217
+
218
+ cy.get('.q-btn')
219
+ .should('have.attr', 'href', link)
220
+ .should('have.prop', 'tagName').should('eq', 'A')
79
221
  })
80
222
  })
81
223
 
82
224
  describe('(prop): replace', () => {
83
- it.skip(' ', () => {
84
- //
225
+ it('should render a component with <a> tag when "replace" prop is set', () => {
226
+ const link = '/test'
227
+
228
+ mountQBtn({
229
+ props: {
230
+ to: link,
231
+ replace: true
232
+ }
233
+ })
234
+
235
+ cy.get('.q-btn')
236
+ .should('have.attr', 'href', link)
237
+ .should('have.prop', 'tagName').should('eq', 'A')
85
238
  })
86
239
  })
87
240
 
88
241
  describe('(prop): href', () => {
89
- it.skip(' ', () => {
90
- //
242
+ it('should render a component with <a> tag when "href" attribute is set', () => {
243
+ const href = 'https://quasar.dev'
244
+
245
+ mountQBtn({
246
+ props: {
247
+ href
248
+ }
249
+ })
250
+
251
+ cy.get('.q-btn')
252
+ .should('have.attr', 'href', href)
253
+ .should('have.prop', 'tagName').should('eq', 'A')
91
254
  })
92
255
  })
93
256
 
94
257
  describe('(prop): target', () => {
95
- it.skip(' ', () => {
96
- //
258
+ it('should render a component with <a> tag when "href" and "target" attributes are set', () => {
259
+ const href = 'https://quasar.dev'
260
+
261
+ mountQBtn({
262
+ props: {
263
+ href,
264
+ target: '_blank'
265
+ }
266
+ })
267
+
268
+ cy.get('.q-btn')
269
+ .should('have.attr', 'target', '_blank')
270
+ .should('have.prop', 'tagName').should('eq', 'A')
97
271
  })
98
272
  })
99
273
  })
100
274
 
101
275
  describe('Category: state', () => {
102
276
  describe('(prop): disable', () => {
103
- it.skip(' ', () => {
104
- //
277
+ it('should render a disabled button', () => {
278
+ mountQBtn({
279
+ props: {
280
+ disable: true
281
+ }
282
+ })
283
+
284
+ cy.get('.q-btn')
285
+ .should('have.class', 'disabled')
286
+ .should('have.attr', 'disabled')
105
287
  })
106
288
  })
107
289
  })
108
290
 
109
291
  describe('Category: style', () => {
110
292
  describe('(prop): outline', () => {
111
- it.skip(' ', () => {
112
- //
293
+ it('should render a button with outline style', () => {
294
+ mountQBtn({
295
+ props: {
296
+ outline: true
297
+ }
298
+ })
299
+
300
+ cy.get('.q-btn')
301
+ .should('have.class', 'q-btn--outline')
113
302
  })
114
303
  })
115
304
 
116
305
  describe('(prop): flat', () => {
117
- it.skip(' ', () => {
118
- //
306
+ it('should render a button with flat style', () => {
307
+ mountQBtn({
308
+ props: {
309
+ flat: true
310
+ }
311
+ })
312
+
313
+ cy.get('.q-btn')
314
+ .should('have.class', 'q-btn--flat')
119
315
  })
120
316
  })
121
317
 
122
318
  describe('(prop): unelevated', () => {
123
- it.skip(' ', () => {
124
- //
319
+ it('should render a button with unelevated style', () => {
320
+ mountQBtn({
321
+ props: {
322
+ unelevated: true
323
+ }
324
+ })
325
+
326
+ cy.get('.q-btn')
327
+ .should('have.class', 'q-btn--unelevated')
125
328
  })
126
329
  })
127
330
 
128
331
  describe('(prop): rounded', () => {
129
- it.skip(' ', () => {
130
- //
332
+ it('should render a button with rounded style', () => {
333
+ mountQBtn({
334
+ props: {
335
+ rounded: true
336
+ }
337
+ })
338
+
339
+ cy.get('.q-btn')
340
+ .should('have.class', 'q-btn--rounded')
131
341
  })
132
342
  })
133
343
 
134
344
  describe('(prop): push', () => {
135
- it.skip(' ', () => {
136
- //
345
+ it('should render a button with push style', () => {
346
+ mountQBtn({
347
+ props: {
348
+ push: true
349
+ }
350
+ })
351
+
352
+ cy.get('.q-btn')
353
+ .should('have.class', 'q-btn--push')
354
+ })
355
+ })
356
+
357
+ describe('(prop): square', () => {
358
+ it('should render a button with square style', () => {
359
+ mountQBtn({
360
+ props: {
361
+ square: true
362
+ }
363
+ })
364
+
365
+ cy.get('.q-btn')
366
+ .should('have.class', 'q-btn--square')
137
367
  })
138
368
  })
139
369
 
140
370
  describe('(prop): glossy', () => {
141
- it.skip(' ', () => {
142
- //
371
+ it('should render a button with glossy style', () => {
372
+ mountQBtn({
373
+ props: {
374
+ glossy: true
375
+ }
376
+ })
377
+
378
+ cy.get('.q-btn')
379
+ .should('have.class', 'glossy')
143
380
  })
144
381
  })
145
382
 
146
383
  describe('(prop): fab', () => {
147
- it.skip(' ', () => {
148
- //
384
+ it('should render a button with fab style', () => {
385
+ mountQBtn({
386
+ props: {
387
+ fab: true
388
+ }
389
+ })
390
+
391
+ cy.get('.q-btn')
392
+ .should('have.class', 'q-btn--fab')
149
393
  })
150
394
  })
151
395
 
152
396
  describe('(prop): fab-mini', () => {
153
- it.skip(' ', () => {
154
- //
397
+ it('should render a button with fab-mini style', () => {
398
+ mountQBtn({
399
+ props: {
400
+ fabMini: true
401
+ }
402
+ })
403
+
404
+ cy.get('.q-btn')
405
+ .should('have.class', 'q-btn--fab-mini')
155
406
  })
156
407
  })
157
408
 
158
409
  describe('(prop): padding', () => {
159
- it.skip(' ', () => {
160
- //
410
+ it(`should render a button with padding based on defined values: ${ paddingValues.join(', ') }`, () => {
411
+ mountQBtn()
412
+
413
+ for (const padding of paddingValues) {
414
+ cy.get('.q-btn')
415
+ .then(() => Cypress.vueWrapper.setProps({ padding }))
416
+ .should('have.css', 'padding', `${ paddingMap[ padding ] }px`)
417
+ }
418
+ })
419
+
420
+ it('should render a button with padding based custom value', () => {
421
+ const padding = '10px'
422
+
423
+ mountQBtn({
424
+ props: {
425
+ padding
426
+ }
427
+ })
428
+
429
+ cy.get('.q-btn')
430
+ .should('have.css', 'padding', padding)
431
+ })
432
+
433
+ it('should render a button with padding vertically and horizontally based on defined values" ', () => {
434
+ mountQBtn()
435
+
436
+ for (const paddingVertically of paddingValues) {
437
+ for (const paddingHorizontally of paddingValues) {
438
+ if (paddingVertically === paddingHorizontally) { continue }
439
+
440
+ const padding = `${ paddingVertically } ${ paddingHorizontally }`
441
+
442
+ cy.get('.q-btn')
443
+ .then(() => Cypress.vueWrapper.setProps({ padding }))
444
+ .should('have.css', 'padding',
445
+ `${ paddingMap[ paddingVertically ] }px ${ paddingMap[ paddingHorizontally ] }px`)
446
+ }
447
+ }
448
+ })
449
+
450
+ it('should render a button with "minWidth" and "minHeight" props set to "0"', () => {
451
+ mountQBtn({
452
+ props: {
453
+ padding: '0'
454
+ }
455
+ })
456
+
457
+ cy.get('.q-btn')
458
+ .should('have.css', 'min-width', '0px')
459
+ .should('have.css', 'min-height', '0px')
161
460
  })
162
461
  })
163
462
 
164
463
  describe('(prop): color', () => {
165
- it.skip(' ', () => {
166
- //
464
+ it('should change text color based on Quasar Color Palette', () => {
465
+ const color = 'red'
466
+
467
+ mountQBtn({
468
+ props: { color }
469
+ })
470
+
471
+ cy.get('.q-btn')
472
+ .should('have.class', `bg-${ color }`)
167
473
  })
168
474
  })
169
475
 
170
476
  describe('(prop): text-color', () => {
171
- it.skip(' ', () => {
172
- //
477
+ it('should change text color based on Quasar Color Palette', () => {
478
+ const textColor = 'red'
479
+
480
+ mountQBtn({
481
+ props: { textColor }
482
+ })
483
+
484
+ cy.get('.q-btn')
485
+ .should('have.class', `text-${ textColor }`)
173
486
  })
174
487
  })
175
488
 
176
489
  describe('(prop): dense', () => {
177
- it.skip(' ', () => {
178
- //
490
+ it('should render a button with dense style', () => {
491
+ mountQBtn({
492
+ props: {
493
+ dense: true
494
+ }
495
+ })
496
+
497
+ cy.get('.q-btn')
498
+ .should('have.class', 'q-btn--dense')
179
499
  })
180
500
  })
181
501
 
182
502
  describe('(prop): ripple', () => {
183
- it.skip(' ', () => {
184
- //
503
+ it('should render a button with ripple effect', () => {
504
+ mountQBtn({
505
+ props: {
506
+ ripple: true
507
+ }
508
+ })
509
+
510
+ cy.get('.q-btn')
511
+ .click().get('.q-ripple').should('exist')
185
512
  })
186
513
  })
187
514
  })
@@ -15,13 +15,6 @@ import { hSlot } from '../../utils/private/render.js'
15
15
 
16
16
  const btnPropsList = Object.keys(useBtnProps)
17
17
 
18
- // let's not duplicate type checking and prop validations
19
- // so just specify the props here with no type description
20
- const btnProps = btnPropsList.reduce(
21
- (acc, key) => (acc[ key ] = {}) && acc,
22
- {}
23
- )
24
-
25
18
  export const passBtnProps = props => btnPropsList.reduce(
26
19
  (acc, key) => {
27
20
  const val = props[ key ]
@@ -37,7 +30,7 @@ export default createComponent({
37
30
  name: 'QBtnDropdown',
38
31
 
39
32
  props: {
40
- ...btnProps,
33
+ ...useBtnProps,
41
34
  ...useTransitionProps,
42
35
 
43
36
  modelValue: Boolean,
@@ -70,7 +63,7 @@ export default createComponent({
70
63
  toggleAriaLabel: String
71
64
  },
72
65
 
73
- emits: [ 'update:modelValue', 'click', 'before-show', 'show', 'before-hide', 'hide' ],
66
+ emits: [ 'update:modelValue', 'click', 'beforeShow', 'show', 'beforeHide', 'hide' ],
74
67
 
75
68
  setup (props, { slots, emit }) {
76
69
  const { proxy } = getCurrentInstance()
@@ -84,7 +77,6 @@ export default createComponent({
84
77
  'aria-expanded': showing.value === true ? 'true' : 'false',
85
78
  'aria-haspopup': 'true',
86
79
  'aria-controls': targetUid,
87
- 'aria-owns': targetUid,
88
80
  'aria-label': props.toggleAriaLabel || proxy.$q.lang.label[ showing.value === true ? 'collapse' : 'expand' ](props.label)
89
81
  }
90
82
 
@@ -118,7 +110,7 @@ export default createComponent({
118
110
 
119
111
  function onBeforeShow (e) {
120
112
  showing.value = true
121
- emit('before-show', e)
113
+ emit('beforeShow', e)
122
114
  }
123
115
 
124
116
  function onShow (e) {
@@ -128,7 +120,7 @@ export default createComponent({
128
120
 
129
121
  function onBeforeHide (e) {
130
122
  showing.value = false
131
- emit('before-hide', e)
123
+ emit('beforeHide', e)
132
124
  }
133
125
 
134
126
  function onHide (e) {
@@ -97,7 +97,6 @@
97
97
  "bottom left", "bottom middle", "bottom right", "bottom start", "bottom end"
98
98
  ],
99
99
  "default": "bottom end",
100
- "examples": [ "top right", "bottom end" ],
101
100
  "category": "position"
102
101
  },
103
102
 
@@ -110,7 +109,6 @@
110
109
  "bottom left", "bottom middle", "bottom right", "bottom start", "bottom end"
111
110
  ],
112
111
  "default": "top end",
113
- "examples": [ "top right", "bottom end" ],
114
112
  "category": "position"
115
113
  },
116
114
 
@@ -36,8 +36,7 @@
36
36
  "value": {
37
37
  "type": "Any",
38
38
  "desc": "Value of the option that will be used by component model",
39
- "required": true,
40
- "__exemption": [ "examples" ]
39
+ "required": true
41
40
  },
42
41
  "slot": {
43
42
  "type": "String",
@@ -46,8 +45,7 @@
46
45
  },
47
46
  "...props": {
48
47
  "type": "Any",
49
- "desc": "Any other QBtn props (including class and style)",
50
- "__exemption": [ "examples" ]
48
+ "desc": "Any other QBtn props (including class and style)"
51
49
  }
52
50
  },
53
51
  "examples": [