@thinkpixellab-public/px-vue 3.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 (398) hide show
  1. package/.eslintrc.js +14 -0
  2. package/.prettierrc.js +10 -0
  3. package/LICENSE.md +9 -0
  4. package/README.md +83 -0
  5. package/assets/feather/activity.svg +1 -0
  6. package/assets/feather/airplay.svg +1 -0
  7. package/assets/feather/alert-circle.svg +1 -0
  8. package/assets/feather/alert-octagon.svg +1 -0
  9. package/assets/feather/alert-triangle.svg +1 -0
  10. package/assets/feather/align-center.svg +1 -0
  11. package/assets/feather/align-justify.svg +1 -0
  12. package/assets/feather/align-left.svg +1 -0
  13. package/assets/feather/align-right.svg +1 -0
  14. package/assets/feather/anchor.svg +1 -0
  15. package/assets/feather/aperture.svg +1 -0
  16. package/assets/feather/archive.svg +1 -0
  17. package/assets/feather/arrow-down-circle.svg +1 -0
  18. package/assets/feather/arrow-down-left.svg +1 -0
  19. package/assets/feather/arrow-down-right.svg +1 -0
  20. package/assets/feather/arrow-down.svg +1 -0
  21. package/assets/feather/arrow-left-circle.svg +1 -0
  22. package/assets/feather/arrow-left.svg +1 -0
  23. package/assets/feather/arrow-right-circle.svg +1 -0
  24. package/assets/feather/arrow-right.svg +1 -0
  25. package/assets/feather/arrow-up-circle.svg +1 -0
  26. package/assets/feather/arrow-up-left.svg +1 -0
  27. package/assets/feather/arrow-up-right.svg +1 -0
  28. package/assets/feather/arrow-up.svg +1 -0
  29. package/assets/feather/at-sign.svg +1 -0
  30. package/assets/feather/award.svg +1 -0
  31. package/assets/feather/bar-chart-2.svg +1 -0
  32. package/assets/feather/bar-chart.svg +1 -0
  33. package/assets/feather/battery-charging.svg +1 -0
  34. package/assets/feather/battery.svg +1 -0
  35. package/assets/feather/bell-off.svg +1 -0
  36. package/assets/feather/bell.svg +1 -0
  37. package/assets/feather/bluetooth.svg +1 -0
  38. package/assets/feather/bold.svg +1 -0
  39. package/assets/feather/book-open.svg +1 -0
  40. package/assets/feather/book.svg +1 -0
  41. package/assets/feather/bookmark.svg +1 -0
  42. package/assets/feather/box.svg +1 -0
  43. package/assets/feather/briefcase.svg +1 -0
  44. package/assets/feather/calendar.svg +1 -0
  45. package/assets/feather/camera-off.svg +1 -0
  46. package/assets/feather/camera.svg +1 -0
  47. package/assets/feather/cast.svg +1 -0
  48. package/assets/feather/check-circle.svg +1 -0
  49. package/assets/feather/check-square.svg +1 -0
  50. package/assets/feather/check.svg +1 -0
  51. package/assets/feather/chevron-down.svg +1 -0
  52. package/assets/feather/chevron-left.svg +1 -0
  53. package/assets/feather/chevron-right.svg +1 -0
  54. package/assets/feather/chevron-up.svg +1 -0
  55. package/assets/feather/chevrons-down.svg +1 -0
  56. package/assets/feather/chevrons-left.svg +1 -0
  57. package/assets/feather/chevrons-right.svg +1 -0
  58. package/assets/feather/chevrons-up.svg +1 -0
  59. package/assets/feather/chrome.svg +1 -0
  60. package/assets/feather/circle.svg +1 -0
  61. package/assets/feather/clipboard.svg +1 -0
  62. package/assets/feather/clock.svg +1 -0
  63. package/assets/feather/cloud-drizzle.svg +1 -0
  64. package/assets/feather/cloud-lightning.svg +1 -0
  65. package/assets/feather/cloud-off.svg +1 -0
  66. package/assets/feather/cloud-rain.svg +1 -0
  67. package/assets/feather/cloud-snow.svg +1 -0
  68. package/assets/feather/cloud.svg +1 -0
  69. package/assets/feather/code.svg +1 -0
  70. package/assets/feather/codepen.svg +1 -0
  71. package/assets/feather/codesandbox.svg +1 -0
  72. package/assets/feather/coffee.svg +1 -0
  73. package/assets/feather/columns.svg +1 -0
  74. package/assets/feather/command.svg +1 -0
  75. package/assets/feather/compass.svg +1 -0
  76. package/assets/feather/copy.svg +1 -0
  77. package/assets/feather/corner-down-left.svg +1 -0
  78. package/assets/feather/corner-down-right.svg +1 -0
  79. package/assets/feather/corner-left-down.svg +1 -0
  80. package/assets/feather/corner-left-up.svg +1 -0
  81. package/assets/feather/corner-right-down.svg +1 -0
  82. package/assets/feather/corner-right-up.svg +1 -0
  83. package/assets/feather/corner-up-left.svg +1 -0
  84. package/assets/feather/corner-up-right.svg +1 -0
  85. package/assets/feather/cpu.svg +1 -0
  86. package/assets/feather/credit-card.svg +1 -0
  87. package/assets/feather/crop.svg +1 -0
  88. package/assets/feather/crosshair.svg +1 -0
  89. package/assets/feather/database.svg +1 -0
  90. package/assets/feather/delete.svg +1 -0
  91. package/assets/feather/disc.svg +1 -0
  92. package/assets/feather/divide-circle.svg +1 -0
  93. package/assets/feather/divide-square.svg +1 -0
  94. package/assets/feather/divide.svg +1 -0
  95. package/assets/feather/dollar-sign.svg +1 -0
  96. package/assets/feather/download-cloud.svg +1 -0
  97. package/assets/feather/download.svg +1 -0
  98. package/assets/feather/dribbble.svg +1 -0
  99. package/assets/feather/droplet.svg +1 -0
  100. package/assets/feather/edit-2.svg +1 -0
  101. package/assets/feather/edit-3.svg +1 -0
  102. package/assets/feather/edit.svg +1 -0
  103. package/assets/feather/external-link.svg +1 -0
  104. package/assets/feather/eye-off.svg +1 -0
  105. package/assets/feather/eye.svg +1 -0
  106. package/assets/feather/facebook.svg +1 -0
  107. package/assets/feather/fast-forward.svg +1 -0
  108. package/assets/feather/feather.svg +1 -0
  109. package/assets/feather/figma.svg +1 -0
  110. package/assets/feather/file-minus.svg +1 -0
  111. package/assets/feather/file-plus.svg +1 -0
  112. package/assets/feather/file-text.svg +1 -0
  113. package/assets/feather/file.svg +1 -0
  114. package/assets/feather/film.svg +1 -0
  115. package/assets/feather/filter.svg +1 -0
  116. package/assets/feather/flag.svg +1 -0
  117. package/assets/feather/folder-minus.svg +1 -0
  118. package/assets/feather/folder-plus.svg +1 -0
  119. package/assets/feather/folder.svg +1 -0
  120. package/assets/feather/framer.svg +1 -0
  121. package/assets/feather/frown.svg +1 -0
  122. package/assets/feather/gift.svg +1 -0
  123. package/assets/feather/git-branch.svg +1 -0
  124. package/assets/feather/git-commit.svg +1 -0
  125. package/assets/feather/git-merge.svg +1 -0
  126. package/assets/feather/git-pull-request.svg +1 -0
  127. package/assets/feather/github.svg +1 -0
  128. package/assets/feather/gitlab.svg +1 -0
  129. package/assets/feather/globe.svg +1 -0
  130. package/assets/feather/grid.svg +1 -0
  131. package/assets/feather/hard-drive.svg +1 -0
  132. package/assets/feather/hash.svg +1 -0
  133. package/assets/feather/headphones.svg +1 -0
  134. package/assets/feather/heart.svg +1 -0
  135. package/assets/feather/help-circle.svg +1 -0
  136. package/assets/feather/hexagon.svg +1 -0
  137. package/assets/feather/home.svg +1 -0
  138. package/assets/feather/image.svg +1 -0
  139. package/assets/feather/inbox.svg +1 -0
  140. package/assets/feather/info.svg +1 -0
  141. package/assets/feather/instagram.svg +1 -0
  142. package/assets/feather/italic.svg +1 -0
  143. package/assets/feather/key.svg +1 -0
  144. package/assets/feather/layers.svg +1 -0
  145. package/assets/feather/layout.svg +1 -0
  146. package/assets/feather/life-buoy.svg +1 -0
  147. package/assets/feather/link-2.svg +1 -0
  148. package/assets/feather/link.svg +1 -0
  149. package/assets/feather/linkedin.svg +1 -0
  150. package/assets/feather/list.svg +1 -0
  151. package/assets/feather/loader.svg +1 -0
  152. package/assets/feather/lock.svg +1 -0
  153. package/assets/feather/log-in.svg +1 -0
  154. package/assets/feather/log-out.svg +1 -0
  155. package/assets/feather/mail.svg +1 -0
  156. package/assets/feather/map-pin.svg +1 -0
  157. package/assets/feather/map.svg +1 -0
  158. package/assets/feather/maximize-2.svg +1 -0
  159. package/assets/feather/maximize.svg +1 -0
  160. package/assets/feather/meh.svg +1 -0
  161. package/assets/feather/menu.svg +1 -0
  162. package/assets/feather/message-circle.svg +1 -0
  163. package/assets/feather/message-square.svg +1 -0
  164. package/assets/feather/mic-off.svg +1 -0
  165. package/assets/feather/mic.svg +1 -0
  166. package/assets/feather/minimize-2.svg +1 -0
  167. package/assets/feather/minimize.svg +1 -0
  168. package/assets/feather/minus-circle.svg +1 -0
  169. package/assets/feather/minus-square.svg +1 -0
  170. package/assets/feather/minus.svg +1 -0
  171. package/assets/feather/monitor.svg +1 -0
  172. package/assets/feather/moon.svg +1 -0
  173. package/assets/feather/more-horizontal.svg +1 -0
  174. package/assets/feather/more-vertical.svg +1 -0
  175. package/assets/feather/mouse-pointer.svg +1 -0
  176. package/assets/feather/move.svg +1 -0
  177. package/assets/feather/music.svg +1 -0
  178. package/assets/feather/navigation-2.svg +1 -0
  179. package/assets/feather/navigation.svg +1 -0
  180. package/assets/feather/octagon.svg +1 -0
  181. package/assets/feather/package.svg +1 -0
  182. package/assets/feather/paperclip.svg +1 -0
  183. package/assets/feather/pause-circle.svg +1 -0
  184. package/assets/feather/pause.svg +1 -0
  185. package/assets/feather/pen-tool.svg +1 -0
  186. package/assets/feather/percent.svg +1 -0
  187. package/assets/feather/phone-call.svg +1 -0
  188. package/assets/feather/phone-forwarded.svg +1 -0
  189. package/assets/feather/phone-incoming.svg +1 -0
  190. package/assets/feather/phone-missed.svg +1 -0
  191. package/assets/feather/phone-off.svg +1 -0
  192. package/assets/feather/phone-outgoing.svg +1 -0
  193. package/assets/feather/phone.svg +1 -0
  194. package/assets/feather/pie-chart.svg +1 -0
  195. package/assets/feather/play-circle.svg +1 -0
  196. package/assets/feather/play.svg +1 -0
  197. package/assets/feather/plus-circle.svg +1 -0
  198. package/assets/feather/plus-square.svg +1 -0
  199. package/assets/feather/plus.svg +1 -0
  200. package/assets/feather/pocket.svg +1 -0
  201. package/assets/feather/power.svg +1 -0
  202. package/assets/feather/printer.svg +1 -0
  203. package/assets/feather/radio.svg +1 -0
  204. package/assets/feather/refresh-ccw.svg +1 -0
  205. package/assets/feather/refresh-cw.svg +1 -0
  206. package/assets/feather/repeat.svg +1 -0
  207. package/assets/feather/rewind.svg +1 -0
  208. package/assets/feather/rotate-ccw.svg +1 -0
  209. package/assets/feather/rotate-cw.svg +1 -0
  210. package/assets/feather/rss.svg +1 -0
  211. package/assets/feather/save.svg +1 -0
  212. package/assets/feather/scissors.svg +1 -0
  213. package/assets/feather/search.svg +1 -0
  214. package/assets/feather/send.svg +1 -0
  215. package/assets/feather/server.svg +1 -0
  216. package/assets/feather/settings.svg +1 -0
  217. package/assets/feather/share-2.svg +1 -0
  218. package/assets/feather/share.svg +1 -0
  219. package/assets/feather/shield-off.svg +1 -0
  220. package/assets/feather/shield.svg +1 -0
  221. package/assets/feather/shopping-bag.svg +1 -0
  222. package/assets/feather/shopping-cart.svg +1 -0
  223. package/assets/feather/shuffle.svg +1 -0
  224. package/assets/feather/sidebar.svg +1 -0
  225. package/assets/feather/skip-back.svg +1 -0
  226. package/assets/feather/skip-forward.svg +1 -0
  227. package/assets/feather/slack.svg +1 -0
  228. package/assets/feather/slash.svg +1 -0
  229. package/assets/feather/sliders.svg +1 -0
  230. package/assets/feather/smartphone.svg +1 -0
  231. package/assets/feather/smile.svg +1 -0
  232. package/assets/feather/speaker.svg +1 -0
  233. package/assets/feather/square.svg +1 -0
  234. package/assets/feather/star.svg +1 -0
  235. package/assets/feather/stop-circle.svg +1 -0
  236. package/assets/feather/sun.svg +1 -0
  237. package/assets/feather/sunrise.svg +1 -0
  238. package/assets/feather/sunset.svg +1 -0
  239. package/assets/feather/table.svg +1 -0
  240. package/assets/feather/tablet.svg +1 -0
  241. package/assets/feather/tag.svg +1 -0
  242. package/assets/feather/target.svg +1 -0
  243. package/assets/feather/terminal.svg +1 -0
  244. package/assets/feather/thermometer.svg +1 -0
  245. package/assets/feather/thumbs-down.svg +1 -0
  246. package/assets/feather/thumbs-up.svg +1 -0
  247. package/assets/feather/toggle-left.svg +1 -0
  248. package/assets/feather/toggle-right.svg +1 -0
  249. package/assets/feather/tool.svg +1 -0
  250. package/assets/feather/trash-2.svg +1 -0
  251. package/assets/feather/trash.svg +1 -0
  252. package/assets/feather/trello.svg +1 -0
  253. package/assets/feather/trending-down.svg +1 -0
  254. package/assets/feather/trending-up.svg +1 -0
  255. package/assets/feather/triangle.svg +1 -0
  256. package/assets/feather/truck.svg +1 -0
  257. package/assets/feather/tv.svg +1 -0
  258. package/assets/feather/twitch.svg +1 -0
  259. package/assets/feather/twitter.svg +1 -0
  260. package/assets/feather/type.svg +1 -0
  261. package/assets/feather/umbrella.svg +1 -0
  262. package/assets/feather/underline.svg +1 -0
  263. package/assets/feather/unlock.svg +1 -0
  264. package/assets/feather/upload-cloud.svg +1 -0
  265. package/assets/feather/upload.svg +1 -0
  266. package/assets/feather/user-check.svg +1 -0
  267. package/assets/feather/user-minus.svg +1 -0
  268. package/assets/feather/user-plus.svg +1 -0
  269. package/assets/feather/user-x.svg +1 -0
  270. package/assets/feather/user.svg +1 -0
  271. package/assets/feather/users.svg +1 -0
  272. package/assets/feather/video-off.svg +1 -0
  273. package/assets/feather/video.svg +1 -0
  274. package/assets/feather/voicemail.svg +1 -0
  275. package/assets/feather/volume-1.svg +1 -0
  276. package/assets/feather/volume-2.svg +1 -0
  277. package/assets/feather/volume-x.svg +1 -0
  278. package/assets/feather/volume.svg +1 -0
  279. package/assets/feather/watch.svg +1 -0
  280. package/assets/feather/wifi-off.svg +1 -0
  281. package/assets/feather/wifi.svg +1 -0
  282. package/assets/feather/wind.svg +1 -0
  283. package/assets/feather/x-circle.svg +1 -0
  284. package/assets/feather/x-octagon.svg +1 -0
  285. package/assets/feather/x-square.svg +1 -0
  286. package/assets/feather/x.svg +1 -0
  287. package/assets/feather/youtube.svg +1 -0
  288. package/assets/feather/zap-off.svg +1 -0
  289. package/assets/feather/zap.svg +1 -0
  290. package/assets/feather/zoom-in.svg +1 -0
  291. package/assets/feather/zoom-out.svg +1 -0
  292. package/assets/icons/calendar.svg +6 -0
  293. package/assets/icons/check.svg +1 -0
  294. package/assets/icons/close-sm.svg +1 -0
  295. package/assets/icons/close.svg +1 -0
  296. package/assets/icons/copy.svg +1 -0
  297. package/assets/icons/dropdown.svg +8 -0
  298. package/assets/icons/invalid.svg +1 -0
  299. package/assets/icons/menu.svg +1 -0
  300. package/assets/icons/nav-next.svg +1 -0
  301. package/assets/icons/nav-prev.svg +1 -0
  302. package/assets/icons/sort-asc.svg +1 -0
  303. package/assets/icons/sort-desc.svg +1 -0
  304. package/assets/test/README.md +1 -0
  305. package/assets/test/trash.svg +8 -0
  306. package/babel.config.js +16 -0
  307. package/components/PxAspect.vue +127 -0
  308. package/components/PxAutoClamp.vue +75 -0
  309. package/components/PxBalancedText.vue +118 -0
  310. package/components/PxBase.vue +15 -0
  311. package/components/PxBaseDate.vue +27 -0
  312. package/components/PxBaseItems.vue +72 -0
  313. package/components/PxBaseItemsSelect.vue +230 -0
  314. package/components/PxBaseResize.vue +60 -0
  315. package/components/PxBaseToggle.vue +56 -0
  316. package/components/PxBaseVariants.vue +62 -0
  317. package/components/PxBaseVisible.vue +40 -0
  318. package/components/PxCalendar.vue +385 -0
  319. package/components/PxCard.vue +47 -0
  320. package/components/PxCardGrid.vue +386 -0
  321. package/components/PxClock.vue +510 -0
  322. package/components/PxCopyText.vue +78 -0
  323. package/components/PxDatePicker.vue +249 -0
  324. package/components/PxDropdown.vue +181 -0
  325. package/components/PxExpander.vue +46 -0
  326. package/components/PxFeatherIcon.vue +29 -0
  327. package/components/PxFeatherIconButton.vue +19 -0
  328. package/components/PxFit.vue +274 -0
  329. package/components/PxFlex.vue +93 -0
  330. package/components/PxFloat.vue +32 -0
  331. package/components/PxIcon.vue +43 -0
  332. package/components/PxIconButton.vue +115 -0
  333. package/components/PxIdUniquer.vue +59 -0
  334. package/components/PxModal.vue +365 -0
  335. package/components/PxNineGrid.vue +94 -0
  336. package/components/PxPivot.vue +207 -0
  337. package/components/PxPopup.vue +230 -0
  338. package/components/PxPortal.vue +138 -0
  339. package/components/PxPortalTarget.vue +25 -0
  340. package/components/PxProgressCircle.vue +73 -0
  341. package/components/PxRadioButton.vue +83 -0
  342. package/components/PxSideDrawer.vue +164 -0
  343. package/components/PxSlideTransition.vue +116 -0
  344. package/components/PxSlides.vue +217 -0
  345. package/components/PxStylesPreview.vue +129 -0
  346. package/components/PxSvg.vue +157 -0
  347. package/components/PxSwiper.vue +271 -0
  348. package/components/PxSwiperSlide.vue +42 -0
  349. package/components/PxSyncHeight.vue +137 -0
  350. package/components/PxTable.vue +323 -0
  351. package/components/PxTabs.vue +1 -0
  352. package/components/PxTextbox.vue +90 -0
  353. package/components/PxToggle.vue +125 -0
  354. package/components/PxToggleButton.vue +139 -0
  355. package/components/PxToggleButtonList.vue +131 -0
  356. package/components/PxTransitionExpand.vue +100 -0
  357. package/components/PxValidator.vue +431 -0
  358. package/components/PxVueTest.vue +761 -0
  359. package/components/README.md +0 -0
  360. package/dev/data/fruits.js +59 -0
  361. package/dev/data/random.js +13 -0
  362. package/dev/demos/Demo-PxBaseDrag.vue +94 -0
  363. package/dev/demos/Demo-PxCardGrid.vue +53 -0
  364. package/dev/demos/Demo-PxPivot.vue +58 -0
  365. package/dev/demos/Demo-PxSideDrawer.vue +72 -0
  366. package/dev/demos/Demo-PxSlideTransition.vue +86 -0
  367. package/dev/demos/Demo-PxSlides.vue +142 -0
  368. package/dev/demos/Demo-PxStylesPreview.vue +46 -0
  369. package/dev/demos/Demo-PxSwiper.vue +44 -0
  370. package/dev/demos/DemoPicker.vue +79 -0
  371. package/dev/dev.vue +56 -0
  372. package/dev/serve.js +17 -0
  373. package/package.json +45 -0
  374. package/plugins/common-client.js +13 -0
  375. package/plugins/common-lib.js +4 -0
  376. package/plugins/common.js +39 -0
  377. package/plugins/filters/aspect.js +14 -0
  378. package/plugins/filters/date.js +26 -0
  379. package/plugins/filters/kebab.js +9 -0
  380. package/plugins/filters/phone.js +7 -0
  381. package/plugins/filters/slug.js +26 -0
  382. package/plugins/filters/spacenator.js +11 -0
  383. package/plugins/filters/stringToItems.js +28 -0
  384. package/plugins/filters/striphtml.js +10 -0
  385. package/plugins/mixins/eventBus.js +23 -0
  386. package/px-styles.config.scss +12 -0
  387. package/styles/helpers.scss +14 -0
  388. package/styles/px.scss +6 -0
  389. package/utils/balanceText.js +123 -0
  390. package/utils/bem.js +99 -0
  391. package/utils/cardGrid.js +383 -0
  392. package/utils/cssStr.js +45 -0
  393. package/utils/drag.js +363 -0
  394. package/utils/fit.js +73 -0
  395. package/utils/tween.js +129 -0
  396. package/utils/utils.js +167 -0
  397. package/utils/variants.js +33 -0
  398. package/vue.config.js +12 -0
@@ -0,0 +1,274 @@
1
+ <!--
2
+
3
+ <px-fit :fits="['lg', 'md', 'sm']" :debug="true">
4
+ <template #default="{ fit }">
5
+ <div :class="`fit fit--${fit}`">
6
+ <span v-if="fit == 'lg'">LARGE</span>
7
+ <span v-if="fit == 'md'">MEDIUM</span>
8
+ <span v-if="fit == 'sm'">SMALL</span>
9
+ One Two Three Four Five Size Seven Eight Nine Ten
10
+ </div>
11
+ </template>
12
+ </px-fit>
13
+
14
+ -->
15
+ <template>
16
+ <div :class="bem({ debug: debug, fitting: fitting })">
17
+ <div ref="outer" :class="bem('outer')" :style="{ opacity: resizing ? 0 : null }">
18
+ <slot
19
+ name="default"
20
+ v-bind="{
21
+ fit: fit,
22
+ fitting: fitting,
23
+ }"
24
+ />
25
+ </div>
26
+ </div>
27
+ </template>
28
+
29
+ <script>
30
+ import PxBaseResize from './PxBaseResize.vue';
31
+
32
+ export default {
33
+ name: 'px-fit',
34
+ mixins: [PxBaseResize],
35
+ props: {
36
+ // list of "fits" that will be attempted during resize (must be ordered small to large, will
37
+ // be attempted from large to small)
38
+ fits: { type: Array, default: () => ['sm', 'md', 'lg'] },
39
+
40
+ // by default the last fit attempted will be kept when no fit is found,
41
+ // but you can set this to specific a different fallback
42
+ fallback: { type: String, default: null },
43
+
44
+ // whether to width, height or both when looking for a fit
45
+ mode: { type: String, default: 'both' },
46
+
47
+ // disables resize events (and fitting) when true
48
+ disabled: { type: Boolean, default: false },
49
+
50
+ // wait this amount of time (in ms) before restoring the sized element after a resize pass
51
+ // (setting this to something other than 0 can help prventing flickering but comes at the
52
+ // expense of the element disappearing during resize)
53
+ restoreDelay: { type: Number, default: 0 },
54
+
55
+ // whether to show the debug version of the component
56
+ debug: { type: Boolean, default: false },
57
+
58
+ // override the function that evaluates whether a particular fit is valid (called after the
59
+ // component has been placed into the "fit" state, takes the current mode, available
60
+ // outer size and fit being evaluated as parameters and should return true or false)
61
+ testFitFunction: { default: null },
62
+ },
63
+
64
+ data() {
65
+ return {
66
+ fit: null,
67
+ selectedFit: null,
68
+ fitting: false,
69
+ availableSize: { w: 0, h: 0 },
70
+ outerSize: { w: 0, h: 0 },
71
+ };
72
+ },
73
+
74
+ computed: {
75
+ resizeDebounceValue() {
76
+ return 200;
77
+ },
78
+
79
+ fitMap() {
80
+ let map = this.fits?.reduce((map, val, idx) => {
81
+ return (map[val] = idx);
82
+ }, {});
83
+ map.fit = this.fits.indexOf(this.fit);
84
+ map.fitting = this.fitting;
85
+ return map;
86
+ },
87
+ },
88
+
89
+ watch: {
90
+ selectedFit(nv) {
91
+ this.$emit('fit-changed', nv);
92
+ },
93
+ },
94
+
95
+ methods: {
96
+ testFitDefault(mode, available, fit) {
97
+ const outer = this.$refs.outer;
98
+
99
+ if (outer) {
100
+ const outerSize = {
101
+ w: outer.offsetWidth,
102
+ h: outer.offsetHeight,
103
+ };
104
+
105
+ let doesFit = true;
106
+
107
+ if (mode == 'width' || mode == 'both') {
108
+ doesFit = doesFit && available.w >= outerSize.w;
109
+ }
110
+ if (mode == 'height' || mode == 'both') {
111
+ doesFit = doesFit && available.h >= outerSize.h;
112
+ }
113
+
114
+ if (this.debug) {
115
+ console.log(`${fit}: ${doesFit}`);
116
+ }
117
+
118
+ return doesFit;
119
+ }
120
+ return false;
121
+ },
122
+
123
+ async tryFit(fit, signal) {
124
+ if (process.server) {
125
+ return;
126
+ }
127
+
128
+ const promise = new Promise((resolve, reject) => {
129
+ // on the next frame, check the size
130
+ this.fit = fit;
131
+
132
+ let timeout;
133
+
134
+ const abortListener = () => {
135
+ if (timeout) {
136
+ clearTimeout(timeout);
137
+ }
138
+ signal.removeEventListener('abort', abortListener);
139
+ reject();
140
+ };
141
+
142
+ signal.addEventListener('abort', abortListener);
143
+
144
+ timeout = setTimeout(
145
+ () => {
146
+ signal.removeEventListener('abort', abortListener);
147
+
148
+ const testFn = this.testFitFunction || this.testFitDefault;
149
+ const doesFit = testFn(this.mode, this.availableSize, fit);
150
+
151
+ resolve(doesFit);
152
+ },
153
+ this.debug ? 1000 : this.restoreDelay
154
+ );
155
+ });
156
+
157
+ return promise;
158
+ },
159
+
160
+ async tryAllFits() {
161
+ if (this.aborter) {
162
+ this.aborter.abort();
163
+ }
164
+
165
+ this.aborter = new AbortController();
166
+ let signal = this.aborter.signal;
167
+
168
+ // get the current size
169
+ this.availableSize = {
170
+ w: this.$el.clientWidth,
171
+ h: this.$el.clientHeight,
172
+ };
173
+
174
+ // places the component into a state where it can be sized independently
175
+ this.fitting = true;
176
+
177
+ let fit;
178
+
179
+ for (let i = this.fits.length - 1; i >= 0 && !signal.aborted; i--) {
180
+ fit = this.fits[i];
181
+
182
+ try {
183
+ const doesFit = await this.tryFit(fit, signal);
184
+ if (doesFit) {
185
+ // we found a fit so clean up and return
186
+ this.selectedFit = fit;
187
+ this.aborter = null;
188
+ this.abortSignal = null;
189
+ this.fitting = false;
190
+ return;
191
+ }
192
+ } catch {
193
+ // aborted
194
+ return;
195
+ }
196
+ }
197
+
198
+ // no fit was found
199
+
200
+ // set the fallback if specified (otherwise last tested will be maintained)
201
+ this.fit = this.fallback || this.fit;
202
+ this.selectedFit = this.fit;
203
+ this.aborter = null;
204
+ this.abortSignal = null;
205
+ this.fitting = false;
206
+ },
207
+
208
+ resizeStarted() {
209
+ this.$emit('resize-start');
210
+ },
211
+ async resize() {
212
+ if (!this.disabled) {
213
+ this.outerSize = {
214
+ w: this.$el.offsetWidth,
215
+ h: this.$el.offsetHeight,
216
+ };
217
+
218
+ await this.tryAllFits();
219
+
220
+ this.$emit('resize-end');
221
+ }
222
+ },
223
+ },
224
+ };
225
+ </script>
226
+
227
+ <style lang="scss">
228
+ @use '../styles/px.scss' as *;
229
+ .px-fit {
230
+ position: relative;
231
+ width: 100%;
232
+ height: 100%;
233
+ display: grid;
234
+ grid-template-columns: 100%;
235
+ grid-template-rows: 100%;
236
+
237
+ &__outer {
238
+ position: absolute;
239
+ left: 0;
240
+ width: 0;
241
+ height: 100%;
242
+ width: 100%;
243
+ display: grid;
244
+ grid-template-columns: 100%;
245
+ grid-template-rows: 100%;
246
+ > * {
247
+ grid-area: 1 / 1;
248
+ }
249
+
250
+ @include transition(opacity, $dur: 100ms);
251
+ }
252
+
253
+ &--fitting & {
254
+ width: 100vh;
255
+ &__outer {
256
+ position: fixed;
257
+ overflow: visible;
258
+ top: 0;
259
+ left: 0;
260
+ width: auto;
261
+ height: auto;
262
+ pointer-events: none;
263
+ opacity: 0;
264
+ }
265
+ }
266
+
267
+ &--debug.px-fit--fitting & {
268
+ &__outer {
269
+ opacity: 1;
270
+ background-color: white;
271
+ }
272
+ }
273
+ }
274
+ </style>
@@ -0,0 +1,93 @@
1
+ <!--
2
+ This is a simple wrapper for flexbox layout. It exists to keep markup simple and remove the need
3
+ to write custom css when all you need is common flexbox functionality.
4
+
5
+ Note: this is no always the right choice. Use regular flex layout if you need fine control or
6
+ the ability to modify the layout wiht media queries.
7
+
8
+ Some additional conveniences:
9
+
10
+ - Map common properties (vertical, align, justify, etc.) to props.
11
+
12
+ - Convenient item spacing with a "gap" property (specify without units to use as a multiple
13
+ of the sp(1) function, otherwise specify specific units.)
14
+ -->
15
+
16
+ <template>
17
+ <component
18
+ :is="tag"
19
+ :class="className"
20
+ :style="{
21
+ gap: gapHasUnits ? gap : `calc(var(--gap-sp) * ${gap})`,
22
+ '--flex-gap-sp': gapHasUnits ? null : gap,
23
+ }"
24
+ >
25
+ <!-- no spacing, so regular slot -->
26
+ <slot />
27
+ </component>
28
+ </template>
29
+
30
+ <script>
31
+ const alignments = ['start', 'center', 'end', 'stretch', 'around', 'between', 'baseline'];
32
+
33
+ export default {
34
+ name: 'px-flex',
35
+ props: {
36
+ tag: { type: String, default: 'div' },
37
+ vertical: { type: Boolean, default: false },
38
+ inline: { type: Boolean, default: false },
39
+ reverse: { type: Boolean, default: false },
40
+ wrap: { type: Boolean, default: false },
41
+ align: { type: String, default: 'stretch', validator: val => alignments.includes(val) },
42
+ justify: { type: String, default: 'start', validator: val => alignments.includes(val) },
43
+ gap: { default: null },
44
+ },
45
+ // data() { return { b: 0 }; },
46
+ computed: {
47
+ className() {
48
+ let c = 'px-flex';
49
+
50
+ if (this.reverse) {
51
+ c = 'px-flex-row-reverse';
52
+ }
53
+
54
+ if (this.vertical) {
55
+ c = 'px-flex-column';
56
+ if (this.reverse) {
57
+ c = 'px-flex-column-reverse';
58
+ }
59
+ }
60
+
61
+ if (this.inline) {
62
+ c += ' px-flex-inline';
63
+ }
64
+
65
+ if (this.wrap) {
66
+ c += ' px-flex-wrap';
67
+ }
68
+
69
+ // align-justify
70
+ c += ` px-flex-items-${this.align} px-flex-justify-${this.justify}`;
71
+
72
+ return c;
73
+ },
74
+ gapHasUnits() {
75
+ return this.gap && parseFloat(this.gap) != this.gap;
76
+ },
77
+ },
78
+ };
79
+ </script>
80
+
81
+ <style lang="scss">
82
+ @use '/px-styles.config.scss' as *;
83
+
84
+ // generate the atoms classes with px-flex as a prefix
85
+ @include atoms-flex(px-flex);
86
+
87
+ .px-flex,
88
+ .px-flex-row-reverse,
89
+ .px-flex-column,
90
+ .px-flex-column-reverse {
91
+ --gap-sp: #{sp(1)};
92
+ }
93
+ </style>
@@ -0,0 +1,32 @@
1
+ <!--
2
+ Describe this component...
3
+ -->
4
+ <template>
5
+ <div :class="bem()"></div>
6
+ </template>
7
+
8
+ <script>
9
+ // import { mapState } from 'vuex';
10
+ // import Component from '~/components/Component.vue';
11
+ // import Mixin from '~/components/Mixin.vue';
12
+ export default {
13
+ name: 'px-float'
14
+ // components: { Component },
15
+ // mixins: [ Mixin ],
16
+ props: {
17
+ a: { type: Boolean, default: false }
18
+ },
19
+ // data() { return { b: 0 }; },
20
+ // computed: {},
21
+ // watch: {},
22
+ // mounted() {},
23
+ // methods: {},
24
+ };
25
+ </script>
26
+
27
+ <style lang="scss">
28
+ @import '@/styles/include.scss';
29
+ .px-float {
30
+ // add styles here
31
+ }
32
+ </style>
@@ -0,0 +1,43 @@
1
+ <!--
2
+
3
+ More or less a wrapper for PxSvg with a couple of optimizations for icons:
4
+
5
+ 1. Default replacements will swap the color black (in various forms) to 'currentColor' so black
6
+ icons will inherit the current test color.
7
+
8
+ 2. If size is specified as a number (i.e. no units), then the default unit is assumed to be ems
9
+ (instead of pixels).
10
+
11
+ -->
12
+
13
+ <script>
14
+ import PxSvg from './PxSvg.vue';
15
+ export default {
16
+ name: 'px-icon',
17
+ mixins: [PxSvg],
18
+ props: {
19
+ replacements: {
20
+ type: Object,
21
+ default: () => {
22
+ return { '#000000': 'currentColor', '#000': 'currentColor', black: 'currentColor' };
23
+ },
24
+ },
25
+ },
26
+ computed: {
27
+ calcUnit() {
28
+ if (typeof this.size == 'number') {
29
+ return 'em';
30
+ }
31
+ return this.size.replace(this.calcSize, '') || 'em';
32
+ },
33
+ },
34
+ };
35
+ </script>
36
+
37
+ <style lang="scss">
38
+ .px-icon {
39
+ color: inherit;
40
+ display: inline-block;
41
+ line-height: 1;
42
+ }
43
+ </style>
@@ -0,0 +1,115 @@
1
+ <!--
2
+ Wraps a simple icon in a button and provides some basic styling options via variants:
3
+
4
+ - basic - pointer cursor only (all of the other variants also have a pointer cursor)
5
+ - default - transform on hover and active
6
+ - accent - accent colored icon (assumes currentColor usage in the icon)
7
+ - accent-hover - accent colored icon + subtle color effects for hover / active
8
+ - white - white colored icon
9
+
10
+ For the most part, all variants can be mixed and matched (e.g. 'default white' to get white and
11
+ transforms for hover and active)
12
+
13
+ -->
14
+ <template>
15
+ <button
16
+ :class="
17
+ bem({
18
+ ...variantsMap,
19
+ checked: toggles && syncChecked,
20
+ unchecked: toggles && !syncChecked,
21
+ })
22
+ "
23
+ v-on="$listeners"
24
+ @click="tryToggleChecked"
25
+ >
26
+ <inline-svg
27
+ :transformSource="transform"
28
+ :src="src"
29
+ :viewBox="svgViewBox"
30
+ :height="calcHeight"
31
+ :width="calcWidth"
32
+ />
33
+ </button>
34
+ </template>
35
+
36
+ <script>
37
+ import PxIcon from './PxIcon.vue';
38
+ import PxBaseVariants from './PxBaseVariants.vue';
39
+ import PxBaseToggle from './PxBaseToggle.vue';
40
+
41
+ export default {
42
+ name: 'px-icon-button',
43
+ mixins: [PxIcon, PxBaseVariants, PxBaseToggle],
44
+ props: {
45
+ // set to true for icon to toggle on and off
46
+ toggles: { type: Boolean, default: false },
47
+ },
48
+ methods: {
49
+ tryToggleChecked() {
50
+ if (this.toggles) {
51
+ this.toggleChecked();
52
+ }
53
+ },
54
+ },
55
+ };
56
+ </script>
57
+
58
+ <style lang="scss">
59
+ @use '../styles/px.scss' as *;
60
+
61
+ .px-icon-button {
62
+ &--unchecked {
63
+ opacity: 0.5;
64
+ &:hover {
65
+ opacity: 0.66;
66
+ }
67
+ }
68
+
69
+ // VARIANTS
70
+
71
+ &--default {
72
+ @include button-icon(
73
+ (
74
+ focus: control-focus-style(outline),
75
+ padding: 0,
76
+ min-height: 0,
77
+ )
78
+ );
79
+ }
80
+
81
+ &--basic {
82
+ @include control-reset();
83
+ background-color: transparent;
84
+ min-width: 0;
85
+ min-height: 0;
86
+ background-color: transparent;
87
+ padding: 0;
88
+ border-radius: 0.05em;
89
+ line-height: 1;
90
+ @include focus() {
91
+ outline-offset: 0.1em;
92
+ outline: 1px dotted currentColor;
93
+ }
94
+ cursor: pointer;
95
+ }
96
+
97
+ &--accent {
98
+ color: accent();
99
+ }
100
+
101
+ &--white {
102
+ color: white;
103
+ }
104
+
105
+ &--accent-hover {
106
+ @include transition(transform color);
107
+ &:hover {
108
+ color: accent(2);
109
+ }
110
+ &:active {
111
+ color: accent(-2);
112
+ }
113
+ }
114
+ }
115
+ </style>
@@ -0,0 +1,59 @@
1
+ <!-- Makes IDs unique with an SVG -->
2
+
3
+ <script>
4
+ let _idIncrementer = 0;
5
+
6
+ export default {
7
+ data() {
8
+ return {
9
+ idSuffix: _idIncrementer++,
10
+ };
11
+ },
12
+ props: {
13
+ ids: { type: Array, default: () => [] },
14
+ },
15
+ computed: {
16
+ idReferences() {
17
+ return this.ids.map(id => `#${id}`);
18
+ },
19
+ },
20
+ methods: {
21
+ replaceIds(vNode) {
22
+ if (!vNode) {
23
+ return;
24
+ }
25
+
26
+ const { attrs } = vNode.data ? vNode.data : {};
27
+ if (attrs) {
28
+ Object.keys(attrs).forEach(k => {
29
+ if (k === 'id') {
30
+ // check for an id we are replacing
31
+ if (this.ids.includes(attrs[k])) {
32
+ attrs[k] += `_${this.idSuffix}`;
33
+ }
34
+ } else {
35
+ const attrVal = attrs[k];
36
+
37
+ this.idReferences.forEach(idRef => {
38
+ if (attrVal.indexOf(idRef) > -1) {
39
+ attrs[k] = attrVal.replace(idRef, `${idRef}_${this.idSuffix}`);
40
+ }
41
+ });
42
+ }
43
+ });
44
+ }
45
+
46
+ if (vNode.children && vNode.children.length) {
47
+ vNode.children.forEach(vNodeChild => {
48
+ this.replaceIds(vNodeChild);
49
+ });
50
+ }
51
+ },
52
+ },
53
+ render(h) {
54
+ this.$slots.default.forEach(vNode => this.replaceIds(vNode));
55
+
56
+ return h('div', {}, this.$slots.default);
57
+ },
58
+ };
59
+ </script>