├── .browserslistrc ├── .editorconfig ├── .github └── FUNDING.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── biome.json ├── docs ├── .htaccess ├── 404.html ├── assets │ ├── 404-0AmFZZ1S.js │ ├── MaterialIcons-Regular-BjVsc-s9.woff2 │ ├── MaterialIcons-Regular-Bnsxcfr1.woff │ ├── MaterialIcons-Regular-N21pKt8_.ttf │ ├── MaterialIcons-Regular-rDPjWPoz.eot │ ├── backers-CCEcxcQY.js │ ├── backers-D9VKmk8R.css │ ├── breakpoints-ICV0X3Pc.js │ ├── browser-support-0bqFfhDS.js │ ├── browser-support-BIBu4Xuf.css │ ├── calendar-Br8tivqM.js │ ├── calendar-DxWS4aaK.css │ ├── chunk-IHAWQA3S-C2e_0_q3.js │ ├── colors-CFqQ0Mvj.js │ ├── colors-DP4oetJD.css │ ├── customization-B6Uo_tBU.css │ ├── customization-DXbGjn85.js │ ├── divriots-B_KSrxWL.svg │ ├── divriots-D1OfRDmM.js │ ├── divriots-grey-mhwOlI6i.svg │ ├── firefox-D9MITaIK.svg │ ├── fontawesome-webfont-B-jkhYfk.woff2 │ ├── fontawesome-webfont-CDK5bt4p.woff │ ├── fontawesome-webfont-CQDK8MU3.ttf │ ├── fontawesome-webfont-D13rzr4g.svg │ ├── fontawesome-webfont-G5YE5S7X.eot │ ├── index--oiLLynP.js │ ├── index-2ZCamaBg.css │ ├── index-6xS2SmYh.js │ ├── index-9NF37iH7.js │ ├── index-B2OX0MIU.css │ ├── index-B658aKGJ.js │ ├── index-B9sOEDTP.js │ ├── index-BGDMz2Cn.css │ ├── index-BHkLnnUi.js │ ├── index-BKqiX5i7.css │ ├── index-BMteKUiG.js │ ├── index-BNiAKg-J.css │ ├── index-BPOOKPfw.js │ ├── index-BVB9dhrV.css │ ├── index-BVnPSY0K.js │ ├── index-BZHTN_6e.js │ ├── index-BdIifd8n.js │ ├── index-BjISqBvH.js │ ├── index-Bme8dWpr.js │ ├── index-BrYmm0ak.css │ ├── index-BrrnfJdG.js │ ├── index-BuW4mvnh.js │ ├── index-BvX2OupU.css │ ├── index-C1sHp0QC.css │ ├── index-C7KsVxSt.js │ ├── index-CCxgNCle.css │ ├── index-CEy1Gxbm.css │ ├── index-CGAplnVU.js │ ├── index-CHRfuE62.js │ ├── index-CM2ms3xk.js │ ├── index-COEqPz2J.js │ ├── index-COzlDZuj.css │ ├── index-CR5vpSbl.css │ ├── index-CSIdeDlu.js │ ├── index-CVKdmZBa.js │ ├── index-CbmHwYvH.js │ ├── index-CfqKAFAA.js │ ├── index-CiMOwoyf.js │ ├── index-CjpXKRF7.css │ ├── index-Cn8S-fA9.css │ ├── index-CoRY2FNS.css │ ├── index-CvadZCvp.js │ ├── index-D2qPpq6F.js │ ├── index-D7zTFg19.js │ ├── index-DI0ckmDl.js │ ├── index-DO6cHQOj.js │ ├── index-DRXqSxL9.js │ ├── index-DTEEj9Hm.css │ ├── index-DYMeeJxx.js │ ├── index-DbfexEYN.js │ ├── index-DefPPk4A.css │ ├── index-Ds6L1Npy.js │ ├── index-E-qyEt7y.js │ ├── index-NJcuK2av.js │ ├── index-O19ywtg-.css │ ├── index-OZcYtltZ.js │ ├── index-UQol5dZi.css │ ├── index-_82BkkJw.js │ ├── index-a7oKtucQ.js │ ├── index-fJ7WHZWQ.css │ ├── index-hh92P6HW.js │ ├── index-laxqWTgJ.css │ ├── index-t--hEgTQ.js │ ├── index-z5YJYWZ8.js │ ├── index-z9Wxq3PL.js │ ├── ionicons-2KJKsoSy.svg │ ├── ionicons-BDAtaWce.woff2 │ ├── ionicons-CGzXJSgF.eot │ ├── ionicons-DDYVtJZB.woff │ ├── ionicons-sCCZ7T_s.ttf │ ├── item-NEdosgh0.js │ ├── japanese-wave-D3iTiDOl.png │ ├── layout-flex-NMt5U0L6.css │ ├── layout-flex-PwNPBo3U.js │ ├── layout-grid-system-BtUYTTw9.js │ ├── layout-grid-system-CakSzy2-.css │ ├── layout-other-css-classes-tVVvAQv1.js │ ├── layout-simplified-grid-system-DIJTcW-F.js │ ├── layout-simplified-grid-system-DWKkvnTA.css │ ├── layout-spaces-BF9UHE_O.js │ ├── layout-spaces-BqHiF-MA.css │ ├── materialdesignicons-webfont-B7mPwVP_.ttf │ ├── materialdesignicons-webfont-CSr8KVlo.eot │ ├── materialdesignicons-webfont-Dp5v-WZN.woff2 │ ├── materialdesignicons-webfont-PXm3-2wK.woff │ ├── migration-from-v2-to-v3-DVkOjJrd.js │ ├── options-presets-and-waveui-D0MIyqsb.js │ ├── release-notes-BBOwob93.css │ ├── release-notes-OGiwZ7md.js │ ├── safari-UO2fLQfp.svg │ ├── shadows-borders-radii-BjlQd1Df.js │ ├── shadows-borders-radii-C0NsyAGU.css │ ├── slideshow-DN4yrm6g.js │ ├── slideshow-FFwBIynh.css │ ├── splitter-44X23I9l.js │ ├── splitter-rNA1Cs7K.css │ ├── syncopate-BnJcoNZq.woff2 │ ├── syncopate-Jacay9uH.woff │ ├── test-DHkuIGbU.js │ ├── themes-BybnZ-mP.js │ ├── transitions-CmqQ2Y-R.css │ ├── transitions-xibIN5ff.js │ ├── typography-D07jvCgw.css │ ├── typography-Dy7sawCL.js │ ├── vue-cal-BBxrKX5r.jpg │ ├── wave-ui-icons-BtsEzG8w.svg │ ├── wave-ui-mobile-1-Uo7DcfBg.png │ ├── wave-ui-mobile-2-D2fs8BgS.png │ ├── why-wave-ui-B9pOdQRE.js │ └── why-wave-ui-C4dxO-RF.css ├── ghspa.js ├── images │ ├── favicon.png │ ├── japanese-wave.png │ ├── not-found.jpg │ ├── spirit-island--alberta.png │ └── the-great-wave-off--kanagawa.jpg ├── index.html └── robots.txt ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── .htaccess ├── 404.html ├── ghspa.js ├── images │ ├── favicon.png │ ├── japanese-wave.png │ ├── not-found.jpg │ ├── spirit-island--alberta.png │ └── the-great-wave-off--kanagawa.jpg └── robots.txt ├── src ├── app.vue ├── assets │ ├── chrome.svg │ ├── divriots-grey.svg │ ├── divriots.svg │ ├── edge.svg │ ├── firefox.svg │ ├── fonts │ │ ├── syncopate.woff │ │ └── syncopate.woff2 │ ├── japanese-wave.png │ ├── opera.svg │ ├── safari.svg │ ├── vue-cal.jpg │ ├── wave-pattern-dark.svg │ ├── wave-pattern.svg │ ├── wave-ui--dark-theme.png │ ├── wave-ui-icons.svg │ ├── wave-ui-mobile-1.png │ ├── wave-ui-mobile-2.png │ └── wave.svg ├── documentation │ ├── components │ │ ├── alert.vue │ │ ├── api.vue │ │ ├── example │ │ │ ├── index.vue │ │ │ ├── preference-buttons.vue │ │ │ └── source-code.vue │ │ ├── issue-link.vue │ │ ├── nav-menu.vue │ │ ├── title-link.vue │ │ ├── toolbar.vue │ │ └── ui-component-title.vue │ ├── index.vue │ ├── scss │ │ ├── _base.scss │ │ ├── _dark-theme.scss │ │ ├── _header.scss │ │ ├── _typography.scss │ │ ├── _variables.scss │ │ └── index.scss │ └── views │ │ ├── 404.vue │ │ ├── backers.vue │ │ ├── breakpoints.vue │ │ ├── browser-support.vue │ │ ├── colors.vue │ │ ├── customization.vue │ │ ├── getting-started │ │ ├── index.vue │ │ ├── install-cdn.vue │ │ ├── install-custom.vue │ │ ├── install-nuxt.vue │ │ └── install-standard.vue │ │ ├── home.vue │ │ ├── layout-flex.vue │ │ ├── layout-grid-system.vue │ │ ├── layout-other-css-classes.vue │ │ ├── layout-simplified-grid-system.vue │ │ ├── layout-spaces.vue │ │ ├── migration-from-v2-to-v3.vue │ │ ├── options-presets-and-waveui.vue │ │ ├── release-notes.vue │ │ ├── shadows-borders-radii.vue │ │ ├── test.vue │ │ ├── themes.vue │ │ ├── transitions.vue │ │ ├── typography.vue │ │ ├── ui-components │ │ ├── accordion │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── alert │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── app │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── autocomplete │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── badge │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── breadcrumbs │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── button │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── calendar.vue │ │ ├── card │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── checkbox │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── confirm │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── date-picker │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── dialog │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── divider │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── drawer │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── form │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── icon │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── image │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── input │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── list │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ ├── index.vue │ │ │ └── item.vue │ │ ├── menu │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── notification │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── overlay │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── parallax │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── progress │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── radio │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── rating │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── scrollable │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── select │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── slider │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── slideshow.vue │ │ ├── spinner │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── splitter.vue │ │ ├── steps │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── switch │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── table │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── tabs │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── tag │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── textarea │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── timeline │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── toolbar │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ ├── tooltip │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ └── tree │ │ │ ├── api.vue │ │ │ ├── examples.vue │ │ │ └── index.vue │ │ └── why-wave-ui.vue ├── main.js ├── router │ └── index.js ├── store.js ├── types │ ├── $waveui.ts │ ├── colors.ts │ ├── components │ │ ├── WAccordion.ts │ │ ├── WAlert.ts │ │ ├── WApp.ts │ │ ├── WBadge.ts │ │ ├── WBreadcrumbs.ts │ │ ├── WButton.ts │ │ ├── WCard.ts │ │ ├── WCheckbox.ts │ │ ├── WCheckboxes.ts │ │ ├── WConfirm.ts │ │ ├── WDialog.ts │ │ ├── WDivider.ts │ │ ├── WDrawer.ts │ │ ├── WFlex.ts │ │ ├── WForm.ts │ │ ├── WFormElement.ts │ │ ├── WGrid.ts │ │ ├── WIcon.ts │ │ ├── WImage.ts │ │ ├── WInput.ts │ │ ├── WList.ts │ │ ├── WMenu.ts │ │ ├── WNotification.ts │ │ ├── WNotificationManager.ts │ │ ├── WOverlay.ts │ │ ├── WProgress.ts │ │ ├── WRadio.ts │ │ ├── WRadios.ts │ │ ├── WRating.ts │ │ ├── WSelect.ts │ │ ├── WSlider.ts │ │ ├── WSpinner.ts │ │ ├── WSteps.ts │ │ ├── WSwitch.ts │ │ ├── WTable.ts │ │ ├── WTabs.ts │ │ ├── WTag.ts │ │ ├── WTextarea.ts │ │ ├── WTimeline.ts │ │ ├── WToolbar.ts │ │ ├── WTooltip.ts │ │ ├── WTree.ts │ │ └── index.ts │ ├── extra-vue-types.ts │ ├── index.ts │ └── plugin.ts └── wave-ui │ ├── components │ ├── index.js │ ├── transitions │ │ ├── w-transition-bounce.vue │ │ ├── w-transition-expand.vue │ │ ├── w-transition-fade.vue │ │ ├── w-transition-scale-fade.vue │ │ ├── w-transition-scale.vue │ │ ├── w-transition-slide-fade.vue │ │ ├── w-transition-slide.vue │ │ └── w-transition-twist.vue │ ├── w-accordion │ │ ├── index.vue │ │ └── item.vue │ ├── w-alert.vue │ ├── w-app.vue │ ├── w-autocomplete.vue │ ├── w-badge.vue │ ├── w-breadcrumbs.vue │ ├── w-button │ │ ├── button.vue │ │ └── index.vue │ ├── w-card.vue │ ├── w-checkbox.vue │ ├── w-checkboxes.vue │ ├── w-confirm.vue │ ├── w-date-picker.vue │ ├── w-dialog.vue │ ├── w-divider.vue │ ├── w-drawer.vue │ ├── w-flex.vue │ ├── w-form-element.vue │ ├── w-form.vue │ ├── w-grid.vue │ ├── w-icon.vue │ ├── w-image.vue │ ├── w-input.vue │ ├── w-list.vue │ ├── w-menu.vue │ ├── w-notification-manager.vue │ ├── w-notification.vue │ ├── w-overlay.vue │ ├── w-parallax.vue │ ├── w-progress.vue │ ├── w-radio.vue │ ├── w-radios.vue │ ├── w-rating.vue │ ├── w-scrollable.vue │ ├── w-select.vue │ ├── w-slider.vue │ ├── w-slideshow.vue │ ├── w-spinner.vue │ ├── w-steps.vue │ ├── w-switch.vue │ ├── w-table.vue │ ├── w-tabs │ │ ├── index.vue │ │ └── tab-content.vue │ ├── w-tag.vue │ ├── w-textarea.vue │ ├── w-timeline.vue │ ├── w-toolbar.vue │ ├── w-tooltip.vue │ └── w-tree.vue │ ├── core.js │ ├── index.d.ts │ ├── index.js │ ├── mixins │ ├── detachable.js │ └── form-elements.js │ ├── scss │ ├── _base.scss │ ├── _colors.scss │ ├── _icons.scss │ ├── _layout.scss │ ├── _transitions.scss │ ├── _typography.scss │ ├── index.scss │ └── variables │ │ ├── _index.scss │ │ ├── _mixins.scss │ │ └── _variables.scss │ └── utils │ ├── colors.js │ ├── config.js │ ├── console.js │ ├── dynamic-css.js │ ├── index.js │ └── notification-manager.js ├── tsconfig.json └── vite.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 3 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: antoniandre 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /_DOCS 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | 24 | .cursor 25 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | strict-peer-dependencies=false 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Antoni Andre 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Wave UI 2 | 3 | [![Latest Version on NPM](https://img.shields.io/npm/v/wave-ui.svg)](https://npmjs.com/package/wave-ui) 4 | [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE.md) 5 | [![npm](https://img.shields.io/npm/dt/wave-ui.svg)](https://www.npmjs.com/package/wave-ui) 6 | 7 | [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) 8 | 9 | > An emerging UI framework for Vue.js (2 & 3) with only the bright side. :sunny: 10 | 11 | ___ 12 | 13 | ## Demo & Documentation 14 | > [antoniandre.github.io/wave-ui](https://antoniandre.github.io/wave-ui) 15 | 16 | ___ 17 | 18 | ## install 19 | ``` 20 | npm i wave-ui 21 | ``` 22 | 23 | **Vue 2 (legacy)** 24 | 25 | ``` 26 | npm i wave-ui@legacy 27 | ``` 28 | 29 | ___ 30 | 31 | ## Browser Support 32 | ![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | 33 | | --- | --- | --- | --- | --- | 34 | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 35 | 36 | ___ 37 | 38 | ## Donating 39 | 40 | If you want to support the development of this library, you can buy me a beer or [become a sponsor](https://github.com/sponsors/antoniandre)! 41 | 42 | [![paypal](https://www.paypalobjects.com/en_AU/i/btn/btn_donateCC_LG.gif)](https://www.paypal.me/antoniandre1) 43 | Thank you! 44 | 45 | If you are using this library for profit business, please consider [backing me](https://github.com/sponsors/antoniandre)! 46 | It ensures that the project your products rely on keep being actively maintained. :) 47 | ___ 48 | 49 | ## Contributing 50 | 51 | If you have any idea, feel free to open an issue to discuss a new feature or fork Wave UI and submit your changes back to me. 52 | 53 | ___ 54 | 55 | ## Release Notes 56 | 57 | [antoniandre.github.io/wave-ui/release-notes](https://antoniandre.github.io/wave-ui/release-notes) 58 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "organizeImports": { 4 | "enabled": false 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true, 10 | "correctness": { 11 | "noUnusedVariables": "error", 12 | "noConstructorReturn": "off" 13 | }, 14 | "suspicious": { 15 | "noConsoleLog": "warn", 16 | "noDebugger": "warn", 17 | "noAssignInExpressions": "off", 18 | "noGlobalIsNan": "off" 19 | }, 20 | "style": { 21 | "useTemplate": "error", 22 | "useBlockStatements": "off", 23 | "noParameterAssign": "off", 24 | "useNumberNamespace": "off" 25 | }, 26 | "complexity": { 27 | "noForEach": "off" 28 | }, 29 | "performance": { 30 | "noDelete": "off" 31 | } 32 | } 33 | }, 34 | "formatter": { 35 | "enabled": false, 36 | "formatWithErrors": true, 37 | "indentStyle": "space", 38 | "indentWidth": 2, 39 | "lineWidth": 320, 40 | "lineEnding": "lf", 41 | "ignore": ["dist", "node_modules", "docs"] 42 | }, 43 | "javascript": { 44 | "formatter": { 45 | "quoteStyle": "single", 46 | "quoteProperties": "asNeeded", 47 | "trailingCommas": "none", 48 | "semicolons": "asNeeded", 49 | "arrowParentheses": "asNeeded" 50 | } 51 | }, 52 | "files": { 53 | "ignore": ["dist", "node_modules", "*.min.js", "public", "src/assets", "coverage", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "docs"] 54 | }, 55 | "overrides": [ 56 | { 57 | "include": ["*.svelte", "*.astro", "*.vue"], 58 | "linter": { 59 | "rules": { 60 | "correctness": { 61 | "noUnusedVariables": "off" 62 | } 63 | } 64 | } 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /docs/.htaccess: -------------------------------------------------------------------------------- 1 | Options +FollowSymlinks 2 | Options -Indexes 3 | 4 | RewriteEngine On 5 | RewriteRule \.(js|css|map|jpe?g|svg|gif|png|eot|ttf|woff2?)(\?.*)?$ - [NC,QSA,L] 6 | RewriteRule .* index.html [NC,QSA,L] 7 | -------------------------------------------------------------------------------- /docs/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 404 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/assets/404-0AmFZZ1S.js: -------------------------------------------------------------------------------- 1 | import{r as t,g as n,o as a,a as r,b as s,w as l,e as i,_ as c}from"./index-a7oKtucQ.js";function d(u,e){const o=t("title-link");return a(),n("main",null,[r(o,{class:"mt4",h1:""},{default:l(()=>e[0]||(e[0]=[i("404 - Not found")])),_:1}),e[1]||(e[1]=s("p",null,"The page you are looking for was not found on the server.",-1))])}const f={},p=c(f,[["render",d]]);export{p as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/MaterialIcons-Regular-BjVsc-s9.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/MaterialIcons-Regular-BjVsc-s9.woff2 -------------------------------------------------------------------------------- /docs/assets/MaterialIcons-Regular-Bnsxcfr1.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/MaterialIcons-Regular-Bnsxcfr1.woff -------------------------------------------------------------------------------- /docs/assets/MaterialIcons-Regular-N21pKt8_.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/MaterialIcons-Regular-N21pKt8_.ttf -------------------------------------------------------------------------------- /docs/assets/MaterialIcons-Regular-rDPjWPoz.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/MaterialIcons-Regular-rDPjWPoz.eot -------------------------------------------------------------------------------- /docs/assets/backers-CCEcxcQY.js: -------------------------------------------------------------------------------- 1 | import{a as k}from"./index-t--hEgTQ.js";import{a as _,D as v}from"./divriots-D1OfRDmM.js";import{r as l,g as i,o as u,a as n,b as s,w as o,e,F as y,k as w,t as B,m as c,f,_ as x}from"./index-a7oKtucQ.js";const D={class:"text-center"},G=["href"],$=["src"],L={class:"backer plus ma1"},R={class:"gold-sponsors"},E={href:"https://divriots.com/",target:"_blank"},I=["src"];function N(a,t,d,H,S,V){const A=l("title-link"),m=l("w-icon"),p=l("w-tooltip"),g=l("w-flex");return u(),i("main",null,[n(A,{class:"mt4",h1:""},{default:o(()=>t[1]||(t[1]=[e("Backers")])),_:1}),s("div",D,[t[5]||(t[5]=s("div",{class:"mb12"},[s("h2",null,"A big THANK YOU to all the backers!"),s("p",null,"Thank you to all of you, you make this happen, you are part of this library!")],-1)),n(g,{class:"align-center wrap justify-center backers"},{default:o(()=>[(u(!0),i(y,null,w(a.backers,r=>(u(),i("div",{class:"backer ma1",key:r.username},[n(p,null,{activator:o(({on:h})=>[s("a",c({href:r.url,target:"_blank"},f(h,!0)),[s("img",{class:"avatar",alt:"",src:r.avatar,onError:t[0]||(t[0]=b=>b.target.src=a.emptyGif)},null,40,$),n(m,{class:"octocat",xl:""},{default:o(()=>t[2]||(t[2]=[e("mdi mdi-github")])),_:1})],16,G)]),default:o(()=>[e(B(r.username),1)]),_:2},1024)]))),128)),n(p,null,{activator:o(({on:r})=>[s("div",L,[s("a",c({class:"mx1",href:"https://github.com/sponsors/antoniandre",target:"_blank"},f(r,!0)),[n(m,{class:"white",xl:""},{default:o(()=>t[3]||(t[3]=[e("wi-plus")])),_:1})],16)])]),default:o(()=>[t[4]||(t[4]=e("Add yourself!"))]),_:1})]),_:1}),t[6]||(t[6]=s("p",{class:"mt10"},[e("If you would like to support Wave UI, you can"),s("a",{class:"mx1",href:"https://github.com/sponsors/antoniandre",target:"_blank"},"become a sponsor"),e("or"),s("a",{class:"ml1",href:"https://www.paypal.me/antoniandre1",target:"_blank"},"make a donation"),e(". Thank you! 🙏🙏")],-1)),t[7]||(t[7]=s("h2",{class:"gold"},"Gold Sponsors 🔥",-1)),s("div",R,[s("a",E,[s("img",{src:a.$store.state.darkMode?a.DivRiotsLogoGrey:a.DivRiotsLogo},null,8,I)])])])])}const T=["divriots","nmauersberg","tswolin","KleinSamuel","chris-deep","crbast","CoolGoose","bohdaq","cordova-jauregui","consuman","bastien09","micksp","orefalo","helenetran","antoniandre"],C={data:()=>({emptyGif:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",backers:[],DivRiotsLogo:v,DivRiotsLogoGrey:_}),created(){T.forEach((a,t)=>{this.backers[t]={username:a,avatar:"",url:`https://github.com/${a}`},k.get(`https://api.github.com/users/${a}`).then(d=>{this.backers[t].avatar=d.data.avatar_url})})}},O=x(C,[["render",N]]);export{O as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/backers-D9VKmk8R.css: -------------------------------------------------------------------------------- 1 | .main--backers h2{font-size:2.5em;margin-bottom:1em}.main--backers h2.gold{margin-top:3.2em;margin-bottom:1.4em;color:#ccad15}.backers a{position:relative;display:flex}.backers .avatar,.backers .plus{display:inline-flex;align-items:center;justify-content:center;width:4em;aspect-ratio:1;border-radius:4em;background-color:color-mix(in srgb,var(--w-contrast-bg-color) 10%,transparent);overflow:hidden}.backers .octocat{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:color-mix(in srgb,var(--w-contrast-bg-color) 5%,transparent);font-size:4.5em}.gold-sponsors{display:flex;justify-content:center}.gold-sponsors a{width:11rem}.gold-sponsors a img{display:block} 2 | -------------------------------------------------------------------------------- /docs/assets/browser-support-BIBu4Xuf.css: -------------------------------------------------------------------------------- 1 | .main--browser-support p{margin-top:1.5em}.main--browser-support .w-list__item-label{display:flex;align-items:center;gap:4px}.main--browser-support .w-list img{width:16px} 2 | -------------------------------------------------------------------------------- /docs/assets/calendar-Br8tivqM.js: -------------------------------------------------------------------------------- 1 | import{r as s,g as c,o as d,a as l,b as e,w as n,e as a,h as p,_ as u}from"./index-a7oKtucQ.js";const g="/wave-ui/assets/vue-cal-BBxrKX5r.jpg",h={class:"w-flex align-center wrap mt8"};function v(r,t){const o=s("title-link"),i=s("w-icon"),m=s("ssh-pre");return d(),c("main",null,[l(o,{class:"mt4",h1:""},{default:n(()=>t[0]||(t[0]=[a("Calendar")])),_:1}),t[4]||(t[4]=e("p",null,[a("The work is already done in this library! Check out"),e("a",{class:"mx1",href:"https://github.com/antoniandre/vue-cal",target:"_blank"},"Vue Cal"),a("by the same awesome author! ;)")],-1)),e("div",h,[l(i,{class:"grey-light4 ml-2 mr2",xl:""},{default:n(()=>t[1]||(t[1]=[a("mdi mdi-chevron-right")])),_:1}),t[2]||(t[2]=p('Vue Cal
',2))]),l(m,{class:"mt6",language:"shell",dark:r.$store.state.darkMode},{default:n(()=>t[3]||(t[3]=[a("npm i vue-cal")])),_:1},8,["dark"]),t[5]||(t[5]=e("img",{class:"mt6",src:g,alt:"Vue Cal"},null,-1))])}const w={},_=u(w,[["render",v]]);export{_ as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/calendar-DxWS4aaK.css: -------------------------------------------------------------------------------- 1 | .main--calendar img{max-width:100%} 2 | -------------------------------------------------------------------------------- /docs/assets/colors-DP4oetJD.css: -------------------------------------------------------------------------------- 1 | .main--colors .horizontal{overflow-x:auto;overflow-y:hidden}.main--colors .color{align-items:center;display:flex;justify-content:center}.main--colors .ssh-pre .color{display:inline-block}.vertical .color-palette{min-width:250px;flex-grow:1}.horizontal .color-palette{display:flex;flex-direction:row;flex-grow:1;height:100px}.color-palette .color{display:flex}.horizontal .color-palette .color{flex-direction:column;justify-content:center;flex-grow:1}.color-palette .color--top{font-size:2.4em}.color-palette .color--top:not(.white--bg):not(.transparent--bg):not(.inherit--bg){color:#fff}.vertical .color-palette .color--top{height:90px;flex-direction:column;justify-content:center}.horizontal .color-palette .color--top{min-width:220px}.color-palette .color--top span{padding-bottom:4px;letter-spacing:1px}.color-palette .color--top small{font-size:.5em;font-family:monospace;letter-spacing:-1px}.color-palette .color--top.black{text-shadow:none;color:#000}.color-palette .color--top.black--bg{text-shadow:none;color:#fff}.color-palette .color--top.white--bg,.color-palette .color--top.transparent--bg,.color-palette .color--top.inherit--bg{border:1px solid #999}.color-palette .color--shade{font-size:.8em;color:#000000e6;text-shadow:none;flex-direction:row}.vertical .color-palette .color--shade{justify-content:space-between;align-items:center;height:45px;padding-left:8px;padding-right:8px}.horizontal .color-palette .color--shade{min-width:140px}.color-palette .color--shade.color--darker{color:#fff}.color-palette .color--shade span{padding-bottom:2px;font-size:1.2em}.color-palette .color--shade small{font-size:1.1em;font-family:monospace;letter-spacing:-.5px}.mint-green{color:#acebd7}.navy-blue--bg{background-color:#345276} 2 | -------------------------------------------------------------------------------- /docs/assets/customization-B6Uo_tBU.css: -------------------------------------------------------------------------------- 1 | pre.ssh-pre{white-space:pre-wrap} 2 | -------------------------------------------------------------------------------- /docs/assets/divriots-D1OfRDmM.js: -------------------------------------------------------------------------------- 1 | const s="/wave-ui/assets/divriots-grey-mhwOlI6i.svg",i="/wave-ui/assets/divriots-B_KSrxWL.svg";export{i as D,s as a}; 2 | -------------------------------------------------------------------------------- /docs/assets/fontawesome-webfont-B-jkhYfk.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/fontawesome-webfont-B-jkhYfk.woff2 -------------------------------------------------------------------------------- /docs/assets/fontawesome-webfont-CDK5bt4p.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/fontawesome-webfont-CDK5bt4p.woff -------------------------------------------------------------------------------- /docs/assets/fontawesome-webfont-CQDK8MU3.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/fontawesome-webfont-CQDK8MU3.ttf -------------------------------------------------------------------------------- /docs/assets/fontawesome-webfont-G5YE5S7X.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/fontawesome-webfont-G5YE5S7X.eot -------------------------------------------------------------------------------- /docs/assets/index-B2OX0MIU.css: -------------------------------------------------------------------------------- 1 | .common-layouts .example{border:none;display:flex;flex-direction:column}.common-layouts .example>.w-flex{flex:1}.common-layouts .example__render{overflow:visible;display:flex;flex-direction:column}.common-layouts .w-badge-wrap{flex-grow:1;align-self:flex-start;min-width:240px}.common-layouts fieldset,.common-layouts section{border:1px solid rgba(0,0,0,.05);padding:.8em;text-transform:uppercase;font-size:.95em}.common-layouts fieldset{margin-top:-6px;position:relative;border-color:#00000026;width:100%;min-height:240px}.common-layouts legend{padding:0 .5em;border-radius:99em}.common-layouts section{margin:.4em;color:#0009}.common-layouts .block{min-height:100px}.common-layouts .app{background-color:#fffeed}.common-layouts .header,.common-layouts .footer{background-color:#e9f8fe}.common-layouts .nav-menu{background-color:#fef2ff}.common-layouts .content{background-color:#efffed} 2 | -------------------------------------------------------------------------------- /docs/assets/index-BGDMz2Cn.css: -------------------------------------------------------------------------------- 1 | .message-box{min-height:35px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-BKqiX5i7.css: -------------------------------------------------------------------------------- 1 | .big-label{font-size:1.4em} 2 | -------------------------------------------------------------------------------- /docs/assets/index-BdIifd8n.js: -------------------------------------------------------------------------------- 1 | import{r as s,g as m,o as c,a as e,w as r,e as a,_ as d,b as $,Y as x}from"./index-a7oKtucQ.js";function v(n,t,u,_,f,i){const o=s("title-link"),l=s("example");return c(),m("div",null,[e(o,{h2:""},{default:r(()=>t[0]||(t[0]=[a("Default")])),_:1}),e(l,null,{pug:r(()=>t[1]||(t[1]=[])),_:1})])}const k={},w=d(k,[["render",v]]);function g(n,t,u,_,f,i){const o=s("title-link"),l=s("alert"),p=s("component-api");return c(),m("div",null,[t[2]||(t[2]=$("div",{class:"w-divider my12"},null,-1)),e(o,{class:"title1",h2:""},{default:r(()=>t[0]||(t[0]=[a("API")])),_:1}),e(l,{class:"mb6",info:""},{default:r(()=>t[1]||(t[1]=[a("The missing props descriptions will be added shortly (all the props are already listed).")])),_:1}),e(p,{class:"mt0",items:i.props,descriptions:n.propsDescs,title:"Props"},null,8,["items","descriptions"]),e(p,{items:n.slots,title:"Slots"},null,8,["items"]),e(p,{items:i.events,title:"Events"},null,8,["items"])])}const y={},B={},D={},E={data:()=>({propsDescs:y,slots:B}),computed:{props(){return x.props},events(){return x.emits.reduce((n,t)=>(n[t]=D[t]||{})&&n,{})}}},N=d(E,[["render",g]]);function P(n,t,u,_,f,i){const o=s("ui-component-title"),l=s("examples"),p=s("api");return c(),m("main",null,[e(o,{slug:"w-parallax","in-progress":""},{default:r(()=>t[0]||(t[0]=[a("w-parallax")])),_:1}),e(l),e(p)])}const V={components:{Examples:w,Api:N}},C=d(V,[["render",P]]);export{C as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/index-BrYmm0ak.css: -------------------------------------------------------------------------------- 1 | .pos-relative{position:relative} 2 | -------------------------------------------------------------------------------- /docs/assets/index-BvX2OupU.css: -------------------------------------------------------------------------------- 1 | .main-content--tabs{overflow:hidden;margin-left:-20px;padding-left:20px}.main-content--tabs .macos-tabs{border:none}.main-content--tabs .macos-tabs .w-tabs__bar{display:inline-flex;margin-bottom:12px;padding:0;background:#eee;border-radius:6px;border:1px solid #ddd;z-index:0;overflow:visible}.main-content--tabs .macos-tabs .w-tabs__slider{opacity:1;background-color:var(--w-base-bg-color);bottom:0;height:100%;border-radius:6px;box-shadow:1px 1px 2px #00000040}.main-content--tabs .macos-tabs .w-tabs__bar-item{padding:2px 10px;font-size:1.1rem}.main-content--tabs .macos-tabs .w-tabs__bar-item>*{z-index:1}.main-content--tabs .macos-tabs .w-tabs__bar-item:before{content:"";position:absolute;top:25%;bottom:25%;right:100%;transform:translate(-50%);border-left:1px solid #d2d2d2;display:block;opacity:1}.main-content--tabs .macos-tabs .w-tabs__bar-item:first-child:before{display:none}[data-theme=dark] .main-content--tabs .macos-tabs .w-tabs__bar{border-color:#181818;background-color:#222}[data-theme=dark] .main-content--tabs .macos-tabs .w-tabs__slider{background-color:#2c2c2c}[data-theme=dark] .main-content--tabs .macos-tabs .w-tabs__bar-item:before{border-left-color:#262626} 2 | -------------------------------------------------------------------------------- /docs/assets/index-C1sHp0QC.css: -------------------------------------------------------------------------------- 1 | .element{position:relative;display:flex;align-items:center;justify-content:center;width:6em;height:5.5em;padding-bottom:8px;border-radius:4px;border:1px solid color-mix(in srgb,var(--w-contrast-bg-color) 12%,transparent)}.element .symbol{color:var(--w-primary-color)}.element .number{position:absolute;top:4px;right:4px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-CCxgNCle.css: -------------------------------------------------------------------------------- 1 | ul.input-types li{margin-bottom:8px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-CEy1Gxbm.css: -------------------------------------------------------------------------------- 1 | .blur-backdrop{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)} 2 | -------------------------------------------------------------------------------- /docs/assets/index-COzlDZuj.css: -------------------------------------------------------------------------------- 1 | .main--menu .example{display:flex;flex-direction:column;overflow:visible}.example7 .w-menu{top:10px;right:20px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-CR5vpSbl.css: -------------------------------------------------------------------------------- 1 | .main--toolbar .w-card{margin:auto;max-width:550px;height:200px}@media screen and (max-width: 400px){.main--toolbar .w-toolbar button{margin:0}.main--toolbar .w-toolbar .ml2{margin-left:4px}.main--toolbar .w-toolbar .title2{font-size:19px}.main--toolbar .w-toolbar .title3{font-size:16px}} 2 | -------------------------------------------------------------------------------- /docs/assets/index-CjpXKRF7.css: -------------------------------------------------------------------------------- 1 | .example--sticky-columns .w-table{white-space:nowrap}.example--sticky-columns .w-table__header,.example--sticky-columns .w-table__cell{padding-left:20px;padding-right:20px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-Cn8S-fA9.css: -------------------------------------------------------------------------------- 1 | .w-switch--wide .w-switch__input{width:55px}.w-switch--wide .w-switch__track{width:35px;text-align:center}.w-switch--custom-track .w-switch__track{color:color-mix(in srgb,var(--w-base-color) 50%,transparent)}.w-switch--custom-track.w-switch--on .w-switch__track{color:#fff} 2 | -------------------------------------------------------------------------------- /docs/assets/index-CoRY2FNS.css: -------------------------------------------------------------------------------- 1 | .main-content--image{overflow:auto;margin-left:-20px;padding-left:20px} 2 | -------------------------------------------------------------------------------- /docs/assets/index-DTEEj9Hm.css: -------------------------------------------------------------------------------- 1 | .lists-demo{max-width:1250px}.lists-demo .w-list.custom .w-list__item-label:before{display:none}.lists-demo .w-list.custom .w-list__item-label label{position:relative;transition:.3s ease-in-out}.lists-demo .w-list.custom .w-list__item-label--active label{opacity:.6;color:#999}.lists-demo .w-list.custom .w-list__item-label label:before{content:"";position:absolute;top:50%;left:0;width:0;border-top:1px solid #999;pointer-events:none;transition:.3s ease-in-out}.lists-demo .w-list.custom .w-list__item-label--active label:before{width:100%} 2 | -------------------------------------------------------------------------------- /docs/assets/index-DbfexEYN.js: -------------------------------------------------------------------------------- 1 | import{r as n,g as c,o as m,a as e,w as r,e as a,_ as d,b as x,I as $}from"./index-a7oKtucQ.js";function k(s,t,u,_,f,i){const o=n("title-link"),p=n("example");return m(),c("div",null,[e(o,{h2:""},{default:r(()=>t[0]||(t[0]=[a("Default")])),_:1}),e(p,null,{pug:r(()=>t[1]||(t[1]=[])),_:1})])}const v={},w=d(v,[["render",k]]);function g(s,t,u,_,f,i){const o=n("title-link"),p=n("alert"),l=n("component-api");return m(),c("div",null,[t[2]||(t[2]=x("div",{class:"w-divider my12"},null,-1)),e(o,{class:"title1",h2:""},{default:r(()=>t[0]||(t[0]=[a("API")])),_:1}),e(p,{class:"mb6",info:""},{default:r(()=>t[1]||(t[1]=[a("The missing props descriptions will be added shortly (all the props are already listed).")])),_:1}),e(l,{class:"mt0",items:i.props,descriptions:s.propsDescs,title:"Props"},null,8,["items","descriptions"]),e(l,{items:s.slots,title:"Slots"},null,8,["items"]),e(l,{items:i.events,title:"Events"},null,8,["items"])])}const D={},y={},B={},E={data:()=>({propsDescs:D,slots:y}),computed:{props(){return $.props},events(){return $.emits.reduce((s,t)=>(s[t]=B[t]||{},s),{})}}},N=d(E,[["render",g]]);function P(s,t,u,_,f,i){const o=n("ui-component-title"),p=n("examples"),l=n("api");return m(),c("main",null,[e(o,{slug:"w-date-picker","in-progress":""},{default:r(()=>t[0]||(t[0]=[a("w-date-picker")])),_:1}),e(p),e(l)])}const V={components:{Examples:w,Api:N}},C=d(V,[["render",P]]);export{C as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/index-DefPPk4A.css: -------------------------------------------------------------------------------- 1 | .tooltips-demo .example{display:flex;flex-direction:column;overflow:visible}.tooltips-demo .w-card{overflow:hidden;display:inline-block;padding:8px}.tooltips-demo .w-card:before,.tooltips-demo .w-card:after{content:"";position:absolute;background-color:#ffea62;width:6em;aspect-ratio:1;border-radius:100%}.tooltips-demo .w-card:before{top:-3em;left:-3em}.tooltips-demo .w-card:after{bottom:-3em;right:-3em}.tooltips-demo .w-card .w-tag{z-index:1}.tooltips-demo .another-container{position:relative}.tooltips-demo .example__render{overflow:visible} 2 | -------------------------------------------------------------------------------- /docs/assets/index-Ds6L1Npy.js: -------------------------------------------------------------------------------- 1 | import{r as s,g as m,o as c,a as e,w as r,e as a,_ as d,b as x,a6 as $}from"./index-a7oKtucQ.js";function v(n,t,u,_,f,i){const o=s("title-link"),p=s("example");return c(),m("div",null,[e(o,{h2:""},{default:r(()=>t[0]||(t[0]=[a("Default")])),_:1}),e(p,null,{pug:r(()=>t[1]||(t[1]=[])),_:1})])}const k={},w=d(k,[["render",v]]);function g(n,t,u,_,f,i){const o=s("title-link"),p=s("alert"),l=s("component-api");return c(),m("div",null,[t[2]||(t[2]=x("div",{class:"w-divider my12"},null,-1)),e(o,{class:"title1",h2:""},{default:r(()=>t[0]||(t[0]=[a("API")])),_:1}),e(p,{class:"mb6",info:""},{default:r(()=>t[1]||(t[1]=[a("The missing props descriptions will be added shortly (all the props are already listed).")])),_:1}),e(l,{class:"mt0",items:i.props,descriptions:n.propsDescs,title:"Props"},null,8,["items","descriptions"]),e(l,{items:n.slots,title:"Slots"},null,8,["items"]),e(l,{items:i.events,title:"Events"},null,8,["items"])])}const y={},B={},D={},E={data:()=>({propsDescs:y,slots:B}),computed:{props(){return $.props},events(){return $.emits.reduce((n,t)=>(n[t]=D[t]||{},n),{})}}},N=d(E,[["render",g]]);function V(n,t,u,_,f,i){const o=s("ui-component-title"),p=s("examples"),l=s("api");return c(),m("main",null,[e(o,{slug:"w-steps","in-progress":""},{default:r(()=>t[0]||(t[0]=[a("w-steps")])),_:1}),e(p),e(l)])}const A={components:{Examples:w,Api:N}},P=d(A,[["render",V]]);export{P as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/index-O19ywtg-.css: -------------------------------------------------------------------------------- 1 | .choose-progress[data-v-421017b5],.progress-wrap[data-v-421017b5]{max-width:350px}.choose-progress[data-v-421017b5]{justify-content:space-around;width:100%} 2 | -------------------------------------------------------------------------------- /docs/assets/index-UQol5dZi.css: -------------------------------------------------------------------------------- 1 | .example .relative{position:relative} 2 | -------------------------------------------------------------------------------- /docs/assets/index-fJ7WHZWQ.css: -------------------------------------------------------------------------------- 1 | .discrete--bg{background-color:#58aaf91a} 2 | -------------------------------------------------------------------------------- /docs/assets/index-laxqWTgJ.css: -------------------------------------------------------------------------------- 1 | .w-tree__item--branch>.w-tree__item-label{font-weight:700} 2 | -------------------------------------------------------------------------------- /docs/assets/ionicons-BDAtaWce.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/ionicons-BDAtaWce.woff2 -------------------------------------------------------------------------------- /docs/assets/ionicons-CGzXJSgF.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/ionicons-CGzXJSgF.eot -------------------------------------------------------------------------------- /docs/assets/ionicons-DDYVtJZB.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/ionicons-DDYVtJZB.woff -------------------------------------------------------------------------------- /docs/assets/ionicons-sCCZ7T_s.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/ionicons-sCCZ7T_s.ttf -------------------------------------------------------------------------------- /docs/assets/item-NEdosgh0.js: -------------------------------------------------------------------------------- 1 | import{r as o,c as s,o as a,w as c,b as r,t as i,_ as l}from"./index-a7oKtucQ.js";const n={class:"title1"};function _(p,m,t,u,f,w){const e=o("w-card");return a(),s(e,{"bg-color":"blue-light5",title:"Nested <router-view>","title-class":"title3"},{default:c(()=>[r("div",n,"Selected list item: "+i(t.item),1)]),_:1})}const d={props:["item"]},h=l(d,[["render",_]]);export{h as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/japanese-wave-D3iTiDOl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/japanese-wave-D3iTiDOl.png -------------------------------------------------------------------------------- /docs/assets/layout-flex-NMt5U0L6.css: -------------------------------------------------------------------------------- 1 | .main--layout-flex .box{background-color:#9bbff9;border:1px solid #55f;padding:12px}.main--layout-flex .lighter .box{background-color:#e2ecfc;border:1px solid #b2c2f0;padding:12px 0;text-align:center}.main--layout-flex .wrapper,.main--layout-flex .wrapper2{background-color:#eef7ff;padding:12px;height:140px}.main--layout-flex .wrapper2{height:100px} 2 | -------------------------------------------------------------------------------- /docs/assets/layout-grid-system-CakSzy2-.css: -------------------------------------------------------------------------------- 1 | .main--layout-grid-system .xs1{overflow:hidden}.main--layout-grid-system .xs1 div{display:flex;justify-content:center}.main--layout-grid-system fieldset{border:2px solid rgba(204,170,68,.8)}.main--layout-grid-system fieldset fieldset{border:1px solid rgba(102,204,255,.8)} 2 | -------------------------------------------------------------------------------- /docs/assets/layout-other-css-classes-tVVvAQv1.js: -------------------------------------------------------------------------------- 1 | import{r as o,g as r,o as p,a as l,b as n,h as c,w as t,e,_ as m}from"./index-a7oKtucQ.js";const u={class:"ml1",href:"https://github.com/antoniandre/wave-ui/blob/master/src/wave-ui/scss/_layout.scss",target:"_blank"};function y(b,s){const a=o("title-link"),i=o("w-icon"),d=o("alert");return p(),r("main",null,[l(a,{class:"mt4",h1:""},{default:t(()=>s[0]||(s[0]=[e("Other useful CSS classes")])),_:1}),s[6]||(s[6]=n("p",null,`In addition to the CSS classes listed in this layout section, here are a few other 2 | CSS classes related to the display. 3 | `,-1)),l(a,{h2:""},{default:t(()=>s[1]||(s[1]=[e("Display")])),_:1}),s[7]||(s[7]=c(``,1)),l(d,{tip:""},{default:t(()=>[s[4]||(s[4]=e(`In general, it's always useful to look into the source code by yourself to understand what it 5 | does: you can find all the layout classes in the`)),n("a",u,[s[3]||(s[3]=e("layout.scss")),l(i,{class:"mx1",sm:""},{default:t(()=>s[2]||(s[2]=[e("mdi mdi-open-in-new")])),_:1})]),s[5]||(s[5]=e("file."))]),_:1})])}const f={},w=m(f,[["render",y]]);export{w as default}; 6 | -------------------------------------------------------------------------------- /docs/assets/layout-simplified-grid-system-DWKkvnTA.css: -------------------------------------------------------------------------------- 1 | .main--layout-simplified-grid-system .wrapper{background-color:#faeed4;padding:12px}.main--layout-simplified-grid-system .box{background-color:#e2ecfc;border:1px solid #b2c2f0;padding:12px} 2 | -------------------------------------------------------------------------------- /docs/assets/layout-spaces-BqHiF-MA.css: -------------------------------------------------------------------------------- 1 | .main-content--layout-spaces .example__render .code{color:inherit} 2 | -------------------------------------------------------------------------------- /docs/assets/materialdesignicons-webfont-B7mPwVP_.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/materialdesignicons-webfont-B7mPwVP_.ttf -------------------------------------------------------------------------------- /docs/assets/materialdesignicons-webfont-CSr8KVlo.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/materialdesignicons-webfont-CSr8KVlo.eot -------------------------------------------------------------------------------- /docs/assets/materialdesignicons-webfont-Dp5v-WZN.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 -------------------------------------------------------------------------------- /docs/assets/materialdesignicons-webfont-PXm3-2wK.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/materialdesignicons-webfont-PXm3-2wK.woff -------------------------------------------------------------------------------- /docs/assets/migration-from-v2-to-v3-DVkOjJrd.js: -------------------------------------------------------------------------------- 1 | import{r as l,g as m,o as u,a as s,b as o,w as n,e,h as w,_ as f}from"./index-a7oKtucQ.js";const v={class:"mt6"},g={class:"mt4"},k={class:"w-flex align-center"},b={class:"mt4"},y={class:"w-flex align-center"};function x(i,t,U,$,W,M){const p=l("title-link"),a=l("ssh-pre"),r=l("w-icon"),d=l("router-link");return u(),m("main",null,[s(p,{class:"mt4",h1:""},{default:n(()=>t[0]||(t[0]=[e("Migration strategy from version 2.x to version 3.x")])),_:1}),t[17]||(t[17]=o("p",null,[e("The migration from Wave UI 2.x is extremely simple. You'll be done in two steps, two minutes!"),o("br"),e(` 2 | But if you want to offer two themes in your app, there's a bit more work.`)],-1)),o("ol",v,[o("li",g,[t[4]||(t[4]=o("div",{class:"title3"},"Update the initialization of Wave UI.",-1)),o("div",k,[s(a,{language:"js",label:"before",dark:i.$store.state.darkMode,style:{"min-width":"290px"}},{default:n(()=>t[1]||(t[1]=[e(`const app = createApp(App) 3 | new WaveUI(app, { /* Some Wave UI options */ }) 4 | app.mount('#app')`)])),_:1},8,["dark"]),s(r,{class:"ma2 grey",xl:""},{default:n(()=>t[2]||(t[2]=[e("mdi mdi-arrow-right")])),_:1}),s(a,{language:"js",label:"after",dark:i.$store.state.darkMode,style:{"min-width":"290px"}},{default:n(()=>t[3]||(t[3]=[e(`const app = createApp(App) 5 | app.use(WaveUI, { /* Some Wave UI options */ }) 6 | app.mount('#app') 7 | `)])),_:1},8,["dark"])])]),o("li",b,[t[9]||(t[9]=o("div",{class:"title3"},[e("Remove the component, it's no longer needed!"),o("br")],-1)),t[10]||(t[10]=e("Note: there is also an ")),s(d,{to:"/options-presets-and-waveui"},{default:n(()=>t[5]||(t[5]=[e("option to define the Wave UI root")])),_:1}),t[11]||(t[11]=e(" (Default: ")),t[12]||(t[12]=o("code",{class:"code"},"#app",-1)),t[13]||(t[13]=e(", if not found, ")),t[14]||(t[14]=o("code",{class:"code"},"body",-1)),t[15]||(t[15]=e(").")),o("div",y,[s(a,{language:"html-vue",label:"before",dark:i.$store.state.darkMode,style:{"min-width":"290px"}},{default:n(()=>t[6]||(t[6]=[e(` 8 | My button 9 | `)])),_:1},8,["dark"]),s(r,{class:"ma2 grey",xl:""},{default:n(()=>t[7]||(t[7]=[e("mdi mdi-arrow-right")])),_:1}),s(a,{language:"html-vue",label:"after",dark:i.$store.state.darkMode,style:{"min-width":"290px"}},{default:n(()=>t[8]||(t[8]=[e(`My button 10 | `)])),_:1},8,["dark"])])]),t[16]||(t[16]=w('
  • If you were using useWaveUI in composition API

    just replace it with inject('$waveui').

  • Optionally, if you want to use two themes.

    Follow the steps in the themes page.

  • ',2))])])}const I={},A=f(I,[["render",x]]);export{A as default}; 11 | -------------------------------------------------------------------------------- /docs/assets/release-notes-BBOwob93.css: -------------------------------------------------------------------------------- 1 | .main--release-notes .history{margin-left:4px}.main--release-notes .history li{list-style-type:none;position:relative}.main--release-notes .history>li{padding-left:20px}.main--release-notes .history>li+li{margin-top:28px}.main--release-notes .history>li:before{content:"";position:absolute;top:11px;left:0;background-color:var(--w-base-bg-color);border-radius:1em;border:1px solid currentColor;width:1em;aspect-ratio:1;transform:translate(-50%,-50%);z-index:1}.main--release-notes .history>li:after{content:"";position:absolute;top:11px;bottom:-39px;left:-.5px;border-left:1px solid #ddd}.main--release-notes .history>li:last-child:after{display:none}.main--release-notes .history>li.dashed:after{border-left-style:dashed}.main--release-notes .history>li.patch:before{font-size:7px;width:1.1rem;border-style:dashed;animation:spin 10s linear infinite}.main--release-notes .history>li.minor:before{font-size:11px;width:1.1rem;animation:pulse 3s ease-in-out infinite}.main--release-notes .history>li.major:before{font-size:14px;animation:pulse-sonar 3s infinite cubic-bezier(.25,.46,.45,.94)}.main--release-notes .history .version{font:700 1.2rem monospace;display:block}.main--release-notes .history>li.patch:before,.main--release-notes .history>li.patch .version{color:color-mix(in srgb,var(--w-base-color) 30%,transparent)}.main--release-notes .history>li.minor:before,.main--release-notes .history>li.minor .version{color:color-mix(in srgb,var(--w-base-color) 60%,transparent)}.main--release-notes .history>li.major:before,.main--release-notes .history>li.major .version{color:#09c;font-size:1.4rem}.main--release-notes .history ul{margin-left:-2px}.main--release-notes .history li li{padding-left:20px;margin-top:2px}.main--release-notes .history li li:before{content:"";font-family:wave-ui!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;position:absolute;top:3px;left:0;width:1em;aspect-ratio:1}.main--release-notes .history li li li:before{content:""}.main--release-notes .history p{margin:.2em 0 0;line-height:1.2}.main--release-notes .history code{padding:0 4px;font-size:1em}.main--release-notes .history strong.code:first-child:not(.black){color:var(--w-primary-color);font-size:1.1em}.main--release-notes .vue-green{color:#42b883}.main--release-notes .vue-green--bg{background-color:#42b883}.main--release-notes span.tag{border-radius:99em;padding:2px 5px;color:#fff;font-weight:700;font-size:9px;position:relative;top:-1px}.main--release-notes span.new{background-color:#3698e5}.main--release-notes span.new:before{content:"NEW"}.main--release-notes span.deprecated{background-color:#000}.main--release-notes span.deprecated:before{content:"DEPRECATED"}.main--release-notes span.removed{background-color:#f02c2c}.main--release-notes span.removed:before{content:"REMOVED"}@keyframes spin{0%{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}@keyframes pulse{0%{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}to{transform:translate(-50%,-50%) scale(1)}}@keyframes pulse-sonar{0%{box-shadow:0 0 #09c;transform:translate(-50%,-50%) scale(1);border-color:var(--w-primary-color);opacity:.5}50%{box-shadow:0 0 0 15px #09cccc00;transform:translate(-50%,-50%) scale(1.05);border-color:#09c}to{box-shadow:0 0 #09cccc00;transform:translate(-50%,-50%) scale(1);border-color:var(--w-primary-color)}} 2 | -------------------------------------------------------------------------------- /docs/assets/shadows-borders-radii-C0NsyAGU.css: -------------------------------------------------------------------------------- 1 | .main--shadows-borders-radii .box{width:80px;height:80px}.main--shadows-borders-radii .box--rect{width:120px;height:40px} 2 | -------------------------------------------------------------------------------- /docs/assets/splitter-rNA1Cs7K.css: -------------------------------------------------------------------------------- 1 | .splitpanes{display:flex;width:100%;height:100%}.splitpanes--vertical{flex-direction:row}.splitpanes--horizontal{flex-direction:column}.splitpanes--dragging .splitpanes__pane{-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.splitpanes__pane{width:100%;height:100%;overflow:hidden}.splitpanes--vertical .splitpanes__pane{transition:width .2s ease-out}.splitpanes--horizontal .splitpanes__pane{transition:height .2s ease-out}.splitpanes--dragging .splitpanes__pane{transition:none}.splitpanes__splitter{touch-action:none}.splitpanes--vertical>.splitpanes__splitter{min-width:1px;cursor:col-resize}.splitpanes--horizontal>.splitpanes__splitter{min-height:1px;cursor:row-resize}.splitpanes.default-theme .splitpanes__pane{background-color:#f2f2f2}.splitpanes.default-theme .splitpanes__splitter{background-color:#fff;box-sizing:border-box;position:relative;flex-shrink:0}.splitpanes.default-theme .splitpanes__splitter:before,.splitpanes.default-theme .splitpanes__splitter:after{content:"";position:absolute;top:50%;left:50%;background-color:#00000026;transition:background-color .3s}.splitpanes.default-theme .splitpanes__splitter:hover:before,.splitpanes.default-theme .splitpanes__splitter:hover:after{background-color:#00000040}.splitpanes.default-theme .splitpanes__splitter:first-child{cursor:auto}.default-theme.splitpanes .splitpanes .splitpanes__splitter{z-index:1}.default-theme.splitpanes--vertical>.splitpanes__splitter,.default-theme .splitpanes--vertical>.splitpanes__splitter{width:7px;border-left:1px solid #eee;margin-left:-1px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{transform:translateY(-50%);width:1px;height:30px}.default-theme.splitpanes--vertical>.splitpanes__splitter:before,.default-theme .splitpanes--vertical>.splitpanes__splitter:before{margin-left:-2px}.default-theme.splitpanes--vertical>.splitpanes__splitter:after,.default-theme .splitpanes--vertical>.splitpanes__splitter:after{margin-left:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter,.default-theme .splitpanes--horizontal>.splitpanes__splitter{height:7px;border-top:1px solid #eee;margin-top:-1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{transform:translate(-50%);width:30px;height:1px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:before,.default-theme .splitpanes--horizontal>.splitpanes__splitter:before{margin-top:-2px}.default-theme.splitpanes--horizontal>.splitpanes__splitter:after,.default-theme .splitpanes--horizontal>.splitpanes__splitter:after{margin-top:1px}.splitpanes{height:300px}.splitpanes__pane{box-shadow:inset 0 0 3px #0003;justify-content:center;align-items:center;display:flex;position:relative}.splitpanes__pane>span{color:#fff;font-size:5em;opacity:.7}em.specs{font-size:.8em;line-height:1;position:absolute;color:#999;bottom:.5em;left:0;right:0;text-align:center} 2 | -------------------------------------------------------------------------------- /docs/assets/syncopate-BnJcoNZq.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/syncopate-BnJcoNZq.woff2 -------------------------------------------------------------------------------- /docs/assets/syncopate-Jacay9uH.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/syncopate-Jacay9uH.woff -------------------------------------------------------------------------------- /docs/assets/test-DHkuIGbU.js: -------------------------------------------------------------------------------- 1 | import{j as n,r as c,g as r,o as v,b as l,a as u,t as d}from"./index-a7oKtucQ.js";const _={class:"test ma12 pa12 bd1 bdrs2"},b={__name:"test",setup(g){const o=n(""),a=n(0),p=e=>{o.value=e,console.log("message updated:",e,o.value)},m=e=>{a.value=e,console.log("count updated:",e,a.value)};return(e,t)=>{const s=c("w-input");return v(),r("div",_,[t[0]||(t[0]=l("h1",{class:"mt0 mb8"},"Testing playground",-1)),u(s,{"onUpdate:modelValue":p,"model-value":o.value},null,8,["model-value"]),l("p",null,"model-value: "+d(o.value),1),u(s,{"onUpdate:modelValue":m,"model-value":a.value,type:"number"},null,8,["model-value"]),l("p",null,"model-value: "+d(a.value),1)])}}};export{b as default}; 2 | -------------------------------------------------------------------------------- /docs/assets/transitions-CmqQ2Y-R.css: -------------------------------------------------------------------------------- 1 | .transition-toggle{margin:12px 24px 12px 0;width:7.7em}.transition-box{background-color:#eee;border:1px solid #ddd;border-radius:3px;padding:1em;width:14em;text-align:center}@media screen and (max-width: 420px){.transition-box{padding:.4em;width:14em}} 2 | -------------------------------------------------------------------------------- /docs/assets/typography-D07jvCgw.css: -------------------------------------------------------------------------------- 1 | .main--typography code{font-weight:400;font-style:normal;text-transform:initial} 2 | -------------------------------------------------------------------------------- /docs/assets/vue-cal-BBxrKX5r.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/vue-cal-BBxrKX5r.jpg -------------------------------------------------------------------------------- /docs/assets/wave-ui-mobile-1-Uo7DcfBg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/wave-ui-mobile-1-Uo7DcfBg.png -------------------------------------------------------------------------------- /docs/assets/wave-ui-mobile-2-D2fs8BgS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/assets/wave-ui-mobile-2-D2fs8BgS.png -------------------------------------------------------------------------------- /docs/assets/why-wave-ui-C4dxO-RF.css: -------------------------------------------------------------------------------- 1 | .top-alert .title3{position:relative;padding-left:50px}.top-alert>.w-icon{display:none}.top-alert .i-chevron-right{margin-top:2px}.top-alert .wave{position:absolute;left:0;width:1.8em;vertical-align:middle;fill:#497ca2;stroke:#497ca2;stroke-width:6px}.main--why-wave-ui .w-list__item{align-items:center;display:flex}.main--why-wave-ui .w-list__item-label{align-items:center;display:block} 2 | -------------------------------------------------------------------------------- /docs/ghspa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Easy way to enable Single Page Applications for GitHub Pages 3 | * 4 | * This project was released under MIT license. 5 | * 6 | * @link https://github.com/rafrex/spa-github-pages 7 | * @author Rafael Pedicini 8 | * @link http://websemantics.ca 9 | * @author Adnan M.Sagar, PhD. 10 | * 11 | * @param {Object} l, the document current location 12 | */ 13 | ;(function(l) { 14 | var repo = '/' + l.pathname.split('/')[1] 15 | 16 | /* redirect all 404 trafic to index.html */ 17 | function redirect() { 18 | l.replace(l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') + repo + '/?' + 19 | (l.pathname ? 'p=' + l.pathname.replace(/&/g, '~and~').replace(repo, '') : '') + 20 | (l.search ? '&q=' + l.search.slice(1).replace(/&/g, '~and~') : '') + 21 | (l.hash)) 22 | } 23 | 24 | /* resolve 404 redirects into internal routes */ 25 | function resolve() { 26 | if (l.search) { 27 | var q = {} 28 | l.search.slice(1).split('&').forEach(function(v) { 29 | var a = v.split('=') 30 | q[a[0]] = a.slice(1).join('=').replace(/~and~/g, '&') 31 | }) 32 | if (q.p !== undefined) { 33 | window.history.replaceState(null, null, 34 | repo + (q.p || '') + 35 | (q.q ? ('?' + q.q) : '') + 36 | l.hash 37 | ) 38 | } 39 | } 40 | } 41 | 42 | /* if current document is 404 page page, redirect to index.html otherwise resolve */ 43 | document.title === '404' ? redirect() : resolve() 44 | }(window.location)) 45 | -------------------------------------------------------------------------------- /docs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/images/favicon.png -------------------------------------------------------------------------------- /docs/images/japanese-wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/images/japanese-wave.png -------------------------------------------------------------------------------- /docs/images/not-found.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/images/not-found.jpg -------------------------------------------------------------------------------- /docs/images/spirit-island--alberta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/images/spirit-island--alberta.png -------------------------------------------------------------------------------- /docs/images/the-great-wave-off--kanagawa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/docs/images/the-great-wave-off--kanagawa.jpg -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Wave UI 9 | 10 | 11 | 12 | 13 | 14 | 17 |
    18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Wave UI 9 | 10 | 11 | 12 | 15 |
    16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wave-ui", 3 | "version": "3.21.1", 4 | "description": "A UI framework for Vue.js 3 (and 2) with only the bright side. :sunny:", 5 | "author": "Antoni Andre ", 6 | "homepage": "https://antoniandre.github.io/wave-ui", 7 | "repository": "https://github.com/antoniandre/wave-ui", 8 | "license": "MIT", 9 | "funding": "https://github.com/sponsors/antoniandre", 10 | "main": "./dist/wave-ui.es.js", 11 | "types": "./dist/types/index.d.ts", 12 | "unpkg": "dist/wave-ui.umd.js", 13 | "jsdelivr": "dist/wave-ui.umd.js", 14 | "module": "./dist/wave-ui.es.js", 15 | "files": [ 16 | "dist", 17 | "src/wave-ui" 18 | ], 19 | "exports": { 20 | ".": { 21 | "import": "./dist/wave-ui.es.js", 22 | "require": "./dist/wave-ui.umd.js" 23 | }, 24 | "./package.json": "./package.json", 25 | "./dist/*": "./dist/*", 26 | "./src/wave-ui": "./src/wave-ui/index.js", 27 | "./src/wave-ui/components": "./src/wave-ui/components/index.js", 28 | "./src/wave-ui/*": "./src/wave-ui/*" 29 | }, 30 | "type": "module", 31 | "sideEffects": [ 32 | "*.css", 33 | "*.scss", 34 | "*.vue" 35 | ], 36 | "keywords": [ 37 | "wave ui", 38 | "ui framework", 39 | "ui library", 40 | "vue ui", 41 | "vue3", 42 | "vue framework", 43 | "ui" 44 | ], 45 | "scripts": { 46 | "dev": "vite", 47 | "build": "vite build --base /wave-ui/", 48 | "build-types": "tsc -p ./tsconfig.json", 49 | "build-bundle": "BUNDLE=true vite build && npm run build-types", 50 | "preview": "vite preview --base /wave-ui/", 51 | "lint": "biome check .", 52 | "lint:fix": "biome check --apply .", 53 | "format": "biome format .", 54 | "format:fix": "biome format --write .", 55 | "publish-doc": "npm run build && npm run build-bundle && git add . && git commit -m 'Publish documentation on Github.' && git push && git push --tag" 56 | }, 57 | "devDependencies": { 58 | "@babel/core": "^7.26.10", 59 | "@biomejs/biome": "^1.9.4", 60 | "@faker-js/faker": "^9.7.0", 61 | "@mdi/font": "^7.4.47", 62 | "@tsconfig/recommended": "^1.0.8", 63 | "@vitejs/plugin-vue": "^5.2.3", 64 | "autoprefixer": "^10.4.21", 65 | "axios": "^1.8.4", 66 | "font-awesome": "^4.7.0", 67 | "globals": "^16.0.0", 68 | "gsap": "^3.12.7", 69 | "ionicons": "^4.6.3", 70 | "material-design-icons": "^3.0.1", 71 | "postcss": "^8.5.3", 72 | "pug": "^3.0.3", 73 | "rollup-plugin-delete": "^3.0.1", 74 | "sass": "^1.86.3", 75 | "simple-syntax-highlighter": "^3.1.1", 76 | "splitpanes": "^4.0.3", 77 | "typescript": "^5.8.3", 78 | "vite": "^6.2.6", 79 | "vite-svg-loader": "^5.1.0", 80 | "vue": "^3.5.13", 81 | "vue-router": "^4.5.0", 82 | "vueperslides": "^3.6.0", 83 | "vuex": "^4.1.0" 84 | }, 85 | "peerDependencies": { 86 | "vue": "^3.2.0" 87 | }, 88 | "engines": { 89 | "node": ">=16.0.0", 90 | "pnpm": ">=8.0.0" 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export const plugins = { 2 | autoprefixer: {} 3 | } 4 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | Options +FollowSymlinks 2 | Options -Indexes 3 | 4 | RewriteEngine On 5 | RewriteRule \.(js|css|map|jpe?g|svg|gif|png|eot|ttf|woff2?)(\?.*)?$ - [NC,QSA,L] 6 | RewriteRule .* index.html [NC,QSA,L] 7 | -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 404 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/ghspa.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Easy way to enable Single Page Applications for GitHub Pages 3 | * 4 | * This project was released under MIT license. 5 | * 6 | * @link https://github.com/rafrex/spa-github-pages 7 | * @author Rafael Pedicini 8 | * @link http://websemantics.ca 9 | * @author Adnan M.Sagar, PhD. 10 | * 11 | * @param {Object} l, the document current location 12 | */ 13 | ;(function(l) { 14 | var repo = '/' + l.pathname.split('/')[1] 15 | 16 | /* redirect all 404 trafic to index.html */ 17 | function redirect() { 18 | l.replace(l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') + repo + '/?' + 19 | (l.pathname ? 'p=' + l.pathname.replace(/&/g, '~and~').replace(repo, '') : '') + 20 | (l.search ? '&q=' + l.search.slice(1).replace(/&/g, '~and~') : '') + 21 | (l.hash)) 22 | } 23 | 24 | /* resolve 404 redirects into internal routes */ 25 | function resolve() { 26 | if (l.search) { 27 | var q = {} 28 | l.search.slice(1).split('&').forEach(function(v) { 29 | var a = v.split('=') 30 | q[a[0]] = a.slice(1).join('=').replace(/~and~/g, '&') 31 | }) 32 | if (q.p !== undefined) { 33 | window.history.replaceState(null, null, 34 | repo + (q.p || '') + 35 | (q.q ? ('?' + q.q) : '') + 36 | l.hash 37 | ) 38 | } 39 | } 40 | } 41 | 42 | /* if current document is 404 page page, redirect to index.html otherwise resolve */ 43 | document.title === '404' ? redirect() : resolve() 44 | }(window.location)) 45 | -------------------------------------------------------------------------------- /public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/public/images/favicon.png -------------------------------------------------------------------------------- /public/images/japanese-wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/public/images/japanese-wave.png -------------------------------------------------------------------------------- /public/images/not-found.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/public/images/not-found.jpg -------------------------------------------------------------------------------- /public/images/spirit-island--alberta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/public/images/spirit-island--alberta.png -------------------------------------------------------------------------------- /public/images/the-great-wave-off--kanagawa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/public/images/the-great-wave-off--kanagawa.jpg -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /src/app.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | -------------------------------------------------------------------------------- /src/assets/chrome.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/fonts/syncopate.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/fonts/syncopate.woff -------------------------------------------------------------------------------- /src/assets/fonts/syncopate.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/fonts/syncopate.woff2 -------------------------------------------------------------------------------- /src/assets/japanese-wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/japanese-wave.png -------------------------------------------------------------------------------- /src/assets/opera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/vue-cal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/vue-cal.jpg -------------------------------------------------------------------------------- /src/assets/wave-pattern-dark.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/wave-pattern.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/assets/wave-ui--dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/wave-ui--dark-theme.png -------------------------------------------------------------------------------- /src/assets/wave-ui-mobile-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/wave-ui-mobile-1.png -------------------------------------------------------------------------------- /src/assets/wave-ui-mobile-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antoniandre/wave-ui/37e94c88f707134d280150e64c3f17048d375c2c/src/assets/wave-ui-mobile-2.png -------------------------------------------------------------------------------- /src/assets/wave.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/documentation/components/alert.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 29 | 30 | 94 | -------------------------------------------------------------------------------- /src/documentation/components/example/preference-buttons.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 63 | -------------------------------------------------------------------------------- /src/documentation/components/example/source-code.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 43 | 44 | 105 | -------------------------------------------------------------------------------- /src/documentation/components/issue-link.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /src/documentation/components/title-link.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 63 | 64 | 96 | -------------------------------------------------------------------------------- /src/documentation/components/ui-component-title.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 42 | 43 | 46 | -------------------------------------------------------------------------------- /src/documentation/scss/_base.scss: -------------------------------------------------------------------------------- 1 | @use './variables' as *; 2 | 3 | html, body {height: 100%;} 4 | 5 | :root { 6 | --header-waves-pattern: rgba(73, 123, 162, 0.2); 7 | scroll-behavior: smooth; 8 | } 9 | 10 | a {color: $links;} 11 | 12 | ul, ol {margin-left: 4 * $base-increment + 2px;} 13 | .w-list--icon .w-list__item-bullet {color: green;} 14 | .w-list--icon .w-list__item-bullet.wi-minus {color: rgb(213, 117, 0);} 15 | 16 | p {margin-bottom: 2 * $base-increment;} 17 | 18 | .ovh {overflow: hidden;} 19 | 20 | .main-content { 21 | max-width: 100%; 22 | line-height: 1.2; 23 | // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size 24 | min-width: 0; 25 | } 26 | 27 | .ssh-pre { 28 | margin: 1em 0; 29 | line-height: 1.3; 30 | font-size: 0.9rem; 31 | 32 | &[data-label] {margin: 2em 0 1em;} 33 | &[data-label]:before {font-weight: bold;} 34 | } 35 | 36 | .nav-menu ~ .main-content {padding-left: 4em;} 37 | 38 | footer { 39 | margin-top: 5em; 40 | 41 | .nav-drawer ~ & {padding-left: 12px;} 42 | 43 | .heart:hover {animation: heartbeat 1s infinite;} 44 | small {font-size: 10px;} 45 | .caption {padding-top: 1px;} 46 | } 47 | 48 | @keyframes heartbeat { 49 | 0%, 30%, 60%, 100% {transform: scale(1);} 50 | 15%, 45% {transform: scale(1.2);} 51 | } 52 | 53 | // Vue Transitions. 54 | // -------------------------------------------------------- 55 | .fade-page-enter-active, .fade-page-leave-from-active {transition: opacity 0.12s;} 56 | .fade-page-enter-from, .fade-page-leave-to {opacity: 0;} 57 | 58 | // Media queries. 59 | // -------------------------------------------------------- 60 | @media screen and (max-width: 560px) { 61 | button.go-top {display: none;} 62 | } 63 | 64 | // MEDIA QUERIES. 65 | // -------------------------------------------------------- 66 | @media screen and (max-width: 600px) { 67 | .title-link .hash {display: none;} 68 | } 69 | 70 | @media screen and (max-width: 450px) { 71 | .w-app .content-wrap {padding-left: 8px;padding-right: 8px;} 72 | .ssh-pre__content {padding-top: 12px;} 73 | .w-app .example { 74 | .ssh-pre__copy {top: -2px;right: -2px;} 75 | .ssh-pre[data-label]:before {top: 5px;} 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/documentation/scss/_header.scss: -------------------------------------------------------------------------------- 1 | header { 2 | margin-top: 42px; 3 | position: relative; 4 | overflow: hidden; 5 | 6 | &:before { 7 | content: ''; 8 | position: absolute; 9 | inset: 0; 10 | background: url('@/assets/japanese-wave.png') repeat-x 0 5px; 11 | z-index: 1; 12 | } 13 | 14 | &:after { 15 | content: ''; 16 | position: absolute; 17 | inset: 100% 0 auto; 18 | height: 30px; 19 | box-shadow: 0 0 1.5em rgba(0, 0, 0, 0.4); 20 | } 21 | 22 | svg { 23 | position: absolute; 24 | top: 0; 25 | left: 0; 26 | } 27 | } 28 | 29 | @media screen and (min-width: 1500px) { 30 | header {height: 300px;} 31 | header:before {background-size: 1400px;} 32 | } 33 | 34 | @media screen and (min-width: 1281px) and (max-width: 1500px) { 35 | header {height: 280px;} 36 | header:before { 37 | display: block; 38 | position: relative; 39 | padding-bottom: 23.34%; 40 | background-size: contain; 41 | } 42 | } 43 | 44 | @media screen and (min-width: 1021px) and (max-width: 1280px) { 45 | header {height: 238px;} 46 | header:before { 47 | display: block; 48 | position: relative; 49 | padding-bottom: 23.34%; 50 | background-size: contain; 51 | } 52 | } 53 | 54 | @media screen and (min-width: 601px) and (max-width: 1020px) { 55 | header {height: 180px;} 56 | header:before {background-size: 800px;} 57 | } 58 | 59 | @media screen and (max-width: 600px) { 60 | header {height: 135px;} 61 | header:before {background-size: 600px;} 62 | } 63 | 64 | // For iOS: https://stackoverflow.com/a/23420490/2012407, https://stackoverflow.com/a/47818418/2012407. 65 | @supports (-webkit-touch-callout: none) { 66 | header {background-attachment: scroll;} 67 | } 68 | -------------------------------------------------------------------------------- /src/documentation/scss/_typography.scss: -------------------------------------------------------------------------------- 1 | @use './variables' as *; 2 | 3 | @font-face { 4 | font-family: 'title font'; 5 | src: url('@/assets/fonts/syncopate.woff2') format('woff2'), 6 | url('@/assets/fonts/syncopate.woff') format('woff'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | html { 12 | font-size: $base-font-size; 13 | font-family: Helvetica, Arial, sans-serif; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | h1 { 19 | color: $primary; 20 | margin-top: 6 * $base-increment; 21 | margin-bottom: 2 * $base-increment; 22 | font-size: 2rem; 23 | font-weight: 400; 24 | } 25 | .w-app h1.headline {margin-bottom: 30px;} 26 | 27 | h2 { 28 | color: $primary; 29 | margin-top: 12 * $base-increment; 30 | margin-bottom: 3 * $base-increment; 31 | font-size: 1.6rem; 32 | font-weight: 400; 33 | } 34 | 35 | h3 { 36 | margin-top: 6 * $base-increment; 37 | margin-bottom: 2 * $base-increment; 38 | font-size: 1.25rem; 39 | font-weight: 400; 40 | } 41 | 42 | h4 {font-size: 1rem;} 43 | 44 | .headline { 45 | margin-top: 10 * $base-increment; 46 | margin-bottom: 5 * $base-increment; 47 | } 48 | 49 | .title2 { 50 | margin-top: 4 * $base-increment; 51 | margin-bottom: 2 * $base-increment; 52 | } 53 | 54 | .title3 {margin-bottom: 2 * $base-increment;} 55 | 56 | .title4 {margin-bottom: 2 * $base-increment;} 57 | 58 | .title5 {margin-bottom: 2 * $base-increment;} 59 | 60 | code, .code, kbd { 61 | display: inline-block; 62 | font-family: monospace; 63 | } 64 | 65 | code { 66 | padding: 1px 4px; 67 | background-color: rgba(130, 130, 130, 0.1); 68 | border: 1px solid rgba(0, 0, 0, 0.05); 69 | border-radius: $border-radius; 70 | color: #2a4459; 71 | font-size: 0.9em; 72 | } 73 | 74 | .code {color: #000;} 75 | 76 | kbd { 77 | padding: 1px 5px 2px; 78 | background-color: rgba(130, 130, 130, 0.1); 79 | border: 1px solid rgba(0, 0, 0, 0.08); 80 | border-radius: $border-radius; 81 | color: rgba(0, 0, 0, 0.55); 82 | box-shadow: inset -1px -1px 1px rgba(0, 0, 0, 0.1), inset 1px 1px 2px rgba(255, 255, 255, 1); 83 | } 84 | -------------------------------------------------------------------------------- /src/documentation/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | @forward '@/wave-ui/scss/variables'; 2 | 3 | $links: #09c; 4 | $theme-switch-transition: 0.4s; 5 | 6 | @mixin theme-switch-transition() { 7 | transition: color $theme-switch-transition, 8 | background-color $theme-switch-transition, 9 | border-color $theme-switch-transition, 10 | stroke $theme-switch-transition, 11 | fill $theme-switch-transition; 12 | } 13 | 14 | // Override Wave UI's SCSS defaults. 15 | // $base-font-size: 14px; 16 | // $box-shadow: 0 3px 1px -2px rgba(#000, 0.5), 17 | // 0 2px 2px 0 rgba(#000, 0.5), 18 | // 0 1px 5px 0 rgba(#000, 0.5); 19 | -------------------------------------------------------------------------------- /src/documentation/scss/index.scss: -------------------------------------------------------------------------------- 1 | @forward './base'; 2 | @forward './dark-theme'; // Can't import conditionally. 3 | @forward './typography'; 4 | @forward './header'; 5 | -------------------------------------------------------------------------------- /src/documentation/views/404.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/documentation/views/browser-support.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 51 | 52 | 64 | -------------------------------------------------------------------------------- /src/documentation/views/getting-started/install-cdn.vue: -------------------------------------------------------------------------------- 1 | 56 | -------------------------------------------------------------------------------- /src/documentation/views/layout-other-css-classes.vue: -------------------------------------------------------------------------------- 1 | 41 | -------------------------------------------------------------------------------- /src/documentation/views/migration-from-v2-to-v3.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | 64 | 65 | 67 | -------------------------------------------------------------------------------- /src/documentation/views/test.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | 28 | 31 | -------------------------------------------------------------------------------- /src/documentation/views/typography.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 53 | 54 | 63 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/accordion/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/alert/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/app/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 57 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/app/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/autocomplete/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/badge/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/breadcrumbs/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 71 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/breadcrumbs/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/button/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/calendar.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/card/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 56 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/card/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/checkbox/index.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/confirm/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/date-picker/api.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/date-picker/examples.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/date-picker/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/dialog/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/divider/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 48 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/divider/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/drawer/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/form/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/icon/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 66 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/icon/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/image/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/input/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/list/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/list/item.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/menu/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/notification/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/overlay/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 75 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/overlay/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/parallax/api.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 41 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/parallax/examples.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/parallax/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/progress/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/radio/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/rating/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/scrollable/api.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/scrollable/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/select/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/slider/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/spinner/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 51 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/spinner/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/splitter.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 62 | 63 | 89 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/steps/api.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 44 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/steps/examples.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/steps/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/switch/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/table/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/tabs/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/tag/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/textarea/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/timeline/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 66 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/timeline/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/toolbar/api.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 53 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/toolbar/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/tooltip/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/documentation/views/ui-components/tree/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './app.vue' 3 | import router from './router' 4 | import store from './store' 5 | import WaveUI from '@/wave-ui/index' 6 | import '@mdi/font/css/materialdesignicons.min.css' 7 | 8 | import SshPre from 'simple-syntax-highlighter' 9 | import 'simple-syntax-highlighter/dist/sshpre.css' 10 | import TitleLink from '@/documentation/components/title-link.vue' 11 | import IssueLink from '@/documentation/components/issue-link.vue' 12 | import UiComponentTitle from '@/documentation/components/ui-component-title.vue' 13 | import Example from '@/documentation/components/example/index.vue' 14 | import Alert from '@/documentation/components/alert.vue' 15 | import Api from '@/documentation/components/api.vue' 16 | 17 | const app = createApp(App) 18 | app 19 | .use(router) 20 | .use(store) 21 | .use(WaveUI, { 22 | on: '#app', 23 | colors: { 24 | dark: { 25 | primary: '#7fb0cf' 26 | } 27 | }, 28 | theme: 'auto' 29 | }) 30 | 31 | app.component('ssh-pre', SshPre) 32 | app.component('title-link', TitleLink) 33 | app.component('ui-component-title', UiComponentTitle) 34 | app.component('example', Example) 35 | app.component('alert', Alert) 36 | app.component('component-api', Api) // The `api` keyword in template crashes Vue 3. 37 | app.component('issue-link', IssueLink) 38 | 39 | app.mount('#app') 40 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore } from 'vuex' 2 | 3 | export default createStore({ 4 | state: () => ({ 5 | currentPage: '', // The title of the page, to pass to Codepen from examples. 6 | usePug: false, 7 | tabsView: true, 8 | darkMode: false 9 | }), 10 | 11 | mutations: { 12 | setDarkMode(state, bool) { 13 | state.darkMode = bool 14 | localStorage.darkMode = bool 15 | }, 16 | setCurrentPage(state, pageTitle) { 17 | state.currentPage = pageTitle 18 | }, 19 | initUsePug(state) { 20 | state.usePug = !!Number.parseInt(localStorage.getItem('usePug')) 21 | }, 22 | setUsePug(state, usePug) { 23 | if (state.usePug !== usePug) { 24 | state.usePug = usePug 25 | localStorage.setItem('usePug', +usePug) 26 | } 27 | }, 28 | initTabsView(state) { 29 | state.tabsView = !!Number.parseInt(localStorage.getItem('tabsView')) 30 | }, 31 | setTabsView(state, tabsView) { 32 | if (state.tabsView !== tabsView) { 33 | state.tabsView = tabsView 34 | localStorage.setItem('tabsView', +tabsView) 35 | } 36 | } 37 | }, 38 | 39 | actions: { 40 | detectDarkMode({ commit }) { 41 | // Detect the dark mode preference. 42 | const darkMode = window?.matchMedia?.('(prefers-color-scheme: dark)')?.matches 43 | 44 | commit('setDarkMode', darkMode) 45 | return darkMode 46 | } 47 | } 48 | }) 49 | -------------------------------------------------------------------------------- /src/types/components/WGrid.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | /* eslint-disable @typescript-eslint/ban-types */ 4 | import type { 5 | ComputedGetter, 6 | ComputedOptions, 7 | DefineComponent, 8 | EmitsOptions, 9 | ExtractDefaultPropTypes, 10 | MethodOptions, 11 | SlotsType 12 | } from 'vue' 13 | 14 | import type { 15 | PublicProps, 16 | ResolveProps 17 | } from '../extra-vue-types' 18 | 19 | // ---------------------------------------------------------------------------- 20 | // Props 21 | // ---------------------------------------------------------------------------- 22 | export interface WaveGridProps { 23 | /** 24 | * TODO: Add Description 25 | * @property {string} tag - Default: 'div' 26 | * @see https://antoniandre.github.io/wave-ui/w-grid 27 | */ 28 | tag?: string 29 | 30 | /** 31 | * TODO: Add Description 32 | * @property {number|{}|string} columns 33 | * @see https://antoniandre.github.io/wave-ui/w-grid 34 | */ 35 | columns?: number|{}|string 36 | 37 | /** 38 | * TODO: Add Description 39 | * @property {number|{}|string} gap - Default: 0 40 | * @see https://antoniandre.github.io/wave-ui/w-grid 41 | */ 42 | gap?: number|{}|string 43 | } 44 | 45 | // ---------------------------------------------------------------------------- 46 | // Emits 47 | // ---------------------------------------------------------------------------- 48 | export type WaveGridEmits = {} 49 | 50 | // ---------------------------------------------------------------------------- 51 | // Computeds 52 | // ---------------------------------------------------------------------------- 53 | export interface WaveGridComputeds extends ComputedOptions { 54 | /** 55 | * TODO: Add Description 56 | * @see https://antoniandre.github.io/wave-ui/w-grid 57 | */ 58 | breakpointsColumns: ComputedGetter 59 | 60 | /** 61 | * TODO: Add Description 62 | * @see https://antoniandre.github.io/wave-ui/w-grid 63 | */ 64 | breakpointsGap: ComputedGetter 65 | 66 | /** 67 | * TODO: Add Description 68 | * @see https://antoniandre.github.io/wave-ui/w-grid 69 | */ 70 | classes: ComputedGetter 71 | } 72 | 73 | // ---------------------------------------------------------------------------- 74 | // Methods 75 | // ---------------------------------------------------------------------------- 76 | export interface WaveGridMethods extends MethodOptions { 77 | } 78 | 79 | // ---------------------------------------------------------------------------- 80 | // Slots 81 | // ---------------------------------------------------------------------------- 82 | export type WaveGridSlots = SlotsType<{ 83 | /** 84 | * TODO: Add Description 85 | * @see https://antoniandre.github.io/wave-ui/w-grid 86 | */ 87 | 'default': () => any 88 | }> 89 | 90 | // ---------------------------------------------------------------------------- 91 | // Component 92 | // ---------------------------------------------------------------------------- 93 | export type WGrid = DefineComponent< 94 | WaveGridProps, 95 | {}, 96 | {}, 97 | WaveGridComputeds, 98 | WaveGridMethods, 99 | {}, 100 | {}, 101 | WaveGridEmits & EmitsOptions, 102 | string, 103 | PublicProps, 104 | ResolveProps, 105 | ExtractDefaultPropTypes, 106 | WaveGridSlots 107 | > 108 | -------------------------------------------------------------------------------- /src/types/components/WNotificationManager.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | /* eslint-disable @typescript-eslint/ban-types */ 4 | import type { 5 | ComputedGetter, 6 | ComputedOptions, 7 | DefineComponent, 8 | EmitsOptions, 9 | ExtractDefaultPropTypes, 10 | MethodOptions, 11 | SlotsType 12 | } from 'vue' 13 | 14 | import type { 15 | PublicProps, 16 | ResolveProps 17 | } from '../extra-vue-types' 18 | 19 | // ---------------------------------------------------------------------------- 20 | // Props 21 | // ---------------------------------------------------------------------------- 22 | export type WaveNotificationManagerProps = {} 23 | 24 | // ---------------------------------------------------------------------------- 25 | // Emits 26 | // ---------------------------------------------------------------------------- 27 | export type WaveNotificationManagerEmits = {} 28 | 29 | // ---------------------------------------------------------------------------- 30 | // Computeds 31 | // ---------------------------------------------------------------------------- 32 | export interface WaveNotificationManagerComputeds extends ComputedOptions { 33 | /** 34 | * TODO: Add Description 35 | * @see https://antoniandre.github.io/wave-ui/w-notification-manager 36 | */ 37 | conf: ComputedGetter 38 | 39 | /** 40 | * TODO: Add Description 41 | * @see https://antoniandre.github.io/wave-ui/w-notification-manager 42 | */ 43 | notifications: ComputedGetter 44 | 45 | /** 46 | * TODO: Add Description 47 | * @see https://antoniandre.github.io/wave-ui/w-notification-manager 48 | */ 49 | transition: ComputedGetter 50 | } 51 | 52 | // ---------------------------------------------------------------------------- 53 | // Methods 54 | // ---------------------------------------------------------------------------- 55 | export interface WaveNotificationManagerMethods extends MethodOptions { 56 | /** 57 | * TODO: Add Description 58 | * @param {any} notif 59 | * @see https://antoniandre.github.io/wave-ui/w-notification-manager 60 | */ 61 | notifProps(notif: any): void 62 | } 63 | 64 | // ---------------------------------------------------------------------------- 65 | // Slots 66 | // ---------------------------------------------------------------------------- 67 | export type WaveNotificationManagerSlots = SlotsType<{ 68 | }> 69 | 70 | // ---------------------------------------------------------------------------- 71 | // Component 72 | // ---------------------------------------------------------------------------- 73 | export type WNotificationManager = DefineComponent< 74 | WaveNotificationManagerProps, 75 | {}, 76 | {}, 77 | WaveNotificationManagerComputeds, 78 | WaveNotificationManagerMethods, 79 | {}, 80 | {}, 81 | WaveNotificationManagerEmits & EmitsOptions, 82 | string, 83 | PublicProps, 84 | ResolveProps, 85 | ExtractDefaultPropTypes, 86 | WaveNotificationManagerSlots 87 | > 88 | -------------------------------------------------------------------------------- /src/types/components/WSteps.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | /* eslint-disable @typescript-eslint/ban-types */ 4 | import type { 5 | ComputedGetter, 6 | ComputedOptions, 7 | DefineComponent, 8 | EmitsOptions, 9 | ExtractDefaultPropTypes, 10 | MethodOptions, 11 | SlotsType 12 | } from 'vue' 13 | 14 | import type { 15 | PublicProps, 16 | ResolveProps 17 | } from '../extra-vue-types' 18 | 19 | // ---------------------------------------------------------------------------- 20 | // Props 21 | // ---------------------------------------------------------------------------- 22 | export interface WaveStepsProps { 23 | /** 24 | * TODO: Add Description 25 | * @property {boolean} dark 26 | * @see https://antoniandre.github.io/wave-ui/w-steps 27 | */ 28 | dark?: boolean 29 | 30 | /** 31 | * TODO: Add Description 32 | * @property {boolean} light 33 | * @see https://antoniandre.github.io/wave-ui/w-steps 34 | */ 35 | light?: boolean 36 | } 37 | 38 | // ---------------------------------------------------------------------------- 39 | // Emits 40 | // ---------------------------------------------------------------------------- 41 | export type WaveStepsEmits = {} 42 | 43 | // ---------------------------------------------------------------------------- 44 | // Computeds 45 | // ---------------------------------------------------------------------------- 46 | export interface WaveStepsComputeds extends ComputedOptions { 47 | /** 48 | * TODO: Add Description 49 | * @see https://antoniandre.github.io/wave-ui/w-steps 50 | */ 51 | classes: ComputedGetter 52 | } 53 | 54 | // ---------------------------------------------------------------------------- 55 | // Methods 56 | // ---------------------------------------------------------------------------- 57 | export interface WaveStepsMethods extends MethodOptions { 58 | } 59 | 60 | // ---------------------------------------------------------------------------- 61 | // Slots 62 | // ---------------------------------------------------------------------------- 63 | export type WaveStepsSlots = SlotsType<{ 64 | }> 65 | 66 | // ---------------------------------------------------------------------------- 67 | // Component 68 | // ---------------------------------------------------------------------------- 69 | export type WSteps = DefineComponent< 70 | WaveStepsProps, 71 | {}, 72 | {}, 73 | WaveStepsComputeds, 74 | WaveStepsMethods, 75 | {}, 76 | {}, 77 | WaveStepsEmits & EmitsOptions, 78 | string, 79 | PublicProps, 80 | ResolveProps, 81 | ExtractDefaultPropTypes, 82 | WaveStepsSlots 83 | > 84 | -------------------------------------------------------------------------------- /src/types/components/index.ts: -------------------------------------------------------------------------------- 1 | export { WAccordion } from './WAccordion' 2 | export { WAlert } from './WAlert' 3 | export { WApp } from './WApp' 4 | export { WBadge } from './WBadge' 5 | export { WBreadcrumbs } from './WBreadcrumbs' 6 | export { WButton } from './WButton' 7 | export { WCard } from './WCard' 8 | export { WCheckbox } from './WCheckbox' 9 | export { WCheckboxes } from './WCheckboxes' 10 | export { WConfirm } from './WConfirm' 11 | export { WDialog } from './WDialog' 12 | export { WDivider } from './WDivider' 13 | export { WDrawer } from './WDrawer' 14 | export { WFlex } from './WFlex' 15 | export { WFormElement } from './WFormElement' 16 | export { WForm } from './WForm' 17 | export { WGrid } from './WGrid' 18 | export { WIcon } from './WIcon' 19 | export { WImage } from './WImage' 20 | export { WInput } from './WInput' 21 | export { WList } from './WList' 22 | export { WMenu } from './WMenu' 23 | export { WNotificationManager } from './WNotificationManager' 24 | export { WNotification } from './WNotification' 25 | export { WOverlay } from './WOverlay' 26 | export { WProgress } from './WProgress' 27 | export { WRadio } from './WRadio' 28 | export { WRadios } from './WRadios' 29 | export { WRating } from './WRating' 30 | export { WSelect, WSelectDropdownItem } from './WSelect' 31 | export { WSlider } from './WSlider' 32 | export { WSpinner } from './WSpinner' 33 | export { WSteps } from './WSteps' 34 | export { WSwitch } from './WSwitch' 35 | export { WTable, WTableHeader, WTablePagination } from './WTable' 36 | export { WTabs } from './WTabs' 37 | export { WTag } from './WTag' 38 | export { WTextarea } from './WTextarea' 39 | export { WTimeline } from './WTimeline' 40 | export { WToolbar } from './WToolbar' 41 | export { WTooltip } from './WTooltip' 42 | export { WTree } from './WTree' 43 | -------------------------------------------------------------------------------- /src/types/extra-vue-types.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | /* eslint-disable @typescript-eslint/ban-types */ 4 | import type { 5 | AllowedComponentProps, 6 | ComponentCustomProps, 7 | ComponentPropsOptions, 8 | EmitsOptions, 9 | ExtractPropTypes, 10 | ObjectEmitsOptions, 11 | VNodeProps 12 | } from 'vue' 13 | 14 | export type EmitsToProps = T extends string[] ? { 15 | [K in string & `on${Capitalize}`]?: (...args: any[]) => any 16 | } : T extends ObjectEmitsOptions ? { 17 | [K in string & `on${Capitalize}`]?: K extends `on${infer C}` ? T[Uncapitalize] extends null ? (...args: any[]) => any : (...args: T[Uncapitalize] extends (...args: infer P) => any ? P : never) => any : never 18 | } : {} 19 | 20 | export type ResolveProps = Readonly : PropsOrPropOptions> & ({} extends E ? {} : EmitsToProps) 21 | 22 | export type PublicProps = VNodeProps & AllowedComponentProps & ComponentCustomProps 23 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | import { WaveUIPlugin } from './plugin' 2 | 3 | export type * from './$waveui' 4 | export type * from './colors' 5 | export type * from './components' 6 | 7 | export default WaveUIPlugin 8 | -------------------------------------------------------------------------------- /src/types/plugin.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/ban-types */ 2 | import type { App } from 'vue' 3 | 4 | import type { $waveui } from '@/types/$waveui' 5 | 6 | export interface BreakpointConfig { 7 | xs?: number 8 | sm?: number 9 | md?: number 10 | lg?: number 11 | xl?: number 12 | } 13 | 14 | export interface ConstructorOptions { 15 | colors?: Record>; 16 | breakpoints?: BreakpointConfig 17 | } 18 | 19 | export declare class WaveUIPlugin { 20 | static #registered: boolean 21 | 22 | $waveui: $waveui 23 | 24 | constructor(app: App, options?: ConstructorOptions & {}) 25 | 26 | static install(app: App, options?: ConstructorOptions & {}): undefined 27 | } 28 | -------------------------------------------------------------------------------- /src/wave-ui/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as WAccordion } from './w-accordion/index.vue' 2 | export { default as WAccordionItem } from './w-accordion/item.vue' 3 | export { default as WAlert } from './w-alert.vue' 4 | export { default as WAutocomplete } from './w-autocomplete.vue' 5 | export { default as WApp } from './w-app.vue' 6 | export { default as WBadge } from './w-badge.vue' 7 | export { default as WBreadcrumbs } from './w-breadcrumbs.vue' 8 | export { default as WButton } from './w-button/index.vue' 9 | export { default as WCard } from './w-card.vue' 10 | export { default as WCheckbox } from './w-checkbox.vue' 11 | export { default as WCheckboxes } from './w-checkboxes.vue' 12 | export { default as WConfirm } from './w-confirm.vue' 13 | export { default as WDatePicker } from './w-date-picker.vue' 14 | export { default as WDialog } from './w-dialog.vue' 15 | export { default as WDivider } from './w-divider.vue' 16 | export { default as WDrawer } from './w-drawer.vue' 17 | export { default as WFlex } from './w-flex.vue' 18 | export { default as WForm } from './w-form.vue' 19 | export { default as WFormElement } from './w-form-element.vue' 20 | export { default as WGrid } from './w-grid.vue' 21 | export { default as WIcon } from './w-icon.vue' 22 | export { default as WImage } from './w-image.vue' 23 | export { default as WInput } from './w-input.vue' 24 | export { default as WList } from './w-list.vue' 25 | export { default as WMenu } from './w-menu.vue' 26 | export { default as WNotification } from './w-notification.vue' 27 | export { default as WOverlay } from './w-overlay.vue' 28 | export { default as WParallax } from './w-parallax.vue' 29 | export { default as WProgress } from './w-progress.vue' 30 | export { default as WRadio } from './w-radio.vue' 31 | export { default as WRadios } from './w-radios.vue' 32 | export { default as WRating } from './w-rating.vue' 33 | export { default as WScrollable } from './w-scrollable.vue' 34 | export { default as WSelect } from './w-select.vue' 35 | export { default as WSlider } from './w-slider.vue' 36 | export { default as WSpinner } from './w-spinner.vue' 37 | export { default as WSteps } from './w-steps.vue' 38 | export { default as WSwitch } from './w-switch.vue' 39 | export { default as WTabs } from './w-tabs/index.vue' 40 | export { default as WTable } from './w-table.vue' 41 | export { default as WTag } from './w-tag.vue' 42 | export { default as WTextarea } from './w-textarea.vue' 43 | export { default as WTimeline } from './w-timeline.vue' 44 | export { default as WToolbar } from './w-toolbar.vue' 45 | export { default as WTooltip } from './w-tooltip.vue' 46 | export { default as WTransitionBounce } from './transitions/w-transition-bounce.vue' 47 | export { default as WTransitionExpand } from './transitions/w-transition-expand.vue' 48 | export { default as WTransitionFade } from './transitions/w-transition-fade.vue' 49 | export { default as WTransitionScale } from './transitions/w-transition-scale.vue' 50 | export { default as WTransitionScaleFade } from './transitions/w-transition-scale-fade.vue' 51 | export { default as WTransitionSlide } from './transitions/w-transition-slide.vue' 52 | export { default as WTransitionSlideFade } from './transitions/w-transition-slide-fade.vue' 53 | export { default as WTransitionTwist } from './transitions/w-transition-twist.vue' 54 | export { default as WTree } from './w-tree.vue' 55 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-bounce.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-fade.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-scale-fade.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-scale.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-slide-fade.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 34 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-slide.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 34 | -------------------------------------------------------------------------------- /src/wave-ui/components/transitions/w-transition-twist.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-app.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 25 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-breadcrumbs.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 86 | 87 | 106 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-button/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 71 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-date-picker.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 29 | 30 | 36 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-divider.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 35 | 36 | 85 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-flex.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 57 | 58 | 70 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-grid.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 73 | 74 | 83 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-notification-manager.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 49 | 50 | 72 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-parallax.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 19 | 20 | 24 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-slideshow.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 23 | 24 | 28 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-steps.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 29 | 30 | 35 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-tabs/tab-content.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 15 | -------------------------------------------------------------------------------- /src/wave-ui/components/w-timeline.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 43 | 44 | 87 | -------------------------------------------------------------------------------- /src/wave-ui/index.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/ban-types */ 2 | declare module 'wave-ui/src/wave-ui' { 3 | import type { App } from 'vue' 4 | 5 | import type { $waveui } from '@/types/$waveui' 6 | import type { ConstructorOptions } from '@/types/plugin' 7 | 8 | export declare class WaveUIPlugin { 9 | static #registered: boolean 10 | 11 | $waveui: $waveui 12 | 13 | constructor(app: App, options?: ConstructorOptions & {}) 14 | 15 | install(app: App, options?: ConstructorOptions & {}): undefined 16 | } 17 | 18 | const WaveUI: WaveUIPlugin 19 | 20 | export default WaveUI 21 | } 22 | -------------------------------------------------------------------------------- /src/wave-ui/index.js: -------------------------------------------------------------------------------- 1 | import WaveUI from './core' 2 | import * as components from './components' 3 | 4 | const install = WaveUI.install 5 | WaveUI.install = (app, options = {}) => install.call(WaveUI, app, { components, ...options }) 6 | 7 | export default WaveUI 8 | -------------------------------------------------------------------------------- /src/wave-ui/mixins/form-elements.js: -------------------------------------------------------------------------------- 1 | export default { 2 | inject: { 3 | // Used in each form component to determine whether to use the w-form-element wrap or not. 4 | // So, if a form component is in a form, use the w-form-element wrap. 5 | formRegister: { default: null }, 6 | // If the form is disabled or readonly, apply to all the form components. 7 | formProps: { default: () => ({ disabled: false, readonly: false }) } 8 | }, 9 | 10 | props: { 11 | name: { type: String }, // When sending data through form. 12 | disabled: { type: Boolean }, 13 | readonly: { type: Boolean }, 14 | required: { type: Boolean }, 15 | tabindex: { type: String }, 16 | validators: { type: Array } 17 | }, 18 | 19 | data: () => ({ 20 | valid: null // Null is pristine (unknown), can also be true or false. 21 | }), 22 | 23 | computed: { 24 | inputName () { 25 | return this.name || `${this.$options.name}--${this._.uid}` 26 | }, 27 | isDisabled () { 28 | return this.disabled || this.formProps.disabled 29 | }, 30 | isReadonly () { 31 | return this.readonly || this.formProps.readonly 32 | }, 33 | validationColor () { 34 | return this.formProps.validationColor 35 | }, 36 | labelClasses () { 37 | return { 38 | [this.labelColor]: this.labelColor && this.valid !== false, 39 | [this.validationColor]: this.valid === false 40 | } 41 | } 42 | }, 43 | 44 | methods: { 45 | // Allow triggering a particular field validation manually via `$refs.myField.validate()`. 46 | validate () { 47 | this.$refs.formEl.validate(this) 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/wave-ui/scss/_base.scss: -------------------------------------------------------------------------------- 1 | @use "sass:map"; 2 | @use "variables" as *; 3 | 4 | // The CSS variables are used in the dynamic-css.js file in order to reuse the same SCSS 5 | // variable presets. 6 | :root { 7 | --w-base-increment: #{$base-increment}; 8 | --w-css-scope: #{$css-scope}; 9 | --w-contrast-bg-o025-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 2.5%, transparent)}; 10 | --w-contrast-bg-o05-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 5%, transparent)}; 11 | --w-contrast-bg-o1-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 10%, transparent)}; 12 | --w-contrast-bg-o2-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 20%, transparent)}; 13 | --w-contrast-bg-o3-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 30%, transparent)}; 14 | --w-contrast-bg-o4-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 40%, transparent)}; 15 | --w-contrast-bg-o5-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 50%, transparent)}; 16 | --w-contrast-bg-o6-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 60%, transparent)}; 17 | --w-contrast-bg-o7-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 70%, transparent)}; 18 | --w-contrast-bg-o8-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 80%, transparent)}; 19 | --w-contrast-bg-o9-color: #{color-mix(in srgb, var(--w-contrast-bg-color) 90%, transparent)}; 20 | 21 | background-color: var(--w-base-bg-color); 22 | color: var(--w-base-color); 23 | } 24 | 25 | :root[data-theme="light"] { 26 | --w-base-bg-color: #{map.get($theme-light, 'base-bg-color')}; 27 | --w-base-color: #{map.get($theme-light, 'base-color')}; 28 | --w-contrast-bg-color: #{map.get($theme-light, 'contrast-bg-color')}; 29 | --w-contrast-color: #{map.get($theme-light, 'contrast-color')}; 30 | --w-caption-color: #{map.get($theme-light, 'caption-color')}; 31 | --w-disabled-color: #{map.get($theme-light, 'disabled-color')}; 32 | } 33 | 34 | :root[data-theme="dark"] { 35 | --w-base-bg-color: #{map.get($theme-dark, 'base-bg-color')}; 36 | --w-base-color: #{map.get($theme-dark, 'base-color')}; 37 | --w-contrast-bg-color: #{map.get($theme-dark, 'contrast-bg-color')}; 38 | --w-contrast-color: #{map.get($theme-dark, 'contrast-color')}; 39 | --w-caption-color: #{map.get($theme-dark, 'caption-color')}; 40 | --w-disabled-color: #{map.get($theme-dark, 'disabled-color')}; 41 | } 42 | 43 | * { 44 | outline: none; 45 | margin: 0; 46 | padding: 0; 47 | } 48 | 49 | body {overflow-x: hidden;} 50 | 51 | a {text-decoration: none;} 52 | 53 | .w-app { 54 | position: relative; // Make the .w-app a referential for tooltips / menus. 55 | display: flex; 56 | flex-direction: column; 57 | min-height: 100dvh; 58 | 59 | &, *, :before, :after {box-sizing: border-box;} 60 | 61 | &.row {flex-direction: row;} 62 | &.d-block {display: block;} 63 | &.align-center {align-items: center;} 64 | &.align-end {align-items: flex-end;} 65 | &.justify-center {justify-content: center;} 66 | &.justify-end {justify-content: flex-end;} 67 | &.justify-space-between {justify-content: space-between;} 68 | &.justify-space-around {justify-content: space-around;} 69 | &.justify-space-evenly {justify-content: space-evenly;} 70 | &.text-center {text-align: center;} 71 | &.text-right {text-align: right;} 72 | } 73 | 74 | .w-main { 75 | padding-left: 3 * $base-increment; 76 | padding-right: 3 * $base-increment; 77 | } 78 | 79 | // Structure classes. 80 | // ---------------------------------------------- 81 | .content-wrap { 82 | position: relative; 83 | padding: $layout-padding; 84 | } 85 | -------------------------------------------------------------------------------- /src/wave-ui/scss/_typography.scss: -------------------------------------------------------------------------------- 1 | @use "sass:math"; 2 | @use 'variables' as *; 3 | 4 | #{$css-scope} { 5 | .headline, .title1 { 6 | font-size: math.round(2.2 * $base-font-size); 7 | font-weight: 100; 8 | } 9 | 10 | .title2 { 11 | font-size: math.round(1.7 * $base-font-size); 12 | font-weight: 400; 13 | } 14 | 15 | .title3 { 16 | font-size: math.round(1.4 * $base-font-size); 17 | font-weight: 400; 18 | } 19 | 20 | .title4 { 21 | font-size: math.round(1.25 * $base-font-size); 22 | font-weight: 400; 23 | } 24 | 25 | .title5 { 26 | font-size: math.round(1.1 * $base-font-size); 27 | font-weight: 600; 28 | } 29 | 30 | .body { 31 | font-size: $base-font-size; 32 | font-weight: normal; 33 | } 34 | 35 | .caption { 36 | font-size: math.round(0.85 * $base-font-size); 37 | font-style: italic; 38 | color: $caption-color; 39 | } 40 | 41 | .text-upper {text-transform: uppercase;} 42 | .text-lower {text-transform: lowercase;} 43 | .text-capitalize {text-transform: capitalize;} 44 | .text-light {font-weight: normal;} 45 | .text-bold {font-weight: bold;} 46 | .text-italic {font-style: italic;} 47 | .text-nowrap {white-space: nowrap;} 48 | } 49 | -------------------------------------------------------------------------------- /src/wave-ui/scss/index.scss: -------------------------------------------------------------------------------- 1 | @forward 'base'; 2 | @forward 'typography'; 3 | @forward 'layout'; 4 | @forward 'colors'; 5 | @forward 'icons'; 6 | @forward 'transitions'; 7 | -------------------------------------------------------------------------------- /src/wave-ui/scss/variables/_index.scss: -------------------------------------------------------------------------------- 1 | @forward 'variables'; 2 | @forward 'mixins'; 3 | -------------------------------------------------------------------------------- /src/wave-ui/utils/config.js: -------------------------------------------------------------------------------- 1 | import { reactive } from 'vue' 2 | 3 | const config = reactive({ 4 | on: '#app', // Sets the Wave UI root node. If not found, will default to `body`. 5 | breakpoints: { 6 | xs: 600, 7 | sm: 900, 8 | md: 1200, 9 | lg: 1700, 10 | xl: 9999 // Xl only needs a greater value than lg but starts from lg and goes to infinity. 11 | }, 12 | css: { 13 | // Generate shades for custom colors and status colors. 14 | // Note: the color palette shades are always generated separately from SCSS. 15 | colorShades: true, 16 | 17 | // Generate CSS variables for color shades. 18 | // Note: colorShades must be enabled for this to work. 19 | colorShadeCssVariables: false, 20 | 21 | // Generate palette colors and palette color shades. 22 | // Can't have this option: color palette is generated via SCSS in colors.scss. 23 | // colorPalette: true, 24 | 25 | breakpointSpaces: false, // Generate margin & padding classes for each breakpoint. E.g. `sm-ma2`. 26 | // Generate helper classes for each breakpoint. 27 | // E.g. `sm-text-left`, `xs-hide`. 28 | breakpointLayoutClasses: true, 29 | grid: 12 30 | }, 31 | colors: { 32 | // Default colors of Wave UI. Can be overridden from the Wave UI user config on init. 33 | light: { 34 | primary: '#234781', 35 | secondary: '#d3ebff', 36 | info: '#3d9ff5', 37 | warning: '#f80', 38 | success: '#54b946', 39 | error: '#f65555' 40 | }, 41 | dark: { 42 | primary: '#89b6d2', 43 | secondary: '#375b6a', 44 | info: '#3d9ff5', 45 | warning: '#f80', 46 | success: '#54b946', 47 | error: '#f65555' 48 | } 49 | }, 50 | // The initial theme to use. 51 | // To switch theme while running, call the $waveui.switchTheme('light'|'dark') method. 52 | theme: 'light', // One of 'light', 'dark', 'auto'. 53 | icons: [], 54 | iconsLigature: false, 55 | notificationManager: { 56 | align: 'right', 57 | transition: 'default' // Sliding from the side by default. 58 | }, 59 | presets: {} // User presets for each component. 60 | }) 61 | 62 | export { config as default } 63 | 64 | export const mergeConfig = (options, conf = config) => { 65 | // If the conf object is empty, populate with options (case of presets). 66 | if (!Object.keys(conf).length) conf = Object.assign(conf, options) 67 | 68 | else { 69 | for (const key in options) { 70 | const option = options[key] 71 | if (typeof option === 'object' && typeof conf[key] === 'object') { 72 | mergeConfig(options[key], conf[key]) 73 | } 74 | else conf[key] = option 75 | } 76 | } 77 | 78 | return conf 79 | } 80 | -------------------------------------------------------------------------------- /src/wave-ui/utils/console.js: -------------------------------------------------------------------------------- 1 | export const consoleWarn = message => console.warn(`Wave UI: ${message}`) 2 | 3 | export const consoleError = message => console.error(`Wave UI: ${message}`) 4 | -------------------------------------------------------------------------------- /src/wave-ui/utils/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Takes CSS classes as a string array or object and turn them into an object. 3 | * 4 | * @param {String|Array|Object} classes the CSS classes to merge into an object 5 | * @return {Object} 6 | */ 7 | export const objectifyClasses = (classes = {}) => { 8 | if (typeof classes === 'string') classes = { [classes]: true } 9 | else if (Array.isArray(classes)) classes = { [classes.join(' ')]: true } 10 | return classes 11 | } 12 | -------------------------------------------------------------------------------- /src/wave-ui/utils/notification-manager.js: -------------------------------------------------------------------------------- 1 | import { h, render } from 'vue' 2 | import WNotificationManager from '../components/w-notification-manager.vue' 3 | 4 | export class NotificationManager { 5 | static #instance 6 | notifications 7 | // Private fields. 8 | _uid // A unique ID for each notification. 9 | _notificationDefaults 10 | 11 | constructor () { 12 | // Singleton pattern. 13 | if (NotificationManager.#instance) return NotificationManager.#instance 14 | 15 | this.notifications = [] 16 | this._uid = 0 17 | this._notificationDefaults = { 18 | _uid: 0, 19 | _value: true, 20 | message: '', 21 | timeout: 4000, 22 | dismiss: true 23 | } 24 | NotificationManager.#instance = this 25 | } 26 | 27 | notify (...args) { 28 | let notification = { 29 | ...this._notificationDefaults, 30 | _uid: this._uid++ 31 | } 32 | 33 | if (typeof args[0] === 'object') notification = { ...notification, ...args[0] } 34 | else { 35 | const [message, type, timeout] = args 36 | notification = { 37 | ...notification, 38 | message: message || '', 39 | [type === undefined ? 'info' : type]: true, 40 | timeout: timeout || timeout === 0 ? parseFloat(timeout) : 4000 41 | } 42 | } 43 | 44 | // Allow calling notification.dismiss(). 45 | if (notification.dismiss) notification.dismiss = () => this.dismiss(notification._uid) 46 | 47 | this.notifications.push(notification) 48 | if (~~notification.timeout !== 0) setTimeout(() => this.dismiss(notification._uid), notification.timeout) 49 | } 50 | 51 | dismiss (uid) { 52 | this.notifications = this.notifications.filter(item => item._uid !== uid) 53 | } 54 | } 55 | 56 | /** 57 | * Injects the w-notification-manager in the DOM programmatically so the user does not have to do it. 58 | * 59 | * @param {Object} app The Vue app instance. 60 | */ 61 | export const injectNotifManagerInDOM = app => { 62 | const div = document.createElement('div') 63 | document.body.appendChild(div) // Attach to body before teleporting. 64 | 65 | // Create a VNode for WNotificationManager and assign app._context to inherit global components. 66 | const vnode = h(WNotificationManager) 67 | vnode.appContext = app._context // ! \ Attach app context to inherit global components & provide()! 68 | 69 | render(vnode, div) // Render inside the main app scope. 70 | 71 | div.remove() // The WNotificationManager component teleports itself inside `.w-app`. 72 | } 73 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "@tsconfig/recommended/tsconfig.json", 4 | "compilerOptions": { 5 | "declaration": true, 6 | "lib": ["es6", "dom", "es2017"], 7 | "outDir": "dist/types/", 8 | "baseUrl": ".", 9 | "paths": { 10 | "@/*": ["src/*"] 11 | } 12 | }, 13 | "include": ["./src/**/*", "./src/**/*.ts", "./src/*.d.ts", "./src/**/*.d.ts"], 14 | "exclude": ["./dist/", "./node_modules/"] 15 | } 16 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { resolve } from 'node:path' 2 | import vue from '@vitejs/plugin-vue' 3 | import autoprefixer from 'autoprefixer' 4 | import Delete from 'rollup-plugin-delete' 5 | import { defineConfig } from 'vite' 6 | import svgLoader from 'vite-svg-loader' 7 | 8 | const bundlingConf = { 9 | lib: { 10 | entry: resolve(__dirname, '/src/wave-ui/index.js'), 11 | name: 'WaveUI', 12 | formats: ['es', 'umd', 'cjs'] 13 | }, 14 | rollupOptions: { 15 | plugins: [ 16 | // Rollup generates all the files, then remove what we don't want. 17 | // @todo: find a better way. 18 | Delete({ 19 | targets: ['dist/{images,.htaccess,ghspa.js}', 'dist/*.{ico,txt,html}'], 20 | hook: 'generateBundle' 21 | }) 22 | ], 23 | // Make sure to externalize deps that shouldn't be bundled into library. 24 | external: ['vue'], 25 | output: { 26 | // Provide global variables to use in the UMD build for externalized deps. 27 | globals: { vue: 'Vue' }, 28 | entryFileNames: 'wave-ui.[format].js', 29 | chunkFileNames: '[name].js' 30 | } 31 | } 32 | } 33 | 34 | export default defineConfig({ 35 | define: { 36 | 'process.env': { 37 | ...process.env, 38 | VITE_APP_VERSION: process.env.npm_package_version, 39 | __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false 40 | } 41 | }, 42 | plugins: [ 43 | vue({ 44 | template: { 45 | compilerOptions: { 46 | whitespace: 'preserve' 47 | } 48 | } 49 | }), 50 | svgLoader() 51 | ], // https://vitejs.dev/config/ 52 | css: { 53 | preprocessorOptions: { 54 | scss: { 55 | api: 'modern-compiler', 56 | additionalData: '@use "@/wave-ui/scss/variables" as *;@use "@/documentation/scss/variables" as *;' 57 | } 58 | }, 59 | postcss: { 60 | plugins: [autoprefixer] 61 | } 62 | }, 63 | resolve: { 64 | alias: { 65 | '@': resolve(__dirname, '/src') 66 | } 67 | }, 68 | build: process.env.BUNDLE ? bundlingConf : { outDir: 'docs' } 69 | }) 70 | --------------------------------------------------------------------------------