Copy disabled (too large)
Download .txt
Showing preview only (81,715K chars total). Download the full file to get everything.
Repository: rstoenescu/quasar-framework
Branch: dev
Commit: 3826ef27879b
Files: 4052
Total size: 77.1 MB
Directory structure:
gitextract_0inuvllc/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report--quasar-v2.yml
│ │ ├── config.yml
│ │ └── docs-report--quasar-v2.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── RELEASE-TEMPLATE.md
│ └── workflows/
│ ├── build-types.yml
│ ├── comment-build-results.yml
│ ├── process-created-issue.yml
│ ├── project-creation-tests.yml
│ ├── release-notes.yml
│ ├── tests-on-pr-report.yml
│ └── tests-on-pr.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .npmrc
├── .oxfmtrc.json
├── .oxlintrc.json
├── .sasslintrc
├── .vscode/
│ ├── extensions.json
│ └── settings.json
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── ROADMAP.md
├── SECURITY.md
├── app-vite/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── assets/
│ │ └── logo.art
│ ├── bin/
│ │ └── quasar.js
│ ├── exports/
│ │ ├── bex/
│ │ │ ├── background.js
│ │ │ ├── content.js
│ │ │ └── private/
│ │ │ └── bex-bridge.js
│ │ ├── eslint/
│ │ │ ├── eslint.cjs
│ │ │ └── eslint.js
│ │ ├── testing/
│ │ │ └── testing.js
│ │ └── wrappers.js
│ ├── lib/
│ │ ├── app-builder.js
│ │ ├── app-devserver.js
│ │ ├── app-extension/
│ │ │ ├── AppExtensionInstance.js
│ │ │ ├── api-classes/
│ │ │ │ ├── BaseAPI.js
│ │ │ │ ├── IndexAPI.js
│ │ │ │ ├── InstallAPI.js
│ │ │ │ ├── PromptsAPI.js
│ │ │ │ └── UninstallAPI.js
│ │ │ └── create-app-ext.js
│ │ ├── app-tool.js
│ │ ├── cache/
│ │ │ ├── create-cache-proxy.js
│ │ │ ├── module.animations.js
│ │ │ ├── module.capCli.js
│ │ │ ├── module.cssVariables.js
│ │ │ ├── module.electron.js
│ │ │ ├── module.hasTypescript.js
│ │ │ ├── module.nodePackager.js
│ │ │ ├── module.storeProvider.js
│ │ │ └── module.workboxBuild.js
│ │ ├── cmd/
│ │ │ ├── build.js
│ │ │ ├── clean.js
│ │ │ ├── describe.js
│ │ │ ├── dev.js
│ │ │ ├── ext.js
│ │ │ ├── help.js
│ │ │ ├── info.js
│ │ │ ├── inspect.js
│ │ │ ├── mode.js
│ │ │ ├── new.js
│ │ │ ├── prepare.js
│ │ │ └── run.js
│ │ ├── config-tools.js
│ │ ├── entry-files-generator.js
│ │ ├── modes/
│ │ │ ├── bex/
│ │ │ │ ├── bex-builder.js
│ │ │ │ ├── bex-config.js
│ │ │ │ ├── bex-devserver.js
│ │ │ │ ├── bex-installation.js
│ │ │ │ └── bex-utils.js
│ │ │ ├── capacitor/
│ │ │ │ ├── capacitor-builder.js
│ │ │ │ ├── capacitor-config.js
│ │ │ │ ├── capacitor-consistency.js
│ │ │ │ ├── capacitor-devserver.js
│ │ │ │ ├── capacitor-installation.js
│ │ │ │ └── config-file.js
│ │ │ ├── cordova/
│ │ │ │ ├── android-cleartext.js
│ │ │ │ ├── config-file.js
│ │ │ │ ├── cordova-builder.js
│ │ │ │ ├── cordova-config.js
│ │ │ │ ├── cordova-consistency.js
│ │ │ │ ├── cordova-devserver.js
│ │ │ │ ├── cordova-installation.js
│ │ │ │ └── vite-plugin.dev.cordova-platform-inject.js
│ │ │ ├── electron/
│ │ │ │ ├── electron-builder.js
│ │ │ │ ├── electron-config.js
│ │ │ │ ├── electron-consistency.js
│ │ │ │ ├── electron-devserver.js
│ │ │ │ └── electron-installation.js
│ │ │ ├── modes-utils.js
│ │ │ ├── pwa/
│ │ │ │ ├── pwa-builder.js
│ │ │ │ ├── pwa-config.js
│ │ │ │ ├── pwa-devserver.js
│ │ │ │ ├── pwa-installation.js
│ │ │ │ ├── utils.js
│ │ │ │ └── vite-plugin.pwa-resources.js
│ │ │ ├── spa/
│ │ │ │ ├── spa-builder.js
│ │ │ │ ├── spa-config.js
│ │ │ │ ├── spa-devserver.js
│ │ │ │ └── spa-installation.js
│ │ │ └── ssr/
│ │ │ ├── ssr-builder.js
│ │ │ ├── ssr-config.js
│ │ │ ├── ssr-consistency.js
│ │ │ ├── ssr-devserver.js
│ │ │ └── ssr-installation.js
│ │ ├── node-version-check.js
│ │ ├── plugins/
│ │ │ ├── rolldown.inject-replacements.js
│ │ │ ├── rolldown.vue-shim.js
│ │ │ ├── vite.index-html-transform.js
│ │ │ └── vite.strip-filename-hashes.js
│ │ ├── quasar-config-file.js
│ │ ├── types-generator.js
│ │ └── utils/
│ │ ├── app-files-validations.js
│ │ ├── banner.js
│ │ ├── build-targets.js
│ │ ├── cli-runtime.js
│ │ ├── encode-for-diff.js
│ │ ├── ensure-argv.js
│ │ ├── env.js
│ │ ├── escape-regex-string.js
│ │ ├── get-api.js
│ │ ├── get-app-paths.js
│ │ ├── get-caller-path.js
│ │ ├── get-ctx.js
│ │ ├── get-external-ip.js
│ │ ├── get-fixed-deps.js
│ │ ├── get-package-json.js
│ │ ├── get-package-major-version.js
│ │ ├── get-package-path.js
│ │ ├── get-package.js
│ │ ├── get-pkg.js
│ │ ├── html-template.js
│ │ ├── is-terminal.js
│ │ ├── logger.js
│ │ ├── net.js
│ │ ├── on-shutdown.js
│ │ ├── open-browser.js
│ │ ├── open-ide.js
│ │ ├── print-build-summary.js
│ │ ├── rate-limit.js
│ │ ├── resolve-extension.js
│ │ ├── signals.js
│ │ ├── spawn.js
│ │ └── template.js
│ ├── package.json
│ ├── playground-js/
│ │ ├── index.html
│ │ ├── jsconfig.json
│ │ ├── package.json
│ │ ├── public/
│ │ │ └── .gitkeep
│ │ ├── quasar.config.js
│ │ └── src/
│ │ ├── App.vue
│ │ ├── assets/
│ │ │ └── .gitkeep
│ │ ├── boot/
│ │ │ └── .gitkeep
│ │ ├── components/
│ │ │ └── EssentialLink.vue
│ │ ├── css/
│ │ │ ├── app.scss
│ │ │ └── quasar.variables.scss
│ │ ├── layouts/
│ │ │ └── MainLayout.vue
│ │ ├── pages/
│ │ │ ├── ErrorNotFound.vue
│ │ │ └── IndexPage.vue
│ │ └── router/
│ │ ├── index.js
│ │ └── routes.js
│ ├── playground-ts/
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── public/
│ │ │ └── .gitkeep
│ │ ├── quasar.config.ts
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── assets/
│ │ │ │ └── .gitkeep
│ │ │ ├── boot/
│ │ │ │ └── .gitkeep
│ │ │ ├── components/
│ │ │ │ ├── EssentialLink.vue
│ │ │ │ ├── ExampleComponent.vue
│ │ │ │ └── models.ts
│ │ │ ├── css/
│ │ │ │ ├── app.scss
│ │ │ │ └── quasar.variables.scss
│ │ │ ├── env.d.ts
│ │ │ ├── layouts/
│ │ │ │ └── MainLayout.vue
│ │ │ ├── pages/
│ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ └── IndexPage.vue
│ │ │ └── router/
│ │ │ ├── index.ts
│ │ │ └── routes.ts
│ │ └── tsconfig.json
│ ├── templates/
│ │ ├── app/
│ │ │ ├── js/
│ │ │ │ ├── boot.js
│ │ │ │ ├── component.vue
│ │ │ │ ├── layout.vue
│ │ │ │ ├── page.vue
│ │ │ │ ├── ssrmiddleware.js
│ │ │ │ └── store.js
│ │ │ └── ts/
│ │ │ ├── boot.ts
│ │ │ ├── component.vue
│ │ │ ├── layout.vue
│ │ │ ├── page.vue
│ │ │ ├── ssrmiddleware.ts
│ │ │ └── store.ts
│ │ ├── bex/
│ │ │ ├── common/
│ │ │ │ └── assets/
│ │ │ │ └── content.css
│ │ │ ├── js/
│ │ │ │ ├── background.js
│ │ │ │ ├── manifest.json
│ │ │ │ └── my-content-script.js
│ │ │ └── ts/
│ │ │ ├── background.ts
│ │ │ ├── bex-env.d.ts
│ │ │ ├── manifest.json
│ │ │ └── my-content-script.ts
│ │ ├── capacitor/
│ │ │ ├── capacitor.config.json
│ │ │ ├── package.json
│ │ │ ├── pnpm-workspace.yaml
│ │ │ └── www/
│ │ │ └── index.html
│ │ ├── cordova/
│ │ │ └── www/
│ │ │ └── index.html
│ │ ├── electron/
│ │ │ ├── common/
│ │ │ │ ├── icons/
│ │ │ │ │ └── icon.icns
│ │ │ │ ├── package.json
│ │ │ │ └── pnpm-workspace.yaml
│ │ │ ├── js/
│ │ │ │ ├── electron-main.js
│ │ │ │ └── electron-preload.js
│ │ │ └── ts/
│ │ │ ├── electron-env.d.ts
│ │ │ ├── electron-main.ts
│ │ │ └── electron-preload.ts
│ │ ├── entry/
│ │ │ ├── app.js
│ │ │ ├── bex-app.js
│ │ │ ├── client-entry.js
│ │ │ ├── client-prefetch.js
│ │ │ ├── quasar-user-options.js
│ │ │ ├── server-entry.js
│ │ │ ├── ssr-dev-webserver.js
│ │ │ ├── ssr-middlewares.js
│ │ │ └── ssr-prod-webserver.js
│ │ ├── pwa/
│ │ │ ├── js/
│ │ │ │ ├── custom-service-worker.js
│ │ │ │ ├── manifest.json
│ │ │ │ └── register-service-worker.js
│ │ │ └── ts/
│ │ │ ├── custom-service-worker.ts
│ │ │ ├── manifest.json
│ │ │ ├── pwa-env.d.ts
│ │ │ ├── register-service-worker.ts
│ │ │ └── tsconfig.json
│ │ ├── ssr/
│ │ │ ├── express/
│ │ │ │ ├── common/
│ │ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ │ └── server-assets/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── js/
│ │ │ │ │ ├── middlewares/
│ │ │ │ │ │ └── render.js
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── server.js
│ │ │ │ └── ts/
│ │ │ │ ├── middlewares/
│ │ │ │ │ └── render.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── server.ts
│ │ │ │ └── ssr-env.d.ts
│ │ │ ├── fastify/
│ │ │ │ ├── common/
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ │ └── server-assets/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── js/
│ │ │ │ │ ├── middlewares/
│ │ │ │ │ │ └── render.js
│ │ │ │ │ └── server.js
│ │ │ │ └── ts/
│ │ │ │ ├── middlewares/
│ │ │ │ │ └── render.ts
│ │ │ │ ├── server.ts
│ │ │ │ └── ssr-env.d.ts
│ │ │ ├── hono/
│ │ │ │ ├── common/
│ │ │ │ │ ├── package.json
│ │ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ │ └── server-assets/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── js/
│ │ │ │ │ ├── middlewares/
│ │ │ │ │ │ └── render.js
│ │ │ │ │ └── server.js
│ │ │ │ └── ts/
│ │ │ │ ├── middlewares/
│ │ │ │ │ └── render.ts
│ │ │ │ ├── server.ts
│ │ │ │ └── ssr-env.d.ts
│ │ │ └── koa/
│ │ │ ├── common/
│ │ │ │ ├── pnpm-workspace.yaml
│ │ │ │ └── server-assets/
│ │ │ │ └── .gitkeep
│ │ │ ├── js/
│ │ │ │ ├── middlewares/
│ │ │ │ │ └── render.js
│ │ │ │ ├── package.json
│ │ │ │ └── server.js
│ │ │ └── ts/
│ │ │ ├── middlewares/
│ │ │ │ └── render.ts
│ │ │ ├── package.json
│ │ │ ├── server.ts
│ │ │ └── ssr-env.d.ts
│ │ └── store/
│ │ └── pinia/
│ │ ├── js/
│ │ │ └── index.js
│ │ └── ts/
│ │ └── index.ts
│ └── types/
│ ├── app-extension.d.ts
│ ├── app-paths.d.ts
│ ├── app-wrappers.d.ts
│ ├── bex/
│ │ ├── bridge.d.ts
│ │ ├── entrypoints/
│ │ │ ├── background.d.ts
│ │ │ ├── content.d.ts
│ │ │ └── create-bridge.d.ts
│ │ └── index.d.ts
│ ├── boot.d.ts
│ ├── client/
│ │ ├── src-bex.d.ts
│ │ ├── src-electron.d.ts
│ │ ├── src-pwa.d.ts
│ │ ├── src-ssr.d.ts
│ │ └── src.d.ts
│ ├── configuration/
│ │ ├── bex.d.ts
│ │ ├── boot.d.ts
│ │ ├── build.d.ts
│ │ ├── capacitor-conf.d.ts
│ │ ├── conf.d.ts
│ │ ├── context.d.ts
│ │ ├── cordova-conf.d.ts
│ │ ├── electron-conf.d.ts
│ │ ├── framework-conf.d.ts
│ │ ├── mobile-conf.d.ts
│ │ ├── pwa-conf.d.ts
│ │ └── ssr-conf.d.ts
│ ├── configuration.d.ts
│ ├── globals.d.ts
│ ├── index.d.ts
│ ├── prefetch.d.ts
│ ├── route.d.ts
│ ├── ssr/
│ │ ├── context.d.ts
│ │ ├── driver.d.ts
│ │ ├── index.d.ts
│ │ └── ssrmiddleware.d.ts
│ ├── store.d.ts
│ └── tsconfig.json
├── app-webpack/
│ ├── .gitignore
│ ├── .npmignore
│ ├── LICENSE
│ ├── README.md
│ ├── assets/
│ │ └── logo.art
│ ├── bin/
│ │ └── quasar
│ ├── exports/
│ │ ├── bex/
│ │ │ ├── background.mjs
│ │ │ ├── content.mjs
│ │ │ └── private/
│ │ │ └── bex-bridge.mjs
│ │ ├── eslint/
│ │ │ ├── eslint.js
│ │ │ └── eslint.mjs
│ │ ├── testing/
│ │ │ └── testing.js
│ │ └── wrappers/
│ │ ├── wrappers.js
│ │ └── wrappers.mjs
│ ├── lib/
│ │ ├── app-builder.js
│ │ ├── app-devserver.js
│ │ ├── app-extension/
│ │ │ ├── AppExtensionInstance.js
│ │ │ ├── api-classes/
│ │ │ │ ├── BaseAPI.js
│ │ │ │ ├── IndexAPI.js
│ │ │ │ ├── InstallAPI.js
│ │ │ │ ├── PromptsAPI.js
│ │ │ │ └── UninstallAPI.js
│ │ │ ├── create-app-ext.js
│ │ │ └── utils.app-extension.js
│ │ ├── app-tool.js
│ │ ├── cache/
│ │ │ ├── create-cache-proxy.js
│ │ │ ├── module.animations.js
│ │ │ ├── module.capCli.js
│ │ │ ├── module.cssVariables.js
│ │ │ ├── module.electron.js
│ │ │ ├── module.eslint.js
│ │ │ ├── module.extrasPath.js
│ │ │ ├── module.hasTypescript.js
│ │ │ ├── module.nodePackager.js
│ │ │ ├── module.quasarMeta.js
│ │ │ ├── module.storeProvider.js
│ │ │ ├── module.vueRouterVersion.js
│ │ │ └── module.workboxWebpackPlugin.js
│ │ ├── cmd/
│ │ │ ├── build.js
│ │ │ ├── clean.js
│ │ │ ├── describe.js
│ │ │ ├── dev.js
│ │ │ ├── ext.js
│ │ │ ├── help.js
│ │ │ ├── info.js
│ │ │ ├── inspect.js
│ │ │ ├── mode.js
│ │ │ ├── new.js
│ │ │ ├── prepare.js
│ │ │ └── run.js
│ │ ├── config-tools.js
│ │ ├── entry-files-generator.js
│ │ ├── loaders/
│ │ │ ├── loader.js.transform-quasar-imports.js
│ │ │ ├── loader.quasar-scss-variables.js
│ │ │ ├── loader.vue.auto-import-quasar.js
│ │ │ ├── runtime.auto-import.js
│ │ │ └── runtime.inject-module-id.js
│ │ ├── modes/
│ │ │ ├── bex/
│ │ │ │ ├── bex-builder.js
│ │ │ │ ├── bex-config.js
│ │ │ │ ├── bex-devserver.js
│ │ │ │ ├── bex-installation.js
│ │ │ │ └── bex-utils.js
│ │ │ ├── capacitor/
│ │ │ │ ├── capacitor-builder.js
│ │ │ │ ├── capacitor-config.js
│ │ │ │ ├── capacitor-devserver.js
│ │ │ │ ├── capacitor-installation.js
│ │ │ │ ├── config-file.js
│ │ │ │ └── ensure-consistency.js
│ │ │ ├── cordova/
│ │ │ │ ├── android-cleartext.js
│ │ │ │ ├── config-file.js
│ │ │ │ ├── cordova-builder.js
│ │ │ │ ├── cordova-config.js
│ │ │ │ ├── cordova-devserver.js
│ │ │ │ ├── cordova-installation.js
│ │ │ │ └── ensure-consistency.js
│ │ │ ├── electron/
│ │ │ │ ├── electron-builder.js
│ │ │ │ ├── electron-config.js
│ │ │ │ ├── electron-devserver.js
│ │ │ │ └── electron-installation.js
│ │ │ ├── modes-utils.js
│ │ │ ├── pwa/
│ │ │ │ ├── plugin.webpack.pwa-manifest.js
│ │ │ │ ├── plugin.webpack.workbox-warning.js
│ │ │ │ ├── pwa-builder.js
│ │ │ │ ├── pwa-config.js
│ │ │ │ ├── pwa-devserver.js
│ │ │ │ └── pwa-installation.js
│ │ │ ├── spa/
│ │ │ │ ├── spa-builder.js
│ │ │ │ ├── spa-config.js
│ │ │ │ ├── spa-devserver.js
│ │ │ │ └── spa-installation.js
│ │ │ └── ssr/
│ │ │ ├── plugin.webpack.client-side.js
│ │ │ ├── plugin.webpack.server-side.js
│ │ │ ├── ssr-builder.js
│ │ │ ├── ssr-config.js
│ │ │ ├── ssr-devserver.js
│ │ │ └── ssr-installation.js
│ │ ├── node-version-check.js
│ │ ├── plugins/
│ │ │ ├── esbuild.eslint.js
│ │ │ ├── esbuild.inject-replacements.js
│ │ │ ├── esbuild.vue-shim.js
│ │ │ ├── webpack.boot-default-export.js
│ │ │ ├── webpack.html-transform.js
│ │ │ └── webpack.progress.js
│ │ ├── quasar-config-file.js
│ │ ├── testing.js
│ │ ├── types-generator.js
│ │ └── utils/
│ │ ├── app-files-validations.js
│ │ ├── banner.js
│ │ ├── cli-runtime.js
│ │ ├── encode-for-diff.js
│ │ ├── ensure-argv.js
│ │ ├── env.js
│ │ ├── escape-regex-string.js
│ │ ├── get-api.js
│ │ ├── get-app-paths.js
│ │ ├── get-caller-path.js
│ │ ├── get-ctx.js
│ │ ├── get-external-ip.js
│ │ ├── get-fixed-deps.js
│ │ ├── get-package-json.js
│ │ ├── get-package-major-version.js
│ │ ├── get-package-path.js
│ │ ├── get-package.js
│ │ ├── get-pkg.js
│ │ ├── html-template.js
│ │ ├── inject-eslint-plugin.js
│ │ ├── inject-style-rules.js
│ │ ├── is-minimal-terminal.js
│ │ ├── logger.js
│ │ ├── net.js
│ │ ├── on-shutdown.js
│ │ ├── open-browser.js
│ │ ├── open-ide.js
│ │ ├── print-build-summary.js
│ │ ├── print-webpack-issue/
│ │ │ ├── extractWebpackError.js
│ │ │ ├── formatters/
│ │ │ │ ├── babelError.js
│ │ │ │ ├── defaultError.js
│ │ │ │ ├── eslintError.js
│ │ │ │ ├── moduleNotFound.js
│ │ │ │ └── stringError.js
│ │ │ ├── index.js
│ │ │ ├── transformErrors.js
│ │ │ ├── transformers/
│ │ │ │ ├── babelSyntax.js
│ │ │ │ ├── defaultTransformer.js
│ │ │ │ ├── esLintError.js
│ │ │ │ ├── index.js
│ │ │ │ ├── moduleNotFound.js
│ │ │ │ └── stringError.js
│ │ │ └── utils.js
│ │ ├── progress-log.js
│ │ ├── resolve-extension.js
│ │ ├── signals.js
│ │ └── spawn.js
│ ├── package.json
│ ├── playground-js/
│ │ ├── babel.config.js
│ │ ├── index.html
│ │ ├── jsconfig.json
│ │ ├── package.json
│ │ ├── postcss.config.js
│ │ ├── public/
│ │ │ └── .gitkeep
│ │ ├── quasar.config.js
│ │ └── src/
│ │ ├── App.vue
│ │ ├── assets/
│ │ │ └── .gitkeep
│ │ ├── boot/
│ │ │ └── .gitkeep
│ │ ├── components/
│ │ │ └── EssentialLink.vue
│ │ ├── css/
│ │ │ ├── app.scss
│ │ │ └── quasar.variables.scss
│ │ ├── layouts/
│ │ │ └── MainLayout.vue
│ │ ├── pages/
│ │ │ ├── ErrorNotFound.vue
│ │ │ └── IndexPage.vue
│ │ └── router/
│ │ ├── index.js
│ │ └── routes.js
│ ├── playground-ts/
│ │ ├── babel.config.cjs
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── postcss.config.cjs
│ │ ├── public/
│ │ │ └── .gitkeep
│ │ ├── quasar.config.ts
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── assets/
│ │ │ │ └── .gitkeep
│ │ │ ├── boot/
│ │ │ │ └── .gitkeep
│ │ │ ├── components/
│ │ │ │ ├── EssentialLink.vue
│ │ │ │ ├── ExampleComponent.vue
│ │ │ │ └── models.ts
│ │ │ ├── css/
│ │ │ │ ├── app.scss
│ │ │ │ └── quasar.variables.scss
│ │ │ ├── env.d.ts
│ │ │ ├── layouts/
│ │ │ │ └── MainLayout.vue
│ │ │ ├── pages/
│ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ └── IndexPage.vue
│ │ │ └── router/
│ │ │ ├── index.ts
│ │ │ └── routes.ts
│ │ └── tsconfig.json
│ ├── templates/
│ │ ├── app/
│ │ │ ├── js/
│ │ │ │ ├── boot.js
│ │ │ │ ├── component.vue
│ │ │ │ ├── layout.vue
│ │ │ │ ├── page.vue
│ │ │ │ ├── ssrmiddleware.js
│ │ │ │ └── store.js
│ │ │ └── ts/
│ │ │ ├── boot.ts
│ │ │ ├── component.vue
│ │ │ ├── layout.vue
│ │ │ ├── page.vue
│ │ │ ├── ssrmiddleware.ts
│ │ │ └── store.ts
│ │ ├── bex/
│ │ │ ├── common/
│ │ │ │ └── assets/
│ │ │ │ └── content.css
│ │ │ ├── js/
│ │ │ │ ├── background.js
│ │ │ │ ├── manifest.json
│ │ │ │ └── my-content-script.js
│ │ │ └── ts/
│ │ │ ├── background.ts
│ │ │ ├── manifest.json
│ │ │ └── my-content-script.ts
│ │ ├── capacitor/
│ │ │ ├── capacitor.config.json
│ │ │ ├── package.json
│ │ │ └── www/
│ │ │ └── index.html
│ │ ├── cordova/
│ │ │ └── www/
│ │ │ └── index.html
│ │ ├── electron/
│ │ │ ├── icons/
│ │ │ │ └── icon.icns
│ │ │ ├── js/
│ │ │ │ ├── electron-main.js
│ │ │ │ └── electron-preload.js
│ │ │ └── ts/
│ │ │ ├── electron-env.d.ts
│ │ │ ├── electron-main.ts
│ │ │ └── electron-preload.ts
│ │ ├── entry/
│ │ │ ├── app.js
│ │ │ ├── bex-app.js
│ │ │ ├── client-entry.js
│ │ │ ├── client-prefetch.js
│ │ │ ├── quasar-user-options.js
│ │ │ ├── server-entry.js
│ │ │ ├── ssr-dev-webserver.js
│ │ │ ├── ssr-middlewares.js
│ │ │ └── ssr-prod-webserver.js
│ │ ├── pwa/
│ │ │ ├── js/
│ │ │ │ ├── custom-service-worker.js
│ │ │ │ ├── manifest.json
│ │ │ │ └── register-service-worker.js
│ │ │ └── ts/
│ │ │ ├── custom-service-worker.ts
│ │ │ ├── manifest.json
│ │ │ ├── pwa-env.d.ts
│ │ │ ├── register-service-worker.ts
│ │ │ └── tsconfig.json
│ │ ├── ssr/
│ │ │ ├── js/
│ │ │ │ ├── middlewares/
│ │ │ │ │ └── render.js
│ │ │ │ └── server.js
│ │ │ └── ts/
│ │ │ ├── middlewares/
│ │ │ │ └── render.ts
│ │ │ └── server.ts
│ │ └── store/
│ │ └── pinia/
│ │ ├── js/
│ │ │ └── index.js
│ │ └── ts/
│ │ └── index.ts
│ └── types/
│ ├── app-extension.d.ts
│ ├── app-paths.d.ts
│ ├── app-wrappers.d.ts
│ ├── bex/
│ │ ├── bridge.d.ts
│ │ ├── entrypoints/
│ │ │ ├── background.d.ts
│ │ │ ├── content.d.ts
│ │ │ └── create-bridge.d.ts
│ │ └── index.d.ts
│ ├── boot.d.ts
│ ├── configuration/
│ │ ├── bex.d.ts
│ │ ├── boot.d.ts
│ │ ├── build.d.ts
│ │ ├── capacitor-conf.d.ts
│ │ ├── conf.d.ts
│ │ ├── context.d.ts
│ │ ├── cordova-conf.d.ts
│ │ ├── electron-conf.d.ts
│ │ ├── eslint.d.ts
│ │ ├── framework-conf.d.ts
│ │ ├── mobile-conf.d.ts
│ │ ├── pwa-conf.d.ts
│ │ └── ssr-conf.d.ts
│ ├── configuration.d.ts
│ ├── globals.d.ts
│ ├── index.d.ts
│ ├── prefetch.d.ts
│ ├── route.d.ts
│ ├── ssr/
│ │ ├── context.d.ts
│ │ ├── driver.d.ts
│ │ ├── index.d.ts
│ │ └── ssrmiddleware.d.ts
│ ├── store.d.ts
│ ├── tsconfig.json
│ └── ui-wrappers.d.ts
├── backers.md
├── cli/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── assets/
│ │ └── logo.art
│ ├── bin/
│ │ └── quasar.js
│ ├── lib/
│ │ ├── app-paths.js
│ │ ├── app-pkg.js
│ │ ├── cli-pkg.js
│ │ ├── cmd/
│ │ │ ├── create.js
│ │ │ ├── help.js
│ │ │ ├── info.js
│ │ │ ├── serve.js
│ │ │ └── upgrade.js
│ │ ├── get-package-json.js
│ │ ├── get-package-path.js
│ │ ├── is-terminal.js
│ │ ├── logger.js
│ │ ├── net.js
│ │ ├── node-packager.js
│ │ ├── node-version-check.js
│ │ └── spawn.js
│ └── package.json
├── create-quasar/
│ ├── .gitignore
│ ├── README.md
│ ├── assets/
│ │ └── logo.art
│ ├── index.js
│ ├── package.json
│ ├── scripts/
│ │ ├── create-test-project.ts
│ │ └── tsconfig.json
│ ├── templates/
│ │ ├── __eslint.config.base.js
│ │ ├── app/
│ │ │ ├── __eslint.config.js
│ │ │ ├── create-quasar-script.js
│ │ │ └── quasar-v2/
│ │ │ ├── create-quasar-script.js
│ │ │ ├── js-vite-2/
│ │ │ │ ├── BASE/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.editorconfig
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _.vscode/
│ │ │ │ │ │ ├── extensions.json
│ │ │ │ │ │ └── settings.json
│ │ │ │ │ ├── _jsconfig.json
│ │ │ │ │ ├── _package.json
│ │ │ │ │ ├── _pnpm-workspace.yaml
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── postcss.config.js
│ │ │ │ │ ├── quasar.config.js
│ │ │ │ │ └── src/
│ │ │ │ │ ├── App.vue
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── _.gitkeep
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── EssentialLink.vue
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ └── MainLayout.vue
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ │ └── IndexPage.vue
│ │ │ │ │ └── router/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── routes.js
│ │ │ │ ├── __.eslintrc.cjs
│ │ │ │ ├── create-quasar-script.js
│ │ │ │ ├── css/
│ │ │ │ │ └── src/
│ │ │ │ │ └── css/
│ │ │ │ │ └── app.css
│ │ │ │ ├── eslint/
│ │ │ │ │ └── _eslint.config.js
│ │ │ │ ├── i18n/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── i18n.js
│ │ │ │ │ └── i18n/
│ │ │ │ │ ├── en-US/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── pinia/
│ │ │ │ │ └── src/
│ │ │ │ │ └── stores/
│ │ │ │ │ ├── example-store.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── prettier/
│ │ │ │ │ └── _.prettierrc.json
│ │ │ │ └── sass/
│ │ │ │ └── src/
│ │ │ │ └── css/
│ │ │ │ ├── app.scss
│ │ │ │ └── quasar.variables.scss
│ │ │ ├── js-webpack-4/
│ │ │ │ ├── BASE/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.editorconfig
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _.vscode/
│ │ │ │ │ │ ├── extensions.json
│ │ │ │ │ │ └── settings.json
│ │ │ │ │ ├── _jsconfig.json
│ │ │ │ │ ├── _package.json
│ │ │ │ │ ├── _pnpm-workspace.yaml
│ │ │ │ │ ├── babel.config.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── postcss.config.js
│ │ │ │ │ ├── quasar.config.js
│ │ │ │ │ └── src/
│ │ │ │ │ ├── App.vue
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── _.gitkeep
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── EssentialLink.vue
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ └── MainLayout.vue
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ │ └── IndexPage.vue
│ │ │ │ │ └── router/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── routes.js
│ │ │ │ ├── __.eslintrc.cjs
│ │ │ │ ├── create-quasar-script.js
│ │ │ │ ├── css/
│ │ │ │ │ └── src/
│ │ │ │ │ └── css/
│ │ │ │ │ └── app.css
│ │ │ │ ├── eslint/
│ │ │ │ │ └── _eslint.config.js
│ │ │ │ ├── i18n/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── i18n.js
│ │ │ │ │ └── i18n/
│ │ │ │ │ ├── en-US/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── pinia/
│ │ │ │ │ └── src/
│ │ │ │ │ └── stores/
│ │ │ │ │ ├── example-store.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── store-flag.d.ts
│ │ │ │ ├── prettier/
│ │ │ │ │ └── _.prettierrc.json
│ │ │ │ └── sass/
│ │ │ │ └── src/
│ │ │ │ └── css/
│ │ │ │ ├── app.scss
│ │ │ │ └── quasar.variables.scss
│ │ │ ├── ts-vite-2/
│ │ │ │ ├── BASE/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.editorconfig
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _.vscode/
│ │ │ │ │ │ ├── extensions.json
│ │ │ │ │ │ └── settings.json
│ │ │ │ │ ├── _package.json
│ │ │ │ │ ├── _pnpm-workspace.yaml
│ │ │ │ │ ├── _tsconfig.json
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── postcss.config.js
│ │ │ │ │ ├── quasar.config.ts
│ │ │ │ │ └── src/
│ │ │ │ │ ├── App.vue
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── _.gitkeep
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── EssentialLink.vue
│ │ │ │ │ │ ├── ExampleComponent.vue
│ │ │ │ │ │ └── models.ts
│ │ │ │ │ ├── env.d.ts
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ └── MainLayout.vue
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ │ └── IndexPage.vue
│ │ │ │ │ └── router/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── routes.ts
│ │ │ │ ├── __.eslintrc.cjs
│ │ │ │ ├── create-quasar-script.js
│ │ │ │ ├── css/
│ │ │ │ │ └── src/
│ │ │ │ │ └── css/
│ │ │ │ │ └── app.css
│ │ │ │ ├── eslint/
│ │ │ │ │ └── _eslint.config.js
│ │ │ │ ├── i18n/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── i18n.ts
│ │ │ │ │ └── i18n/
│ │ │ │ │ ├── en-US/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── pinia/
│ │ │ │ │ └── src/
│ │ │ │ │ └── stores/
│ │ │ │ │ ├── example-store.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── prettier/
│ │ │ │ │ └── _.prettierrc.json
│ │ │ │ └── sass/
│ │ │ │ └── src/
│ │ │ │ └── css/
│ │ │ │ ├── app.scss
│ │ │ │ └── quasar.variables.scss
│ │ │ └── ts-webpack-4/
│ │ │ ├── BASE/
│ │ │ │ ├── README.md
│ │ │ │ ├── _.editorconfig
│ │ │ │ ├── _.gitignore
│ │ │ │ ├── _.vscode/
│ │ │ │ │ ├── extensions.json
│ │ │ │ │ └── settings.json
│ │ │ │ ├── _package.json
│ │ │ │ ├── _pnpm-workspace.yaml
│ │ │ │ ├── _tsconfig.json
│ │ │ │ ├── babel.config.cjs
│ │ │ │ ├── index.html
│ │ │ │ ├── postcss.config.cjs
│ │ │ │ ├── quasar.config.ts
│ │ │ │ └── src/
│ │ │ │ ├── App.vue
│ │ │ │ ├── boot/
│ │ │ │ │ └── _.gitkeep
│ │ │ │ ├── components/
│ │ │ │ │ ├── EssentialLink.vue
│ │ │ │ │ ├── ExampleComponent.vue
│ │ │ │ │ └── models.ts
│ │ │ │ ├── env.d.ts
│ │ │ │ ├── layouts/
│ │ │ │ │ └── MainLayout.vue
│ │ │ │ ├── pages/
│ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ └── IndexPage.vue
│ │ │ │ └── router/
│ │ │ │ ├── index.ts
│ │ │ │ └── routes.ts
│ │ │ ├── __.eslintrc.cjs
│ │ │ ├── create-quasar-script.js
│ │ │ ├── css/
│ │ │ │ └── src/
│ │ │ │ └── css/
│ │ │ │ └── app.css
│ │ │ ├── eslint/
│ │ │ │ └── _eslint.config.js
│ │ │ ├── i18n/
│ │ │ │ └── src/
│ │ │ │ ├── boot/
│ │ │ │ │ └── i18n.ts
│ │ │ │ └── i18n/
│ │ │ │ ├── en-US/
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.ts
│ │ │ ├── pinia/
│ │ │ │ └── src/
│ │ │ │ └── stores/
│ │ │ │ ├── example-store.ts
│ │ │ │ └── index.ts
│ │ │ ├── prettier/
│ │ │ │ └── _.prettierrc.json
│ │ │ └── sass/
│ │ │ └── src/
│ │ │ └── css/
│ │ │ ├── app.scss
│ │ │ └── quasar.variables.scss
│ │ ├── app-extension/
│ │ │ ├── __eslint.config.js
│ │ │ ├── ae-js/
│ │ │ │ ├── BASE/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _package.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── templates/
│ │ │ │ │ └── _.gitkeep
│ │ │ │ ├── create-quasar-script.js
│ │ │ │ ├── install-script/
│ │ │ │ │ └── src/
│ │ │ │ │ └── install.js
│ │ │ │ ├── prompts-script/
│ │ │ │ │ └── src/
│ │ │ │ │ └── prompts.js
│ │ │ │ └── uninstall-script/
│ │ │ │ └── src/
│ │ │ │ └── uninstall.js
│ │ │ ├── ae-ts/
│ │ │ │ ├── BASE/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _.vscode/
│ │ │ │ │ │ ├── extensions.json
│ │ │ │ │ │ └── settings.json
│ │ │ │ │ ├── _eslint.config.js
│ │ │ │ │ ├── _package.json
│ │ │ │ │ ├── _tsconfig.json
│ │ │ │ │ ├── app-extension/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── _.npmignore
│ │ │ │ │ │ ├── _package.json
│ │ │ │ │ │ ├── _tsconfig.json
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── quasar.d.ts
│ │ │ │ │ │ └── runtime/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── boot/
│ │ │ │ │ │ │ └── register.ts
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ ├── MyButton.vue
│ │ │ │ │ │ │ └── types.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── quasar.d.ts
│ │ │ │ │ │ └── shims-vue.d.ts
│ │ │ │ │ └── playground/
│ │ │ │ │ ├── quasar-cli-vite/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── _.gitignore
│ │ │ │ │ │ ├── _package.json
│ │ │ │ │ │ ├── _tsconfig.json
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ ├── postcss.config.cjs
│ │ │ │ │ │ ├── quasar.config.ts
│ │ │ │ │ │ ├── quasar.extensions.json
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── App.vue
│ │ │ │ │ │ ├── boot/
│ │ │ │ │ │ │ └── _.gitkeep
│ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ └── EssentialLink.vue
│ │ │ │ │ │ ├── css/
│ │ │ │ │ │ │ ├── app.scss
│ │ │ │ │ │ │ └── quasar.variables.scss
│ │ │ │ │ │ ├── env.d.ts
│ │ │ │ │ │ ├── layouts/
│ │ │ │ │ │ │ └── MainLayout.vue
│ │ │ │ │ │ ├── pages/
│ │ │ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ │ │ └── IndexPage.vue
│ │ │ │ │ │ ├── quasar.d.ts
│ │ │ │ │ │ ├── router/
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── routes.ts
│ │ │ │ │ │ └── shims-vue.d.ts
│ │ │ │ │ └── quasar-cli-webpack/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.gitignore
│ │ │ │ │ ├── _package.json
│ │ │ │ │ ├── _tsconfig.json
│ │ │ │ │ ├── babel.config.cjs
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── postcss.config.cjs
│ │ │ │ │ ├── quasar.config.ts
│ │ │ │ │ ├── quasar.extensions.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── App.vue
│ │ │ │ │ ├── boot/
│ │ │ │ │ │ └── _.gitkeep
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── EssentialLink.vue
│ │ │ │ │ ├── css/
│ │ │ │ │ │ ├── app.scss
│ │ │ │ │ │ └── quasar.variables.scss
│ │ │ │ │ ├── env.d.ts
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ └── MainLayout.vue
│ │ │ │ │ ├── pages/
│ │ │ │ │ │ ├── ErrorNotFound.vue
│ │ │ │ │ │ └── IndexPage.vue
│ │ │ │ │ ├── quasar.d.ts
│ │ │ │ │ ├── router/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── routes.ts
│ │ │ │ │ └── shims-vue.d.ts
│ │ │ │ ├── create-quasar-script.js
│ │ │ │ ├── install-script/
│ │ │ │ │ └── app-extension/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── install.ts
│ │ │ │ │ └── templates/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _.gitkeep
│ │ │ │ │ └── base/
│ │ │ │ │ └── _.gitkeep
│ │ │ │ ├── pnpm/
│ │ │ │ │ └── _pnpm-workspace.yaml
│ │ │ │ ├── prompts-script/
│ │ │ │ │ └── app-extension/
│ │ │ │ │ └── src/
│ │ │ │ │ └── prompts.ts
│ │ │ │ └── uninstall-script/
│ │ │ │ └── app-extension/
│ │ │ │ └── src/
│ │ │ │ └── uninstall.ts
│ │ │ └── create-quasar-script.js
│ │ └── ui-kit/
│ │ ├── __eslint.config.js
│ │ ├── create-quasar-script.js
│ │ └── quasar-v2/
│ │ ├── BASE/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── _.gitignore
│ │ │ ├── _jsconfig.json
│ │ │ └── ui/
│ │ │ ├── README.md
│ │ │ ├── _.npmignore
│ │ │ ├── _package.json
│ │ │ ├── build/
│ │ │ │ ├── config.js
│ │ │ │ ├── index.js
│ │ │ │ ├── script.clean.js
│ │ │ │ ├── script.css.js
│ │ │ │ ├── script.javascript.js
│ │ │ │ ├── script.open-umd.js
│ │ │ │ └── utils.js
│ │ │ ├── dev/
│ │ │ │ ├── README.md
│ │ │ │ ├── _.editorconfig
│ │ │ │ ├── _.gitignore
│ │ │ │ ├── _.postcssrc.js
│ │ │ │ ├── _package.json
│ │ │ │ ├── babel.config.js
│ │ │ │ ├── quasar.config.js
│ │ │ │ └── src/
│ │ │ │ ├── App.vue
│ │ │ │ ├── assets/
│ │ │ │ │ └── _.gitkeep
│ │ │ │ ├── boot/
│ │ │ │ │ └── register.js
│ │ │ │ ├── components/
│ │ │ │ │ └── _.gitkeep
│ │ │ │ ├── css/
│ │ │ │ │ ├── app.sass
│ │ │ │ │ └── quasar.variables.sass
│ │ │ │ ├── index.template.html
│ │ │ │ ├── layouts/
│ │ │ │ │ └── MyLayout.vue
│ │ │ │ ├── pages/
│ │ │ │ │ ├── Error404.vue
│ │ │ │ │ ├── Index.vue
│ │ │ │ │ └── Test1.vue
│ │ │ │ └── router/
│ │ │ │ ├── index.js
│ │ │ │ ├── pages.js
│ │ │ │ └── routes.js
│ │ │ ├── src/
│ │ │ │ ├── index.common.js
│ │ │ │ ├── index.esm.js
│ │ │ │ ├── index.sass
│ │ │ │ ├── index.umd.js
│ │ │ │ └── vue-plugin.js
│ │ │ └── umd-test.html
│ │ ├── ae/
│ │ │ └── app-extension/
│ │ │ ├── README.md
│ │ │ ├── _.npmignore
│ │ │ ├── _package.json
│ │ │ └── src/
│ │ │ ├── boot/
│ │ │ │ └── register.js
│ │ │ ├── index.js
│ │ │ └── templates/
│ │ │ └── _.gitkeep
│ │ ├── ae-install/
│ │ │ └── app-extension/
│ │ │ └── src/
│ │ │ └── install.js
│ │ ├── ae-prompts/
│ │ │ └── app-extension/
│ │ │ └── src/
│ │ │ └── prompts.js
│ │ ├── ae-uninstall/
│ │ │ └── app-extension/
│ │ │ └── src/
│ │ │ └── uninstall.js
│ │ ├── create-quasar-script.js
│ │ ├── ui-ae/
│ │ │ └── ui/
│ │ │ └── build/
│ │ │ └── script.app-ext.js
│ │ ├── ui-component/
│ │ │ └── ui/
│ │ │ └── src/
│ │ │ └── components/
│ │ │ ├── Component.js
│ │ │ └── Component.sass
│ │ └── ui-directive/
│ │ └── ui/
│ │ └── src/
│ │ └── directives/
│ │ ├── Directive.js
│ │ └── Directive.sass
│ └── utils/
│ ├── index.js
│ ├── logger.js
│ └── template.js
├── docs/
│ ├── .gitignore
│ ├── .npmrc
│ ├── README.md
│ ├── build/
│ │ ├── chunks.js
│ │ ├── copy-quasar-api.js
│ │ ├── examples.js
│ │ ├── fix-ssr-manifest.js
│ │ ├── md/
│ │ │ ├── flat-menu.js
│ │ │ ├── index.js
│ │ │ ├── md-parse-utils.js
│ │ │ ├── md-parse.js
│ │ │ ├── md-plugin-blockquote.js
│ │ │ ├── md-plugin-codeblock.js
│ │ │ ├── md-plugin-containers.js
│ │ │ ├── md-plugin-heading.js
│ │ │ ├── md-plugin-image.js
│ │ │ ├── md-plugin-link.js
│ │ │ ├── md-plugin-table.js
│ │ │ ├── md-plugin-token.js
│ │ │ └── md.js
│ │ ├── release-notes/
│ │ │ ├── highlight.js
│ │ │ ├── index.js
│ │ │ ├── md.mjs
│ │ │ └── request.js
│ │ ├── search.js
│ │ ├── ssg.js
│ │ └── utils.js
│ ├── index.html
│ ├── jsconfig.json
│ ├── package.json
│ ├── pnpm-workspace.yaml
│ ├── public/
│ │ └── search_manifest.xml
│ ├── quasar.config.js
│ ├── src/
│ │ ├── App.vue
│ │ ├── assets/
│ │ │ ├── docs-homepage.js
│ │ │ ├── get-meta.js
│ │ │ ├── layout-gallery.js
│ │ │ ├── links.components.js
│ │ │ ├── links.footer.js
│ │ │ ├── links.header.js
│ │ │ ├── links.integrations.js
│ │ │ ├── links.social.js
│ │ │ ├── menu.js
│ │ │ ├── page-utils.js
│ │ │ ├── sponsors.js
│ │ │ └── tutorials.js
│ │ ├── boot/
│ │ │ └── gdpr.js
│ │ ├── components/
│ │ │ ├── CodePrism.js
│ │ │ ├── CopyButton.vue
│ │ │ ├── DocApi.vue
│ │ │ ├── DocApiEntry.js
│ │ │ ├── DocCardLink.vue
│ │ │ ├── DocCardTitle.vue
│ │ │ ├── DocCode.vue
│ │ │ ├── DocCodepen.vue
│ │ │ ├── DocExample.vue
│ │ │ ├── DocInstallation.vue
│ │ │ ├── DocLink.vue
│ │ │ ├── DocPrerender.js
│ │ │ ├── DocStars.vue
│ │ │ ├── DocTree.vue
│ │ │ └── SurveyCountdown.vue
│ │ ├── css/
│ │ │ ├── app.sass
│ │ │ ├── fonts.sass
│ │ │ ├── prism-theme.sass
│ │ │ └── quasar.variables.sass
│ │ ├── examples/
│ │ │ ├── AppFullscreen/
│ │ │ │ ├── Basic.vue
│ │ │ │ └── Targeted.vue
│ │ │ ├── AppVisibility/
│ │ │ │ └── Basic.vue
│ │ │ ├── BottomSheet/
│ │ │ │ ├── Basic.vue
│ │ │ │ └── Dark.vue
│ │ │ ├── ClosePopup/
│ │ │ │ ├── Dialog.vue
│ │ │ │ ├── DialogInDialog.vue
│ │ │ │ ├── DialogMenu.vue
│ │ │ │ ├── Menu.vue
│ │ │ │ └── MenuTree.vue
│ │ │ ├── Dialog/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── NativeAttributes.vue
│ │ │ │ ├── OtherOptions.vue
│ │ │ │ ├── Pickers.vue
│ │ │ │ ├── Progress.vue
│ │ │ │ ├── UnsafeHtml.vue
│ │ │ │ ├── ValidationOptions.vue
│ │ │ │ └── ValidationPrompt.vue
│ │ │ ├── Intersection/
│ │ │ │ ├── Advanced.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── ObjectForm.vue
│ │ │ │ ├── Once.vue
│ │ │ │ └── ScrollingCards.vue
│ │ │ ├── Loading/
│ │ │ │ ├── Customized.vue
│ │ │ │ ├── Default.vue
│ │ │ │ ├── MultipleGroups.vue
│ │ │ │ ├── ShowAndChange.vue
│ │ │ │ ├── WithBox.vue
│ │ │ │ ├── WithMessage.vue
│ │ │ │ └── WithMessageSanitized.vue
│ │ │ ├── Morph/
│ │ │ │ ├── BasicGroup.vue
│ │ │ │ └── Card.vue
│ │ │ ├── MorphUtils/
│ │ │ │ ├── FabCard.vue
│ │ │ │ ├── ImageGallery.vue
│ │ │ │ ├── ImageStripHorizontal.vue
│ │ │ │ ├── ImageStripVertical.vue
│ │ │ │ └── SameElement.vue
│ │ │ ├── Mutation/
│ │ │ │ ├── CatchAll.vue
│ │ │ │ ├── DragDrop.vue
│ │ │ │ └── UndoRedo.vue
│ │ │ ├── Notify/
│ │ │ │ ├── Actions.vue
│ │ │ │ ├── Avatar.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Caption.vue
│ │ │ │ ├── Grouping.vue
│ │ │ │ ├── GroupingCustomBadge.vue
│ │ │ │ ├── Icon.vue
│ │ │ │ ├── Multiline.vue
│ │ │ │ ├── Positioning.vue
│ │ │ │ ├── PredefinedTypesCustom.vue
│ │ │ │ ├── PredefinedTypesDefault.vue
│ │ │ │ ├── Spinner.vue
│ │ │ │ ├── TimeoutProgress.vue
│ │ │ │ ├── UnsafeHtml.vue
│ │ │ │ └── Updatable.vue
│ │ │ ├── Platform/
│ │ │ │ └── Basic.vue
│ │ │ ├── QAjaxBar/
│ │ │ │ └── Basic.vue
│ │ │ ├── QAvatar/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Integrated.vue
│ │ │ │ ├── Overlapping.vue
│ │ │ │ ├── Rounded.vue
│ │ │ │ ├── Square.vue
│ │ │ │ ├── Squarish.vue
│ │ │ │ └── StandardSizes.vue
│ │ │ ├── QBadge/
│ │ │ │ ├── Align.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Floating.vue
│ │ │ │ ├── Indicators.vue
│ │ │ │ ├── Outline.vue
│ │ │ │ ├── Rounded.vue
│ │ │ │ └── Transparent.vue
│ │ │ ├── QBanner/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── Image.vue
│ │ │ │ ├── Inline.vue
│ │ │ │ └── Rounded.vue
│ │ │ ├── QBar/
│ │ │ │ ├── Android.vue
│ │ │ │ ├── Dialog.vue
│ │ │ │ ├── Header.vue
│ │ │ │ ├── MacOS.vue
│ │ │ │ ├── Menu.vue
│ │ │ │ ├── Windows.vue
│ │ │ │ └── iOS.vue
│ │ │ ├── QBreadcrumbs/
│ │ │ │ ├── Align.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Gutters.vue
│ │ │ │ ├── LinksWithGo.vue
│ │ │ │ ├── RouterLinks.vue
│ │ │ │ ├── Separator.vue
│ │ │ │ └── Toolbar.vue
│ │ │ ├── QBtn/
│ │ │ │ ├── ButtonAlignment.vue
│ │ │ │ ├── ButtonDesign.vue
│ │ │ │ ├── ButtonPadding.vue
│ │ │ │ ├── ButtonSize.vue
│ │ │ │ ├── CustomColor.vue
│ │ │ │ ├── CustomContent.vue
│ │ │ │ ├── CustomRipple.vue
│ │ │ │ ├── DeterministicProgress.vue
│ │ │ │ ├── Disabled.vue
│ │ │ │ ├── FormSubmission.vue
│ │ │ │ ├── IndeterminateProgress.vue
│ │ │ │ ├── Links.vue
│ │ │ │ ├── LinksWithGo.vue
│ │ │ │ ├── OtherOptions.vue
│ │ │ │ ├── Round.vue
│ │ │ │ ├── RouterLinkExample.vue
│ │ │ │ ├── Square.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── TruncateLabel.vue
│ │ │ │ └── WithIcons.vue
│ │ │ ├── QBtnDropdown/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomButton.vue
│ │ │ │ ├── CustomDropdownIcon.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── LabelSlot.vue
│ │ │ │ ├── Link.vue
│ │ │ │ ├── Model.vue
│ │ │ │ ├── Split.vue
│ │ │ │ └── VariousContent.vue
│ │ │ ├── QBtnGroup/
│ │ │ │ ├── Group.vue
│ │ │ │ ├── GroupSpread.vue
│ │ │ │ └── WithDropdown.vue
│ │ │ ├── QBtnToggle/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomContent.vue
│ │ │ │ ├── Design.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ └── Spread.vue
│ │ │ ├── QCard/
│ │ │ │ ├── Actions.vue
│ │ │ │ ├── ActionsAlignment.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Expandable.vue
│ │ │ │ ├── HorizontalBasic.vue
│ │ │ │ ├── HorizontalMoreInvolved.vue
│ │ │ │ ├── Media.vue
│ │ │ │ ├── Parallax.vue
│ │ │ │ ├── Table.vue
│ │ │ │ ├── Tabs.vue
│ │ │ │ ├── VariousContent.vue
│ │ │ │ └── Video.vue
│ │ │ ├── QCarousel/
│ │ │ │ ├── AutoPadding.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Captions.vue
│ │ │ │ ├── ControlType.vue
│ │ │ │ ├── Controls.vue
│ │ │ │ ├── CustomNavigation.vue
│ │ │ │ ├── Fullscreen.vue
│ │ │ │ ├── ImageSlides.vue
│ │ │ │ ├── InfiniteAutoplay.vue
│ │ │ │ ├── MultiImageSlides.vue
│ │ │ │ ├── NavigationPosition.vue
│ │ │ │ ├── Thumbnails.vue
│ │ │ │ ├── Transitions.vue
│ │ │ │ ├── Vertical.vue
│ │ │ │ ├── VideoSlides.vue
│ │ │ │ ├── WithScrollareaFull.vue
│ │ │ │ └── WithScrollareaPadding.vue
│ │ │ ├── QChatMessage/
│ │ │ │ ├── Avatar.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Color.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── Name.vue
│ │ │ │ ├── Sanitize.vue
│ │ │ │ ├── Size.vue
│ │ │ │ ├── SlotAvatarStampName.vue
│ │ │ │ ├── SlotDefault.vue
│ │ │ │ └── Stamp.vue
│ │ │ ├── QCheckbox/
│ │ │ │ ├── ArrayAsModel.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── CustomModel.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── InaList.vue
│ │ │ │ ├── IndeterminateState.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── OnDarkBackground.vue
│ │ │ │ ├── OptionGroup.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── StandardSizes.vue
│ │ │ │ ├── ToggleOrder.vue
│ │ │ │ └── WithIcons.vue
│ │ │ ├── QChip/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Clickable.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── LongLabel.vue
│ │ │ │ ├── Outline.vue
│ │ │ │ ├── Removable.vue
│ │ │ │ ├── Selected.vue
│ │ │ │ ├── Sizes.vue
│ │ │ │ └── Square.vue
│ │ │ ├── QCircularProgress/
│ │ │ │ ├── Angle.vue
│ │ │ │ ├── CustomMinMax.vue
│ │ │ │ ├── Determined.vue
│ │ │ │ ├── Indeterminate.vue
│ │ │ │ ├── Reverse.vue
│ │ │ │ ├── RoundedStyle.vue
│ │ │ │ ├── ShowValue.vue
│ │ │ │ └── StandardSizes.vue
│ │ │ ├── QColor/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomDefaultView.vue
│ │ │ │ ├── CustomPalette.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DefaultValue.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── Input.vue
│ │ │ │ ├── LazyModel.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ └── NoHeaderFooter.vue
│ │ │ ├── QDate/
│ │ │ │ ├── AdditionalButtons.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Color.vue
│ │ │ │ ├── CustomLocale.vue
│ │ │ │ ├── CustomTitleSubtitle.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DefaultView.vue
│ │ │ │ ├── DefaultYearMonth.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── EventColor.vue
│ │ │ │ ├── Events.vue
│ │ │ │ ├── FirstDayOfWeek.vue
│ │ │ │ ├── Input.vue
│ │ │ │ ├── InputFull.vue
│ │ │ │ ├── Landscape.vue
│ │ │ │ ├── MaskDateTime.vue
│ │ │ │ ├── MaskEscape.vue
│ │ │ │ ├── MaskSimple.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── NavigationBoundaries.vue
│ │ │ │ ├── Options.vue
│ │ │ │ ├── Persian.vue
│ │ │ │ ├── SelectionMultiple.vue
│ │ │ │ ├── SelectionRange.vue
│ │ │ │ ├── SelectionRangeMultiple.vue
│ │ │ │ ├── Splitter.vue
│ │ │ │ └── TodayBtn.vue
│ │ │ ├── QDialog/
│ │ │ │ ├── BackdropFilter.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Inception.vue
│ │ │ │ ├── Layout.vue
│ │ │ │ ├── Maximized.vue
│ │ │ │ ├── Persistent.vue
│ │ │ │ ├── Positioning.vue
│ │ │ │ ├── Scrollable.vue
│ │ │ │ ├── Seamless.vue
│ │ │ │ ├── Sizing.vue
│ │ │ │ ├── Style.vue
│ │ │ │ └── VariousContent.vue
│ │ │ ├── QDrawer/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── HeaderPicture.vue
│ │ │ │ ├── Menu.vue
│ │ │ │ ├── MenuSeamless.vue
│ │ │ │ ├── MiniClickEvent.vue
│ │ │ │ ├── MiniMouseEvents.vue
│ │ │ │ ├── MiniSlot.vue
│ │ │ │ ├── MiniToOverlay.vue
│ │ │ │ └── OverlayMode.vue
│ │ │ ├── QEditor/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Custom.vue
│ │ │ │ ├── KitchenSink.vue
│ │ │ │ ├── NewBold.vue
│ │ │ │ ├── NewCommands.vue
│ │ │ │ ├── Pasting.vue
│ │ │ │ └── ToolbarSlot.vue
│ │ │ ├── QExpansionItem/
│ │ │ │ ├── Accordion.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── ControlExpansionState.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── HandlingEvents.vue
│ │ │ │ ├── HeaderSlot.vue
│ │ │ │ ├── IconToggle.vue
│ │ │ │ ├── InsetLevels.vue
│ │ │ │ ├── Popup.vue
│ │ │ │ └── SwitchToggleSide.vue
│ │ │ ├── QFab/
│ │ │ │ ├── Draggable.vue
│ │ │ │ ├── Expandable.vue
│ │ │ │ ├── ExternalLabel.vue
│ │ │ │ ├── ExternalLabelStyled.vue
│ │ │ │ ├── ExternalLabelToggling.vue
│ │ │ │ ├── FabSlots.vue
│ │ │ │ ├── HideIcon.vue
│ │ │ │ ├── InternalLabel.vue
│ │ │ │ ├── InternalLabelToggling.vue
│ │ │ │ ├── NonExpandable.vue
│ │ │ │ ├── Padding.vue
│ │ │ │ ├── PageSticky.vue
│ │ │ │ ├── SquareStyle.vue
│ │ │ │ └── VerticalActionsAlignment.vue
│ │ │ ├── QField/
│ │ │ │ ├── Borderless.vue
│ │ │ │ ├── Clearable.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── ControlTypes.vue
│ │ │ │ ├── CustomLabel.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DesignFilled.vue
│ │ │ │ ├── DesignOutlined.vue
│ │ │ │ ├── DesignOverview.vue
│ │ │ │ ├── DesignStandard.vue
│ │ │ │ ├── DesignStandout.vue
│ │ │ │ ├── LoadingState.vue
│ │ │ │ ├── PrefixSuffix.vue
│ │ │ │ ├── Rounded.vue
│ │ │ │ ├── SquareBorders.vue
│ │ │ │ ├── StandoutToolbar.vue
│ │ │ │ ├── ValidationAsync.vue
│ │ │ │ ├── ValidationExternal.vue
│ │ │ │ ├── ValidationLazy.vue
│ │ │ │ ├── ValidationMaxValue.vue
│ │ │ │ ├── ValidationRequired.vue
│ │ │ │ └── ValidationSlots.vue
│ │ │ ├── QFile/
│ │ │ │ ├── AppendingFiles.vue
│ │ │ │ ├── BasicMultiple.vue
│ │ │ │ ├── BasicSingle.vue
│ │ │ │ ├── Clearable.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── CounterBasic.vue
│ │ │ │ ├── CounterLabel.vue
│ │ │ │ ├── Decorators.vue
│ │ │ │ ├── DesignOverview.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── RestrictionBasic.vue
│ │ │ │ ├── RestrictionFilter.vue
│ │ │ │ ├── WithChips.vue
│ │ │ │ └── WithProgress.vue
│ │ │ ├── QForm/
│ │ │ │ └── Basic.vue
│ │ │ ├── QHeader/
│ │ │ │ ├── AppLike.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Breadcrumbs.vue
│ │ │ │ ├── Extended.vue
│ │ │ │ ├── Glossy.vue
│ │ │ │ ├── LookingIOS.vue
│ │ │ │ ├── Reveal.vue
│ │ │ │ └── Tabs.vue
│ │ │ ├── QIcon/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── DynamicSvg.vue
│ │ │ │ └── StandardSizes.vue
│ │ │ ├── QImg/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Caption.vue
│ │ │ │ ├── ContextMenu.vue
│ │ │ │ ├── CustomImageStyle.vue
│ │ │ │ ├── ErrorState.vue
│ │ │ │ ├── FitModes.vue
│ │ │ │ ├── LoadingLazy.vue
│ │ │ │ ├── LoadingState.vue
│ │ │ │ ├── PlaceholderSrc.vue
│ │ │ │ ├── Ratio.vue
│ │ │ │ └── Responsive.vue
│ │ │ ├── QInfiniteScroll/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Container.vue
│ │ │ │ ├── Menu.vue
│ │ │ │ └── Reverse.vue
│ │ │ ├── QInnerLoading/
│ │ │ │ ├── Basic.vue
│ │ │ │ └── LabelProp.vue
│ │ │ ├── QInput/
│ │ │ │ ├── Autogrow.vue
│ │ │ │ ├── Borderless.vue
│ │ │ │ ├── Clearable.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── CustomLabel.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Debouncing.vue
│ │ │ │ ├── DesignFilled.vue
│ │ │ │ ├── DesignOutlined.vue
│ │ │ │ ├── DesignOverview.vue
│ │ │ │ ├── DesignStandard.vue
│ │ │ │ ├── DesignStandout.vue
│ │ │ │ ├── InputTypeFile.vue
│ │ │ │ ├── InputTypeNumber.vue
│ │ │ │ ├── InputTypes.vue
│ │ │ │ ├── LoadingState.vue
│ │ │ │ ├── MaskBasic.vue
│ │ │ │ ├── MaskCustomTokens.vue
│ │ │ │ ├── MaskFill.vue
│ │ │ │ ├── MaskFillReverse.vue
│ │ │ │ ├── MaskUnmaskedModel.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── PrefixSuffix.vue
│ │ │ │ ├── Rounded.vue
│ │ │ │ ├── ShadowText.vue
│ │ │ │ ├── SquareBorders.vue
│ │ │ │ ├── StandoutToolbar.vue
│ │ │ │ ├── Textarea.vue
│ │ │ │ ├── ValidationAsync.vue
│ │ │ │ ├── ValidationExternal.vue
│ │ │ │ ├── ValidationForm.vue
│ │ │ │ ├── ValidationLazy.vue
│ │ │ │ ├── ValidationMaxLength.vue
│ │ │ │ ├── ValidationRequired.vue
│ │ │ │ └── ValidationSlots.vue
│ │ │ ├── QIntersection/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── List.vue
│ │ │ │ ├── Once.vue
│ │ │ │ ├── Root.vue
│ │ │ │ └── Transition.vue
│ │ │ ├── QItem/
│ │ │ │ ├── ActiveState.vue
│ │ │ │ ├── AvatarLeft.vue
│ │ │ │ ├── AvatarRight.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── ExampleContacts.vue
│ │ │ │ ├── ExampleEmails.vue
│ │ │ │ ├── ExampleFolders.vue
│ │ │ │ ├── ExampleMenu.vue
│ │ │ │ ├── ExampleSettings.vue
│ │ │ │ ├── ItemLabel.vue
│ │ │ │ ├── LinksWithGo.vue
│ │ │ │ └── SideSection.vue
│ │ │ ├── QKnob/
│ │ │ │ ├── Angle.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── InnerMinMax.vue
│ │ │ │ ├── MinMax.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── ShowValue.vue
│ │ │ │ └── Step.vue
│ │ │ ├── QLayout/
│ │ │ │ ├── Container.vue
│ │ │ │ └── ContainerDialog.vue
│ │ │ ├── QLinearProgress/
│ │ │ │ ├── Buffering.vue
│ │ │ │ ├── CustomHeight.vue
│ │ │ │ ├── Determinate.vue
│ │ │ │ ├── Indeterminate.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── OnDarkBackground.vue
│ │ │ │ ├── Query.vue
│ │ │ │ ├── Reverse.vue
│ │ │ │ ├── StandardSizes.vue
│ │ │ │ └── Stripe.vue
│ │ │ ├── QMarkupTable/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Customization.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ └── Separators.vue
│ │ │ ├── QMenu/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── ContextMenu.vue
│ │ │ │ ├── MenuInMenu.vue
│ │ │ │ ├── Persistent.vue
│ │ │ │ ├── Positions.vue
│ │ │ │ ├── Sizing.vue
│ │ │ │ ├── Style.vue
│ │ │ │ ├── Target.vue
│ │ │ │ ├── Transitions.vue
│ │ │ │ ├── VModel.vue
│ │ │ │ └── VariousContent.vue
│ │ │ ├── QOptionGroup/
│ │ │ │ ├── Checkbox.vue
│ │ │ │ ├── CustomOptionProps.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DenseInline.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── DisableCertainOptions.vue
│ │ │ │ ├── Inline.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── LabelSlots.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ └── Toggle.vue
│ │ │ ├── QPage/
│ │ │ │ └── Basic.vue
│ │ │ ├── QPageScroller/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Expanded.vue
│ │ │ │ └── Reverse.vue
│ │ │ ├── QPageSticky/
│ │ │ │ ├── Basic.vue
│ │ │ │ └── Expanded.vue
│ │ │ ├── QPagination/
│ │ │ │ ├── BoundaryLinks.vue
│ │ │ │ ├── BoundaryNumbers.vue
│ │ │ │ ├── BtnDesign.vue
│ │ │ │ ├── BtnGutter.vue
│ │ │ │ ├── DirectionLinks.vue
│ │ │ │ ├── Ellipses.vue
│ │ │ │ ├── Icons.vue
│ │ │ │ ├── Input.vue
│ │ │ │ ├── InputColor.vue
│ │ │ │ ├── MaxPages.vue
│ │ │ │ └── Standard.vue
│ │ │ ├── QParallax/
│ │ │ │ ├── Image.vue
│ │ │ │ ├── ScopedSlot.vue
│ │ │ │ ├── Speed.vue
│ │ │ │ └── Video.vue
│ │ │ ├── QPopupEdit/
│ │ │ │ ├── Customizing.vue
│ │ │ │ ├── DefaultSlotParameters.vue
│ │ │ │ ├── PopupWithEditor.vue
│ │ │ │ ├── Standalone.vue
│ │ │ │ ├── TextArea.vue
│ │ │ │ ├── WithButtons.vue
│ │ │ │ ├── WithTable.vue
│ │ │ │ └── WithValidation.vue
│ │ │ ├── QPopupProxy/
│ │ │ │ ├── Breakpoint.vue
│ │ │ │ ├── ContextMenu.vue
│ │ │ │ ├── Passthrough.vue
│ │ │ │ └── Standard.vue
│ │ │ ├── QPullToRefresh/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomColoring.vue
│ │ │ │ └── Icon.vue
│ │ │ ├── QRadio/
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── InaList.vue
│ │ │ │ ├── KeepColor.vue
│ │ │ │ ├── LabelPosition.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── OnDarkBackground.vue
│ │ │ │ ├── OptionGroup.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── StandardSizes.vue
│ │ │ │ └── WithIcons.vue
│ │ │ ├── QRange/
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── Drag.vue
│ │ │ │ ├── DragOnly.vue
│ │ │ │ ├── DragSnap.vue
│ │ │ │ ├── FloatingPoint.vue
│ │ │ │ ├── InnerMinMax.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── LabelAlways.vue
│ │ │ │ ├── LabelLong.vue
│ │ │ │ ├── LabelValue.vue
│ │ │ │ ├── Lazy.vue
│ │ │ │ ├── List.vue
│ │ │ │ ├── MarkerLabelSlots.vue
│ │ │ │ ├── MarkerLabels.vue
│ │ │ │ ├── Markers.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── NoSelection.vue
│ │ │ │ ├── Null.vue
│ │ │ │ ├── RangeColoring.vue
│ │ │ │ ├── RangeSizes.vue
│ │ │ │ ├── Readonly.vue
│ │ │ │ ├── Reverse.vue
│ │ │ │ ├── Snap.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── Step.vue
│ │ │ │ ├── TrackImages.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QRating/
│ │ │ │ ├── ArrayIcon.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Colors.vue
│ │ │ │ ├── HalfSelected.vue
│ │ │ │ ├── Images.vue
│ │ │ │ ├── Max.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── NoDimming.vue
│ │ │ │ ├── ReadonlyDisable.vue
│ │ │ │ ├── SelectedIcon.vue
│ │ │ │ ├── SlotTip.vue
│ │ │ │ └── StandardSizes.vue
│ │ │ ├── QResizeObserver/
│ │ │ │ └── Basic.vue
│ │ │ ├── QResponsive/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Card.vue
│ │ │ │ ├── CardSection.vue
│ │ │ │ ├── Carousel.vue
│ │ │ │ ├── FlexRow.vue
│ │ │ │ ├── MaxHeight.vue
│ │ │ │ └── Table.vue
│ │ │ ├── QScrollArea/
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Delay.vue
│ │ │ │ ├── Horizontal.vue
│ │ │ │ ├── ScrollPosition.vue
│ │ │ │ ├── ScrollbarVisibility.vue
│ │ │ │ ├── Styled.vue
│ │ │ │ ├── StyledBar.vue
│ │ │ │ ├── Synchronized.vue
│ │ │ │ ├── VertHoriz.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QScrollObserver/
│ │ │ │ └── Basic.vue
│ │ │ ├── QSelect/
│ │ │ │ ├── BasicFiltering.vue
│ │ │ │ ├── BehaviorDialog.vue
│ │ │ │ ├── BehaviorMenu.vue
│ │ │ │ ├── Clearable.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── CreateListener.vue
│ │ │ │ ├── CreateListenerUnique.vue
│ │ │ │ ├── CreateNewValueMode.vue
│ │ │ │ ├── Decorators.vue
│ │ │ │ ├── DesignOverview.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── DisableTabSelection.vue
│ │ │ │ ├── DisplayChips.vue
│ │ │ │ ├── DisplayCustomValue.vue
│ │ │ │ ├── DisplaySelectedItemSlot.vue
│ │ │ │ ├── FilteringAddMultiple.vue
│ │ │ │ ├── FilteringAddsToMenu.vue
│ │ │ │ ├── FilteringNoAddToMenu.vue
│ │ │ │ ├── HtmlDisplayValue.vue
│ │ │ │ ├── HtmlOptions.vue
│ │ │ │ ├── InputFilterAfter.vue
│ │ │ │ ├── InputFilterLazy.vue
│ │ │ │ ├── InputFilterMin.vue
│ │ │ │ ├── InputFilterOptions.vue
│ │ │ │ ├── MenuTransitions.vue
│ │ │ │ ├── ModelMultipleCounter.vue
│ │ │ │ ├── ModelSingleMultiple.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── OptionCover.vue
│ │ │ │ ├── OptionCustomProps.vue
│ │ │ │ ├── OptionEmitValue.vue
│ │ │ │ ├── OptionLazyLoad.vue
│ │ │ │ ├── OptionMapOptions.vue
│ │ │ │ ├── OptionNoneSlot.vue
│ │ │ │ ├── OptionObject.vue
│ │ │ │ ├── OptionQToggle.vue
│ │ │ │ ├── OptionSlot.vue
│ │ │ │ ├── OptionString.vue
│ │ │ │ ├── OptionsDynamic.vue
│ │ │ │ ├── RenderPerf.vue
│ │ │ │ └── TextAutocomplete.vue
│ │ │ ├── QSeparator/
│ │ │ │ ├── Colored.vue
│ │ │ │ ├── Horizontal.vue
│ │ │ │ ├── HorizontalWithInset.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QSkeleton/
│ │ │ │ ├── Animations.vue
│ │ │ │ ├── Card.vue
│ │ │ │ ├── RecipeFacebook.vue
│ │ │ │ ├── RecipeList.vue
│ │ │ │ ├── RecipeTable.vue
│ │ │ │ ├── RecipeTwitch.vue
│ │ │ │ ├── RecipeTwitter.vue
│ │ │ │ ├── RecipeYoutube.vue
│ │ │ │ ├── Sizing.vue
│ │ │ │ ├── StylingBordered.vue
│ │ │ │ ├── StylingColor.vue
│ │ │ │ ├── StylingCustomBorder.vue
│ │ │ │ ├── StylingSquare.vue
│ │ │ │ └── Types.vue
│ │ │ ├── QSlideItem/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomColors.vue
│ │ │ │ ├── CustomizeSlide.vue
│ │ │ │ ├── OneSided.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QSlideTransition/
│ │ │ │ └── Basic.vue
│ │ │ ├── QSlider/
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── FloatingPoint.vue
│ │ │ │ ├── InnerMinMax.vue
│ │ │ │ ├── Label.vue
│ │ │ │ ├── LabelAlways.vue
│ │ │ │ ├── LabelLong.vue
│ │ │ │ ├── LabelValue.vue
│ │ │ │ ├── Lazy.vue
│ │ │ │ ├── List.vue
│ │ │ │ ├── MarkerLabelSlots.vue
│ │ │ │ ├── MarkerLabels.vue
│ │ │ │ ├── Markers.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── NoSelection.vue
│ │ │ │ ├── Null.vue
│ │ │ │ ├── Readonly.vue
│ │ │ │ ├── Reverse.vue
│ │ │ │ ├── SliderColoring.vue
│ │ │ │ ├── SliderSizes.vue
│ │ │ │ ├── Snap.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── Step.vue
│ │ │ │ ├── TrackImages.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QSpace/
│ │ │ │ └── Basic.vue
│ │ │ ├── QSpinner/
│ │ │ │ ├── Color.vue
│ │ │ │ ├── Default.vue
│ │ │ │ ├── Others.vue
│ │ │ │ ├── Size.vue
│ │ │ │ └── StandardSizes.vue
│ │ │ ├── QSplitter/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomizedSeparator.vue
│ │ │ │ ├── Embedded.vue
│ │ │ │ ├── Horizontal.vue
│ │ │ │ ├── ImageFun.vue
│ │ │ │ ├── Limits.vue
│ │ │ │ ├── PixelModel.vue
│ │ │ │ ├── ReactiveImages.vue
│ │ │ │ ├── ReverseModel.vue
│ │ │ │ └── SeparatorSlot.vue
│ │ │ ├── QStepper/
│ │ │ │ ├── AlternativeLabels.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── Contracted.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── HeaderClass.vue
│ │ │ │ ├── LinearNavigation.vue
│ │ │ │ ├── MessageSlot.vue
│ │ │ │ ├── NonLinearNavigation.vue
│ │ │ │ ├── Prefix.vue
│ │ │ │ ├── StepError.vue
│ │ │ │ ├── TypeHorizontal.vue
│ │ │ │ └── TypeVertical.vue
│ │ │ ├── QTabPanels/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── Swipeable.vue
│ │ │ │ ├── TabsAndSplitter.vue
│ │ │ │ ├── Transition.vue
│ │ │ │ ├── VerticalSwipeable.vue
│ │ │ │ ├── WithNestedQTabs.vue
│ │ │ │ └── WithQTabs.vue
│ │ │ ├── QTable/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── BeforeAfterHeaderFooter.vue
│ │ │ │ ├── CustomColor.vue
│ │ │ │ ├── CustomColumn.vue
│ │ │ │ ├── CustomLoading.vue
│ │ │ │ ├── CustomSelection.vue
│ │ │ │ ├── CustomSorting.vue
│ │ │ │ ├── CustomTop.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── ExpandedRowExternal.vue
│ │ │ │ ├── ExpandedRowInternal.vue
│ │ │ │ ├── ExportCsv.vue
│ │ │ │ ├── GridHeader.vue
│ │ │ │ ├── GridMasonry.vue
│ │ │ │ ├── GridStyle.vue
│ │ │ │ ├── GridStyleColored.vue
│ │ │ │ ├── GridStyleSlot.vue
│ │ │ │ ├── HideBottom.vue
│ │ │ │ ├── InferColumns.vue
│ │ │ │ ├── InputEditing.vue
│ │ │ │ ├── KeyboardNavigation.vue
│ │ │ │ ├── Loading.vue
│ │ │ │ ├── MultipleSelection.vue
│ │ │ │ ├── NoData.vue
│ │ │ │ ├── NoDataSlot.vue
│ │ │ │ ├── NoHeaderFooter.vue
│ │ │ │ ├── PaginationInitial.vue
│ │ │ │ ├── PaginationSlot.vue
│ │ │ │ ├── PaginationSync.vue
│ │ │ │ ├── PopupEditing.vue
│ │ │ │ ├── ResponsiveDense.vue
│ │ │ │ ├── ResponsiveGrid.vue
│ │ │ │ ├── SelectionSlots.vue
│ │ │ │ ├── SelectionSlotsRange.vue
│ │ │ │ ├── Separators.vue
│ │ │ │ ├── SingleSelection.vue
│ │ │ │ ├── SlotBody.vue
│ │ │ │ ├── SlotBodyCell.vue
│ │ │ │ ├── SlotBodyCellName.vue
│ │ │ │ ├── SlotHeader.vue
│ │ │ │ ├── SlotHeaderCell.vue
│ │ │ │ ├── SlotHeaderCellName.vue
│ │ │ │ ├── StickyColumn.vue
│ │ │ │ ├── StickyHeader.vue
│ │ │ │ ├── StickyHeaderAndColumn.vue
│ │ │ │ ├── StickyHeaderAndLastColumn.vue
│ │ │ │ ├── StickyLastColumn.vue
│ │ │ │ ├── Synchronizing.vue
│ │ │ │ ├── VirtscrollBasic.vue
│ │ │ │ ├── VirtscrollDynamic.vue
│ │ │ │ ├── VirtscrollExpandedRow.vue
│ │ │ │ ├── VirtscrollMultipleRows.vue
│ │ │ │ ├── VirtscrollPagination.vue
│ │ │ │ ├── VirtscrollSticky.vue
│ │ │ │ ├── VisibleColumns.vue
│ │ │ │ └── VisibleColumns2.vue
│ │ │ ├── QTabs/
│ │ │ │ ├── Alignment.vue
│ │ │ │ ├── ArrowsModifiers.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomIndicator.vue
│ │ │ │ ├── Dense.vue
│ │ │ │ ├── Dropdown.vue
│ │ │ │ ├── DynamicTabs.vue
│ │ │ │ ├── IndividualColor.vue
│ │ │ │ ├── Notifying.vue
│ │ │ │ ├── Ripples.vue
│ │ │ │ ├── TabsInToolbar.vue
│ │ │ │ ├── TabsWithTabpanels.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── QTime/
│ │ │ │ ├── AdditionalButtons.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Color.vue
│ │ │ │ ├── CustomLocale.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DisableReadonly.vue
│ │ │ │ ├── Format24h.vue
│ │ │ │ ├── Input.vue
│ │ │ │ ├── InputFull.vue
│ │ │ │ ├── Landscape.vue
│ │ │ │ ├── MaskDateTime.vue
│ │ │ │ ├── MaskEscape.vue
│ │ │ │ ├── MaskSimple.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── NowBtn.vue
│ │ │ │ └── Options.vue
│ │ │ ├── QTimeline/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── Layouts.vue
│ │ │ │ ├── PropsOnly.vue
│ │ │ │ ├── Responsive.vue
│ │ │ │ └── SlotsOnly.vue
│ │ │ ├── QToggle/
│ │ │ │ ├── ArrayValue.vue
│ │ │ │ ├── CustomValues.vue
│ │ │ │ ├── DarkBackground.vue
│ │ │ │ ├── Disabled.vue
│ │ │ │ ├── Icons.vue
│ │ │ │ ├── IndeterminateState.vue
│ │ │ │ ├── KeepColor.vue
│ │ │ │ ├── Labels.vue
│ │ │ │ ├── List.vue
│ │ │ │ ├── NativeForm.vue
│ │ │ │ ├── OptionGroup.vue
│ │ │ │ ├── Standard.vue
│ │ │ │ ├── StandardSizes.vue
│ │ │ │ └── ToggleOrder.vue
│ │ │ ├── QToolbar/
│ │ │ │ ├── Avatar.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Glossy.vue
│ │ │ │ ├── GroupedHorizontally.vue
│ │ │ │ ├── GroupedVertically.vue
│ │ │ │ ├── WithBtnToggle.vue
│ │ │ │ ├── WithDropdown.vue
│ │ │ │ └── WithTabs.vue
│ │ │ ├── QTooltip/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Coloring.vue
│ │ │ │ ├── CustomTransition.vue
│ │ │ │ ├── Offset.vue
│ │ │ │ ├── OneSecond.vue
│ │ │ │ ├── Target.vue
│ │ │ │ └── VModel.vue
│ │ │ ├── QTree/
│ │ │ │ ├── Accordion.vue
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── DenseTree.vue
│ │ │ │ ├── FilterCustom.vue
│ │ │ │ ├── FilterDefault.vue
│ │ │ │ ├── LazyLoad.vue
│ │ │ │ ├── NoConnectors.vue
│ │ │ │ ├── Selectable.vue
│ │ │ │ ├── SlotsCustomized.vue
│ │ │ │ ├── SlotsDefault.vue
│ │ │ │ ├── Splitter.vue
│ │ │ │ ├── Sync.vue
│ │ │ │ └── TickStrategy.vue
│ │ │ ├── QUploader/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Dark.vue
│ │ │ │ ├── FactoryImmediate.vue
│ │ │ │ ├── FactoryPromise.vue
│ │ │ │ ├── Headers.vue
│ │ │ │ ├── Multiple.vue
│ │ │ │ ├── RestrictionBasic.vue
│ │ │ │ ├── RestrictionFilter.vue
│ │ │ │ ├── SlotHeader.vue
│ │ │ │ ├── SlotList.vue
│ │ │ │ ├── UploadAuto.vue
│ │ │ │ └── UploadURL.vue
│ │ │ ├── QVideo/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── HtmlMarkup.vue
│ │ │ │ └── Ratio.vue
│ │ │ ├── QVirtualScroll/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── BasicHorizontal.vue
│ │ │ │ ├── GenerateItems.vue
│ │ │ │ ├── ScrollArea.vue
│ │ │ │ ├── ScrollTargetId.vue
│ │ │ │ ├── ScrollTargetRef.vue
│ │ │ │ ├── ScrollTo.vue
│ │ │ │ ├── TableBasic.vue
│ │ │ │ ├── TableBasicHeader.vue
│ │ │ │ ├── TableSticky.vue
│ │ │ │ ├── TableSticky2.vue
│ │ │ │ ├── VariousContent.vue
│ │ │ │ ├── VariousContentHorizontal.vue
│ │ │ │ ├── VirtscrollExpandedRow.vue
│ │ │ │ └── VirtscrollMultipleRows.vue
│ │ │ ├── Ripple/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Colored.vue
│ │ │ │ ├── Disable.vue
│ │ │ │ ├── Early.vue
│ │ │ │ └── Positioning.vue
│ │ │ ├── ScrollFire/
│ │ │ │ └── Basic.vue
│ │ │ ├── TouchHold/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── CustomSensitivity.vue
│ │ │ │ └── CustomTimer.vue
│ │ │ ├── TouchPan/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Custom.vue
│ │ │ │ ├── Draggable.vue
│ │ │ │ ├── Horizontal.vue
│ │ │ │ └── Vertical.vue
│ │ │ ├── TouchRepeat/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Buttons.vue
│ │ │ │ └── Keys.vue
│ │ │ ├── TouchSwipe/
│ │ │ │ ├── Basic.vue
│ │ │ │ ├── Right.vue
│ │ │ │ └── UpOrLeft.vue
│ │ │ ├── frameless-electron-window/
│ │ │ │ └── StatusBar.vue
│ │ │ ├── grid/
│ │ │ │ ├── BreakColumn.vue
│ │ │ │ ├── BreakRow.vue
│ │ │ │ ├── ChildrenSizeCompare.vue
│ │ │ │ ├── ChildrenStyling.vue
│ │ │ │ ├── ColGutterHorizontal.vue
│ │ │ │ ├── ColGutterMixed.vue
│ │ │ │ ├── ColGutterSize.vue
│ │ │ │ ├── ColGutterVertical.vue
│ │ │ │ ├── ColumnAllBreakpoints.vue
│ │ │ │ ├── ColumnEqualWidth.vue
│ │ │ │ ├── ColumnFlexOrder.vue
│ │ │ │ ├── ColumnHorizontalAlignment.vue
│ │ │ │ ├── ColumnMixAndMatch.vue
│ │ │ │ ├── ColumnNesting.vue
│ │ │ │ ├── ColumnReverse.vue
│ │ │ │ ├── ColumnRowWidth.vue
│ │ │ │ ├── ColumnRowWrapping.vue
│ │ │ │ ├── ColumnVariableWidth.vue
│ │ │ │ ├── ColumnVerticalAlignment.vue
│ │ │ │ ├── GutterHorizontal.vue
│ │ │ │ ├── GutterMixed.vue
│ │ │ │ ├── GutterSize.vue
│ │ │ │ ├── GutterVertical.vue
│ │ │ │ ├── Masonry.vue
│ │ │ │ ├── MasonryTableGrid.vue
│ │ │ │ ├── ParentStyling.vue
│ │ │ │ ├── RowAllBreakpoints.vue
│ │ │ │ ├── RowColumnWidth.vue
│ │ │ │ ├── RowColumnWrapping.vue
│ │ │ │ ├── RowEqualWidth.vue
│ │ │ │ ├── RowFlexOrder.vue
│ │ │ │ ├── RowHorizontalAlignment.vue
│ │ │ │ ├── RowMixAndMatch.vue
│ │ │ │ ├── RowNesting.vue
│ │ │ │ ├── RowOffsettingColumns.vue
│ │ │ │ ├── RowReverse.vue
│ │ │ │ ├── RowStackedToHorizontal.vue
│ │ │ │ ├── RowVariableWidth.vue
│ │ │ │ └── RowVerticalAlignment.vue
│ │ │ └── shadows/
│ │ │ ├── Inset.vue
│ │ │ ├── PointingUp.vue
│ │ │ └── Standard.vue
│ │ ├── layouts/
│ │ │ ├── builder/
│ │ │ │ └── LayoutBuilder.vue
│ │ │ ├── doc-layout/
│ │ │ │ ├── DocDrawerMenu.vue
│ │ │ │ ├── DocDrawerToc.vue
│ │ │ │ ├── DocHeader.vue
│ │ │ │ ├── DocHeaderIconLinks.vue
│ │ │ │ ├── DocHeaderMenu.js
│ │ │ │ ├── DocHeaderTextLinks.vue
│ │ │ │ ├── DocLayout.vue
│ │ │ │ ├── DocPage.vue
│ │ │ │ ├── DocPageFooter.vue
│ │ │ │ ├── DocPageMenu.js
│ │ │ │ ├── DocPageMenu.sass
│ │ │ │ ├── DocPageToc.vue
│ │ │ │ ├── DocSearch.vue
│ │ │ │ ├── search/
│ │ │ │ │ ├── ResultEmpty.vue
│ │ │ │ │ ├── ResultEntry.vue
│ │ │ │ │ ├── ResultError.vue
│ │ │ │ │ └── SearchResults.vue
│ │ │ │ └── store/
│ │ │ │ ├── index.js
│ │ │ │ ├── inject-scroll.js
│ │ │ │ └── inject-toc.js
│ │ │ └── gallery/
│ │ │ ├── LayoutGalleryPage.vue
│ │ │ ├── github.vue
│ │ │ ├── google-news.vue
│ │ │ ├── google-photos.vue
│ │ │ ├── google-play.vue
│ │ │ ├── listing.js
│ │ │ ├── quasar-classic-dark.vue
│ │ │ ├── quasar-classic.vue
│ │ │ ├── whatsapp.vue
│ │ │ └── youtube.vue
│ │ ├── pages/
│ │ │ ├── Page404.vue
│ │ │ ├── __elements.md
│ │ │ ├── api-explorer/
│ │ │ │ ├── DocApiExplorer.vue
│ │ │ │ └── api-explorer.md
│ │ │ ├── app-extensions/
│ │ │ │ ├── development-guide/
│ │ │ │ │ ├── index-api.md
│ │ │ │ │ ├── install-api.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── prompts-api.md
│ │ │ │ │ └── uninstall-api.md
│ │ │ │ ├── discover.md
│ │ │ │ ├── introduction.md
│ │ │ │ └── tips-and-tricks/
│ │ │ │ ├── chain-webpack.md
│ │ │ │ ├── inject-quasar-plugin.md
│ │ │ │ ├── introduction.md
│ │ │ │ ├── json-api.md
│ │ │ │ ├── provide-a-directive.md
│ │ │ │ ├── provide-a-ui-component.md
│ │ │ │ └── starter-kit-equivalent.md
│ │ │ ├── components/
│ │ │ │ ├── ComponentsListing.vue
│ │ │ │ └── components.md
│ │ │ ├── docs/
│ │ │ │ ├── DocsHomepage.vue
│ │ │ │ └── docs.md
│ │ │ ├── how-to-contribute/
│ │ │ │ ├── commit-conventions.md
│ │ │ │ ├── contribution-guide.md
│ │ │ │ ├── new-project.md
│ │ │ │ ├── project-maintainer.md
│ │ │ │ └── running-projects.md
│ │ │ ├── icongenie/
│ │ │ │ ├── app-icons-list.md
│ │ │ │ ├── command-list.md
│ │ │ │ ├── installation.md
│ │ │ │ ├── introduction.md
│ │ │ │ └── profile-files.md
│ │ │ ├── integrations/
│ │ │ │ ├── QuasarIntegrations.vue
│ │ │ │ └── integrations.md
│ │ │ ├── introduction-to-quasar/
│ │ │ │ ├── IntroductionVideo.vue
│ │ │ │ └── introduction-to-quasar.md
│ │ │ ├── landing/
│ │ │ │ ├── PageLanding.vue
│ │ │ │ ├── SponsorList.vue
│ │ │ │ ├── TwitterCards.vue
│ │ │ │ └── WhyQuasarCard.vue
│ │ │ ├── layout/
│ │ │ │ ├── drawer.md
│ │ │ │ ├── gallery/
│ │ │ │ │ ├── LayoutGallery.vue
│ │ │ │ │ └── gallery.md
│ │ │ │ ├── grid/
│ │ │ │ │ ├── column.md
│ │ │ │ │ ├── flex-playground/
│ │ │ │ │ │ ├── FlexChild.vue
│ │ │ │ │ │ ├── FlexPlaygroundDemo.vue
│ │ │ │ │ │ └── flex-playground.md
│ │ │ │ │ ├── flexbox-patterns.md
│ │ │ │ │ ├── gutter.md
│ │ │ │ │ ├── introduction-to-flexbox.md
│ │ │ │ │ └── row.md
│ │ │ │ ├── header-and-footer.md
│ │ │ │ ├── layout/
│ │ │ │ │ ├── ViewPlay.vue
│ │ │ │ │ ├── ViewProp.vue
│ │ │ │ │ └── layout.md
│ │ │ │ ├── page-scroller.md
│ │ │ │ ├── page-sticky.md
│ │ │ │ ├── page.md
│ │ │ │ └── routing-with-layouts-and-pages.md
│ │ │ ├── listing.js
│ │ │ ├── meet-the-team/
│ │ │ │ ├── TeamMember.vue
│ │ │ │ └── meet-the-team.md
│ │ │ ├── options/
│ │ │ │ ├── animations.md
│ │ │ │ ├── app-icons.md
│ │ │ │ ├── app-internationalization.md
│ │ │ │ ├── global-node.md
│ │ │ │ ├── installing-icon-libraries.md
│ │ │ │ ├── platform-detection.md
│ │ │ │ ├── quasar-icon-sets.md
│ │ │ │ ├── quasar-language-packs.md
│ │ │ │ ├── rtl-support.md
│ │ │ │ ├── screen-plugin.md
│ │ │ │ ├── seo.md
│ │ │ │ ├── the-q-object.md
│ │ │ │ └── transitions/
│ │ │ │ ├── TransitionList.vue
│ │ │ │ └── transitions.md
│ │ │ ├── quasar-cli-vite/
│ │ │ │ ├── ajax-requests.md
│ │ │ │ ├── api-proxying.md
│ │ │ │ ├── boot-files.md
│ │ │ │ ├── browser-compatibility.md
│ │ │ │ ├── commands-list.md
│ │ │ │ ├── convert-to-quasar-cli-with-vite.md
│ │ │ │ ├── css-preprocessors.md
│ │ │ │ ├── developing-browser-extensions/
│ │ │ │ │ ├── app-icons-browser-extension.md
│ │ │ │ │ ├── background-script.md
│ │ │ │ │ ├── bex-bridge.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-bex.md
│ │ │ │ │ ├── content-scripts.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── types-of-bex.md
│ │ │ │ ├── developing-capacitor-apps/
│ │ │ │ │ ├── app-icons-capacitor.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── capacitor-api.md
│ │ │ │ │ ├── capacitor-version-support.md
│ │ │ │ │ ├── configuring-capacitor.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── live-updates.md
│ │ │ │ │ ├── managing-google-analytics.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── publishing-to-store.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-cordova-apps/
│ │ │ │ │ ├── app-icons-cordova.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-cordova.md
│ │ │ │ │ ├── cordova-plugins.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── managing-google-analytics.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── publishing-to-store.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-electron-apps/
│ │ │ │ │ ├── app-icons-electron.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-electron.md
│ │ │ │ │ ├── electron-accessing-files.md
│ │ │ │ │ ├── electron-packages.md
│ │ │ │ │ ├── electron-preload-script.md
│ │ │ │ │ ├── electron-security-concerns.md
│ │ │ │ │ ├── electron-upgrade-guide.md
│ │ │ │ │ ├── electron-with-typescript.md
│ │ │ │ │ ├── frameless-electron-window.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-mobile-apps.md
│ │ │ │ ├── developing-pwa/
│ │ │ │ │ ├── app-icons-pwa.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-pwa.md
│ │ │ │ │ ├── handling-service-worker.md
│ │ │ │ │ ├── hmr-for-dev.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── pwa-with-typescript.md
│ │ │ │ ├── developing-spa/
│ │ │ │ │ ├── app-icons-spa.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── deploying.md
│ │ │ │ │ └── introduction.md
│ │ │ │ ├── developing-ssr/
│ │ │ │ │ ├── app-icons-ssr.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── client-side-hydration.md
│ │ │ │ │ ├── configuring-ssr.md
│ │ │ │ │ ├── deploying.md
│ │ │ │ │ ├── handling-404-and-500-errors.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── seo-for-ssr.md
│ │ │ │ │ ├── ssr-context.md
│ │ │ │ │ ├── ssr-frequently-asked-questions.md
│ │ │ │ │ ├── ssr-middleware.md
│ │ │ │ │ ├── ssr-webserver.md
│ │ │ │ │ ├── ssr-with-pwa.md
│ │ │ │ │ ├── ssr-with-typescript.md
│ │ │ │ │ ├── vue-ssr-directives.md
│ │ │ │ │ └── writing-universal-code.md
│ │ │ │ ├── directory-structure.md
│ │ │ │ ├── handling-assets.md
│ │ │ │ ├── handling-process-env.md
│ │ │ │ ├── handling-vite.md
│ │ │ │ ├── lazy-loading.md
│ │ │ │ ├── linter.md
│ │ │ │ ├── opening-dev-server-to-public.md
│ │ │ │ ├── prefetch-feature.md
│ │ │ │ ├── quasar-config-file.md
│ │ │ │ ├── routing.md
│ │ │ │ ├── state-management-with-pinia.md
│ │ │ │ ├── supporting-ts.md
│ │ │ │ ├── testing-and-auditing.md
│ │ │ │ └── upgrade-guide.md
│ │ │ ├── quasar-cli-webpack/
│ │ │ │ ├── ajax-requests.md
│ │ │ │ ├── api-proxying.md
│ │ │ │ ├── boot-files.md
│ │ │ │ ├── browser-compatibility.md
│ │ │ │ ├── commands-list.md
│ │ │ │ ├── convert-to-quasar-cli-with-webpack.md
│ │ │ │ ├── css-preprocessors.md
│ │ │ │ ├── developing-browser-extensions/
│ │ │ │ │ ├── app-icons-browser-extension.md
│ │ │ │ │ ├── background-script.md
│ │ │ │ │ ├── bex-bridge.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-bex.md
│ │ │ │ │ ├── content-scripts.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── types-of-bex.md
│ │ │ │ ├── developing-capacitor-apps/
│ │ │ │ │ ├── app-icons-capacitor.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── capacitor-api.md
│ │ │ │ │ ├── capacitor-version-support.md
│ │ │ │ │ ├── configuring-capacitor.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── live-updates.md
│ │ │ │ │ ├── managing-google-analytics.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── publishing-to-store.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-cordova-apps/
│ │ │ │ │ ├── app-icons-cordova.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-cordova.md
│ │ │ │ │ ├── cordova-plugins.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── managing-google-analytics.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── publishing-to-store.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-electron-apps/
│ │ │ │ │ ├── app-icons-electron.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-electron.md
│ │ │ │ │ ├── electron-accessing-files.md
│ │ │ │ │ ├── electron-packages.md
│ │ │ │ │ ├── electron-preload-script.md
│ │ │ │ │ ├── electron-security-concerns.md
│ │ │ │ │ ├── electron-upgrade-guide.md
│ │ │ │ │ ├── electron-with-typescript.md
│ │ │ │ │ ├── frameless-electron-window.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── troubleshooting-and-tips.md
│ │ │ │ ├── developing-mobile-apps.md
│ │ │ │ ├── developing-pwa/
│ │ │ │ │ ├── app-icons-pwa.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── configuring-pwa.md
│ │ │ │ │ ├── handling-service-worker.md
│ │ │ │ │ ├── hmr-for-dev.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ └── pwa-with-typescript.md
│ │ │ │ ├── developing-spa/
│ │ │ │ │ ├── app-icons-spa.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── deploying.md
│ │ │ │ │ └── introduction.md
│ │ │ │ ├── developing-ssr/
│ │ │ │ │ ├── app-icons-ssr.md
│ │ │ │ │ ├── build-commands.md
│ │ │ │ │ ├── client-side-hydration.md
│ │ │ │ │ ├── configuring-ssr.md
│ │ │ │ │ ├── deploying.md
│ │ │ │ │ ├── handling-404-and-500-errors.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── preparation.md
│ │ │ │ │ ├── seo-for-ssr.md
│ │ │ │ │ ├── ssr-context.md
│ │ │ │ │ ├── ssr-frequently-asked-questions.md
│ │ │ │ │ ├── ssr-middleware.md
│ │ │ │ │ ├── ssr-webserver.md
│ │ │ │ │ ├── ssr-with-pwa.md
│ │ │ │ │ ├── ssr-with-typescript.md
│ │ │ │ │ ├── vue-ssr-directives.md
│ │ │ │ │ └── writing-universal-code.md
│ │ │ │ ├── directory-structure.md
│ │ │ │ ├── handling-assets.md
│ │ │ │ ├── handling-process-env.md
│ │ │ │ ├── handling-webpack.md
│ │ │ │ ├── lazy-loading.md
│ │ │ │ ├── linter.md
│ │ │ │ ├── opening-dev-server-to-public.md
│ │ │ │ ├── prefetch-feature.md
│ │ │ │ ├── quasar-config-file.md
│ │ │ │ ├── routing.md
│ │ │ │ ├── state-management-with-pinia.md
│ │ │ │ ├── supporting-ts.md
│ │ │ │ ├── testing-and-auditing.md
│ │ │ │ └── upgrade-guide.md
│ │ │ ├── quasar-plugins/
│ │ │ │ ├── addressbar-color.md
│ │ │ │ ├── app-fullscreen.md
│ │ │ │ ├── app-visibility.md
│ │ │ │ ├── bottom-sheet.md
│ │ │ │ ├── cookies.md
│ │ │ │ ├── dark.md
│ │ │ │ ├── dialog.md
│ │ │ │ ├── loading-bar.md
│ │ │ │ ├── loading.md
│ │ │ │ ├── meta.md
│ │ │ │ ├── notify.md
│ │ │ │ └── web-storage.md
│ │ │ ├── quasar-utils/
│ │ │ │ ├── color-utils.md
│ │ │ │ ├── date-utils.md
│ │ │ │ ├── dom-utils.md
│ │ │ │ ├── event-bus-util.md
│ │ │ │ ├── formatter-utils.md
│ │ │ │ ├── morph-utils.md
│ │ │ │ ├── other-utils.md
│ │ │ │ ├── scrolling-utils.md
│ │ │ │ └── type-checking-utils.md
│ │ │ ├── security/
│ │ │ │ ├── dos-and-donts.md
│ │ │ │ ├── get-help._md_
│ │ │ │ └── report-a-vulnerability.md
│ │ │ ├── sponsors-and-backers/
│ │ │ │ ├── DonatingButtons.vue
│ │ │ │ ├── SponsorList.vue
│ │ │ │ ├── SponsorTile.vue
│ │ │ │ └── sponsors-and-backers.md
│ │ │ ├── start/
│ │ │ │ ├── how-to-use-vue.md
│ │ │ │ ├── pick-quasar-flavour.md
│ │ │ │ ├── playground.md
│ │ │ │ ├── quasar-cli.md
│ │ │ │ ├── quick-start.md
│ │ │ │ ├── release-notes/
│ │ │ │ │ ├── PackageReleases.vue
│ │ │ │ │ ├── QuasarReleases.vue
│ │ │ │ │ └── release-notes.md
│ │ │ │ ├── umd/
│ │ │ │ │ ├── UmdTags.vue
│ │ │ │ │ └── umd.md
│ │ │ │ ├── upgrade-guide/
│ │ │ │ │ ├── UpgradeVideoLink.vue
│ │ │ │ │ └── upgrade-guide.md
│ │ │ │ ├── vite-plugin/
│ │ │ │ │ ├── VitePluginUsage.vue
│ │ │ │ │ └── vite-plugin.md
│ │ │ │ ├── vs-code-configuration.md
│ │ │ │ └── vue-cli-plugin.md
│ │ │ ├── style/
│ │ │ │ ├── body-classes.md
│ │ │ │ ├── breakpoints.md
│ │ │ │ ├── color-palette/
│ │ │ │ │ ├── BrandColors.vue
│ │ │ │ │ ├── ColorList.vue
│ │ │ │ │ └── color-palette.md
│ │ │ │ ├── dark-mode.md
│ │ │ │ ├── other-helper-classes.md
│ │ │ │ ├── positioning.md
│ │ │ │ ├── sass-scss-variables/
│ │ │ │ │ ├── SassVariables.vue
│ │ │ │ │ └── sass-scss-variables.md
│ │ │ │ ├── shadows.md
│ │ │ │ ├── spacing.md
│ │ │ │ ├── theme-builder/
│ │ │ │ │ ├── ThemePicker.vue
│ │ │ │ │ └── theme-builder.md
│ │ │ │ ├── typography/
│ │ │ │ │ ├── TypographyHeadings.vue
│ │ │ │ │ ├── TypographyWeights.vue
│ │ │ │ │ └── typography.md
│ │ │ │ └── visibility.md
│ │ │ ├── video-tutorials/
│ │ │ │ ├── TutorialLink.vue
│ │ │ │ ├── TutorialListing.vue
│ │ │ │ └── video-tutorials.md
│ │ │ ├── vue-components/
│ │ │ │ ├── ajax-bar.md
│ │ │ │ ├── avatar.md
│ │ │ │ ├── badge.md
│ │ │ │ ├── banner.md
│ │ │ │ ├── bar.md
│ │ │ │ ├── breadcrumbs.md
│ │ │ │ ├── button-dropdown.md
│ │ │ │ ├── button-group.md
│ │ │ │ ├── button-toggle.md
│ │ │ │ ├── button.md
│ │ │ │ ├── card.md
│ │ │ │ ├── carousel.md
│ │ │ │ ├── chat.md
│ │ │ │ ├── checkbox.md
│ │ │ │ ├── chip.md
│ │ │ │ ├── circular-progress.md
│ │ │ │ ├── color-picker.md
│ │ │ │ ├── date.md
│ │ │ │ ├── dialog.md
│ │ │ │ ├── editor.md
│ │ │ │ ├── expansion-item.md
│ │ │ │ ├── field.md
│ │ │ │ ├── file.md
│ │ │ │ ├── floating-action-button.md
│ │ │ │ ├── form.md
│ │ │ │ ├── icon.md
│ │ │ │ ├── img.md
│ │ │ │ ├── infinite-scroll.md
│ │ │ │ ├── inner-loading.md
│ │ │ │ ├── input.md
│ │ │ │ ├── intersection.md
│ │ │ │ ├── knob.md
│ │ │ │ ├── linear-progress.md
│ │ │ │ ├── list-and-list-items.md
│ │ │ │ ├── markup-table.md
│ │ │ │ ├── menu/
│ │ │ │ │ ├── MenuPositioning.vue
│ │ │ │ │ └── menu.md
│ │ │ │ ├── no-ssr.md
│ │ │ │ ├── option-group.md
│ │ │ │ ├── pagination.md
│ │ │ │ ├── parallax.md
│ │ │ │ ├── popup-edit.md
│ │ │ │ ├── popup-proxy.md
│ │ │ │ ├── pull-to-refresh.md
│ │ │ │ ├── radio.md
│ │ │ │ ├── range.md
│ │ │ │ ├── rating.md
│ │ │ │ ├── resize-observer.md
│ │ │ │ ├── responsive.md
│ │ │ │ ├── scroll-area.md
│ │ │ │ ├── scroll-observer.md
│ │ │ │ ├── select.md
│ │ │ │ ├── separator.md
│ │ │ │ ├── skeleton.md
│ │ │ │ ├── slide-item.md
│ │ │ │ ├── slide-transition.md
│ │ │ │ ├── slider.md
│ │ │ │ ├── space.md
│ │ │ │ ├── spinners.md
│ │ │ │ ├── splitter.md
│ │ │ │ ├── stepper.md
│ │ │ │ ├── tab-panels.md
│ │ │ │ ├── table.md
│ │ │ │ ├── tabs.md
│ │ │ │ ├── time.md
│ │ │ │ ├── timeline.md
│ │ │ │ ├── toggle.md
│ │ │ │ ├── toolbar.md
│ │ │ │ ├── tooltip/
│ │ │ │ │ ├── TooltipPositioning.vue
│ │ │ │ │ └── tooltip.md
│ │ │ │ ├── tree.md
│ │ │ │ ├── uploader.md
│ │ │ │ ├── video.md
│ │ │ │ └── virtual-scroll.md
│ │ │ ├── vue-composables/
│ │ │ │ ├── use-dialog-plugin-component.md
│ │ │ │ ├── use-form-child.md
│ │ │ │ ├── use-hydration.md
│ │ │ │ ├── use-id.md
│ │ │ │ ├── use-interval.md
│ │ │ │ ├── use-meta.md
│ │ │ │ ├── use-quasar.md
│ │ │ │ ├── use-render-cache.md
│ │ │ │ ├── use-split-attrs.md
│ │ │ │ ├── use-tick.md
│ │ │ │ └── use-timeout.md
│ │ │ ├── vue-directives/
│ │ │ │ ├── close-popup.md
│ │ │ │ ├── intersection.md
│ │ │ │ ├── material-ripples.md
│ │ │ │ ├── morph.md
│ │ │ │ ├── mutation.md
│ │ │ │ ├── scroll-fire.md
│ │ │ │ ├── scroll.md
│ │ │ │ ├── touch-hold.md
│ │ │ │ ├── touch-pan.md
│ │ │ │ ├── touch-repeat.md
│ │ │ │ └── touch-swipe.md
│ │ │ └── why-donate.md
│ │ └── router/
│ │ ├── index.js
│ │ └── routes.js
│ ├── src-pwa/
│ │ ├── custom-service-worker.js
│ │ ├── manifest.json
│ │ ├── pwa-flag.d.ts
│ │ └── register-service-worker.js
│ └── src-ssr/
│ ├── middlewares/
│ │ └── render.js
│ ├── server.js
│ └── ssr-flag.d.ts
├── extras/
│ ├── .npmignore
│ ├── LICENSE
│ ├── README.md
│ ├── animate/
│ │ ├── LICENSE
│ │ ├── animate-list.common.d.ts
│ │ ├── animate-list.common.js
│ │ ├── animate-list.d.ts
│ │ ├── animate-list.js
│ │ ├── animate-list.mjs
│ │ ├── backInDown.css
│ │ ├── backInLeft.css
│ │ ├── backInRight.css
│ │ ├── backInUp.css
│ │ ├── backOutDown.css
│ │ ├── backOutLeft.css
│ │ ├── backOutRight.css
│ │ ├── backOutUp.css
│ │ ├── bounce.css
│ │ ├── bounceIn.css
│ │ ├── bounceInDown.css
│ │ ├── bounceInLeft.css
│ │ ├── bounceInRight.css
│ │ ├── bounceInUp.css
│ │ ├── bounceOut.css
│ │ ├── bounceOutDown.css
│ │ ├── bounceOutLeft.css
│ │ ├── bounceOutRight.css
│ │ ├── bounceOutUp.css
│ │ ├── fadeIn.css
│ │ ├── fadeInBottomLeft.css
│ │ ├── fadeInBottomRight.css
│ │ ├── fadeInDown.css
│ │ ├── fadeInDownBig.css
│ │ ├── fadeInLeft.css
│ │ ├── fadeInLeftBig.css
│ │ ├── fadeInRight.css
│ │ ├── fadeInRightBig.css
│ │ ├── fadeInTopLeft.css
│ │ ├── fadeInTopRight.css
│ │ ├── fadeInUp.css
│ │ ├── fadeInUpBig.css
│ │ ├── fadeOut.css
│ │ ├── fadeOutBottomLeft.css
│ │ ├── fadeOutBottomRight.css
│ │ ├── fadeOutDown.css
│ │ ├── fadeOutDownBig.css
│ │ ├── fadeOutLeft.css
│ │ ├── fadeOutLeftBig.css
│ │ ├── fadeOutRight.css
│ │ ├── fadeOutRightBig.css
│ │ ├── fadeOutTopLeft.css
│ │ ├── fadeOutTopRight.css
│ │ ├── fadeOutUp.css
│ │ ├── fadeOutUpBig.css
│ │ ├── flash.css
│ │ ├── flip.css
│ │ ├── flipInX.css
│ │ ├── flipInY.css
│ │ ├── flipOutX.css
│ │ ├── flipOutY.css
│ │ ├── headShake.css
│ │ ├── heartBeat.css
│ │ ├── hinge.css
│ │ ├── jackInTheBox.css
│ │ ├── jello.css
│ │ ├── lightSpeedIn.css
│ │ ├── lightSpeedInLeft.css
│ │ ├── lightSpeedInRight.css
│ │ ├── lightSpeedOut.css
│ │ ├── lightSpeedOutLeft.css
│ │ ├── lightSpeedOutRight.css
│ │ ├── pulse.css
│ │ ├── rollIn.css
│ │ ├── rollOut.css
│ │ ├── rotateIn.css
│ │ ├── rotateInDownLeft.css
│ │ ├── rotateInDownRight.css
│ │ ├── rotateInUpLeft.css
│ │ ├── rotateInUpRight.css
│ │ ├── rotateOut.css
│ │ ├── rotateOutDownLeft.css
│ │ ├── rotateOutDownRight.css
│ │ ├── rotateOutUpLeft.css
│ │ ├── rotateOutUpRight.css
│ │ ├── rubberBand.css
│ │ ├── shake.css
│ │ ├── shakeX.css
│ │ ├── shakeY.css
│ │ ├── slideInDown.css
│ │ ├── slideInLeft.css
│ │ ├── slideInRight.css
│ │ ├── slideInUp.css
│ │ ├── slideOutDown.css
│ │ ├── slideOutLeft.css
│ │ ├── slideOutRight.css
│ │ ├── slideOutUp.css
│ │ ├── swing.css
│ │ ├── tada.css
│ │ ├── wobble.css
│ │ ├── zoomIn.css
│ │ ├── zoomInDown.css
│ │ ├── zoomInLeft.css
│ │ ├── zoomInRight.css
│ │ ├── zoomInUp.css
│ │ ├── zoomOut.css
│ │ ├── zoomOutDown.css
│ │ ├── zoomOutLeft.css
│ │ ├── zoomOutRight.css
│ │ └── zoomOutUp.css
│ ├── bootstrap-icons/
│ │ ├── LICENSE
│ │ ├── bootstrap-icons.css
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── build/
│ │ ├── README.template.md
│ │ ├── animate.js
│ │ ├── bootstrap-icons.js
│ │ ├── eva-icons.js
│ │ ├── fontawesome-v5.js
│ │ ├── fontawesome-v6.js
│ │ ├── fontawesome-v7.js
│ │ ├── index.js
│ │ ├── ionicons-v8.js
│ │ ├── line-awesome.js
│ │ ├── material-icons.js
│ │ ├── material-symbols.js
│ │ ├── mdi-v7.js
│ │ ├── readme-data.js
│ │ ├── readme.js
│ │ ├── themify.js
│ │ ├── utils/
│ │ │ ├── buildExports.js
│ │ │ └── index.js
│ │ └── webfonts.js
│ ├── eva-icons/
│ │ ├── LICENSE
│ │ ├── eva-icons.css
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── fontawesome-v5/
│ │ ├── LICENSE.txt
│ │ ├── fontawesome-v5.css
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── fontawesome-v6/
│ │ ├── LICENSE.txt
│ │ ├── fontawesome-v6.css
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── fontawesome-v7/
│ │ ├── LICENSE.txt
│ │ ├── fontawesome-v7.css
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── index.d.ts
│ ├── index.js
│ ├── ionicons-v4/
│ │ ├── LICENSE
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ └── ionicons-v4.css
│ ├── ionicons-v5/
│ │ ├── LICENSE
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── ionicons-v6/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── ionicons-v7/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── ionicons-v8/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ └── index.mjs
│ ├── line-awesome/
│ │ ├── LICENSE.md
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ └── line-awesome.css
│ ├── material-icons/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-icons.css
│ │ └── update.sh
│ ├── material-icons-outlined/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-icons-outlined.css
│ │ └── update.sh
│ ├── material-icons-round/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-icons-round.css
│ │ └── update.sh
│ ├── material-icons-sharp/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-icons-sharp.css
│ │ └── update.sh
│ ├── material-symbols-outlined/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-symbols-outlined.css
│ │ └── update.sh
│ ├── material-symbols-rounded/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-symbols-rounded.css
│ │ └── update.sh
│ ├── material-symbols-sharp/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── material-symbols-sharp.css
│ │ └── update.sh
│ ├── mdi-v3/
│ │ ├── LICENSE
│ │ └── mdi-v3.css
│ ├── mdi-v4/
│ │ ├── LICENSE
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── license.md
│ │ └── mdi-v4.css
│ ├── mdi-v5/
│ │ ├── LICENSE
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── license.md
│ │ └── mdi-v5.css
│ ├── mdi-v6/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── license.md
│ │ └── mdi-v6.css
│ ├── mdi-v7/
│ │ ├── LICENSE
│ │ ├── icons.json
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── license.md
│ │ └── mdi-v7.css
│ ├── package.json
│ ├── roboto-font/
│ │ ├── LICENSE
│ │ ├── roboto-font.css
│ │ └── update.sh
│ ├── roboto-font-latin-ext/
│ │ ├── LICENSE
│ │ ├── roboto-font-latin-ext.css
│ │ └── update.sh
│ └── themify/
│ ├── LICENSE
│ ├── icons.json
│ ├── index.d.ts
│ ├── index.js
│ ├── index.mjs
│ └── themify.css
├── icongenie/
│ ├── .gitignore
│ ├── .npmignore
│ ├── LICENSE
│ ├── README.md
│ ├── bin/
│ │ └── icongenie.js
│ ├── lib/
│ │ ├── cmd/
│ │ │ ├── generate.js
│ │ │ ├── help.js
│ │ │ ├── profile.js
│ │ │ └── verify.js
│ │ ├── generators/
│ │ │ ├── icns.js
│ │ │ ├── ico.js
│ │ │ ├── index.js
│ │ │ ├── png.js
│ │ │ ├── splashscreen.js
│ │ │ └── svg.js
│ │ ├── modes/
│ │ │ ├── index.js
│ │ │ ├── quasar-app-v1/
│ │ │ │ ├── bex.js
│ │ │ │ ├── capacitor.js
│ │ │ │ ├── cordova.js
│ │ │ │ ├── electron.js
│ │ │ │ ├── index.js
│ │ │ │ ├── pwa.js
│ │ │ │ ├── spa.js
│ │ │ │ └── ssr.js
│ │ │ └── quasar-app-v2/
│ │ │ ├── bex.js
│ │ │ ├── capacitor.js
│ │ │ ├── cordova.js
│ │ │ ├── electron.js
│ │ │ ├── index.js
│ │ │ ├── pwa.js
│ │ │ ├── spa.js
│ │ │ └── ssr.js
│ │ ├── mount/
│ │ │ ├── index.js
│ │ │ ├── mount-cordova.js
│ │ │ └── mount-tag.js
│ │ ├── runner/
│ │ │ ├── generate.js
│ │ │ ├── profile.js
│ │ │ └── verify.js
│ │ └── utils/
│ │ ├── app-paths.js
│ │ ├── default-params.js
│ │ ├── filter-argv-params.js
│ │ ├── get-assets-files.js
│ │ ├── get-compression.js
│ │ ├── get-file-size.js
│ │ ├── get-files-options.js
│ │ ├── get-png-size.js
│ │ ├── get-profile-content.js
│ │ ├── get-profile-files.js
│ │ ├── get-square-icon.js
│ │ ├── logger.js
│ │ ├── merge-objects.js
│ │ ├── node-version-check.js
│ │ ├── package-json.js
│ │ ├── parse-argv.js
│ │ ├── spawn-sync.js
│ │ └── validate-profile-object.js
│ ├── package.json
│ ├── pnpm-workspace.yaml
│ └── samples/
│ └── icongenie-profile.json
├── package.json
├── pnpm-workspace.yaml
├── ui/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── build/
│ │ ├── build.api.js
│ │ ├── build.icon-sets.js
│ │ ├── build.lang.js
│ │ ├── build.transforms.js
│ │ ├── build.types.js
│ │ ├── build.utils.js
│ │ ├── build.web-types.js
│ │ ├── prepare-diff.js
│ │ ├── script.build.css.js
│ │ ├── script.build.javascript.js
│ │ ├── script.build.js
│ │ ├── script.clean.js
│ │ └── script.test-umd.js
│ ├── icon-set/
│ │ ├── bootstrap-icons.js
│ │ ├── eva-icons.js
│ │ ├── fontawesome-v5-pro.js
│ │ ├── fontawesome-v5.js
│ │ ├── fontawesome-v6-pro.js
│ │ ├── fontawesome-v6.js
│ │ ├── fontawesome-v7-pro.js
│ │ ├── fontawesome-v7.js
│ │ ├── ionicons-v4.js
│ │ ├── line-awesome.js
│ │ ├── material-icons-outlined.js
│ │ ├── material-icons-round.js
│ │ ├── material-icons-sharp.js
│ │ ├── material-icons.js
│ │ ├── material-symbols-outlined.js
│ │ ├── material-symbols-rounded.js
│ │ ├── material-symbols-sharp.js
│ │ ├── mdi-v3.js
│ │ ├── mdi-v4.js
│ │ ├── mdi-v5.js
│ │ ├── mdi-v6.js
│ │ ├── mdi-v7.js
│ │ ├── svg-bootstrap-icons.js
│ │ ├── svg-eva-icons.js
│ │ ├── svg-fontawesome-v5.js
│ │ ├── svg-fontawesome-v6.js
│ │ ├── svg-fontawesome-v7.js
│ │ ├── svg-ionicons-v4.js
│ │ ├── svg-ionicons-v5.js
│ │ ├── svg-ionicons-v6.js
│ │ ├── svg-ionicons-v7.js
│ │ ├── svg-ionicons-v8.js
│ │ ├── svg-line-awesome.js
│ │ ├── svg-material-icons-outlined.js
│ │ ├── svg-material-icons-round.js
│ │ ├── svg-material-icons-sharp.js
│ │ ├── svg-material-icons.js
│ │ ├── svg-material-symbols-outlined.js
│ │ ├── svg-material-symbols-rounded.js
│ │ ├── svg-material-symbols-sharp.js
│ │ ├── svg-mdi-v6.js
│ │ ├── svg-mdi-v7.js
│ │ ├── svg-themify.js
│ │ └── themify.js
│ ├── jsconfig.json
│ ├── lang/
│ │ ├── ar-TN.js
│ │ ├── ar.js
│ │ ├── az-Latn.js
│ │ ├── bg.js
│ │ ├── bn.js
│ │ ├── bs-BA.js
│ │ ├── ca.js
│ │ ├── cs.js
│ │ ├── da.js
│ │ ├── de-CH.js
│ │ ├── de-DE.js
│ │ ├── de.js
│ │ ├── el.js
│ │ ├── en-GB.js
│ │ ├── en-US.js
│ │ ├── eo.js
│ │ ├── es.js
│ │ ├── et.js
│ │ ├── eu.js
│ │ ├── fa-IR.js
│ │ ├── fa.js
│ │ ├── fi.js
│ │ ├── fr.js
│ │ ├── gn.js
│ │ ├── he.js
│ │ ├── hi.js
│ │ ├── hr.js
│ │ ├── hu.js
│ │ ├── id.js
│ │ ├── index.json
│ │ ├── is.js
│ │ ├── it.js
│ │ ├── ja.js
│ │ ├── kk.js
│ │ ├── km.js
│ │ ├── ko-KR.js
│ │ ├── kur-CKB.js
│ │ ├── lt.js
│ │ ├── lu.js
│ │ ├── lv.js
│ │ ├── mk.js
│ │ ├── ml.js
│ │ ├── mm.js
│ │ ├── ms-MY.js
│ │ ├── ms.js
│ │ ├── my.js
│ │ ├── nb-NO.js
│ │ ├── nl.js
│ │ ├── pl.js
│ │ ├── pt-BR.js
│ │ ├── pt.js
│ │ ├── ro.js
│ │ ├── ru.js
│ │ ├── sk.js
│ │ ├── sl.js
│ │ ├── sm.js
│ │ ├── sq.js
│ │ ├── sr-CYR.js
│ │ ├── sr.js
│ │ ├── sv.js
│ │ ├── ta.js
│ │ ├── th.js
│ │ ├── tl.js
│ │ ├── tr.js
│ │ ├── ug.js
│ │ ├── uk.js
│ │ ├── ur-PK.js
│ │ ├── uz-Cyrl.js
│ │ ├── uz-Latn.js
│ │ ├── vi.js
│ │ ├── zh-CN.js
│ │ └── zh-TW.js
│ ├── package.json
│ ├── playground/
│ │ ├── .editorconfig
│ │ ├── .npmrc
│ │ ├── README.md
│ │ ├── __postcss.config.js
│ │ ├── index.html
│ │ ├── jsconfig.json
│ │ ├── package.json
│ │ ├── quasar.config.js
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── assets/
│ │ │ │ └── grid-data.json
│ │ │ ├── boot/
│ │ │ │ └── ssr-client.js
│ │ │ ├── composables/
│ │ │ │ └── useLocalStorageConfig.js
│ │ │ ├── css/
│ │ │ │ └── quasar.variables.sass
│ │ │ ├── mock-data/
│ │ │ │ └── tree/
│ │ │ │ ├── bigTree.json
│ │ │ │ └── smallTree.json
│ │ │ ├── pages/
│ │ │ │ ├── Error404.vue
│ │ │ │ ├── IndexPage.vue
│ │ │ │ ├── components/
│ │ │ │ │ ├── ajax-bar.vue
│ │ │ │ │ ├── avatar.vue
│ │ │ │ │ ├── badge.vue
│ │ │ │ │ ├── banner.vue
│ │ │ │ │ ├── bar.vue
│ │ │ │ │ ├── breadcrumbs.vue
│ │ │ │ │ ├── button-align-1.vue
│ │ │ │ │ ├── button-align-2.vue
│ │ │ │ │ ├── button-align-3.vue
│ │ │ │ │ ├── button-dropdown.vue
│ │ │ │ │ ├── button-events.vue
│ │ │ │ │ ├── button-functional.vue
│ │ │ │ │ ├── button-group.vue
│ │ │ │ │ ├── button-in-flex.vue
│ │ │ │ │ ├── button-links.vue
│ │ │ │ │ ├── button-prevent.vue
│ │ │ │ │ ├── button-toggle.vue
│ │ │ │ │ ├── button.vue
│ │ │ │ │ ├── card.vue
│ │ │ │ │ ├── carousel-part1.vue
│ │ │ │ │ ├── carousel-part2.vue
│ │ │ │ │ ├── chat.vue
│ │ │ │ │ ├── chat2.vue
│ │ │ │ │ ├── chip.vue
│ │ │ │ │ ├── circular-progress.vue
│ │ │ │ │ ├── data-table-part1.vue
│ │ │ │ │ ├── data-table-part2.vue
│ │ │ │ │ ├── data-table-part3.vue
│ │ │ │ │ ├── data-table-part4.vue
│ │ │ │ │ ├── data-table-part5-fixed.vue
│ │ │ │ │ ├── data-table-part6-virt-loading.vue
│ │ │ │ │ ├── data-table-part6-virt-slots.vue
│ │ │ │ │ ├── data-table-part7-infercols.vue
│ │ │ │ │ ├── data-table-part8-expanded.vue
│ │ │ │ │ ├── data-table-part9-selection-slot.vue
│ │ │ │ │ ├── fab-extended.vue
│ │ │ │ │ ├── fab.vue
│ │ │ │ │ ├── focus-tests.vue
│ │ │ │ │ ├── icon-extras.vue
│ │ │ │ │ ├── icon.vue
│ │ │ │ │ ├── img-queue.vue
│ │ │ │ │ ├── img.vue
│ │ │ │ │ ├── infinite-scroll.vue
│ │ │ │ │ ├── intersection-1.vue
│ │ │ │ │ ├── intersection-2.vue
│ │ │ │ │ ├── intersection-3.vue
│ │ │ │ │ ├── intersection-4.vue
│ │ │ │ │ ├── intersection-5-ssr.vue
│ │ │ │ │ ├── intersection-6-iframe.vue
│ │ │ │ │ ├── linear-progress.vue
│ │ │ │ │ ├── link.vue
│ │ │ │ │ ├── list-expansion-item.vue
│ │ │ │ │ ├── list-item.vue
│ │ │ │ │ ├── list-slide-item.vue
│ │ │ │ │ ├── menu-2-nested-divs.vue
│ │ │ │ │ ├── menu-align.vue
│ │ │ │ │ ├── menu-max-width-height.vue
│ │ │ │ │ ├── menu-test.vue
│ │ │ │ │ ├── menu.vue
│ │ │ │ │ ├── no-ssr.vue
│ │ │ │ │ ├── pagination-design.vue
│ │ │ │ │ ├── pagination-functionality.vue
│ │ │ │ │ ├── parallax.vue
│ │ │ │ │ ├── popup-proxy.vue
│ │ │ │ │ ├── portal-focus.vue
│ │ │ │ │ ├── pull-to-refresh-part1.vue
│ │ │ │ │ ├── pull-to-refresh-part2.vue
│ │ │ │ │ ├── pull-to-refresh-part3.vue
│ │ │ │ │ ├── responsive.vue
│ │ │ │ │ ├── scroll-area-resize.vue
│ │ │ │ │ ├── scroll-area-update.vue
│ │ │ │ │ ├── scroll-area.vue
│ │ │ │ │ ├── scroll-fire.vue
│ │ │ │ │ ├── skeleton.vue
│ │ │ │ │ ├── spinner.vue
│ │ │ │ │ ├── splitter.vue
│ │ │ │ │ ├── stepper-scroll-tests.vue
│ │ │ │ │ ├── stepper.vue
│ │ │ │ │ ├── tabs-cleanup.vue
│ │ │ │ │ ├── tabs-dynamic-1.vue
│ │ │ │ │ ├── tabs-dynamic-2.vue
│ │ │ │ │ ├── tabs-resize.vue
│ │ │ │ │ ├── tabs-router.vue
│ │ │ │ │ ├── tabs.vue
│ │ │ │ │ ├── timeline.vue
│ │ │ │ │ ├── toolbar.vue
│ │ │ │ │ ├── tooltip.vue
│ │ │ │ │ ├── transition-animatecss.vue
│ │ │ │ │ ├── tree.vue
│ │ │ │ │ ├── video-embedding.vue
│ │ │ │ │ ├── virtual-scroll-1.vue
│ │ │ │ │ ├── virtual-scroll-2.vue
│ │ │ │ │ ├── virtual-scroll-3.vue
│ │ │ │ │ ├── virtual-scroll-4.vue
│ │ │ │ │ ├── virtual-scroll-5.vue
│ │ │ │ │ ├── virtual-scroll-6.vue
│ │ │ │ │ ├── virtual-scroll-7-align.vue
│ │ │ │ │ └── virtual-scroll-8-focus.vue
│ │ │ │ ├── css/
│ │ │ │ │ ├── colors.vue
│ │ │ │ │ ├── flex-addon.vue
│ │ │ │ │ ├── flex-columns.vue
│ │ │ │ │ ├── flex-gutter.vue
│ │ │ │ │ ├── flex-rows.vue
│ │ │ │ │ ├── flex-test.vue
│ │ │ │ │ ├── material-ripples-1.vue
│ │ │ │ │ ├── material-ripples-2.vue
│ │ │ │ │ ├── shadows.vue
│ │ │ │ │ ├── size-addon.vue
│ │ │ │ │ └── typography.vue
│ │ │ │ ├── form/
│ │ │ │ │ ├── checkbox-radio-toggle-test.vue
│ │ │ │ │ ├── checkbox.vue
│ │ │ │ │ ├── color-picker.vue
│ │ │ │ │ ├── composition.vue
│ │ │ │ │ ├── date-part1-basic.vue
│ │ │ │ │ ├── date-part2-multiple-range.vue
│ │ │ │ │ ├── date-time-timestamp-test.vue
│ │ │ │ │ ├── date-time-timezone.vue
│ │ │ │ │ ├── editor-part1.vue
│ │ │ │ │ ├── editor-part2-model.vue
│ │ │ │ │ ├── editor-part3.vue
│ │ │ │ │ ├── editor-part4.vue
│ │ │ │ │ ├── field-align.vue
│ │ │ │ │ ├── field-attrs.vue
│ │ │ │ │ ├── field-focus-unfocus.vue
│ │ │ │ │ ├── field-label.vue
│ │ │ │ │ ├── field.vue
│ │ │ │ │ ├── file-picker.vue
│ │ │ │ │ ├── form-async-validation.vue
│ │ │ │ │ ├── form-focus.vue
│ │ │ │ │ ├── form-native.vue
│ │ │ │ │ ├── form-validation-reactive-lazy.vue
│ │ │ │ │ ├── form.vue
│ │ │ │ │ ├── form2.vue
│ │ │ │ │ ├── input-and-qselect-test.vue
│ │ │ │ │ ├── input-autocomplete.vue
│ │ │ │ │ ├── input-composition.vue
│ │ │ │ │ ├── input-debounce-test.vue
│ │ │ │ │ ├── input-mask.vue
│ │ │ │ │ ├── input-number.vue
│ │ │ │ │ ├── input-validate.vue
│ │ │ │ │ ├── input.vue
│ │ │ │ │ ├── knob.vue
│ │ │ │ │ ├── optiongroup.vue
│ │ │ │ │ ├── radio.vue
│ │ │ │ │ ├── range.vue
│ │ │ │ │ ├── rating.vue
│ │ │ │ │ ├── select-mobile.vue
│ │ │ │ │ ├── select-part-1.vue
│ │ │ │ │ ├── select-part-2.vue
│ │ │ │ │ ├── select-part-3.vue
│ │ │ │ │ ├── select-part-4.vue
│ │ │ │ │ ├── select-part-5-kbd.vue
│ │ │ │ │ ├── select-part-6-autocomplete.vue
│ │ │ │ │ ├── select-part-7-text.vue
│ │ │ │ │ ├── select-part-8.vue
│ │ │ │ │ ├── select-part-9-dynamic.vue
│ │ │ │ │ ├── slider-marker-label-part1.vue
│ │ │ │ │ ├── slider-marker-label-part2.vue
│ │ │ │ │ ├── slider-marker-label-part3-img.vue
│ │ │ │ │ ├── slider-range-change-test.vue
│ │ │ │ │ ├── slider-range-label.vue
│ │ │ │ │ ├── slider-range-limits.vue
│ │ │ │ │ ├── slider.vue
│ │ │ │ │ ├── time-limits.vue
│ │ │ │ │ ├── time.vue
│ │ │ │ │ ├── toggle.vue
│ │ │ │ │ ├── uploader-exposed-api.vue
│ │ │ │ │ └── uploader.vue
│ │ │ │ ├── global/
│ │ │ │ │ ├── bottom-sheet.vue
│ │ │ │ │ ├── dialog/
│ │ │ │ │ │ └── TestDialog.vue
│ │ │ │ │ ├── dialog-component-composition-api.js
│ │ │ │ │ ├── dialog-component-options-api.js
│ │ │ │ │ ├── dialog-plugin.vue
│ │ │ │ │ ├── dialog-spawn.vue
│ │ │ │ │ ├── dialog.vue
│ │ │ │ │ ├── inner-loading.vue
│ │ │ │ │ ├── loading-bar.vue
│ │ │ │ │ ├── loading.vue
│ │ │ │ │ ├── notify-part2-updatable.vue
│ │ │ │ │ └── notify.vue
│ │ │ │ ├── layout/
│ │ │ │ │ ├── layout-container-drawer-loop.vue
│ │ │ │ │ ├── layout-container.vue
│ │ │ │ │ ├── layout-drawer-loop.vue
│ │ │ │ │ ├── layout-drawer-mini.vue
│ │ │ │ │ ├── layout-keep-state-above.vue
│ │ │ │ │ ├── layout-page-scroller.vue
│ │ │ │ │ ├── layout.vue
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── a.vue
│ │ │ │ │ ├── b.vue
│ │ │ │ │ ├── c.vue
│ │ │ │ │ └── default.vue
│ │ │ │ ├── meta/
│ │ │ │ │ ├── layouts/
│ │ │ │ │ │ ├── layout_1.vue
│ │ │ │ │ │ ├── layout_2.vue
│ │ │ │ │ │ └── title.vue
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── first.vue
│ │ │ │ │ ├── second.vue
│ │ │ │ │ └── third.vue
│ │ │ │ ├── other/
│ │ │ │ │ ├── app-fullscreen-portals.vue
│ │ │ │ │ ├── app-fullscreen.vue
│ │ │ │ │ ├── app-visibility.vue
│ │ │ │ │ ├── clipboard.vue
│ │ │ │ │ ├── close-popup.vue
│ │ │ │ │ ├── cookies.vue
│ │ │ │ │ ├── date-utils.vue
│ │ │ │ │ ├── event-bus.vue
│ │ │ │ │ ├── export-file.vue
│ │ │ │ │ ├── focus-tests.vue
│ │ │ │ │ ├── intersection.vue
│ │ │ │ │ ├── model-toggle.vue
│ │ │ │ │ ├── morph-1.vue
│ │ │ │ │ ├── morph-directive-boxes-obj.vue
│ │ │ │ │ ├── morph-directive-boxes.vue
│ │ │ │ │ ├── morph-directive-card.vue
│ │ │ │ │ ├── morph-fab-card.vue
│ │ │ │ │ ├── morph-img-1.vue
│ │ │ │ │ ├── morph-img-2.vue
│ │ │ │ │ ├── morph-img-3.vue
│ │ │ │ │ ├── morph-same-element.vue
│ │ │ │ │ ├── mutation.vue
│ │ │ │ │ ├── platform-detection.vue
│ │ │ │ │ ├── run-sequential-promises.vue
│ │ │ │ │ ├── screen-plugin.vue
│ │ │ │ │ ├── scroll-animated.vue
│ │ │ │ │ ├── size-prop-test.vue
│ │ │ │ │ ├── slide-transition.vue
│ │ │ │ │ ├── transitions.vue
│ │ │ │ │ ├── uid.vue
│ │ │ │ │ ├── viewport-resize.vue
│ │ │ │ │ └── web-storage.vue
│ │ │ │ ├── touch-directives/
│ │ │ │ │ ├── pan-complex-test.vue
│ │ │ │ │ ├── touch-hold.vue
│ │ │ │ │ ├── touch-pan.vue
│ │ │ │ │ ├── touch-repeat.vue
│ │ │ │ │ ├── touch-style.sass
│ │ │ │ │ └── touch-swipe.vue
│ │ │ │ └── web-tests/
│ │ │ │ ├── a.vue
│ │ │ │ ├── b.vue
│ │ │ │ ├── breakpoints.vue
│ │ │ │ ├── c.vue
│ │ │ │ ├── fast-table-test.vue
│ │ │ │ ├── fast-test.vue
│ │ │ │ ├── get-normalized-vnodes.vue
│ │ │ │ ├── hover.vue
│ │ │ │ ├── keep-alive-events.vue
│ │ │ │ ├── layout.vue
│ │ │ │ ├── panel-keep-alive.vue
│ │ │ │ ├── panel-vfor-loop.vue
│ │ │ │ ├── portal-inject-test.vue
│ │ │ │ ├── screen-height.vue
│ │ │ │ └── tabs-router/
│ │ │ │ ├── One.vue
│ │ │ │ ├── TabsLayout.vue
│ │ │ │ └── Two.vue
│ │ │ └── router/
│ │ │ ├── index.js
│ │ │ ├── pages.js
│ │ │ └── routes.js
│ │ ├── src-ssr/
│ │ │ ├── middlewares/
│ │ │ │ └── render.js
│ │ │ ├── package.json
│ │ │ ├── pnpm-workspace.yaml
│ │ │ └── server.js
│ │ └── upload-server/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ └── server.js
│ ├── playground-umd/
│ │ ├── index-multiapp.umd.html
│ │ └── index.umd.html
│ ├── src/
│ │ ├── Brand.json
│ │ ├── api.extends.json
│ │ ├── components/
│ │ │ ├── ajax-bar/
│ │ │ │ ├── QAjaxBar.js
│ │ │ │ ├── QAjaxBar.json
│ │ │ │ ├── QAjaxBar.sass
│ │ │ │ └── index.js
│ │ │ ├── avatar/
│ │ │ │ ├── QAvatar.js
│ │ │ │ ├── QAvatar.json
│ │ │ │ ├── QAvatar.sass
│ │ │ │ ├── QAvatar.test.js
│ │ │ │ └── index.js
│ │ │ ├── badge/
│ │ │ │ ├── QBadge.js
│ │ │ │ ├── QBadge.json
│ │ │ │ ├── QBadge.sass
│ │ │ │ ├── QBadge.test.js
│ │ │ │ └── index.js
│ │ │ ├── banner/
│ │ │ │ ├── QBanner.js
│ │ │ │ ├── QBanner.json
│ │ │ │ ├── QBanner.sass
│ │ │ │ ├── QBanner.test.js
│ │ │ │ └── index.js
│ │ │ ├── bar/
│ │ │ │ ├── QBar.js
│ │ │ │ ├── QBar.json
│ │ │ │ ├── QBar.sass
│ │ │ │ ├── QBar.test.js
│ │ │ │ └── index.js
│ │ │ ├── breadcrumbs/
│ │ │ │ ├── QBreadcrumbs.js
│ │ │ │ ├── QBreadcrumbs.json
│ │ │ │ ├── QBreadcrumbs.sass
│ │ │ │ ├── QBreadcrumbs.test.js
│ │ │ │ ├── QBreadcrumbsEl.js
│ │ │ │ ├── QBreadcrumbsEl.json
│ │ │ │ ├── QBreadcrumbsEl.test.js
│ │ │ │ ├── index.js
│ │ │ │ └── test/
│ │ │ │ ├── BasicBreadcrumbs.vue
│ │ │ │ └── BreadcrumbWithSeparatorSlot.vue
│ │ │ ├── btn/
│ │ │ │ ├── QBtn.js
│ │ │ │ ├── QBtn.json
│ │ │ │ ├── QBtn.sass
│ │ │ │ ├── QBtn.test.js
│ │ │ │ ├── index.js
│ │ │ │ ├── use-btn.js
│ │ │ │ ├── use-btn.json
│ │ │ │ └── use-btn.test.js
│ │ │ ├── btn-dropdown/
│ │ │ │ ├── QBtnDropdown.js
│ │ │ │ ├── QBtnDropdown.json
│ │ │ │ ├── QBtnDropdown.sass
│ │ │ │ └── index.js
│ │ │ ├── btn-group/
│ │ │ │ ├── QBtnGroup.js
│ │ │ │ ├── QBtnGroup.json
│ │ │ │ ├── QBtnGroup.sass
│ │ │ │ └── index.js
│ │ │ ├── btn-toggle/
│ │ │ │ ├── QBtnToggle.js
│ │ │ │ ├── QBtnToggle.json
│ │ │ │ ├── QBtnToggle.sass
│ │ │ │ └── index.js
│ │ │ ├── card/
│ │ │ │ ├── QCard.js
│ │ │ │ ├── QCard.json
│ │ │ │ ├── QCard.sass
│ │ │ │ ├── QCardActions.js
│ │ │ │ ├── QCardActions.json
│ │ │ │ ├── QCardSection.js
│ │ │ │ ├── QCardSection.json
│ │ │ │ └── index.js
│ │ │ ├── carousel/
│ │ │ │ ├── QCarousel.js
│ │ │ │ ├── QCarousel.json
│ │ │ │ ├── QCarousel.sass
│ │ │ │ ├── QCarouselControl.js
│ │ │ │ ├── QCarouselControl.json
│ │ │ │ ├── QCarouselSlide.js
│ │ │ │ ├── QCarouselSlide.json
│ │ │ │ └── index.js
│ │ │ ├── chat/
│ │ │ │ ├── QChatMessage.js
│ │ │ │ ├── QChatMessage.json
│ │ │ │ ├── QChatMessage.sass
│ │ │ │ └── index.js
│ │ │ ├── checkbox/
│ │ │ │ ├── QCheckbox.js
│ │ │ │ ├── QCheckbox.json
│ │ │ │ ├── QCheckbox.sass
│ │ │ │ ├── index.js
│ │ │ │ ├── use-checkbox.js
│ │ │ │ └── use-checkbox.json
│ │ │ ├── chip/
│ │ │ │ ├── QChip.js
│ │ │ │ ├── QChip.json
│ │ │ │ ├── QChip.sass
│ │ │ │ ├── QChip.test.js
│ │ │ │ └── index.js
│ │ │ ├── circular-progress/
│ │ │ │ ├── QCircularProgress.js
│ │ │ │ ├── QCircularProgress.json
│ │ │ │ ├── QCircularProgress.sass
│ │ │ │ ├── circular-progress.js
│ │ │ │ ├── circular-progress.test.js
│ │ │ │ └── index.js
│ │ │ ├── color/
│ │ │ │ ├── QColor.js
│ │ │ │ ├── QColor.json
│ │ │ │ ├── QColor.sass
│ │ │ │ └── index.js
│ │ │ ├── date/
│ │ │ │ ├── QDate.js
│ │ │ │ ├── QDate.json
│ │ │ │ ├── QDate.sass
│ │ │ │ ├── index.js
│ │ │ │ ├── use-datetime.js
│ │ │ │ └── use-datetime.json
│ │ │ ├── dialog/
│ │ │ │ ├── QDialog.js
│ │ │ │ ├── QDialog.json
│ │ │ │ ├── QDialog.sass
│ │ │ │ ├── QDialog.test.js
│ │ │ │ ├── index.js
│ │ │ │ └── test/
│ │ │ │ └── DialogWrapper.vue
│ │ │ ├── drawer/
│ │ │ │ ├── QDrawer.js
│ │ │ │ ├── QDrawer.json
│ │ │ │ └── index.js
│ │ │ ├── editor/
│ │ │ │ ├── QEditor.js
│ │ │ │ ├── QEditor.json
│ │ │ │ ├── QEditor.sass
│ │ │ │ ├── editor-caret.js
│ │ │ │ ├── editor-utils.js
│ │ │ │ └── index.js
│ │ │ ├── expansion-item/
│ │ │ │ ├── QExpansionItem.js
│ │ │ │ ├── QExpansionItem.json
│ │ │ │ ├── QExpansionItem.sass
│ │ │ │ └── index.js
│ │ │ ├── fab/
│ │ │ │ ├── QFab.js
│ │ │ │ ├── QFab.json
│ │ │ │ ├── QFab.sass
│ │ │ │ ├── QFabAction.js
│ │ │ │ ├── QFabAction.json
│ │ │ │ ├── index.js
│ │ │ │ ├── use-fab.js
│ │ │ │ └── use-fab.json
│ │ │ ├── field/
│ │ │ │ ├── QField.js
│ │ │ │ ├── QField.json
│ │ │ │ ├── QField.sass
│ │ │ │ └── index.js
│ │ │ ├── file/
│ │ │ │ ├── QFile.js
│ │ │ │ ├── QFile.json
│ │ │ │ ├── QFile.sass
│ │ │ │ └── index.js
│ │ │ ├── footer/
│ │ │ │ ├── QFooter.js
│ │ │ │ ├── QFooter.json
│ │ │ │ └── index.js
│ │ │ ├── form/
│ │ │ │ ├── QForm.js
│ │ │ │ ├── QForm.json
│ │ │ │ ├── QForm.sass
│ │ │ │ ├── QFormChildMixin.js
│ │ │ │ ├── QFormChildMixin.json
│ │ │ │ └── index.js
│ │ │ ├── header/
│ │ │ │ ├── QHeader.js
│ │ │ │ ├── QHeader.json
│ │ │ │ └── index.js
│ │ │ ├── icon/
│ │ │ │ ├── QIcon.js
│ │ │ │ ├── QIcon.json
│ │ │ │ ├── QIcon.sass
│ │ │ │ └── index.js
│ │ │ ├── img/
│ │ │ │ ├── QImg.js
│ │ │ │ ├── QImg.json
│ │ │ │ ├── QImg.sass
│ │ │ │ └── index.js
│ │ │ ├── infinite-scroll/
│ │ │ │ ├── QInfiniteScroll.js
│ │ │ │ ├── QInfiniteScroll.json
│ │ │ │ └── index.js
│ │ │ ├── inner-loading/
│ │ │ │ ├── QInnerLoading.js
│ │ │ │ ├── QInnerLoading.json
│ │ │ │ ├── QInnerLoading.sass
│ │ │ │ └── index.js
│ │ │ ├── input/
│ │ │ │ ├── QInput.js
│ │ │ │ ├── QInput.json
│ │ │ │ ├── QInput.sass
│ │ │ │ ├── index.js
│ │ │ │ ├── use-mask.js
│ │ │ │ └── use-mask.json
│ │ │ ├── intersection/
│ │ │ │ ├── QIntersection.js
│ │ │ │ ├── QIntersection.json
│ │ │ │ ├── QIntersection.sass
│ │ │ │ └── index.js
│ │ │ ├── item/
│ │ │ │ ├── QItem.js
│ │ │ │ ├── QItem.json
│ │ │ │ ├── QItem.sass
│ │ │ │ ├── QItemLabel.js
│ │ │ │ ├── QItemLabel.json
│ │ │ │ ├── QItemSection.js
│ │ │ │ ├── QItemSection.json
│ │ │ │ ├── QList.js
│ │ │ │ ├── QList.json
│ │ │ │ ├── QList.test.js
│ │ │ │ └── index.js
│ │ │ ├── knob/
│ │ │ │ ├── QKnob.js
│ │ │ │ ├── QKnob.json
│ │ │ │ ├── QKnob.sass
│ │ │ │ └── index.js
│ │ │ ├── layout/
│ │ │ │ ├── QLayout.js
│ │ │ │ ├── QLayout.json
│ │ │ │ ├── QLayout.sass
│ │ │ │ └── index.js
│ │ │ ├── linear-progress/
│ │ │ │ ├── QLinearProgress.js
│ │ │ │ ├── QLinearProgress.json
│ │ │ │ ├── QLinearProgress.sass
│ │ │ │ └── index.js
│ │ │ ├── markup-table/
│ │ │ │ ├── QMarkupTable.js
│ │ │ │ ├── QMarkupTable.json
│ │ │ │ └── index.js
│ │ │ ├── menu/
│ │ │ │ ├── QMenu.js
│ │ │ │ ├── QMenu.json
│ │ │ │ ├── QMenu.sass
│ │ │ │ └── index.js
│ │ │ ├── no-ssr/
│ │ │ │ ├── QNoSsr.js
│ │ │ │ ├── QNoSsr.json
│ │ │ │ └── index.js
│ │ │ ├── option-group/
│ │ │ │ ├── QOptionGroup.js
│ │ │ │ ├── QOptionGroup.json
│ │ │ │ ├── QOptionGroup.sass
│ │ │ │ └── index.js
│ │ │ ├── page/
│ │ │ │ ├── QPage.js
│ │ │ │ ├── QPage.json
│ │ │ │ ├── QPageContainer.js
│ │ │ │ ├── QPageContainer.json
│ │ │ │ └── index.js
│ │ │ ├── page-scroller/
│ │ │ │ ├── QPageScroller.js
│ │ │ │ ├── QPageScroller.json
│ │ │ │ └── index.js
│ │ │ ├── page-sticky/
│ │ │ │ ├── QPageSticky.js
│ │ │ │ ├── QPageSticky.json
│ │ │ │ ├── index.js
│ │ │ │ └── use-page-sticky.js
│ │ │ ├── pagination/
│ │ │ │ ├── QPagination.js
│ │ │ │ ├── QPagination.json
│ │ │ │ ├── QPagination.sass
│ │ │ │ └── index.js
│ │ │ ├── parallax/
│ │ │ │ ├── QParallax.js
│ │ │ │ ├── QParallax.json
│ │ │ │ ├── QParallax.sass
│ │ │ │ └── index.js
│ │ │ ├── popup-edit/
│ │ │ │ ├── QPopupEdit.js
│ │ │ │ ├── QPopupEdit.json
│ │ │ │ ├── QPopupEdit.sass
│ │ │ │ └── index.js
│ │ │ ├── popup-proxy/
│ │ │ │ ├── QPopupProxy.js
│ │ │ │ ├── QPopupProxy.json
│ │ │ │ └── index.js
│ │ │ ├── pull-to-refresh/
│ │ │ │ ├── QPullToRefresh.js
│ │ │ │ ├── QPullToRefresh.json
│ │ │ │ ├── QPullToRefresh.sass
│ │ │ │ └── index.js
│ │ │ ├── radio/
│ │ │ │ ├── QRadio.js
│ │ │ │ ├── QRadio.json
│ │ │ │ ├── QRadio.sass
│ │ │ │ └── index.js
│ │ │ ├── range/
│ │ │ │ ├── QRange.js
│ │ │ │ ├── QRange.json
│ │ │ │ └── index.js
│ │ │ ├── rating/
│ │ │ │ ├── QRating.js
│ │ │ │ ├── QRating.json
│ │ │ │ ├── QRating.sass
│ │ │ │ └── index.js
│ │ │ ├── resize-observer/
│ │ │ │ ├── QResizeObserver.js
│ │ │ │ ├── QResizeObserver.json
│ │ │ │ └── index.js
│ │ │ ├── responsive/
│ │ │ │ ├── QResponsive.js
│ │ │ │ ├── QResponsive.json
│ │ │ │ ├── QResponsive.sass
│ │ │ │ └── index.js
│ │ │ ├── scroll-area/
│ │ │ │ ├── QScrollArea.js
│ │ │ │ ├── QScrollArea.json
│ │ │ │ ├── QScrollArea.sass
│ │ │ │ ├── ScrollAreaControls.js
│ │ │ │ └── index.js
│ │ │ ├── scroll-observer/
│ │ │ │ ├── QScrollObserver.js
│ │ │ │ ├── QScrollObserver.json
│ │ │ │ └── index.js
│ │ │ ├── select/
│ │ │ │ ├── QSelect.js
│ │ │ │ ├── QSelect.json
│ │ │ │ ├── QSelect.sass
│ │ │ │ └── index.js
│ │ │ ├── separator/
│ │ │ │ ├── QSeparator.js
│ │ │ │ ├── QSeparator.json
│ │ │ │ ├── QSeparator.sass
│ │ │ │ └── index.js
│ │ │ ├── skeleton/
│ │ │ │ ├── QSkeleton.js
│ │ │ │ ├── QSkeleton.json
│ │ │ │ ├── QSkeleton.sass
│ │ │ │ └── index.js
│ │ │ ├── slide-item/
│ │ │ │ ├── QSlideItem.js
│ │ │ │ ├── QSlideItem.json
│ │ │ │ ├── QSlideItem.sass
│ │ │ │ └── index.js
│ │ │ ├── slide-transition/
│ │ │ │ ├── QSlideTransition.js
│ │ │ │ ├── QSlideTransition.json
│ │ │ │ └── index.js
│ │ │ ├── slider/
│ │ │ │ ├── QSlider.js
│ │ │ │ ├── QSlider.json
│ │ │ │ ├── QSlider.sass
│ │ │ │ ├── index.js
│ │ │ │ ├── use-slider.js
│ │ │ │ └── use-slider.json
│ │ │ ├── space/
│ │ │ │ ├── QSpace.js
│ │ │ │ ├── QSpace.json
│ │ │ │ ├── QSpace.sass
│ │ │ │ ├── QSpace.test.js
│ │ │ │ └── index.js
│ │ │ ├── spinner/
│ │ │ │ ├── QSpinner.js
│ │ │ │ ├── QSpinner.json
│ │ │ │ ├── QSpinner.sass
│ │ │ │ ├── QSpinner.test.js
│ │ │ │ ├── QSpinnerAudio.js
│ │ │ │ ├── QSpinnerAudio.json
│ │ │ │ ├── QSpinnerAudio.test.js
│ │ │ │ ├── QSpinnerBall.js
│ │ │ │ ├── QSpinnerBall.json
│ │ │ │ ├── QSpinnerBall.test.js
│ │ │ │ ├── QSpinnerBars.js
│ │ │ │ ├── QSpinnerBars.json
│ │ │ │ ├── QSpinnerBars.test.js
│ │ │ │ ├── QSpinnerBox.js
│ │ │ │ ├── QSpinnerBox.json
│ │ │ │ ├── QSpinnerBox.test.js
│ │ │ │ ├── QSpinnerClock.js
│ │ │ │ ├── QSpinnerClock.json
│ │ │ │ ├── QSpinnerClock.test.js
│ │ │ │ ├── QSpinnerComment.js
│ │ │ │ ├── QSpinnerComment.json
│ │ │ │ ├── QSpinnerComment.test.js
│ │ │ │ ├── QSpinnerCube.js
│ │ │ │ ├── QSpinnerCube.json
│ │ │ │ ├── QSpinnerCube.test.js
│ │ │ │ ├── QSpinnerDots.js
│ │ │ │ ├── QSpinnerDots.json
│ │ │ │ ├── QSpinnerDots.test.js
│ │ │ │ ├── QSpinnerFacebook.js
│ │ │ │ ├── QSpinnerFacebook.json
│ │ │ │ ├── QSpinnerFacebook.test.js
│ │ │ │ ├── QSpinnerGears.js
│ │ │ │ ├── QSpinnerGears.json
│ │ │ │ ├── QSpinnerGears.test.js
│ │ │ │ ├── QSpinnerGrid.js
│ │ │ │ ├── QSpinnerGrid.json
│ │ │ │ ├── QSpinnerGrid.test.js
│ │ │ │ ├── QSpinnerHearts.js
│ │ │ │ ├── QSpinnerHearts.json
│ │ │ │ ├── QSpinnerHearts.test.js
│ │ │ │ ├── QSpinnerHourglass.js
│ │ │ │ ├── QSpinnerHourglass.json
│ │ │ │ ├── QSpinnerHourglass.test.js
│ │ │ │ ├── QSpinnerInfinity.js
│ │ │ │ ├── QSpinnerInfinity.json
│ │ │ │ ├── QSpinnerInfinity.test.js
│ │ │ │ ├── QSpinnerIos.js
│ │ │ │ ├── QSpinnerIos.json
│ │ │ │ ├── QSpinnerIos.test.js
│ │ │ │ ├── QSpinnerOrbit.js
│ │ │ │ ├── QSpinnerOrbit.json
│ │ │ │ ├── QSpinnerOrbit.test.js
│ │ │ │ ├── QSpinnerOval.js
│ │ │ │ ├── QSpinnerOval.json
│ │ │ │ ├── QSpinnerOval.test.js
│ │ │ │ ├── QSpinnerPie.js
│ │ │ │ ├── QSpinnerPie.json
│ │ │ │ ├── QSpinnerPie.test.js
│ │ │ │ ├── QSpinnerPuff.js
│ │ │ │ ├── QSpinnerPuff.json
│ │ │ │ ├── QSpinnerPuff.test.js
│ │ │ │ ├── QSpinnerRadio.js
│ │ │ │ ├── QSpinnerRadio.json
│ │ │ │ ├── QSpinnerRadio.test.js
│ │ │ │ ├── QSpinnerRings.js
│ │ │ │ ├── QSpinnerRings.json
│ │ │ │ ├── QSpinnerRings.test.js
│ │ │ │ ├── QSpinnerTail.js
│ │ │ │ ├── QSpinnerTail.json
│ │ │ │ ├── QSpinnerTail.test.js
│ │ │ │ ├── index.js
│ │ │ │ ├── spinner.json
│ │ │ │ ├── use-spinner.js
│ │ │ │ └── use-spinner.test.js
│ │ │ ├── splitter/
│ │ │ │ ├── QSplitter.js
│ │ │ │ ├── QSplitter.json
│ │ │ │ ├── QSplitter.sass
│ │ │ │ └── index.js
│ │ │ ├── stepper/
│ │ │ │ ├── QStep.js
│ │ │ │ ├── QStep.json
│ │ │ │ ├── QStepper.js
│ │ │ │ ├── QStepper.json
│ │ │ │ ├── QStepper.sass
│ │ │ │ ├── QStepperNavigation.js
│ │ │ │ ├── QStepperNavigation.json
│ │ │ │ ├── StepHeader.js
│ │ │ │ └── index.js
│ │ │ ├── tab-panels/
│ │ │ │ ├── QTabPanel.js
│ │ │ │ ├── QTabPanel.json
│ │ │ │ ├── QTabPanel.sass
│ │ │ │ ├── QTabPanels.js
│ │ │ │ ├── QTabPanels.json
│ │ │ │ └── index.js
│ │ │ ├── table/
│ │ │ │ ├── QTable.js
│ │ │ │ ├── QTable.json
│ │ │ │ ├── QTable.sass
│ │ │ │ ├── QTd.js
│ │ │ │ ├── QTd.json
│ │ │ │ ├── QTh.js
│ │ │ │ ├── QTh.json
│ │ │ │ ├── QTr.js
│ │ │ │ ├── QTr.json
│ │ │ │ ├── get-table-middle.js
│ │ │ │ ├── index.js
│ │ │ │ ├── table-column-selection.js
│ │ │ │ ├── table-filter.js
│ │ │ │ ├── table-pagination.js
│ │ │ │ ├── table-row-expand.js
│ │ │ │ ├── table-row-selection.js
│ │ │ │ └── table-sort.js
│ │ │ ├── tabs/
│ │ │ │ ├── QRouteTab.js
│ │ │ │ ├── QRouteTab.json
│ │ │ │ ├── QTab.js
│ │ │ │ ├── QTab.json
│ │ │ │ ├── QTabs.js
│ │ │ │ ├── QTabs.json
│ │ │ │ ├── QTabs.sass
│ │ │ │ ├── index.js
│ │ │ │ ├── use-tab.js
│ │ │ │ └── use-tab.json
│ │ │ ├── time/
│ │ │ │ ├── QTime.js
│ │ │ │ ├── QTime.json
│ │ │ │ ├── QTime.sass
│ │ │ │ └── index.js
│ │ │ ├── timeline/
│ │ │ │ ├── QTimeline.js
│ │ │ │ ├── QTimeline.json
│ │ │ │ ├── QTimeline.sass
│ │ │ │ ├── QTimelineEntry.js
│ │ │ │ ├── QTimelineEntry.json
│ │ │ │ └── index.js
│ │ │ ├── toggle/
│ │ │ │ ├── QToggle.js
│ │ │ │ ├── QToggle.json
│ │ │ │ ├── QToggle.sass
│ │ │ │ └── index.js
│ │ │ ├── toolbar/
│ │ │ │ ├── QToolbar.js
│ │ │ │ ├── QToolbar.json
│ │ │ │ ├── QToolbar.sass
│ │ │ │ ├── QToolbar.test.js
│ │ │ │ ├── QToolbarTitle.js
│ │ │ │ ├── QToolbarTitle.json
│ │ │ │ ├── QToolbarTitle.test.js
│ │ │ │ └── index.js
│ │ │ ├── tooltip/
│ │ │ │ ├── QTooltip.js
│ │ │ │ ├── QTooltip.json
│ │ │ │ ├── QTooltip.sass
│ │ │ │ └── index.js
│ │ │ ├── tree/
│ │ │ │ ├── QTree.js
│ │ │ │ ├── QTree.json
│ │ │ │ ├── QTree.sass
│ │ │ │ └── index.js
│ │ │ ├── uploader/
│ │ │ │ ├── QUploader.js
│ │ │ │ ├── QUploader.json
│ │ │ │ ├── QUploader.sass
│ │ │ │ ├── QUploaderAddTrigger.js
│ │ │ │ ├── QUploaderAddTrigger.json
│ │ │ │ ├── index.js
│ │ │ │ ├── uploader-core.js
│ │ │ │ ├── xhr-uploader-plugin.js
│ │ │ │ └── xhr-uploader-plugin.json
│ │ │ ├── video/
│ │ │ │ ├── QVideo.js
│ │ │ │ ├── QVideo.json
│ │ │ │ ├── QVideo.sass
│ │ │ │ ├── QVideo.test.js
│ │ │ │ └── index.js
│ │ │ └── virtual-scroll/
│ │ │ ├── QVirtualScroll.js
│ │ │ ├── QVirtualScroll.json
│ │ │ ├── QVirtualScroll.sass
│ │ │ ├── index.js
│ │ │ ├── use-virtual-scroll.js
│ │ │ └── use-virtual-scroll.json
│ │ ├── components.js
│ │ ├── composables/
│ │ │ ├── private.use-align/
│ │ │ │ ├── use-align.js
│ │ │ │ └── use-align.test.js
│ │ │ ├── private.use-anchor/
│ │ │ │ ├── use-anchor-static.json
│ │ │ │ ├── use-anchor.js
│ │ │ │ └── use-anchor.json
│ │ │ ├── private.use-dark/
│ │ │ │ ├── use-dark.js
│ │ │ │ └── use-dark.test.js
│ │ │ ├── private.use-field/
│ │ │ │ ├── use-field.js
│ │ │ │ └── use-field.json
│ │ │ ├── private.use-file/
│ │ │ │ ├── use-file-dom-props.js
│ │ │ │ ├── use-file.js
│ │ │ │ └── use-file.json
│ │ │ ├── private.use-fullscreen/
│ │ │ │ ├── use-fullscreen.js
│ │ │ │ └── use-fullscreen.json
│ │ │ ├── private.use-history/
│ │ │ │ ├── use-history.js
│ │ │ │ └── use-history.test.js
│ │ │ ├── private.use-key-composition/
│ │ │ │ └── use-key-composition.js
│ │ │ ├── private.use-model-toggle/
│ │ │ │ ├── use-model-toggle.js
│ │ │ │ └── use-model-toggle.json
│ │ │ ├── private.use-panel/
│ │ │ │ ├── use-panel.child.json
│ │ │ │ ├── use-panel.js
│ │ │ │ ├── use-panel.json
│ │ │ │ └── use-panel.sass
│ │ │ ├── private.use-portal/
│ │ │ │ ├── use-portal.js
│ │ │ │ └── use-portal.json
│ │ │ ├── private.use-prevent-scroll/
│ │ │ │ └── use-prevent-scroll.js
│ │ │ ├── private.use-ratio/
│ │ │ │ ├── use-ratio.js
│ │ │ │ ├── use-ratio.json
│ │ │ │ └── use-ratio.test.js
│ │ │ ├── private.use-refocus-target/
│ │ │ │ └── use-refocus-target.js
│ │ │ ├── private.use-router-link/
│ │ │ │ ├── use-router-link.js
│ │ │ │ └── use-router-link.json
│ │ │ ├── private.use-scroll-target/
│ │ │ │ └── use-scroll-target.js
│ │ │ ├── private.use-size/
│ │ │ │ ├── use-size.js
│ │ │ │ ├── use-size.json
│ │ │ │ └── use-size.test.js
│ │ │ ├── private.use-transition/
│ │ │ │ ├── use-transition.js
│ │ │ │ ├── use-transition.json
│ │ │ │ └── use-transition.test.js
│ │ │ ├── private.use-validate/
│ │ │ │ ├── use-validate.js
│ │ │ │ └── use-validate.json
│ │ │ ├── use-dialog-plugin-component/
│ │ │ │ └── use-dialog-plugin-component.js
│ │ │ ├── use-form/
│ │ │ │ ├── private.use-form.js
│ │ │ │ ├── private.use-form.json
│ │ │ │ ├── private.use-form.test.js
│ │ │ │ └── use-form-child.js
│ │ │ ├── use-hydration/
│ │ │ │ ├── use-hydration.js
│ │ │ │ └── use-hydration.test.js
│ │ │ ├── use-id/
│ │ │ │ ├── use-id.js
│ │ │ │ └── use-id.test.js
│ │ │ ├── use-interval/
│ │ │ │ ├── use-interval.js
│ │ │ │ └── use-interval.test.js
│ │ │ ├── use-meta/
│ │ │ │ └── use-meta.js
│ │ │ ├── use-quasar/
│ │ │ │ ├── use-quasar.js
│ │ │ │ └── use-quasar.test.js
│ │ │ ├── use-render-cache/
│ │ │ │ ├── use-render-cache.js
│ │ │ │ └── use-render-cache.test.js
│ │ │ ├── use-split-attrs/
│ │ │ │ ├── use-split-attrs.js
│ │ │ │ └── use-split-attrs.test.js
│ │ │ ├── use-tick/
│ │ │ │ ├── use-tick.js
│ │ │ │ └── use-tick.test.js
│ │ │ └── use-timeout/
│ │ │ ├── use-timeout.js
│ │ │ └── use-timeout.test.js
│ │ ├── composables.js
│ │ ├── css/
│ │ │ ├── core/
│ │ │ │ ├── animations.sass
│ │ │ │ ├── colors.sass
│ │ │ │ ├── dark.sass
│ │ │ │ ├── elevation.sass
│ │ │ │ ├── flex.sass
│ │ │ │ ├── helpers.sass
│ │ │ │ ├── mouse.sass
│ │ │ │ ├── orientation.sass
│ │ │ │ ├── positioning.sass
│ │ │ │ ├── size.sass
│ │ │ │ ├── touch.sass
│ │ │ │ ├── transitions.sass
│ │ │ │ ├── typography.sass
│ │ │ │ └── visibility.sass
│ │ │ ├── flex-addon.sass
│ │ │ ├── helpers/
│ │ │ │ ├── math.sass
│ │ │ │ └── string.sass
│ │ │ ├── index.sass
│ │ │ ├── normalize.sass
│ │ │ └── variables.sass
│ │ ├── directives/
│ │ │ ├── close-popup/
│ │ │ │ ├── ClosePopup.js
│ │ │ │ └── ClosePopup.json
│ │ │ ├── intersection/
│ │ │ │ ├── Intersection.js
│ │ │ │ └── Intersection.json
│ │ │ ├── morph/
│ │ │ │ ├── Morph.js
│ │ │ │ ├── Morph.json
│ │ │ │ └── Morph.sass
│ │ │ ├── mutation/
│ │ │ │ ├── Mutation.js
│ │ │ │ └── Mutation.json
│ │ │ ├── ripple/
│ │ │ │ ├── Ripple.js
│ │ │ │ ├── Ripple.json
│ │ │ │ ├── Ripple.sass
│ │ │ │ └── Ripple.test.js
│ │ │ ├── scroll/
│ │ │ │ ├── Scroll.js
│ │ │ │ └── Scroll.json
│ │ │ ├── scroll-fire/
│ │ │ │ ├── ScrollFire.js
│ │ │ │ └── ScrollFire.json
│ │ │ ├── touch-hold/
│ │ │ │ ├── TouchHold.js
│ │ │ │ └── TouchHold.json
│ │ │ ├── touch-pan/
│ │ │ │ ├── TouchPan.js
│ │ │ │ └── TouchPan.json
│ │ │ ├── touch-repeat/
│ │ │ │ ├── TouchRepeat.js
│ │ │ │ └── TouchRepeat.json
│ │ │ └── touch-swipe/
│ │ │ ├── TouchSwipe.js
│ │ │ └── TouchSwipe.json
│ │ ├── directives.js
│ │ ├── flags.dev.js
│ │ ├── index.dev.js
│ │ ├── index.ssr.js
│ │ ├── index.umd.js
│ │ ├── install-quasar.js
│ │ ├── plugins/
│ │ │ ├── addressbar/
│ │ │ │ ├── AddressbarColor.js
│ │ │ │ ├── AddressbarColor.json
│ │ │ │ └── AddressbarColor.test.js
│ │ │ ├── app-fullscreen/
│ │ │ │ ├── AppFullscreen.js
│ │ │ │ ├── AppFullscreen.json
│ │ │ │ ├── AppFullscreen.test.js
│ │ │ │ └── test/
│ │ │ │ └── mock-fullscreen.js
│ │ │ ├── app-visibility/
│ │ │ │ ├── AppVisibility.js
│ │ │ │ ├── AppVisibility.json
│ │ │ │ └── AppVisibility.test.js
│ │ │ ├── bottom-sheet/
│ │ │ │ ├── BottomSheet.js
│ │ │ │ ├── BottomSheet.json
│ │ │ │ └── component/
│ │ │ │ ├── BottomSheetComponent.js
│ │ │ │ └── BottomSheetComponent.sass
│ │ │ ├── cookies/
│ │ │ │ ├── Cookies.js
│ │ │ │ └── Cookies.json
│ │ │ ├── dark/
│ │ │ │ ├── Dark.js
│ │ │ │ ├── Dark.json
│ │ │ │ └── Dark.test.js
│ │ │ ├── dialog/
│ │ │ │ ├── Dialog.js
│ │ │ │ ├── Dialog.json
│ │ │ │ └── component/
│ │ │ │ ├── DialogPluginComponent.js
│ │ │ │ └── DialogPluginComponent.sass
│ │ │ ├── icon-set/
│ │ │ │ ├── IconSet.js
│ │ │ │ ├── IconSet.json
│ │ │ │ └── IconSet.test.js
│ │ │ ├── lang/
│ │ │ │ ├── Lang.js
│ │ │ │ ├── Lang.json
│ │ │ │ └── Lang.test.js
│ │ │ ├── loading/
│ │ │ │ ├── Loading.js
│ │ │ │ ├── Loading.json
│ │ │ │ └── Loading.sass
│ │ │ ├── loading-bar/
│ │ │ │ ├── LoadingBar.js
│ │ │ │ └── LoadingBar.json
│ │ │ ├── meta/
│ │ │ │ ├── Meta.js
│ │ │ │ └── Meta.json
│ │ │ ├── notify/
│ │ │ │ ├── Notify.js
│ │ │ │ ├── Notify.json
│ │ │ │ └── Notify.sass
│ │ │ ├── platform/
│ │ │ │ ├── Platform.js
│ │ │ │ ├── Platform.json
│ │ │ │ └── Platform.test.js
│ │ │ ├── private.body/
│ │ │ │ ├── Body.js
│ │ │ │ └── Body.test.js
│ │ │ ├── private.history/
│ │ │ │ ├── History.js
│ │ │ │ └── History.test.js
│ │ │ ├── screen/
│ │ │ │ ├── Screen.js
│ │ │ │ ├── Screen.json
│ │ │ │ └── Screen.test.js
│ │ │ └── storage/
│ │ │ ├── LocalStorage.js
│ │ │ ├── LocalStorage.json
│ │ │ ├── LocalStorage.test.js
│ │ │ ├── SessionStorage.js
│ │ │ ├── SessionStorage.json
│ │ │ ├── SessionStorage.test.js
│ │ │ └── engine/
│ │ │ ├── web-storage.js
│ │ │ ├── web-storage.json
│ │ │ └── web-storage.test.js
│ │ ├── plugins.js
│ │ ├── utils/
│ │ │ ├── EventBus/
│ │ │ │ ├── EventBus.js
│ │ │ │ └── EventBus.test.js
│ │ │ ├── clone/
│ │ │ │ ├── clone.js
│ │ │ │ └── clone.test.js
│ │ │ ├── colors/
│ │ │ │ ├── colors.js
│ │ │ │ └── colors.test.js
│ │ │ ├── copy-to-clipboard/
│ │ │ │ └── copy-to-clipboard.js
│ │ │ ├── create-meta-mixin/
│ │ │ │ └── create-meta-mixin.js
│ │ │ ├── create-uploader-component/
│ │ │ │ └── create-uploader-component.js
│ │ │ ├── css-var/
│ │ │ │ ├── get-css-var.js
│ │ │ │ ├── get-css-var.test.js
│ │ │ │ ├── set-css-var.js
│ │ │ │ └── set-css-var.test.js
│ │ │ ├── date/
│ │ │ │ ├── date.js
│ │ │ │ └── private.persian.js
│ │ │ ├── debounce/
│ │ │ │ ├── debounce.js
│ │ │ │ └── debounce.test.js
│ │ │ ├── dom/
│ │ │ │ ├── dom.js
│ │ │ │ └── dom.test.js
│ │ │ ├── event/
│ │ │ │ └── event.js
│ │ │ ├── export-file/
│ │ │ │ └── export-file.js
│ │ │ ├── extend/
│ │ │ │ ├── extend.js
│ │ │ │ └── extend.test.js
│ │ │ ├── format/
│ │ │ │ ├── format.js
│ │ │ │ └── format.test.js
│ │ │ ├── frame-debounce/
│ │ │ │ ├── frame-debounce.js
│ │ │ │ └── frame-debounce.test.js
│ │ │ ├── is/
│ │ │ │ ├── is.js
│ │ │ │ └── is.test.js
│ │ │ ├── morph/
│ │ │ │ └── morph.js
│ │ │ ├── open-url/
│ │ │ │ └── open-url.js
│ │ │ ├── patterns/
│ │ │ │ ├── patterns.js
│ │ │ │ └── patterns.test.js
│ │ │ ├── private.click-outside/
│ │ │ │ └── click-outside.js
│ │ │ ├── private.config/
│ │ │ │ ├── instance-config.js
│ │ │ │ ├── instance-config.test.js
│ │ │ │ ├── nodes.js
│ │ │ │ └── nodes.test.js
│ │ │ ├── private.create/
│ │ │ │ ├── create.js
│ │ │ │ └── create.test.js
│ │ │ ├── private.dialog/
│ │ │ │ ├── create-dialog.js
│ │ │ │ └── create-dialog.json
│ │ │ ├── private.focus/
│ │ │ │ ├── focus-manager.js
│ │ │ │ ├── focus-manager.test.js
│ │ │ │ ├── focusout.js
│ │ │ │ └── focusout.test.js
│ │ │ ├── private.get-emits-object/
│ │ │ │ ├── get-emits-object.js
│ │ │ │ └── get-emits-object.test.js
│ │ │ ├── private.inject-obj-prop/
│ │ │ │ ├── inject-obj-prop.js
│ │ │ │ └── inject-obj-prop.test.js
│ │ │ ├── private.keyboard/
│ │ │ │ ├── escape-key.js
│ │ │ │ ├── escape-key.test.js
│ │ │ │ └── key-composition.js
│ │ │ ├── private.noop-ssr-directive-transform/
│ │ │ │ ├── noop-ssr-directive-transform.js
│ │ │ │ └── noop-ssr-directive-transform.test.js
│ │ │ ├── private.option-sizes/
│ │ │ │ └── option-sizes.js
│ │ │ ├── private.portal/
│ │ │ │ └── portal.js
│ │ │ ├── private.position-engine/
│ │ │ │ └── position-engine.js
│ │ │ ├── private.render/
│ │ │ │ ├── render.js
│ │ │ │ └── render.test.js
│ │ │ ├── private.rtl/
│ │ │ │ ├── rtl.js
│ │ │ │ └── rtl.test.js
│ │ │ ├── private.selection/
│ │ │ │ ├── selection.js
│ │ │ │ └── selection.test.js
│ │ │ ├── private.sort/
│ │ │ │ ├── sort.js
│ │ │ │ └── sort.test.js
│ │ │ ├── private.symbols/
│ │ │ │ └── symbols.js
│ │ │ ├── private.touch/
│ │ │ │ ├── touch.js
│ │ │ │ └── touch.test.js
│ │ │ ├── private.vm/
│ │ │ │ ├── vm.js
│ │ │ │ └── vm.test.js
│ │ │ ├── run-sequential-promises/
│ │ │ │ └── run-sequential-promises.js
│ │ │ ├── scroll/
│ │ │ │ ├── prevent-scroll.js
│ │ │ │ └── scroll.js
│ │ │ ├── throttle/
│ │ │ │ ├── throttle.js
│ │ │ │ └── throttle.test.js
│ │ │ └── uid/
│ │ │ ├── uid.js
│ │ │ └── uid.test.js
│ │ ├── utils.js
│ │ └── vue-plugin.js
│ ├── testing/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── runtime/
│ │ │ └── router.js
│ │ ├── specs/
│ │ │ ├── astParser.js
│ │ │ ├── cmd.createTestFile.js
│ │ │ ├── cmd.dryRun.js
│ │ │ ├── cmd.generateSection.js
│ │ │ ├── cmd.validateTestFile.js
│ │ │ ├── ctx.js
│ │ │ ├── generators/
│ │ │ │ ├── generator.component.js
│ │ │ │ ├── generator.composable.js
│ │ │ │ ├── generator.directive.js
│ │ │ │ ├── generator.generic.js
│ │ │ │ ├── generator.plugin.js
│ │ │ │ └── map.js
│ │ │ ├── ignoredTestFiles.conf
│ │ │ ├── ignoredTestFiles.js
│ │ │ ├── readAssociatedJsonFile.js
│ │ │ ├── script.js
│ │ │ ├── specs.utils.js
│ │ │ ├── target.js
│ │ │ └── testFile.js
│ │ ├── vitest.config.js
│ │ └── vitest.setup.js
│ ├── tsconfig.json
│ ├── types/
│ │ ├── api/
│ │ │ ├── color.d.ts
│ │ │ ├── cookies.d.ts
│ │ │ ├── dialog.d.ts
│ │ │ ├── qeditor.d.ts
│ │ │ ├── qfile.d.ts
│ │ │ ├── qform.d.ts
│ │ │ ├── qinput.d.ts
│ │ │ ├── qloading.d.ts
│ │ │ ├── qloadingbar.d.ts
│ │ │ ├── qnotify.d.ts
│ │ │ ├── qpopupproxy.d.ts
│ │ │ ├── qselect.d.ts
│ │ │ ├── qtable.d.ts
│ │ │ ├── qtree.d.ts
│ │ │ ├── quploader.d.ts
│ │ │ ├── slider.d.ts
│ │ │ ├── touchswipe.d.ts
│ │ │ ├── validation.d.ts
│ │ │ ├── vue-prop-types.d.ts
│ │ │ └── web-storage.d.ts
│ │ ├── api.d.ts
│ │ ├── composables.d.ts
│ │ ├── config.d.ts
│ │ ├── feature-flag.d.ts
│ │ ├── globals.d.ts
│ │ ├── icon-set.d.ts
│ │ ├── lang.d.ts
│ │ ├── meta.d.ts
│ │ ├── plugin.d.ts
│ │ ├── shim-icon-set.d.ts
│ │ ├── shim-lang.d.ts
│ │ ├── ts-helpers.d.ts
│ │ ├── tsconfig.json
│ │ ├── utils/
│ │ │ ├── colors.d.ts
│ │ │ ├── date.d.ts
│ │ │ ├── dom.d.ts
│ │ │ ├── event.d.ts
│ │ │ ├── format.d.ts
│ │ │ ├── is.d.ts
│ │ │ ├── patterns.d.ts
│ │ │ ├── run-sequential-promises.d.ts
│ │ │ └── scroll.d.ts
│ │ └── utils.d.ts
│ └── wrappers/
│ ├── index.cjs
│ └── index.js
├── utils/
│ ├── babel-preset-app/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── index.js
│ │ ├── package.json
│ │ └── polyfills.js
│ ├── render-ssr-error/
│ │ ├── .npmignore
│ │ ├── README.md
│ │ ├── build/
│ │ │ └── index.js
│ │ ├── compiled-assets/
│ │ │ ├── after-injection
│ │ │ └── before-injection
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── env.js
│ │ │ ├── error-details.js
│ │ │ ├── index.js
│ │ │ └── stack.js
│ │ └── src-ui/
│ │ ├── README.md
│ │ ├── build/
│ │ │ └── vite.plugin.single-file.js
│ │ ├── index.html
│ │ ├── jsconfig.json
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── assets/
│ │ │ │ ├── data.js
│ │ │ │ └── store.js
│ │ │ ├── components/
│ │ │ │ ├── AppCode.vue
│ │ │ │ ├── AppEnvironment.vue
│ │ │ │ ├── AppHeader.vue
│ │ │ │ └── AppStack.vue
│ │ │ ├── main.js
│ │ │ └── quasar.variables.sass
│ │ └── vite.config.js
│ ├── ssl-certificate/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── README.md
│ │ ├── package.json
│ │ └── src/
│ │ └── index.js
│ └── ssr-helpers/
│ ├── README.md
│ ├── create-renderer.js
│ ├── lib/
│ │ └── create-bundle.js
│ └── package.json
├── vite-plugin/
│ ├── LICENSE
│ ├── README.md
│ ├── build/
│ │ ├── clean.js
│ │ └── rolldown.config.js
│ ├── index.d.ts
│ ├── package.json
│ ├── playground/
│ │ ├── index.html
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ ├── components/
│ │ │ │ ├── AssetTransform.vue
│ │ │ │ ├── JsPug.vue
│ │ │ │ ├── JsScript.vue
│ │ │ │ ├── JsScriptSetup.vue
│ │ │ │ ├── SassTransform.vue
│ │ │ │ ├── TsScript.vue
│ │ │ │ ├── TsScriptSetup.vue
│ │ │ │ ├── asset-transform/
│ │ │ │ │ ├── ChatMessageWithAvatar.vue
│ │ │ │ │ ├── ImgWithPlaceholderSrc.vue
│ │ │ │ │ ├── ImgWithSrc.vue
│ │ │ │ │ └── NativeImage.vue
│ │ │ │ ├── js-pug/
│ │ │ │ │ ├── AliasedImports.vue
│ │ │ │ │ ├── BasicTest.vue
│ │ │ │ │ ├── CustomWithAliasedImports.vue
│ │ │ │ │ ├── CustomWithImports.vue
│ │ │ │ │ ├── ExtendBtn.vue
│ │ │ │ │ ├── ImportsTest.vue
│ │ │ │ │ ├── MixedCase.vue
│ │ │ │ │ ├── MixedCaseWithDuplicates.vue
│ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue
│ │ │ │ │ └── WithDirective.vue
│ │ │ │ ├── js-script/
│ │ │ │ │ ├── AliasedImports.vue
│ │ │ │ │ ├── BasicTest.vue
│ │ │ │ │ ├── CustomComp.vue
│ │ │ │ │ ├── CustomWithAliasedImports.vue
│ │ │ │ │ ├── CustomWithImports.vue
│ │ │ │ │ ├── ExtendBtn.vue
│ │ │ │ │ ├── ImportsTest.vue
│ │ │ │ │ ├── MixedCase.vue
│ │ │ │ │ ├── MixedCaseWithDuplicates.vue
│ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithImports.vue
│ │ │ │ │ ├── WithDirective.vue
│ │ │ │ │ └── custom-component.js
│ │ │ │ ├── js-script-setup/
│ │ │ │ │ ├── AliasedImports.vue
│ │ │ │ │ ├── BasicTest.vue
│ │ │ │ │ ├── CustomComp.vue
│ │ │ │ │ ├── CustomWithAliasedImports.vue
│ │ │ │ │ ├── CustomWithImports.vue
│ │ │ │ │ ├── ExtendBtn.vue
│ │ │ │ │ ├── ImportsTest.vue
│ │ │ │ │ ├── MixedCase.vue
│ │ │ │ │ ├── MixedCaseWithDuplicates.vue
│ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithImports.vue
│ │ │ │ │ ├── WithDirective.vue
│ │ │ │ │ └── custom-component.js
│ │ │ │ ├── sass-transform/
│ │ │ │ │ ├── ColorOverride.vue
│ │ │ │ │ ├── ColorSassUse.vue
│ │ │ │ │ ├── ColorScssUse.vue
│ │ │ │ │ └── PaddingTest.vue
│ │ │ │ ├── ts-script/
│ │ │ │ │ ├── AliasedImports.vue
│ │ │ │ │ ├── BasicTest.vue
│ │ │ │ │ ├── CustomComp.vue
│ │ │ │ │ ├── CustomWithAliasedImports.vue
│ │ │ │ │ ├── CustomWithImports.vue
│ │ │ │ │ ├── ExtendBtn.vue
│ │ │ │ │ ├── ImportsTest.vue
│ │ │ │ │ ├── MixedCase.vue
│ │ │ │ │ ├── MixedCaseWithDuplicates.vue
│ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue
│ │ │ │ │ ├── OnlyCustomWithImports.vue
│ │ │ │ │ ├── WithDirective.vue
│ │ │ │ │ └── custom-component.ts
│ │ │ │ └── ts-script-setup/
│ │ │ │ ├── AliasedImports.vue
│ │ │ │ ├── BasicTest.vue
│ │ │ │ ├── CustomComp.vue
│ │ │ │ ├── CustomWithAliasedImports.vue
│ │ │ │ ├── CustomWithImports.vue
│ │ │ │ ├── ExtendBtn.vue
│ │ │ │ ├── ImportsTest.vue
│ │ │ │ ├── MixedCase.vue
│ │ │ │ ├── MixedCaseWithDuplicates.vue
│ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue
│ │ │ │ ├── OnlyCustomWithAliasedImports.vue
│ │ │ │ ├── OnlyCustomWithImports.vue
│ │ │ │ ├── WithDirective.vue
│ │ │ │ └── custom-component.ts
│ │ │ ├── main.js
│ │ │ └── quasar-variables.sass
│ │ └── vite.config.js
│ ├── src/
│ │ ├── index.js
│ │ ├── js-transform.js
│ │ ├── plugin.js
│ │ ├── quasar-path.js
│ │ ├── query.js
│ │ ├── scss-transform.js
│ │ ├── vite-config.js
│ │ └── vue-transform.js
│ └── testing/
│ ├── runtime/
│ │ ├── tests/
│ │ │ ├── asset-transform.test.js
│ │ │ ├── js-transform.test.js
│ │ │ ├── sass-transform.test.js
│ │ │ ├── ts-transform.test.ts
│ │ │ ├── vue-pug-transform.test.js
│ │ │ └── vue-transform.test.js
│ │ ├── vitest.config.js
│ │ └── vitest.setup.js
│ └── usage/
│ ├── tests/
│ │ └── usage.test.js
│ └── vitest.config.js
└── vitest.workspace.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_size = 2
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Code of Conduct
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Quasar Contributing Guide
Hi! We are really excited that you are interested in contributing to Quasar 👏.
Please visit our website to view the [Contribution Guide](https://quasar.dev/how-to-contribute/contribution-guide).
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: rstoenescu
patreon: # quasarframework
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report--quasar-v2.yml
================================================
name: Bug report (Quasar v2)
description: Create a bug report to help us improve
labels: ['kind/bug 🐞', 'Qv2 🔝']
# Note: Do NOT use commas(,) in options with 'multiple: true', the issue processing workflow won't be able to label it
body:
- type: markdown
attributes:
value: |
### Read Before Proceeding Further
This form is for submitting a **bug report** for Quasar Framework(**v2**).
If you are using another version, just seeking help, or you would like to submit a feature request, go back and choose a more suitable option from the list.
Also, search for your issue in the repo to be sure it doesn't exist already.
To enter your issue, fill out the form correctly and according to the instructions. Try to be as clear as possible and provide as many details as possible, to help our team better understand the issue and to resolve it faster.
Issues with an unclear description or lacking information will have a lower priority. They may even get closed without taking action.
Lastly, read the [Reporting an Issue | Contribution Guide](https://quasar.dev/how-to-contribute/contribution-guide#reporting-an-issue) section of our docs for a more detailed explanation.
Thanks for your understanding. We truly appreciate your effort to fill out this form!
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Clearly and concisely explain the problem.
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What did you expect to happen?
validations:
required: true
- type: input
id: repro-url
attributes:
label: Reproduction URL
description: |
A [reproduction](https://stackoverflow.com/help/minimal-reproducible-example) URL is **REQUIRED**, even if you think the error is obvious.
Fork one of the following, hit save then copy-paste the URL here:
- [Codepen](https://codepen.quasar.dev)
- [jsFiddle](https://jsfiddle.quasar.dev)
- [StackBlitz - app-vite](https://stackblitz-vite.quasar.dev)
- [StackBlitz - app-webpack](https://stackblitz-webpack.quasar.dev)
- [Codesandbox](https://codesandbox.quasar.dev)
_You can provide a GitHub repo only as a last resort. Keep in mind that it will be prioritized less as it makes the reproduction process slower._
placeholder: https://codepen.io/rstoenescu/pen/xxEvBLR - DO NOT use this example value or a random URL
validations:
required: true
- type: textarea
id: repro-description
attributes:
label: How to reproduce?
description: Steps to reproduce the behavior.
placeholder: |
1. Go to the provided reproduction link
2. Click on '....'
3. Scroll down to '....'
4. See the error
validations:
required: true
- type: dropdown
id: flavour
attributes:
label: Flavour
description: Choose the Quasar flavour you are using. _The names between parentheses indicate the package names if applicable._
options:
- Quasar CLI with Vite (@quasar/cli | @quasar/app-vite)
- Quasar CLI with Webpack (@quasar/cli | @quasar/app-webpack)
- UMD
- Vite Plugin (@quasar/vite-plugin)
- Vue CLI Plugin (vue-cli-plugin-quasar)
validations:
required: true
- type: dropdown
id: areas
attributes:
label: Areas
description: Mark the areas in which you see the problem on. _The names between parentheses indicate the package names if applicable._
multiple: true
options:
- Quasar CLI Commands/Configuration (@quasar/cli | @quasar/app-webpack | @quasar/app-vite)
- Components (quasar)
- Directives (quasar)
- Plugins (quasar)
- Composables (quasar)
- Style & Identity (quasar)
- Accessibility [a11y] (quasar)
- Project Creation (create-quasar)
- Quasar Extras (@quasar/extras)
- TypeScript Support
- App Extension API
# TODO: Consider creating a separate issue template for Icon Genie CLI as most of the info requested may not be relevant
- Icon Genie CLI (@quasar/icongenie)
- SPA Mode
- SSR Mode
- PWA Mode
- Electron Mode
- Cordova Mode
- Capacitor Mode
- BEX Mode
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: Platforms/Browsers
description: Mark the platforms/browsers in which you see the problem on. _If you select `Other`, please explain it in `Additional context` section._
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- iOS
- Android
- Electron
- Other
- type: textarea
id: q-info
attributes:
label: Quasar info output
description: |
Please run [`quasar info` command](https://quasar.dev/quasar-cli/commands-list#info), then copy and paste the output.
_This will be automatically formatted into code, so no need for backticks._
render: Shell
# TODO: Validate the format by using GitHub Actions, Probot, etc.
# TODO: Make this required if the flavour is Quasar CLI, by using GitHub Actions, Probot, etc.
# Consider adding separate controls to select important versions such as quasar, @quasar/app, vite, etc. to also respect the other flavours
# or add just the 'quasar' version(to cover UMD), then evolve `quasar info` command to cover most/all cases, and make people use `npx quasar info` for the environment and package information
- type: textarea
id: logs
attributes:
label: Relevant log output
description: |
Please copy and paste any relevant log output.
_This will be automatically formatted into code, so no need for backticks._
render: Shell
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Check Discussions
url: https://github.com/quasarframework/quasar/discussions
about: Visit our Discussions forum to view announcements, ideas, search for previous help requests, and more!
- name: Have a question or need help?
url: https://github.com/quasarframework/quasar/discussions/new
about: Create a new discussion (or join our Discord server from the link below.)
- name: Get help from the community on Discord
url: https://chat.quasar.dev
about: Join our Discord Server for getting help, helping others, finding/posting jobs, and more!
- name: Check for existing ideas and feature suggestions
url: https://github.com/quasarframework/quasar/discussions/categories/ideas-proposals
about: Visit the "💫 Ideas / Proposals" forum to view, discuss, and vote existing ideas and feature suggestions.
- name: Suggest a feature
url: https://github.com/quasarframework/quasar/discussions/new?category=ideas-proposals
about: (Please check the existing ones first) Suggest new features for Quasar Framework!
================================================
FILE: .github/ISSUE_TEMPLATE/docs-report--quasar-v2.yml
================================================
name: Docs report (Quasar v2)
description: Create a docs report to help us improve
labels: ['kind/docs 📄', 'Qv2 🔝']
# Note: Do NOT use commas(,) in options with 'multiple: true', the issue processing workflow won't be able to label it
body:
- type: markdown
attributes:
value: |
### Read Before Proceeding Further
This form is for submitting a **docs report** for Quasar Framework(**v2**). (https://quasar.dev)
If you are using another version, just seeking help, or you would like to submit a feature request, go back and choose a more suitable option from the list.
Also, search for your issue in the repo to be sure it doesn't exist already.
To enter your issue, fill out the form correctly and according to the instructions. Try to be as clear as possible and provide as many details as possible, to help our team better understand the issue and to resolve it faster.
Issues with an unclear description or lacking information will have a lower priority. They may even get closed without taking action.
Lastly, read the [Contributing to the Quasar Documentation | Contribution Guide](https://quasar.dev/how-to-contribute/contribution-guide#contributing-to-the-quasar-documentation) section of our docs for a more detailed explanation.
Thanks for your understanding. We truly appreciate your effort to fill out this form!
- type: textarea
id: description
attributes:
label: Description
description: |
Clearly and concisely explain the problem.
You can mention unclear or missing information, typos, grammatical mistakes, etc.
Any contributions and suggestions are welcome!
validations:
required: true
- type: input
id: docs-page-url
attributes:
label: Documentation Section URL
description: If the problem is related to an existing docs page/section, click the related section's title and paste the URL here.
placeholder: https://quasar.dev/vue-components/table#virtual-scrolling
- type: dropdown
id: flavour
attributes:
label: Flavour
description: Choose the related Quasar flavour if applicable. _The names between parentheses indicate the package names if applicable._
options:
- Quasar CLI with Vite (@quasar/cli | @quasar/app-vite)
- Quasar CLI with Webpack (@quasar/cli | @quasar/app-webpack)
- UMD
- Vite Plugin (@quasar/vite-plugin)
- Vue CLI Plugin (vue-cli-plugin-quasar)
- type: dropdown
id: areas
attributes:
label: Areas
description: Mark the areas in which you see the problem on. _The names between parentheses indicate the package names if applicable._
multiple: true
options:
- Quasar CLI Commands/Configuration (@quasar/cli | @quasar/app-webpack | @quasar/app-vite)
- Components (quasar)
- Directives (quasar)
- Plugins (quasar)
- Composables (quasar)
- Style & Identity (quasar)
- Quasar Extras (@quasar/extras)
- TypeScript Support
- App Extension API
- Icon Genie CLI (@quasar/icongenie)
- SPA Mode
- SSR Mode
- PWA Mode
- Electron Mode
- Cordova Mode
- Capacitor Mode
- BEX Mode
validations:
required: true
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Please make sure to read the Pull Request Guidelines:
https://github.com/quasarframework/quasar/blob/dev/CONTRIBUTING.md#pull-request-guidelines
-->
<!-- PULL REQUEST TEMPLATE -->
<!-- Update "[ ]" to "[x]" to check a box (space sensitive) -->
**What kind of change does this PR introduce?** <!-- Check at least one -->
- [ ] Bugfix
- [ ] Feature
- [ ] Documentation
- [ ] Code style update
- [ ] Refactor
- [ ] Build-related changes
- [ ] Other, please describe:
**Does this PR introduce a breaking change?** <!-- Check one -->
- [ ] Yes
- [ ] No
<!-- If yes, please describe the impact and migration path for existing applications: -->
**The PR fulfills these requirements:**
- [ ] It's submitted to the `dev` branch (or `v[X]` branch)
- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix: #xxx[,#xxx]`, where "xxx" is the issue number)
- [ ] It's been tested on a Cordova (iOS, Android) app
- [ ] It's been tested on an Electron app
- [ ] Any necessary documentation has been added or updated [in the docs](https://github.com/quasarframework/quasar/tree/dev/docs) <!-- for faster update click on "Suggest an edit on GitHub" at bottom of page --> or explained in the PR's description.
If adding a **new feature**, the PR's description includes:
- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to [start a new feature discussion](https://github.com/quasarframework/quasar/discussions/new?category=ideas-proposals) first and wait for approval before working on it)
**Other information:**
================================================
FILE: .github/RELEASE-TEMPLATE.md
================================================
# Quasar v2.x.x
## What's Changed
**Features:**
**Fixes:**
## Documentation
The documentation can be found at [quasar.dev](https://quasar.dev/)
## Donations
Quasar Framework is an open-source MIT licensed project that has been made possible due to the **generous contributions** by [sponsors and backers](https://github.com/sponsors/rstoenescu). If you are interested in supporting this project, please consider:
- [Becoming a sponsor on Github](https://github.com/sponsors/rstoenescu)
- [One-off donation via PayPal](https://paypal.me/rstoenescu1)
================================================
FILE: .github/workflows/build-types.yml
================================================
name: Build types
on:
workflow_dispatch:
push:
branches:
- dev
paths:
- '.github/workflows/build-types.yml'
# We don't need to hunt for every possible case, these should cover almost all cases
- 'ui/package.json'
- 'ui/build/build.types.js'
- 'ui/build/build.javascript.js'
# Manually authored .d.ts files
- 'ui/types/**'
# JSON API files
- 'ui/src/**/*.json'
- '!ui/src/api-file-example.json'
pull_request:
types:
- opened
- synchronize
paths:
- '.github/workflows/build-types.yml'
# We don't need to hunt for every possible case, these should cover almost all cases
- 'ui/package.json'
- 'ui/build/build.types.js'
- 'ui/build/build.javascript.js'
# Manually authored .d.ts files
- 'ui/types/**'
# JSON API files
- 'ui/src/**/*.json'
- '!ui/src/api-file-example.json'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
permissions:
contents: read # to fetch code (actions/checkout)
defaults:
run:
working-directory: ui
steps:
- uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v5
- uses: actions/setup-node@v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Ensure types are formatted correctly
run: pnpm lint:check
- name: Build the types
run: pnpm build js types
- if: ${{ github.event_name == 'pull_request' }}
run: |
echo "${{ github.event.number }}" > dist/.pr-number
- name: Upload the build artifact
uses: actions/upload-artifact@v7
with:
name: types-build
include-hidden-files: true # to include the .pr-number file
path: |
ui/dist/api
ui/dist/types
ui/dist/.pr-number
# The flow continues with ./comment-build-results.yml for PRs
================================================
FILE: .github/workflows/comment-build-results.yml
================================================
name: Comment build results
# We are not using using a single workflow on `pull_request_target`, and have two workflows on `pull_request` -> `workflow_run`:
# https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
on:
workflow_run:
workflows:
- Build types
types:
- completed
jobs:
check-current-build:
runs-on: ubuntu-latest
permissions:
actions: read # to list the workflow runs
if: >-
${{
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
}}
outputs:
run-id: ${{ fromJSON(steps.current-workflow-run.outputs.result).id }}
steps:
- name: Check current types build workflow run
id: current-workflow-run
uses: actions/github-script@v8
with:
script: |
const { data: { workflow_runs: [workflowRun] } } = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
branch: 'dev', // TODO: Get the PR target branch to support branches other than dev
workflow_id: 'build-types.yml',
event: 'push',
status: 'success',
});
return {
id: workflowRun?.id || -1,
}
comment-build-results:
runs-on: ubuntu-latest
permissions:
actions: read # to download artifacts
pull-requests: write # to comment to the PR
needs: check-current-build
if: ${{ needs.check-current-build.outputs.run-id != -1 }}
steps:
- name: Download the current types build
uses: actions/github-script@v8
env:
CURRENT_RUN_ID: ${{ needs.check-current-build.outputs.run-id }}
with:
script: |
const { writeFile, unlink } = require('node:fs/promises');
const { resolve } = require('node:path');
const __dirname = process.env.GITHUB_WORKSPACE;
const { data: { artifacts } } = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: process.env.CURRENT_RUN_ID,
});
const artifact = artifacts.find(({ name }) => name === 'types-build');
const { data: artifactData } = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact.id,
archive_format: 'zip',
});
const zipPath = resolve(__dirname, './current-build.zip');
await writeFile(zipPath, Buffer.from(artifactData));
await exec.exec('unzip', [zipPath, '-d', './current-build']);
await unlink(zipPath);
- name: Download the PR information artifact
id: pr-info
uses: actions/github-script@v8
with:
script: |
const { readFile, writeFile, unlink } = require('node:fs/promises');
const { resolve } = require('node:path');
const __dirname = process.env.GITHUB_WORKSPACE;
const { data: { artifacts } } = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
const artifact = artifacts.find(({ name }) => name === 'types-build');
const { data: artifactData } = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact.id,
archive_format: 'zip',
});
const zipPath = resolve(__dirname, './pr-info.zip');
await writeFile(zipPath, Buffer.from(artifactData));
await exec.exec('unzip', [zipPath, '-d', './pr-build']);
await unlink(zipPath);
const prNumberPath = resolve(__dirname, './pr-build/.pr-number');
const prNumberString = await readFile(prNumberPath, { encoding: 'utf-8' })
await unlink(prNumberPath);
return {
number: Number(prNumberString)
}
- name: Prepare build results
run: |
echo "# Build Results" >> build-results.md
echo "" >> build-results.md
echo "## JSON API" >> build-results.md
echo "" >> build-results.md
# git diff exits with 1 if there is no diff, which evaluates to true
if $(git diff --no-index ./current-build/api ./pr-build/api > ./api.diff); then
echo "📜 No changes detected." >> build-results.md
else
echo "📜 Changes detected:" >> build-results.md
echo '```diff' >> build-results.md
cat ./api.diff >> build-results.md
echo '```' >> build-results.md
fi
echo "" >> build-results.md
echo "## Types" >> build-results.md
echo "" >> build-results.md
# git diff exits with 1 if there is no diff, which evaluates to true
if $(git diff --no-index ./current-build/types ./pr-build/types > ./types.diff); then
echo "📜 No changes detected." >> build-results.md
else
echo "📜 Changes detected:" >> build-results.md
echo '```diff' >> build-results.md
cat ./types.diff >> build-results.md
echo '```' >> build-results.md
fi
echo "" >> build-results.md
- uses: marocchino/sticky-pull-request-comment@v3
with:
number: ${{ fromJSON(steps.pr-info.outputs.result).number }}
hide_and_recreate: true
hide_classify: 'OUTDATED'
path: build-results.md
- run: cat build-results.md >> $GITHUB_STEP_SUMMARY
================================================
FILE: .github/workflows/process-created-issue.yml
================================================
name: Process Created Issue
on:
issues:
types:
- opened
jobs:
issue-automation:
permissions:
contents: read # to fetch code (actions/checkout)
issues: write # to comment and add labels to issues
if: >-
${{
contains(github.event.issue.labels.*.name, 'kind/bug 🐞') ||
contains(github.event.issue.labels.*.name, 'kind/docs 📄')
}}
runs-on: ubuntu-latest
env:
# Mimic ternary operator, see https://github.com/actions/runner/issues/409#issuecomment-752775072
TEMPLATE_TYPE: ${{ contains(github.event.issue.labels.*.name, 'kind/bug 🐞') && 'bug' || 'docs' }}
TEMPLATE_VERSION: 'v2'
# TEMPLATE_VERSION: ${{ contains(github.event.issue.labels.*.name, 'Qv2') && 'v2' || 'v3' }} # uncomment when Quasar v3 is available
steps:
- uses: actions/checkout@v6
- uses: stefanbuck/github-issue-parser@v3
id: issue-parser
with:
template-path: .github/ISSUE_TEMPLATE/${{ env.TEMPLATE_TYPE }}-report--quasar-${{ env.TEMPLATE_VERSION }}.yml
- uses: actions/github-script@v8
env:
ISSUE_MODEL: ${{ steps.issue-parser.outputs.jsonString }}
INVALID_REPRO_MESSAGE: |
Hi @${{ github.event.issue.user.login }}! 👋
It looks like you provided an invalid or unsupported reproduction URL.
Do not use any service other than [Codepen](https://codepen.io), [jsFiddle](https://jsfiddle.net), [StackBlitz](https://stackblitz.com), [CodeSandbox](https://codesandbox.io), and [GitHub](https://github.com).
Make sure the URL you provided is correct and reachable. You can test it by visiting it in a private tab, another device, etc.
Please **edit your original post above** and provide a valid reproduction URL as explained.
Without a proper reproduction, your issue will have to get closed.
Thank you for your collaboration. 👏
with:
script: |
const templateType = process.env.TEMPLATE_TYPE;
// Use it to differentiate the behavior between different template versions, if needed
// const templateVersion = process.env.TEMPLATE_VERSION;
const issueModel = JSON.parse(process.env.ISSUE_MODEL);
const labelsToAdd = [];
// Strip out the extra information like package names in between parantheses, e.g. 'Webpack-based Quasar CLI (@quasar/cli | @quasar/app-webpack)' -> 'Webpack-based Quasar CLI'
const processValue = value => value.replace(/\s?\(.+\)$/, '');
if (issueModel.flavour) {
const flavourLabelMap = {
'Quasar CLI with Vite': 'flavour/quasar-cli-vite',
'Quasar CLI with Webpack': 'flavour/quasar-cli-webpack',
'UMD': 'flavour/umd',
'Vite Plugin': 'flavour/vite-plugin',
'Vue CLI Plugin': 'flavour/vue-cli-plugin',
};
const flavour = processValue(issueModel.flavour);
const flavourLabel = flavourLabelMap[flavour];
if (flavourLabel) {
labelsToAdd.push(flavourLabel);
}
}
if (issueModel.areas) {
const areasLabelMap = {
'Quasar CLI Commands/Configuration': 'area/cli',
'Components': 'area/components',
'Directives': 'area/directives',
'Plugins': 'area/plugins',
'Composables': 'area/composables',
'Style & Identity': 'area/style',
'Accessibility [a11y]': 'area/a11y',
'Project Creation': 'area/project-creation',
'Quasar Extras': 'area/extras',
'TypeScript Support': 'area/typescript',
'App Extension API': 'area/app-ext',
'Icon Genie CLI': 'area/icongenie',
'SPA Mode': 'mode/spa',
'SSR Mode': 'mode/ssr',
'PWA Mode': 'mode/pwa',
'Electron Mode': 'mode/electron',
'Cordova Mode': 'mode/cordova',
'Capacitor Mode': 'mode/capacitor',
'BEX Mode': 'mode/bex',
};
const areaLabels = issueModel.areas
.split(', ')
.map(rawArea => {
const area = processValue(rawArea);
return areasLabelMap[area];
})
.filter(Boolean);
labelsToAdd.push(...areaLabels);
}
if (templateType === 'bug') {
try {
const reproURL = new URL(issueModel['repro-url']);
if (reproURL.protocol !== 'https:') {
throw Error();
}
switch(reproURL.hostname) {
case 'codepen.io':
if (/^\/.+\/(pen|project)\/.+$/.test(reproURL.pathname)) {
break;
}
case 'jsfiddle.net':
if (/^\/.+$/.test(reproURL.pathname)) {
break;
}
case 'stackblitz.com':
if (/^\/edit\/.+$/.test(reproURL.pathname)) {
break;
}
case 'codesandbox.io':
if (/^\/s\/.+$/.test(reproURL.pathname)) {
break;
}
case 'github.com':
if (/^\/.+\/.+$/.test(reproURL.pathname)) {
labelsToAdd.push('bug/1-hard-to-reproduce');
break;
}
default:
throw new Error();
}
labelsToAdd.push('bug/1-repro-available');
} catch {
labelsToAdd.push('bug/0-needs-info');
}
}
if (labelsToAdd.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: labelsToAdd
});
}
if (labelsToAdd.includes('bug/0-needs-info')) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: process.env.INVALID_REPRO_MESSAGE
});
}
================================================
FILE: .github/workflows/project-creation-tests.yml
================================================
name: Project creation tests
on:
workflow_dispatch:
release:
types:
- released # A release was published, or a pre-release was changed to a release.
pull_request:
types: [opened, synchronize]
branches:
- 'dev'
paths:
- '.github/workflows/project-creation-tests.yml'
- 'create-quasar/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
if: >-
${{
github.event_name == 'workflow_dispatch' ||
github.event_name == 'pull_request' ||
startsWith(github.event.release.tag_name, 'quasar') ||
startsWith(github.event.release.tag_name, '@quasar/extras') ||
startsWith(github.event.release.tag_name, '@quasar/app-webpack') ||
startsWith(github.event.release.tag_name, '@quasar/app-vite')
}}
permissions:
contents: read # to fetch code (actions/checkout)
runs-on: ubuntu-latest
defaults:
run:
working-directory: create-quasar
name: Lint create-quasar
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v5
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Lint the code
run: pnpm lint
test:
needs: lint
permissions:
contents: read # to fetch code (actions/checkout)
runs-on: ubuntu-latest
env:
# See https://github.com/yarnpkg/yarn/issues/9015
SKIP_YARN_COREPACK_CHECK: 1
defaults:
run:
working-directory: create-quasar
strategy:
fail-fast: false
matrix:
script-type: [js, ts]
app-engine: [vite-2, webpack-4]
node-version: [22, 24]
package-manager: [yarn, npm, pnpm]
name: Test ${{ matrix.script-type }}-${{ matrix.app-engine }} (Node v${{ matrix.node-version }} - ${{ matrix.package-manager }})
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v5
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
# pnpm
- name: Get pnpm store directory
if: ${{ matrix.package-manager == 'pnpm' }}
id: pnpm-cache
run: |
echo "PNPM_CACHE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
if: ${{ matrix.package-manager == 'pnpm' }}
uses: actions/cache@v5
with:
path: ${{ steps.pnpm-cache.outputs.PNPM_CACHE_PATH }}
key: pnpm-cache-${{ matrix.app-engine }}-${{ matrix.script-type }}
restore-keys: |
pnpm-cache-${{ matrix.app-engine }}-
pnpm-cache-
# yarn
- name: Get yarn cache directory
if: ${{ matrix.package-manager == 'yarn' }}
id: yarn-cache
run: |
echo "YARN_CACHE_PATH=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Setup yarn cache
if: ${{ matrix.package-manager == 'yarn' }}
uses: actions/cache@v5
with:
path: ${{ steps.yarn-cache.outputs.YARN_CACHE_PATH }}
key: yarn-cache-${{ matrix.app-engine }}-${{ matrix.script-type }}
restore-keys: |
yarn-cache-${{ matrix.app-engine }}-
yarn-cache-
# npm
- name: Get npm cache directory
if: ${{ matrix.package-manager == 'npm' }}
id: npm-cache
run: |
echo "NPM_CACHE_PATH=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Setup npm cache
if: ${{ matrix.package-manager == 'npm' }}
uses: actions/cache@v5
with:
path: ${{ steps.npm-cache.outputs.NPM_CACHE_PATH }}
key: npm-cache-${{ matrix.app-engine }}-${{ matrix.script-type }}
restore-keys: |
npm-cache-${{ matrix.app-engine }}-
npm-cache-
- name: Create the test project
run: pnpm create-test-project ${{ matrix.script-type }} ${{ matrix.app-engine }} ${{ matrix.package-manager }}
- name: Lint the project
working-directory: create-quasar/test-project
run: ${{ matrix.package-manager }} run lint
- name: Test the build
working-directory: create-quasar/test-project
run: ${{ matrix.package-manager }} run build
- name: Test the development server
working-directory: create-quasar/test-project
env:
# For Vite, see https://github.com/jeffbski/wait-on/issues/78#issuecomment-867813529
WAIT_ON_CONFIG: |
{
"headers": {
"accept": "text/html"
}
}
# wait-on is pinned for stability and safety reasons, it can be updated manually after testing a new version
run: |
${{ matrix.package-manager }} run dev &
if [[ '${{ matrix.app-engine }}' == vite* ]]; then
echo $WAIT_ON_CONFIG > wait-on.json
npx wait-on@7.2.0 --config wait-on.json --timeout 5000 http-get://127.0.0.1:9000
else
PORT=$([[ '${{ matrix.app-engine }}' == 'webpack-4' ]] && echo '9000' || echo '8080')
# 15s is almost enough, but due to possible fluctuations in the CI environment, we set it higher than that
npx wait-on@7.2.0 --timeout 20000 http-get://127.0.0.1:$PORT
fi
kill $!
================================================
FILE: .github/workflows/release-notes.yml
================================================
name: Generate and Publish Release Notes JSON
on:
workflow_dispatch:
release:
types:
- released # A release was published, or a pre-release was changed to a release.
jobs:
generate:
permissions:
contents: read # to fetch code (actions/checkout) and to read releases (actions/github-script)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: dev
- name: Setup pnpm
uses: pnpm/action-setup@v5
- uses: actions/setup-node@v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
working-directory: ./docs
run: pnpm i
- name: Generate Release Notes
uses: actions/github-script@v8
with:
script: |
const { mkdir, writeFile } = require('node:fs/promises');
const { join } = require('node:path');
const { default: markdown } = await import('${{ github.workspace }}/docs/build/release-notes/md.mjs');
/**
* `/[\w/\-@]+/` is the name of the package. (e.g. @quasar/app-vite)
* `v` is the literal letter v between the package name and the version.
* `/[\d.\-\w]+/` is the version of the package after `v`. (e.g. 1.0.0, 1.0.0-beta.1)
*/
const versionPattern = /([\w/\-@]+)[- ]v([\d.\-\w]+)/;
/**
* GitHub issue reference (e.g. #123)
*/
const gitHubReferencePattern = /#(\d+)/g;
const gitHubReferenceToMarkdownLink = (content) =>
content.replace(
gitHubReferencePattern,
`[$1](https://github.com/${context.repo.owner}/${context.repo.repo}/issues/$1)`
);
const groups = {
v2: {
versionPatterns: {
quasar: /^2./,
'@quasar/app-webpack': /^(3|4)./,
'@quasar/app-vite': /^(1|2|3)./,
},
packages: {
quasar: [],
'@quasar/app-vite': [],
'@quasar/app-webpack': [],
'@quasar/cli': [],
'@quasar/extras': [],
'@quasar/icongenie': [],
'@quasar/vite-plugin': [],
},
},
};
const allPackageNames = new Set(
Object.values(groups).flatMap(({ packages }) => Object.keys(packages))
);
const releases = await github.paginate(
github.rest.repos.listReleases,
{
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 100,
},
({ data }) =>
data
.map((release) => {
// Split by space and use the first part for cases like this: `@quasar/app-v1.0.4 - Security update`
const matchesList = release.name.split(' ')[0].match(versionPattern);
if (!matchesList || matchesList.length < 2) {
return;
}
let [, packageName, version] = matchesList;
if (!version) {
return;
}
if (packageName === '@quasar/app') {
packageName = '@quasar/app-webpack';
}
if (!allPackageNames.has(packageName)) {
return;
}
return {
packageName,
version,
date: release.created_at,
body: release.body,
};
})
.filter((release) => release !== undefined)
);
for (const [group, { versionPatterns, packages }] of Object.entries(groups)) {
console.log('Started processing group', group);
const packageNameList = Object.keys(packages);
for (const { packageName, version, date, body } of releases) {
if (!packageNameList.includes(packageName)) {
continue;
}
if (
versionPatterns[packageName] &&
versionPatterns[packageName].test(version) === false
) {
continue;
}
packages[packageName].push({
version,
date,
body: markdown.render(gitHubReferenceToMarkdownLink(body)),
});
}
console.log('Completed processing group', group);
}
// The data goes above GitHub Actions 1 MB output limit, so we write the results to files and use actions/upload-artifact and actions/download-artifact to transfer it
const directory = './docs/dist/release-notes';
await mkdir(directory, { recursive: true });
const writeJsonFile = (name, data) =>
writeFile(
join(directory, `${name}.json`),
JSON.stringify(data),
'utf8'
);
await Promise.all(
Object.entries(groups).map(([groupName, { packages }]) => writeJsonFile(groupName, packages))
);
- name: Upload release notes JSON files
uses: actions/upload-artifact@v7
with:
name: release-notes
path: docs/dist/release-notes
# As we commit them in the `publish` job, we don't really need to keep them for long.
# We can't use 0, so we use the minimum possible, 1: https://github.com/actions/upload-artifact/issues/290
retention-days: 1
publish:
permissions: {} # No permissions needed for the active repo
runs-on: ubuntu-latest
needs: generate
steps:
- uses: actions/checkout@v6
with:
repository: quasarframework/cdn
token: ${{ secrets.CDN_REPO_PAT }}
- name: Download generated release notes JSON files
uses: actions/download-artifact@v8
with:
name: release-notes
path: release-notes
- uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_message: |
Generated release notes for Quasar packages
Triggered by: ${{ github.event.release.name || 'manual execution' }}
${{ github.event.release.html_url }}
================================================
FILE: .github/workflows/tests-on-pr-report.yml
================================================
name: Test results
on:
workflow_run:
workflows:
- UI tests
types:
- completed
jobs:
test-results:
name: Test Results
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion != 'skipped' }}
permissions:
checks: write
# for commenting the test results
pull-requests: write
# for using the artifacts API
actions: read
steps:
- name: Download the tests results artifacts
id: results
uses: actions/github-script@v8
with:
script: |
const { readFile, writeFile, unlink } = require('node:fs/promises');
const { resolve } = require('node:path');
const __dirname = process.env.GITHUB_WORKSPACE;
const { data: { artifacts } } = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
const resultArtifacts = artifacts.filter(({ name }) => name.startsWith('test-results'));
for (const artifact of resultArtifacts) {
const { data: artifactData } = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: artifact.id,
archive_format: 'zip',
});
const zipPath = resolve(__dirname, './test-results.zip');
await writeFile(zipPath, Buffer.from(artifactData));
await exec.exec('unzip', [zipPath, '-d', './test-results']);
await unlink(zipPath);
}
const eventDataArtifact = artifacts.find(({ name }) => name === 'event-data');
const { data: eventDataArtifactData } = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: eventDataArtifact.id,
archive_format: 'zip',
});
const eventDataZipPath = resolve(__dirname, './event-data.zip');
await writeFile(eventDataZipPath, Buffer.from(eventDataArtifactData));
await exec.exec('unzip', [eventDataZipPath, '-d', './event-data']);
await unlink(eventDataZipPath);
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
with:
commit: ${{ github.event.workflow_run.head_sha }}
event_file: event-data/event.json
event_name: ${{ github.event.workflow_run.event }}
files: 'test-results/*.xml'
check_name: 'UI Tests Results'
================================================
FILE: .github/workflows/tests-on-pr.yml
================================================
name: UI tests
on:
pull_request:
types: [opened, synchronize]
branches:
- 'dev'
paths:
- '.github/workflows/tests-on-pr.yml'
- 'ui/**/*.js'
- 'ui/package.json'
- 'ui/playground/package.json'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
permissions:
contents: read # to fetch code (actions/checkout)
runs-on: ubuntu-latest
# Check if the build cache exists, and if it does, do nothing else.
# Otherwise, run the build and cache it.
name: Build the packages
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v5
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Build the UI package
working-directory: ui
run: pnpm build
- name: Upload UI build artifact
uses: actions/upload-artifact@v7
with:
name: ui-build
path: ui/dist
- name: Build vite-plugin package
working-directory: vite-plugin
run: pnpm build
- name: Upload vite-plugin build artifact
uses: actions/upload-artifact@v7
with:
name: vite-plugin-build
path: vite-plugin/dist
tests:
# If the build pipeline doesn't succeed, we don't need to run tests at all
needs: build
permissions:
contents: read # to fetch code (actions/checkout)
actions: read # to correctly identify workflow run
runs-on: ubuntu-latest
defaults:
run:
working-directory: ui
strategy:
fail-fast: false
name: Tests
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v5
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Download UI build artifact
uses: actions/download-artifact@v8
with:
name: ui-build
path: ui/dist
- name: Download vite-plugin build artifact
uses: actions/download-artifact@v8
with:
name: vite-plugin-build
path: vite-plugin/dist
- name: Run tests
run: pnpm test
# Upload required artifacts to be used in tests-on-pr-report.yml
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v7
with:
name: test-results
path: ui/testing/test-results
- name: Upload GitHub Actions event data
if: ${{ always() }}
uses: actions/upload-artifact@v7
with:
name: event-data
path: ${{ github.event_path }}
overwrite: true
================================================
FILE: .gitignore
================================================
.DS_Store
.Thumbs.db
npm-debug.log
debug.log
dist/
node_modules/
.quasar/
quasar.config.*.temporary.compiled*
src-capacitor/
src-cordova/
================================================
FILE: .husky/pre-commit
================================================
pnpm exec lint-staged
================================================
FILE: .npmrc
================================================
# pnpm-related options
shamefully-hoist=true
strict-peer-dependencies=false
link-workspace-packages=true
publish-branch=dev
================================================
FILE: .oxfmtrc.json
================================================
{
"ignorePatterns": [
"**/node_modules/",
"**/dist/",
"**/templates/",
"**/quasar.config.*.temporary.compiled*",
"**/.quasar/",
"ui/icon-set/svg-*.js",
"ui/lang/index.json",
"extras/bootstrap-icons/",
"extras/eva-icons/",
"extras/fontawesome-*/",
"extras/ionicons-*/",
"extras/line-awesome/",
"extras/material-*/",
"extras/mdi-*/",
"extras/roboto-*/",
"extras/themify/",
"!create-quasar/templates/**/create-quasar-script.js",
"utils/render-ssr-error/compiled-assets/"
],
"printWidth": 80,
"arrowParens": "avoid",
"bracketSpacing": true,
"bracketSameLine": false,
"htmlWhitespaceSensitivity": "strict",
"semi": false,
"singleQuote": true,
"quoteProps": "as-needed",
"trailingComma": "none",
"useTabs": false,
"vueIndentScriptAndStyle": false,
"overrides": [
{
"files": ["*.ts"],
"options": {
"semi": true,
"singleQuote": false
}
}
]
}
================================================
FILE: .oxlintrc.json
================================================
{
"ignorePatterns": [
"**/node_modules/",
"**/dist/",
"**/quasar.config.*.temporary.compiled*",
"**/.quasar/",
"app-vite/templates/",
"app-webpack/templates/",
"create-quasar/templates/",
"!create-quasar/templates/**/create-quasar-script.js",
"extras/bootstrap-icons/",
"extras/eva-icons/",
"extras/fontawesome-*/",
"extras/ionicons-*/",
"extras/line-awesome/",
"extras/material-*/",
"extras/mdi-*/",
"extras/roboto-*/",
"extras/themify/",
"ui/icon-set/svg-*.js",
"ui/lang/index.json",
"utils/render-ssr-error/compiled-assets/"
],
"plugins": ["vue", "import", "eslint", "promise", "vue", "unicorn"],
"categories": {
"style": "error",
"pedantic": "warn",
"correctness": "error",
"suspicious": "error",
"perf": "error",
"restriction": "error"
},
"rules": {
/** Style rule overrides */
"curly": ["error", "multi-line"],
"sort-imports": [
"error",
{ "allowSeparatedGroups": true, "ignoreDeclarationSort": true }
],
"no-magic-numbers": "off",
"no-ternary": "off",
"no-nested-ternary": "off",
"sort-keys": "off",
"capitalized-comments": "off",
"func-style": "off",
"no-continue": "off",
"init-declarations": "off",
"max-statements": "off",
"operator-assignment": "off",
"prefer-destructuring": "off",
"guard-for-in": "off",
"max-params": "off",
"no-multi-assign": "off",
"prefer-promise-reject-errors": "off",
"id-length": "off",
"prefer-template": "off",
"import/no-anonymous-default-export": [
"error",
{
"allowArray": true,
"allowArrowFunction": true,
"allowLiteral": true,
"allowObject": true
}
],
"import/no-named-export": "off",
"import/group-exports": "off",
"import/exports-last": "off",
"import/no-nodejs-modules": "off",
"import/prefer-default-export": "off",
"import/consistent-type-specifier-style": "off",
"unicorn/catch-error-name": [
"error",
{
"name": "err"
}
],
"eslint/arrow-body-style": ["error", "as-needed"],
"vue/define-props-destructuring": "off",
"vue/define-props-declaration": "off",
"promise/avoid-new": "off",
"promise/param-names": "off",
"promise/prefer-await-to-callbacks": "off",
"promise/prefer-await-to-then": "off",
"unicorn/no-nested-ternary": "off",
"unicorn/no-null": "off",
"unicorn/filename-case": "off",
"unicorn/prefer-global-this": "off",
"unicorn/number-literal-case": "off", // conflicts with oxfmt
/** Performance rule overrides */
"no-await-in-loop": "off",
"prefer-set-has": "off",
"no-map-spread": "off",
/** Suspicious rule overrides */
"no-unassigned-import": ["error", { "allow": ["**/*.{sass,scss,css}"] }],
"no-array-sort": "off",
"no-array-reverse": "off",
"no-useless-concat": "off",
"require-post-message-target-origin": "off",
"no-this-in-exported-function": "off",
"promise/always-return": "off",
"promise/no-promise-in-callback": "off",
/** Correctness rule overrides */
"no-unused-vars": [
"error",
{
"ignoreRestSiblings": true
}
],
"promise/no-callback-in-promise": "off",
/** Restriction rule overrides */
"no-void": "off",
"no-plusplus": "off",
"no-param-reassign": "off",
"no-console": "off",
"complexity": "off",
"no-empty-function": "off",
"no-empty": "off",
"no-relative-parent-imports": "off",
"class-methods-use-this": "off",
"no-bitwise": "off",
"max-props": "off",
"default-case": "off",
"no-div-regex": "off",
"import/no-cycle": ["error", { "maxDepth": 3 }],
"import/no-default-export": "off",
"import/no-dynamic-require": "off",
"import/unambiguous": "off",
"promise/catch-or-return": "off",
"unicorn/no-process-exit": "off",
"unicorn/no-array-for-each": "off",
"unicorn/no-array-reduce": "off",
"unicorn/no-abusive-eslint-disable": "off",
/** Pedantic rule overrides */
"unicorn/explicit-length-check": [
"error",
{
"non-zero": "not-equal"
}
],
"no-inline-comments": "off",
"max-lines": "off",
"no-negated-condition": "off",
"no-warning-comments": "off",
"max-depth": "off",
"max-lines-per-function": "off",
"max-classes-per-file": "off",
"sort-vars": "off",
"import/max-dependencies": "off",
"unicorn/no-array-callback-reference": "off",
"unicorn/prefer-query-selector": "off"
},
"overrides": [
{
"files": ["**/*.d.ts"],
"rules": {
"no-unassigned-import": "off",
"import/no-namespace": "off"
}
},
{
"files": ["{app-vite,cli,create-quasar,icongenie}/**"],
"env": {
"node": true
},
"plugins": ["node"],
"rules": {
"import/first": "off",
"node/no-process-env": "off"
}
},
{
"files": ["{extras,app-webpack}/**"],
"env": {
"node": true
},
"plugins": ["node"],
"rules": {
"import/first": "off",
"node/global-require": "off",
"node/no-process-env": "off",
"unicorn/prefer-module": "off",
"unicorn/prefer-top-level-await": "off"
}
},
{
"files": ["ui/src/**"],
"globals": {
"__QUASAR_VERSION__": "readonly",
"__QUASAR_SSR__": "readonly",
"__QUASAR_SSR_SERVER__": "readonly",
"__QUASAR_SSR_CLIENT__": "readonly",
"__QUASAR_SSR_PWA__": "readonly"
}
},
{
"files": ["**/*.test.js"],
"rules": {
"unicorn/consistent-function-scoping": "off"
}
},
{
"files": [
"{extras,app-webpack,utils/babel-preset-app,utils/ssr-helpers}/**",
"**/*.cjs"
],
"rules": {
"no-commonjs": "off",
"unicorn/prefer-module": "off"
}
},
{
"files": ["docs/src/examples/**"],
"rules": {
"no-alert": "off"
}
}
]
}
================================================
FILE: .sasslintrc
================================================
{
"rules": {
"extends-before-mixins": 2,
"extends-before-declarations": 2,
"placeholder-in-extend": 2,
"mixins-before-declarations": [
2,
{
"exclude": [
"breakpoint",
"mq"
]
}
],
"no-warn": 1,
"no-debug": 1,
"no-ids": 0,
"no-important": 0,
"hex-notation": 0,
"indentation": [
2,
{
"size": 2
}
],
"class-name-format": 0,
"no-color-literals": 0,
"empty-line-between-blocks": 0,
"single-line-per-selector": 1,
"force-element-nesting": 0,
"property-sort-order": 0,
"variable-for-property": 0,
"leading-zero": 0
}
}
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"oxc.oxc-vscode",
"editorconfig.editorconfig",
"vue.volar",
"wayou.vscode-todo-highlight"
],
"unwantedRecommendations": [
"octref.vetur",
"hookyqr.beautify",
"dbaeumer.jshint",
"ms-vscode.vscode-typescript-tslint-plugin"
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"editor.bracketPairColorization.enabled": true,
"editor.guides.bracketPairs": true,
"editor.defaultFormatter": "oxc.oxc-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.format.oxc": "always",
"source.fixAll.oxc": "always"
},
"[javascript]": {
"editor.defaultFormatter": "oxc.oxc-vscode",
"editor.formatOnSave": true
},
"[typescript]": {
"editor.defaultFormatter": "oxc.oxc-vscode",
"editor.formatOnSave": true
},
"oxc.unusedDisableDirectives": "deny",
"oxc.configPath": ".oxlintrc.json",
"search.exclude": {
"**/dist": true,
"**/.quasar": true,
"**/quasar.config.js.temporary.*": true,
"ui/playground/src/mock-data": true,
"utils/render-ssr-error/compiled-assets": true
}
}
================================================
FILE: CONTRIBUTING.md
================================================
# Quasar Contributing Guide
Hi! We are really excited that you are interested in contributing to Quasar 👏.
Please visit our website to view the [Contribution Guide](https://quasar.dev/how-to-contribute/contribution-guide).
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015-present Razvan Stoenescu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.md
================================================

# Quasar Framework
> Build high-performance VueJS user interfaces in record time: responsive Single Page Apps, SSR Apps, PWAs, Browser extensions, Hybrid Mobile Apps and Electron Apps. If you want, all using the same codebase!
<img src="https://img.shields.io/npm/v/quasar?label=quasar"> <img src="https://img.shields.io/npm/v/%40quasar/app-webpack?label=@quasar/app-webpack"> <img src="https://img.shields.io/npm/v/%40quasar/app-vite?label=@quasar/app-vite"> <img src="https://img.shields.io/npm/v/%40quasar/cli?label=@quasar/cli"> <img src="https://img.shields.io/npm/v/%40quasar/extras.svg?label=@quasar/extras"> <img src="https://img.shields.io/npm/v/%40quasar/icongenie.svg?label=@quasar/icongenie"> <img src="https://img.shields.io/npm/v/%40quasar/vite-plugin.svg?label=@quasar/vite-plugin">
[](https://chat.quasar.dev)
<a href="https://forum.quasar.dev" target="_blank"><img src="https://img.shields.io/badge/community-forum-brightgreen.svg"></a>
[](https://good-labs.github.io/greater-good-affirmation)
[](https://github.com/quasarframework/quasar/actions/workflows/build-types.yml)
Please submit a PR to https://github.com/quasarframework/quasar-awesome with your website/app/Quasar tutorial/video etc. Thank you!
## Supporting Quasar
Quasar Framework is an MIT-licensed open source project. Its ongoing development is made possible thanks to the support by these awesome [backers](https://github.com/rstoenescu/quasar-framework/blob/dev/backers.md).
**Please read our manifest on [Why donations are important](https://quasar.dev/why-donate)**. If you'd like to become a donator, check out [Quasar Framework's Donator campaign](https://donate.quasar.dev).
### Proudly sponsored by:
<table>
<tbody>
<tr>
<td align="center" valign="middle">
<a href="https://dreamonkey.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Dreamonkey.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.hapag-lloyd.com/en/landingpage/quasar.html" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/HapagLloyd.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://irewind.com" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/iRewind.svg">
</a>
</td>
<td> </td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://qintil.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Qintil.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://synestia.pl/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Synestia.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://letsbutterfly.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Letsbutterfly.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://kalisio.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Kalisio.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://comcomservices.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/COMCOMService.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://digitalocean.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/DigitalOcean.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://www.projectfinance.io/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/ProjectFinance.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://ib-langenthal.ch/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/iBL.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://jugglestreet.com.au/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/JuggleSt.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.nodesol.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Nodesol.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://www.acornfinance.com" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/AcornFinance.svg">
</a>
</td>
<td align="center" valign="middle">
<a href="https://www.certible.com/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/Certible.svg">
</a>
</td>
</tr>
<tr></tr>
<tr>
<td align="center" valign="middle">
<a href="https://www.bairesdev.com/sponsoring-open-source-projects/" target="_blank">
<img width="200px" height="100px" src="https://cdn.quasar.dev/logo-sponsors-v2/light/BairesDev.svg">
</a>
</td>
<td> </td>
</tr>
</tbody>
</table>
## Documentation
Head on to the Quasar Framework official website: [https://quasar.dev](https://quasar.dev)
## Stay in Touch
For latest releases and announcements, follow us on our Twitter account: [@quasarframework](https://twitter.com/quasarframework)
## Chat Support
Ask questions at the official community Discord server: [https://chat.quasar.dev](https://chat.quasar.dev)
## Community Forum
Ask questions at the official community forum: [https://forum.quasar.dev](https://forum.quasar.dev)
## Contributing
Please make sure to read the [Contributing Guide](./CONTRIBUTING.md) before making a pull request. If you have a Quasar-related project/component/tool, add it with a pull request to [this curated list](https://github.com/quasarframework/quasar-awesome)!
Thank you to all the people who already [contributed to Quasar](https://github.com/quasarframework/quasar/graphs/contributors)!
## Semver
Quasar is following [Semantic Versioning 2.0](https://semver.org/).
## License
Copyright (c) 2015-present Razvan Stoenescu
[MIT License](http://en.wikipedia.org/wiki/MIT_License)
================================================
FILE: ROADMAP.md
================================================
## Quasar Framework Roadmap
Where will Quasar be in one year, five years or ten years? It's up to you, the developers using Quasar.
You, the community, are Quasar. We listen to your opinions and your needs. Which is why we encourage you to directly contact us on [Discord](https://chat.quasar.dev) or submit [Feature Requests](https://github.com/quasarframework/quasar/issues/new/choose). We carefully ponder on all the ideas and we decide along with the community what are the next steps to be taken.
### Important!
If you want to speed up the development of Quasar please consider donating to the project. With proper funding, it allows more of the team to work on the project in a much more dedicated manner.
[Donations - https://donate.quasar.dev](https://donate.quasar.dev)
If you're in a company and using Quasar for commercial projects, explain to your management the importance of monthly donations (eg. $200+) for open source projects: you're the one using it every day and this makes you the best suited person to convince them. Be creative! :)
Quasar is saving your company tens of thousands of development hours (quite literally), which in turn is a pretty high money savings. Consider giving back a part of those savings to refuel the project itself ;)
## Support policy and schedule
All major releases are typically supported for at least 12 months.
LTS support ends 12 months after the release of a new major version.
| Version | Status | Released | Active support ends | LTS support ends |
| ------- | -------- | ---------- | ------------------- | ---------------- |
| 2.x | Active | 2021-06-21 | Not planned yet | Not planned yet |
| 1.x | Inactive | 2019-03-07 | 2021-04-01 | 2023-06-30 |
Quasar v0.x versions are no longer supported.
## Major milestones
We are updating this section constantly in order to keep you up to date with our current (and new!) efforts.
_The schedule may change based on unforeseen and/or out of the ordinary circumstances._
### Evergreens
- 🚧 (WIP) Gradually add more automated tests to Quasar UI. **We're searching for contributors**, get in touch with the team on our [Discord server](https://chat.quasar.dev/) if you're willing to help!
### Q1 2026
- ✌️ (DONE) Release of `@quasar/app-vite` with Vite 8.
- ✌️ (DONE) Replace internal build system: esbuild with Rolldown, cssnano with lightningcss, eslint with oxfmt & oxlint.
### Q2 2026
- Release of a new major version of `@quasar/app-vite` with rolldown replacing esbuild for all Quasar modes compilation threads & further modernize the tooling.
- Plans for Quasar v3. We will need your input on some of the decisions that we will be taking for the new major version.
### Q3-Q4 2026
- Quasar v3 release, hopefully in Q4.
- CLI SSG mode ([#2299](https://github.com/quasarframework/quasar/issues/2299)) ([community support](https://github.com/freddy38510/quasar-app-extension-ssg))
## Archive
### Q1-Q4 2025
- CLI Auto-routing -- our efforts are superseeded by Vue Router v5 having this out of the box
### Q2-Q4 2024
- Release of the new major version of `@quasar/app-vite`
- Release of the new major version of `@quasar/app-webpack`
- Rewrite Quasar UI automation testing (switching to vitest included)
- Rewrite internal build system for Quasar UI itself (q/app work included)
### Q1 2024
- New `@quasar/app-vite` major version -- beta release
- New `@quasar/app-webpack` major version -- beta release
### Q2-4 2023
- Support Capacitor 4 and related bugfixes ([#14226](https://github.com/quasarframework/quasar/pull/14226))
- Add Quasar entry in [Vite ecosystem CI](https://github.com/vitejs/vite-ecosystem-ci)
- June 30th 2023 marks the end of life for Quasar v1. It will no longer receive updates. (postponed for the second time, previously reported EOL was 31th of December 2022)
### Q1 2023
- Release new Quasar website
- Porting Quasar packages to ESM
- Support Vite 3 and 4 in `@quasar/app-vite` ([#14077](https://github.com/quasarframework/quasar/issues/14077)) (already supported via [workaround](https://github.com/quasarframework/quasar/issues/14077#issuecomment-1353213893))
- Publish official Quasar Organizational chart
- More triaging automation ([quasarframework/rfcs#10](https://github.com/quasarframework/rfcs/issues/10))
- Website update community survey
### Q4 2022
- ✌️ (DONE) New Quasar website [preview](https://new-docs.quasar.dev/) 🔥
- ✌️ (DONE) Refactor & enhance QPagination [#14609](https://github.com/quasarframework/quasar/pull/14609)
- ✌️ (DONE) Improve a11y for Quasar components [#14609](https://github.com/quasarframework/quasar/pull/14609)
- ✌️ (DONE) Support Cypress 10/11/12 into Quasar Cypress AE, [check it out](https://github.com/quasarframework/quasar-testing/tree/dev/packages/e2e-cypress)
- ✌️ (DONE) Support Vite 4 in `@quasar/vite-plugin` [#15125](https://github.com/quasarframework/quasar/pull/15125)
### Q3 2022
- ✌️ (DONE) Quasar.Conf 2022 - 9th of July - [Watch](https://bit.ly/qconf2022yt)
- ✌️ (DONE) Quasar v2 TypeScript projects created with Quasar CLI will have all files spawned in .ts format instead of .js for all Quasar modes (_modes had templates only in .js form by default_) ([#8572](https://github.com/quasarframework/quasar/issues/8572))
- ✌️ (DONE) Support PNPM [#13615](https://github.com/quasarframework/quasar/pull/13615)
- 🚫 (BLOCKED, workaround provided) Allow to save starter kit options as JSON profiles ([#5537](https://github.com/quasarframework/quasar/issues/5537))
- ✌️ (DONE) Add Vitest integration via Quasar Vitest AE, [check it out](https://github.com/quasarframework/quasar-testing/tree/dev/packages/unit-vitest)
### Q2 2022
- ✌️ (DONE) Stable release of the new CLI based on Vite.js
- ✌️ (DONE) Support Google Material Symbols ([#13437](https://github.com/quasarframework/quasar/pull/13437))
- ✌️ (DONE) Run automatic tests on Quasar UI via GitHub Actions for every PR [#13432](https://github.com/quasarframework/quasar/pull/13432)
- ✌️ (DONE) [Video tutorials for all Quasar components](https://youtube.com/playlist?list=PLFZAa7EupbB7xC-C0YwYk7aXIAbHYX1Xl). Subscribe at [QuasarCast](https://quasarcast.com/course) to be notified when first-party advanced Quasar paid courses will be available
### Q1 2022
- ✌️ (DONE) First beta of a new CLI for Quasar based on Vite.js instead of Webpack (will have its own life along with the current Webpack-based CLI)
- ✌️ (DONE) Fix intellisense problem for packages provided by `@quasar/app` ([#9235](https://github.com/quasarframework/quasar/issues/9235))
- ✌️ (DONE) Add automatic tests to Quasar UI ([#12047](https://github.com/quasarframework/quasar/pull/12047))
- ✌️ (DONE) Support Pinia out-of-the-box ([#12707](https://github.com/quasarframework/quasar/pull/12707))
### Q4 2021
- ✌️ (DONE) Volar support ([reference](https://github.com/quasarframework/quasar/discussions/10619))
- ✌️ (DONE) Vite.js plugin for Quasar v2 ([reference](https://github.com/quasarframework/quasar/issues/7815))
- ✌️ (DONE) Triaging enhancements ([quasarframework/rfcs#10](https://github.com/quasarframework/rfcs/issues/10))
- ✌️ (DONE) Support Cypress Component Testing into Quasar Cypress AE ([reference](https://github.com/quasarframework/quasar-testing/issues/163) [reference](https://github.com/quasarframework/quasar-testing/pull/185) [reference](https://github.com/quasarframework/quasar/discussions/11496))
- ✌️ (DONE) Enhance Quasar types to be more precise, provide guidelines for community contributions ([#8642](https://github.com/quasarframework/quasar/issues/8642), [#8493](https://github.com/quasarframework/quasar/issues/8493), [#11090](https://github.com/quasarframework/quasar/issues/11090), [#11043](https://github.com/quasarframework/quasar/issues/11043))
### Q3 2021
- ✌️ (DONE) Migration to Quasar v2 of official AEs ([reference](https://github.com/quasarframework/quasar/discussions/9560))
- ✌️ (DONE) Migration to Quasar v2 of most used testing AEs ([`@quasar/testing`](https://github.com/quasarframework/quasar-testing/tree/dev/packages/testing), [`@quasar/testing-unit-jest`](https://github.com/quasarframework/quasar-testing/tree/dev/packages/unit-jest), [`@quasar/testing-e2e-cypress`](https://github.com/quasarframework/quasar-testing/tree/dev/packages/e2e-cypress)) ([reference](https://github.com/quasarframework/quasar/discussions/10341))
- ✌️ (DONE) Quasar brand rework ([reference](https://dev.to/quasar/quasar-brand-refresh-and-new-partnership-ao1))
- 🚫 (CANCELLED 😢) ~~Quasar.Conf 2021~~ ([reference](https://twitter.com/quasarframework/status/1435177368352698375))
### Q2 2021
- ✌️ (DONE) Upgrade the App CLI for Quasar v2 to Webpack v5 ([reference](https://github.com/quasarframework/quasar/issues/8102))
- ✌️ (DONE) Quasar v2 will become officially the "latest" version of Quasar. The documentation website (https://quasar.dev) will point to v2 and the v1 docs will live under https://v1.quasar.dev. The end of life for Quasar v1 will be March 2022 and we will keep on backporting fixes and new features from v2 to it until then.
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 2.x.x | :white_check_mark: |
| 1.x.x | :x: |
| 0.17.x | :x: |
| < 0.17 | :x: |
## Reporting a Vulnerability
If you have found a potential security threat, vulnerability or exploit in Quasar
or one of its upstream dependencies, please DON’T create a pull-request, DON’T
file an issue on GitHub, DON’T mention it on Discord and DON’T create a forum thread.
DO reach out to the team by sending an email to security@quasar.dev - we
will investigate and work with you to triage this issue and help you to report it
if appropriate. At the current time we do not have the financial ability to reward
bounties, but in extreme cases will at our discretion consider a reward.
## Security Audit
You can apply to book the Quasar team’s security experts to perform a Security Audit
for your project. Contact us to find out more about how to acquire, validate and publish
an official timestamped and version-locked audit badge.
security@quasar.dev
## Security Documentation
https://quasar.dev/security/
================================================
FILE: app-vite/.gitignore
================================================
ssl-server.pem
================================================
FILE: app-vite/LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015-present Razvan Stoenescu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: app-vite/README.md
================================================

# Quasar Framework App CLI with Vite (Local)
> Build high-performance VueJS user interfaces in record time: responsive Single Page Apps, SSR Apps, PWAs, Browser extensions, Hybrid Mobile Apps and Electron Apps. If you want, all using the same codebase!
<img src="https://img.shields.io/npm/v/%40quasar/app-vite?label=@quasar/app-vite">
[](https://chat.quasar.dev)
<a href="https://forum.quasar.dev" target="_blank"><img src="https://img.shields.io/badge/community-forum-brightgreen.svg"></a>
[](https://good-labs.github.io/greater-good-affirmation)
Please submit a PR to https://github.com/quasarframework/quasar-awesome with your website/app/Quasar tutorial/video etc. Thank you!
## Supporting Quasar
Quasar Framework is an MIT-licensed open source project. Its ongoing development is made possible thanks to the support by these awesome [backers](https://github.com/rstoenescu/quasar-framework/blob/dev/backers.md).
**Please read our manifest on [Why donations are important](https://quasar.dev/why-donate)**. If you'd like to become a donator, check out [Quasar Framework's Donator campaign](https://donate.quasar.dev).
## Documentation
Head on to the Quasar Framework official website: [https://quasar.dev](https://quasar.dev)
## Stay in Touch
For latest releases and announcements, follow on Twitter: [@quasarframework](https://twitter.com/quasarframework)
## Chat Support
Ask questions at the official community Discord server: [https://chat.quasar.dev](https://chat.quasar.dev)
## Community Forum
Ask questions at the official community forum: [https://forum.quasar.dev](https://forum.quasar.dev)
## Contributing
I'm excited if you want to contribute to Quasar under any form (report bugs, write a plugin, fix an issue, write a new feature). Please read the [Contributing Guide](../CONTRIBUTING.md).
## Semver
Quasar is following [Semantic Versioning 2.0](https://semver.org/).
## License
Copyright (c) 2015-present Razvan Stoenescu
[MIT License](http://en.wikipedia.org/wiki/MIT_License)
================================================
FILE: app-vite/assets/logo.art
================================================
.d88888b.
d88P" "Y88b
888 888
888 888 888 888 8888b. .d8888b 8888b. 888d888
888 888 888 888 "88b 88K "88b 888P"
888 Y8b 888 888 888 .d888888 "Y8888b. .d888888 888
Y88b.Y8b88P Y88b 888 888 888 X88 888 888 888
"Y888888" "Y88888 "Y888888 88888P' "Y888888 888
Y8b
================================================
FILE: app-vite/bin/quasar.js
================================================
#!/usr/bin/env node
// oxlint-disable-next-line import/no-unassigned-import
import '../lib/node-version-check.js'
if (
process.argv.includes('--nocolor') ||
(await import('../lib/utils/is-terminal.js').then(({ isCI }) => isCI))
) {
process.env.FORCE_COLOR = '0'
}
const commands = [
'dev',
'build',
'prepare',
'clean',
'inspect',
'describe',
'ext',
'run',
'mode',
'info',
'new',
'help'
]
let cmd = process.argv[2]
if (cmd) {
if (cmd.length === 1) {
const mapToCmd = {
d: 'dev',
b: 'build',
p: 'prepare',
e: 'ext',
r: 'run',
c: 'clean',
m: 'mode',
i: 'info',
n: 'new',
h: 'help'
}
cmd = mapToCmd[cmd]
}
if (commands.includes(cmd)) {
process.argv.splice(2, 1)
} else {
if (cmd === '-v' || cmd === '--version') {
const { cliPkg } = await import('../lib/utils/cli-runtime.js')
console.log(
`${cliPkg.name} ${cliPkg.version}` +
(process.env.QUASAR_CLI_VERSION
? ` (@quasar/cli ${process.env.QUASAR_CLI_VERSION})`
: '')
)
process.exit(0)
}
const { log, warn } = await import('../lib/utils/logger.js')
if (cmd === '-h' || cmd === '--help') {
cmd = 'help'
} else if (cmd.indexOf('-') === 0) {
warn('Command must come before the options')
cmd = 'help'
} else {
log(
`Looking for Quasar App Extension "${process.argv[2]}" command${(process.argv[3] && ' "' + process.argv[3] + '"') || ''}`
)
const exit = process.exit
process.exit = (code, reason) => {
if (reason === 'ext-missing') {
import('../lib/cmd/help.js').then(() => {
exit(0)
})
} else {
exit(code)
}
}
cmd = 'run'
}
}
} else {
cmd = 'help'
}
import(`../lib/cmd/${cmd}.js`)
================================================
FILE: app-vite/exports/bex/background.js
================================================
import { BexBridge } from './private/bex-bridge.js'
function interceptRequests(devServerPort) {
/**
* We intercept all fetch requests from the extension page and redirect them to the dev server
* for HMR purposes.
*/
const bexOrigin = `chrome-extension://${chrome.runtime.id}`
const hrefRE = /=$|=(?=&)/g
async function getDevServerResponse(url) {
// point it to the dev server
url.protocol = 'http:'
url.host = 'localhost'
url.port = devServerPort
// ensure we have a fresh version of the response
url.searchParams.set('t', Date.now())
// fetch the requested resource
const request = await fetch(url.href.replace(hrefRE, ''))
// and return it wrapped as if it comes from the extension
return new Response(request.body, {
headers: {
'Content-Type':
request.headers.get('Content-Type') || 'text/javascript',
'Cache-Control': request.headers.get('Cache-Control') || ''
}
})
}
self.addEventListener('fetch', evt => {
const url = new URL(evt.request.url)
if (url.origin === bexOrigin) {
evt.respondWith(getDevServerResponse(url))
}
})
}
function connectToDevServer(devServerPort, wsToken) {
const pingUrl = `http://localhost:${devServerPort}/__vite_ping`
const socket = new WebSocket(
`ws://localhost:${devServerPort}?token=${wsToken}`,
'vite-hmr'
)
const contentScriptPortList = new Set()
const contentScriptPortNameRE = /^quasar@hmr\/content-script\//
function reloadExtension() {
const len = contentScriptPortList.size
const suffix =
len !== 0 ? ` along with ${len} content script${len > 1 ? 's' : ''}` : ''
console.log(`[QBex|HMR] Reloading extension${suffix}...`)
for (const port of contentScriptPortList) {
port.postMessage('qbex:hmr:reload-content')
}
chrome.runtime.reload()
}
// Listen for messages
socket.addEventListener('message', ({ data }) => {
const { type, event } = JSON.parse(data)
if (type === 'connected') {
console.log('[QBex|HMR] Connected')
// send a ping every 30s to keep the connection alive
const interval = setInterval(() => socket.send('ping'), 30_000)
socket.addEventListener('close', () => clearInterval(interval))
return
}
if (type === 'custom' && event === 'qbex:hmr:reload') {
reloadExtension()
}
})
socket.addEventListener('close', async ({ wasClean }) => {
if (wasClean) return
console.log('[QBex|HMR] Lost connection. Reconnecting...')
let tries = 1
while (true) {
try {
if (tries > 2000) {
console.log(
'[QBex|HMR] Aborting re-connect after 2000 failed attempts. Please manually reload the extension.'
)
return
}
await fetch(pingUrl)
break
} catch {
console.log('[QBex|HMR] Could not re-connect. Retrying...')
await new Promise(resolve => {
setTimeout(resolve, 1000)
})
tries++
}
}
reloadExtension()
})
chrome.runtime.onConnect.addListener(port => {
const { name } = port
if (contentScriptPortNameRE.test(name)) {
contentScriptPortList.add(port)
port.onDisconnect.addListener(() => {
contentScriptPortList.delete(port)
})
port.postMessage('qbex:hmr:hello')
}
})
}
/**
* Only run these in development mode and in a background service worker.
* Currently only Chrome supports this.
*/
if (import.meta.env.QUASAR_DEV && import.meta.env.QUASAR_TARGET === 'chrome') {
const devServerPort = import.meta.env.QUASAR_BEX_SERVER_PORT
const wsToken = import.meta.env.QUASAR_BEX_WS_TOKEN
interceptRequests(devServerPort)
connectToDevServer(devServerPort, wsToken)
}
let scriptHasBridge = false
export function createBridge({ debug } = {}) {
if (scriptHasBridge) {
console.error('Background Quasar Bridge has already been created.')
return
}
scriptHasBridge = true
return new BexBridge({
type: 'background',
debug
})
}
================================================
FILE: app-vite/exports/bex/content.js
================================================
import { BexBridge } from './private/bex-bridge.js'
/**
* Only run these in development mode and in Chrome.
* Only Chrome allows the background counterpart initialization
* to take place in a service worker.
*/
if (import.meta.env.QUASAR_DEV && import.meta.env.QUASAR_TARGET === 'chrome') {
let scriptIsReloading = false
const scriptName = import.meta.env.QUASAR_BEX_SCRIPT_NAME
const portName = `quasar@hmr/content-script/${scriptName}`
const banner = `[QBex|HMR] [${scriptName}]`
const onMessage = message => {
if (message === 'qbex:hmr:hello') {
console.log(`${banner} Connected to background`)
return
}
if (message === 'qbex:hmr:reload-content') {
console.log(`${banner} Reload requested by background...`)
scriptIsReloading = true
// reload the page with a small delay,
// to allow the extension to be also reloaded
setTimeout(() => {
window.location.reload()
}, 100)
}
}
const connect = () => {
const port = chrome.runtime.connect({ name: portName })
port.onMessage.addListener(onMessage)
port.onDisconnect.addListener(() => {
if (scriptIsReloading) return
port.onMessage.removeListener(onMessage)
console.log(
chrome.runtime.lastError?.message?.includes(
'Could not establish connection'
)
? `${banner} Could not connect to background`
: `${banner} Lost connection to background`
)
setTimeout(connect, 1000)
})
}
connect()
}
let scriptHasBridge = false
export function createBridge({ debug } = {}) {
if (scriptHasBridge) {
console.error('Content script Quasar Bridge has already been created.')
return
}
scriptHasBridge = true
return new BexBridge({
type: 'content',
name: import.meta.env.QUASAR_BEX_SCRIPT_NAME,
debug
})
}
================================================
FILE: app-vite/exports/bex/private/bex-bridge.js
================================================
const portNameRE = /^background$|^app$|^content@/
const { runtime } =
import.meta.env.QUASAR_TARGET === 'firefox' ? browser : chrome
/**
* @param {number} max
* @returns {number}
*/
function getRandomId(max) {
return Math.floor(Math.random() * max)
}
/**
* @typedef Message
* @property {string} from
* @property {string} to
* @property {string} event
* @property {any} payload
*/
export class BexBridge {
// Public properties
/** @type {string} */
portName = null
/** @type {boolean} */
isConnected = false
/** @type {{ type: 'on' | 'once', callback: (message: Message) => void }[]} */
listeners = {}
/** @type {{ [portName: string]: chrome.runtime.Port }} */
portMap = {}
/** @type {string[]} */
portList = []
/** @type {{ [id: string]: { portName: string, resolve: (payload: any) => void, reject: (err: any) => void } }} */
messageMap = {}
/** @type {{ [id: string]: { portName: string, number: number, messageType: string, messageProps: any, payload: any[] } }} */
chunkMap = {}
// Private properties
/** @type {'background' | 'content' | 'app'} */
#type
/** @type {boolean} */
#debug = false
/** @type {string} */
#banner
/**
* @param {{ type: 'background' | 'content' | 'app', name?: string, debug?: boolean }} options
*/
constructor({ type, name = '', debug }) {
this.portName = type
this.#type = type
if (type === 'content') {
/**
* There can be multiple instances of the same content script
* but for different tabs, so we need to differentiate them.
*
* Generating an easy to handle id for the content script.
*/
this.portName = `${type}@${name}-${getRandomId(10_000)}`
}
this.#banner = `[QBex|${this.portName}]`
this.#debug = debug === true
if (type !== 'background') {
this.on('@quasar:ports', ({ payload }) => {
this.portList = payload.portList
if (payload.removed !== void 0) {
this.#cleanupPort(payload.removed)
}
})
return
}
/**
* Else we're the background script
*/
this.isConnected = true
const onPacket = this.#onPacket.bind(this)
runtime.onConnect.addListener(port => {
// if it's not a bridge port on the other end,
// then ignore it
if (!portNameRE.test(port.name)) return
if (this.portMap[port.name] !== void 0) {
this.warn(
`Connection with "${port.name}" already exists.` +
' Disconnecting the previous one and connecting the new one.'
)
this.portMap[port.name].disconnect()
this.#cleanupPort(port.name)
}
this.portMap[port.name] = port
port.onMessage.addListener(onPacket)
port.onDisconnect.addListener(() => {
port.onMessage.removeListener(onPacket)
this.#cleanupPort(port.name)
this.log(`Closed connection with ${port.name}.`)
this.#onPortChange({ removed: port.name })
})
this.log(`Opened connection with ${port.name}.`)
this.#onPortChange({ added: port.name })
})
}
/**
* @returns {Promise<void>}
*/
connectToBackground() {
if (this.#type === 'background') {
return Promise.reject(
'The background script itself does not need to connect'
)
}
if (this.isConnected) {
return Promise.reject('The bridge is already connected')
}
const portToBackground = runtime.connect({ name: this.portName })
return new Promise((resolve, reject) => {
const onPacket = packet => {
if (!this.isConnected) {
/**
* We rely on the fact that upon connection is established
* the background script will send a @quasar:ports event
*/
this.isConnected = true
this.log('Connected to the background script.')
this.portMap = { background: portToBackground }
resolve()
}
this.#onPacket(packet)
}
const onDisconnect = () => {
if (
runtime.lastError?.message?.includes('Could not establish connection')
) {
this.isConnected = false
portToBackground.onMessage.removeListener(onPacket)
portToBackground.onMessage.removeListener(onDisconnect)
reject('Could not connect to the background script.')
return
}
this.isConnected = false
for (const id in this.messageMap) {
const item = this.messageMap[id]
item.reject('Connection was closed')
}
this.portMap = {}
this.portList = []
this.messageMap = {}
this.chunkMap = {}
this.log('Closed connection with the background script.')
}
portToBackground.onMessage.addListener(onPacket)
portToBackground.onDisconnect.addListener(onDisconnect)
})
}
/**
* @returns {Promise<void>}
*/
disconnectFromBackground() {
if (this.#type === 'background') {
return Promise.reject('Background script does not need to disconnect')
}
if (!this.isConnected) {
return Promise.reject(
'Tried to disconnect from the background script but the port was not connected'
)
}
this.portMap.background.disconnect()
delete this.portMap.background
this.isConnected = false
return Promise.resolve()
}
/**
* @param {string} event
* @param {(message: Message) => void} callback
*/
on(event, callback) {
if (!event) {
this.warn('Tried add listener but no event specified.')
return
}
if (typeof callback !== 'function') {
this.warn('Tried add listener but no valid callback function specified.')
return
}
const target = this.listeners[event] || (this.listeners[event] = [])
target.push({ type: 'on', callback })
this.log(`Added a listener for event: "${event}".`)
}
/**
* @param {string} event
* @param {(message: Message) => void} callback
*/
once(event, callback) {
if (!event) {
this.warn('Tried add listener but no event specified.')
return
}
if (typeof callback !== 'function') {
this.warn('Tried add listener but no valid callback function specified.')
return
}
const target = this.listeners[event] || (this.listeners[event] = [])
target.push({ type: 'once', callback })
this.log(`Added a one-time listener for event: "${event}".`)
}
/**
* @param {string} event
* @param {(message: Message) => void} callback
*/
off(event, callback) {
if (!event) {
this.warn('Tried to remove listeners but no event specified.')
return
}
const list = this.listeners[event]
if (list === void 0) {
this.warn(
`Tried to remove listener for "${event}" event but there is no such listener attached.`
)
return
}
if (callback === void 0) {
if (event.startsWith('@quasar:')) {
// ensure we don't remove internal listeners
this.listeners[event] = [list[0]]
} else {
delete this.listeners[event]
}
this.log(`Stopped listening for "${event}".`)
return
}
if (typeof callback !== 'function') {
this.warn(
'Tried to remove listener but the callback specified is not a function.'
)
return
}
const liveEvents = list.filter(entry => entry.callback !== callback)
if (liveEvents.length !== 0) {
this.listeners[event] = liveEvents
this.log(`Removed a listener for: "${event}".`)
} else {
delete this.listeners[event]
this.log(`Stopped listening for: "${event}".`)
}
}
/**
* @param {{ event: string, to: string, payload: any } | undefined} param
* @returns {Promise<any>} response payload
*/
async send({ event, to, payload } = {}) {
if (!this.isConnected) {
throw new Error(
'Tried to send message but the bridge is not connected. Please connect it first.'
)
}
if (!event) {
throw new Error('Tried to send message with no "event" prop specified')
}
if (!to) {
throw new Error('Tried to send message with no "to" prop specified')
}
if (!this.portList.includes(to)) {
throw new Error(
this.#type === 'background'
? `Tried to send message to "${to}" but there is no such port registered`
: `Tried to send message to "${to}" but the port to background is not available to send through`
)
}
const id = getRandomId(1_000_000)
await this.#sendMessage({
id,
to,
payload,
messageType: 'event-send',
messageProps: { event }
})
if (!this.portList.includes(to)) {
throw new Error(
`Connection to "${to}" was closed while waiting for a response`
)
}
return new Promise((resolve, reject) => {
this.messageMap[id] = {
portName: to,
resolve: responsePayload => {
delete this.messageMap[id]
resolve(responsePayload)
},
reject: err => {
delete this.messageMap[id]
reject(err)
}
}
})
}
/**
* @param {boolean} value
*/
setDebug(value) {
this.#debug = value === true
}
log(...args) {
if (this.#debug !== true || args.length === 0) return
const lastArg = args.at(-1)
if (lastArg !== void 0 && Object(lastArg) === lastArg) {
const log = `${this.#banner} ${args.slice(0, -1).join(' ')} (click to expand)`
console.groupCollapsed(log)
console.dir(lastArg)
console.groupEnd(log)
} else {
console.log(this.#banner, ...args)
}
}
warn(...args) {
if (args.length === 0) return
const lastArg = args.at(-1)
if (lastArg !== void 0 && Object(lastArg) === lastArg) {
console.warn(this.#banner, ...args.slice(0, -1))
const group = 'The above warning details (click to expand)'
console.groupCollapsed(group)
console.dir(lastArg)
console.groupEnd(group)
} else {
console.warn(this.#banner, ...args)
}
}
/**
* Should be used only by the background script
* @param {{ added?: string } | { removed?: string }} reason
*/
#onPortChange(reason) {
this.portList = Object.keys(this.portMap)
const list = ['background', ...this.portList]
for (const portName of this.portList) {
this.send({
event: '@quasar:ports',
to: portName,
payload: {
portList: list.filter(name => name !== portName),
...reason
}
}).catch(err => {
this.warn(`Failed to inform "${portName}" about the port list.`, err)
})
}
}
/**
* @param {Message} message
*/
async #triggerMessageEvent(message) {
const list = this.listeners[message.event]
if (list === void 0) return
const plural = list.length > 1 ? 's' : ''
this.log(
`Triggering ${list.length} listener${plural} for event: "${message.event}".`,
{
message,
listeners: list
}
)
let responsePayload
// oxlint-disable-next-line unicorn/no-useless-spread
for (const { type, callback } of [...list]) {
if (type === 'once') {
this.off(message.event, callback)
}
try {
if (responsePayload === void 0) {
const value = callback(message)
responsePayload = value instanceof Promise ? await value : value
} else {
callback(message)
}
} catch (err) {
this.warn(
`Error while triggering listener${plural} for event: "${message.event}".`,
{
error: err,
message,
listener: { type, callback }
}
)
throw err
}
}
return responsePayload
}
/**
* @param {string} portName
*/
#cleanupPort(portName) {
for (const id in this.chunkMap) {
const packet = this.chunkMap[id]
if (packet.portName === portName) {
delete this.chunkMap[id]
}
}
for (const id in this.messageMap) {
const packet = this.messageMap[id]
if (packet.portName === portName) {
packet.reject('Connection was closed')
}
}
delete this.portMap[portName]
}
#onPacket(packet) {
/**
* if it's not a packet sent by this bridge
* then ignore it
*/
if (
Object(packet) !== packet ||
packet.id === void 0 ||
packet.from === void 0 ||
packet.to === void 0 ||
packet.type === void 0
) {
this.log(
'Received a message that does not appear to be emitted by a Quasar bridge or is malformed.',
packet
)
return
}
this.log(
`Received message of type "${packet.type}" from "${packet.from}".`,
packet
)
/**
* if the packet is not addressed to this bridge
* then forward it to the target
*/
if (packet.to !== this.portName) {
this.#sendPacket(packet).catch(err => {
this.warn(
`Failed to forward message of type "${packet.type}" from "${packet.from}" to "${packet.to}".`,
err
)
this.#sendMessage({
id: packet.id,
to: packet.from,
messageType: 'event-response',
messageProps: {
error: {
message: err.message,
stack: err.stack || 'no stack available'
},
quiet: true
}
})
})
return
}
if (packet.type === 'full') {
this.#onMessage({
id: packet.id,
from: packet.from,
to: packet.to,
payload: packet.payload,
type: packet.messageType,
props: packet.messageProps
})
return
}
if (packet.type === 'chunk') {
const chunk = this.chunkMap[packet.id]
if (chunk === void 0) {
if (packet.chunkIndex !== void 0) {
this.warn('Received an unregistered chunk.', packet)
return
}
this.chunkMap[packet.id] = {
portName: packet.from,
number: packet.chunksNumber,
messageType: packet.messageType,
messageProps: packet.messageProps,
payload: []
}
return
}
// if we received an unexpected chunk
if (packet.chunkIndex !== chunk.payload.length) {
this.warn('Received an out of order chunk.', packet)
// free up resources
delete this.chunkMap[packet.id]
return
}
chunk.payload.push(packet.payload)
// if we received all chunks...
if (packet.chunkIndex === chunk.number - 1) {
delete this.chunkMap[packet.id]
this.#onMessage({
id: packet.id,
from: packet.from,
to: packet.to,
payload: chunk.payload,
type: chunk.messageType,
props: chunk.messageProps
})
}
return
}
if (packet.type === 'chunk-abort') {
delete this.chunkMap[packet.id]
return
}
this.warn(`Received an unknown message type: "${packet.type}".`)
}
#sendPacket(packet) {
this.log(
packet.from === this.portName
? `Sending message of type "${packet.type}" to "${packet.to}".`
: `Forwarding message of type "${packet.type}" from "${packet.from}" to "${packet.to}".`,
packet
)
const port =
this.#type === 'background'
? this.portMap[packet.to]
: this.portMap.background
if (!this.portList.includes(packet.to)) {
return Promise.reject(
`Tried to send message of type "${packet.type}" to "${packet.to}" but there is no such port registered`
)
}
if (port === void 0) {
return Promise.reject(
this.#type === 'background'
? `Tried to send message of type "${packet.type}" to "${packet.to}" but the port is not available`
: `Tried to send message of type "${packet.type}" to "${packet.to}" but the port to background is not available to forward through`
)
}
try {
port.postMessage(packet)
} catch (err) {
this.warn(`Failed to send message to "${packet.to}".`, err)
return Promise.reject(err)
}
return Promise.resolve()
}
/**
* @param {{ id?: number, to: string, payload: any, messageType: "event-send" | "event-response", messageProps: any }} param
*/
#sendMessage({
id = getRandomId(1_000_000),
to,
payload,
messageType,
messageProps
}) {
if (!Array.isArray(payload)) {
return this.#sendPacket({
id,
from: this.portName,
to,
type: 'full',
payload,
messageType,
messageProps
})
}
let promise = this.#sendPacket({
id,
from: this.portName,
to,
type: 'chunk',
chunksNumber: payload.length,
messageType,
messageProps
})
for (let i = 0; i < payload.length; i++) {
promise = promise.then(() =>
this.#sendPacket({
id,
from: this.portName,
to,
type: 'chunk',
payload: payload[i],
chunkIndex: i
})
)
}
return promise.catch(err => {
// oxlint-disable-next-line promise/no-nesting
this.#sendPacket({
id,
from: this.portName,
to,
type: 'chunk-abort'
}).catch(sendPacketErr => {
this.warn(
`Failed to send a chunk-abort message to "${to}".`,
sendPacketErr
)
})
throw err
})
}
#onMessage(message) {
if (message.type === 'event-response') {
const target = this.messageMap[message.id]
if (target === void 0) {
if (message.props.quiet !== true) {
this.warn(
`Received a response for an unknown message id: "${message.id}".`,
message
)
}
return
}
if (message.props.error !== void 0) {
target.reject(message.props.error)
} else {
target.resolve(message.payload)
}
return
}
if (message.type === 'event-send') {
this.#triggerMessageEvent({
from: message.from,
to: message.to,
event: message.props.event,
payload: message.payload
})
.then(returnPayload => {
this.#sendMessage({
id: message.id,
to: message.from,
payload: returnPayload,
messageType: 'event-response',
messageProps: {}
})
})
.catch(err => {
this.#sendMessage({
id: message.id,
to: message.from,
messageType: 'event-response',
messageProps: {
error: {
message: err.message,
stack: err.stack || 'no stack available'
}
}
})
})
return
}
this.warn(
`Received a message with unknown type: "${message.type}".`,
message
)
}
}
================================================
FILE: app-vite/exports/eslint/eslint.cjs
================================================
const ignoreList = [
'dist/*',
'src-capacitor/*',
'src-cordova/*',
'.quasar/*',
'quasar.config.*.temporary.compiled*'
]
module.exports = {
configs: {
// using a function so we can add more configurable
// stuff later if needed without breaking changes
recommended() {
return [{ ignores: ignoreList }]
}
}
}
================================================
FILE: app-vite/exports/eslint/eslint.js
================================================
const ignoreList = [
'dist/*',
'src-capacitor/*',
'src-cordova/*',
'.quasar/*',
'quasar.config.*.temporary.compiled*'
]
export default {
configs: {
// using a function so we can add more configurable
// stuff later if needed without breaking changes
recommended() {
return [{ ignores: ignoreList }]
}
}
}
================================================
FILE: app-vite/exports/testing/testing.js
================================================
/**
* This endpoint is used exclusively by @quasar/testing AEs
*/
import { getCtx } from '../../lib/utils/get-ctx.js'
import { QuasarConfigFile } from '../../lib/quasar-config-file.js'
import { quasarSpaConfig } from '../../lib/modes/spa/spa-config.js'
/**
* Retrieve the vite config (SPA only) for @quasar/testing AE
* @param {*} ctxParams
* @returns {Promise<import('vite').UserConfig>}
*/
export async function getTestingConfig(ctxParams = {}) {
const ctx = getCtx({
mode: 'spa',
dev: true,
...ctxParams
})
const quasarConfFile = new QuasarConfigFile({
ctx,
port: 8080,
host: 'localhost'
})
const quasarConf = await quasarConfFile.read()
const viteConf = await quasarSpaConfig.vite(quasarConf)
return viteConf
}
================================================
FILE: app-vite/exports/wrappers.js
================================================
// Functions in this file are no-op,
// they just take a callback function and return it
// They're used to apply typings to the callback
// parameters and return value when using Quasar with TypeScript
const wrapper = callback => callback
export const defineConfig = wrapper
export const defineBoot = wrapper
export const definePreFetch = wrapper
export const defineRouter = wrapper
export const defineStore = wrapper
export const defineSsrMiddleware = wrapper
export const defineSsrCreate = wrapper
export const defineSsrInjectDevMiddleware = wrapper
export const defineSsrListen = wrapper
export const defineSsrClose = wrapper
export const defineSsrServeStaticContent = wrapper
export const defineSsrRenderPreloadTag = wrapper
================================================
FILE: app-vite/lib/app-builder.js
================================================
import fse from 'fs-extra'
import { basename, dirname, isAbsolute, join } from 'node:path'
import { AppTool } from './app-tool.js'
import { printBuildSummary } from '../lib/utils/print-build-summary.js'
export class AppBuilder extends AppTool {
quasarConf
constructor({ argv, quasarConf }) {
super({ argv, ctx: quasarConf.ctx })
this.quasarConf = quasarConf
}
readFile(filename) {
const target = isAbsolute(filename)
? filename
: join(this.quasarConf.build.distDir, filename)
return fse.readFileSync(target, 'utf8')
}
writeFile(filename, content) {
const target = isAbsolute(filename)
? filename
: join(this.quasarConf.build.distDir, filename)
fse.ensureDirSync(dirname(target))
fse.writeFileSync(target, content, 'utf8')
}
copyFiles(patterns, targetFolder = this.quasarConf.build.distDir) {
patterns.forEach(entry => {
const from = this.ctx.appPaths.resolve.app(entry.from)
if (!fse.existsSync(from)) return
const to = join(targetFolder, entry.to, basename(from))
if (entry.from !== '.npmrc') {
fse.copySync(from, to)
return
}
// handle .npmrc separately
let content = this.readFile(from)
if (!content.includes('shamefully-hoist')) {
content += '\n# needed by pnpm\nshamefully-hoist=true'
}
// very important, otherwise PNPM creates symlinks which is NOT
// what we want for an Electron app that should run cross-platform
if (!content.includes('node-linker')) {
content +=
'\n# pnpm needs this otherwise it creates symlinks\nnode-linker=hoisted'
}
this.writeFile(to, content)
})
}
moveFile(source, destination) {
const input = isAbsolute(source)
? source
: join(this.quasarConf.build.distDir, source)
const output = isAbsolute(destination)
? destination
: join(this.quasarConf.build.distDir, destination)
fse.moveSync(input, output)
}
removeFile(filename) {
const target = isAbsolute(filename)
? filename
: join(this.quasarConf.build.distDir, filename)
fse.removeSync(target)
}
printSummary(folder, showGzipped) {
printBuildSummary(folder, showGzipped)
}
}
================================================
FILE: app-vite/lib/app-devserver.js
================================================
import { AppTool } from './app-tool.js'
import { printDevRunningBanner } from './utils/banner.js'
import { encodeForDiff } from './utils/encode-for-diff.js'
import { EntryFilesGenerator } from './entry-files-generator.js'
import { generateTypes } from './types-generator.js'
function getConfSnapshot(extractFn, quasarConf, diffExtractFnMap) {
return extractFn(quasarConf, diffExtractFnMap).map(item =>
item ? encodeForDiff(item) : ''
)
}
export class AppDevserver extends AppTool {
#diffList = {}
#diffExtractFnMap = {}
#entryFiles
#runQueue = Promise.resolve()
#runId = 0
constructor(opts) {
super(opts)
this.#entryFiles = new EntryFilesGenerator(this.ctx)
this.registerDiff('entryFiles', quasarConf => [
quasarConf.boot,
quasarConf.css,
quasarConf.extras,
quasarConf.animations,
quasarConf.framework,
quasarConf.sourceFiles,
quasarConf.preFetch,
quasarConf.build.publicPath,
quasarConf.ssr.pwa,
quasarConf.ssr.middlewares,
quasarConf.ssr.manualStoreSsrContextInjection,
quasarConf.ssr.manualStoreSerialization,
quasarConf.ssr.manualStoreHydration,
quasarConf.ssr.manualPostHydrationTrigger
])
this.registerDiff('types', quasarConf => [
quasarConf.build.typescript,
quasarConf.build.alias
])
this.registerDiff('viteUrl', quasarConf => [quasarConf.metaConf.APP_URL])
this.registerDiff('vite', quasarConf => [
quasarConf.htmlVariables,
quasarConf.devServer,
quasarConf.build,
quasarConf.framework.autoImportComponentCase,
quasarConf.framework.autoImportVueExtensions,
quasarConf.framework.devTreeshaking,
quasarConf.sourceFiles,
quasarConf.metaConf.clientEnvDefineList
/**
* Warning!
*
* Remember to also extend and add quasarConf.metaConf.backendEnvDefineList
* if it becomes relevant to the respective use-case
*/
])
/**
* To be extended only, depending on if it's shipped to client or backend
*/
this.registerDiff('rolldown', quasarConf => [
quasarConf.build.define,
quasarConf.build.alias,
quasarConf.build.minify,
quasarConf.build.target
/**
* Warning!
*
* Remember to also extend and add
* quasarConf.metaConf.clientEnvDefineList and quasarConf.metaConf.backendEnvDefineList
* if they become relevant to the respective use-case
*/
])
}
// to be called from inheriting class
run(quasarConf, __isRetry) {
if (this.#diff('entryFiles', quasarConf)) {
this.#entryFiles.generate(quasarConf)
}
if (this.#diff('types', quasarConf)) {
generateTypes(quasarConf)
}
if (__isRetry !== true) {
this.#runId++
}
// we return wrappers because we want these methods private
// -- they shouldn't be called in all scenarios, which is why we
// artificially restrict them to run() only
return {
diff: (name, diffQuasarConf) => this.#diff(name, diffQuasarConf),
queue: fn => this.#queue(this.#runId, quasarConf, fn)
}
}
#queue(runId, quasarConf, fn) {
this.#runQueue = this.#runQueue
.then(() => fn())
.then(() => {
if (this.#runId === runId) {
this.run(quasarConf, true)
}
})
return this.#runQueue
}
registerDiff(name, extractFn) {
this.#diffList[name] = {
snapshot: null,
extractFn
}
this.#diffExtractFnMap[name] = extractFn
}
#diff(name, quasarConf) {
const target = this.#diffList[name]
const { snapshot, extractFn } = target
const newSnapshot = getConfSnapshot(
extractFn,
quasarConf,
this.#diffExtractFnMap
)
target.snapshot = newSnapshot
if (snapshot === null) {
return true
}
const len = newSnapshot.length
for (let i = 0; i < len; i++) {
if (newSnapshot[i] !== snapshot[i]) {
// Leave here for debugging when needed
// console.log(name, 'at index', i)
// console.log('NEW >>>', newSnapshot[i])
// console.log('OLD >>>', snapshot[i])
// console.log('---')
return true
}
}
return false
}
clearWatcherList([...watcherList], clearFn) {
clearFn()
return Promise.all(watcherList.map(watcher => watcher.close()))
}
printBanner(quasarConf) {
printDevRunningBanner(quasarConf)
}
}
================================================
FILE: app-vite/lib/app-extension/AppExtensionInstance.js
================================================
import { relative, resolve } from 'node:path'
import { pathToFileURL } from 'node:url'
import fse from 'fs-extra'
import inquirer from 'inquirer'
import { isBinaryFileSync as isBinary } from 'isbinaryfile'
import { IndexAPI } from './api-classes/IndexAPI.js'
import { InstallAPI } from './api-classes/InstallAPI.js'
import { UninstallAPI } from './api-classes/UninstallAPI.js'
import { PromptsAPI } from './api-classes/PromptsAPI.js'
import { fatal, log, warn } from '../utils/logger.js'
import { getPackagePath } from '../utils/get-package-path.js'
import { renderTemplate } from '../utils/template.js'
async function promptOverwrite({ targetPath, options, ctx }) {
const choices = [
{ name: 'Overwrite', value: 'overwrite' },
{ name: 'Overwrite all', value: 'overwriteAll' },
{ name: 'Skip (might break extension)', value: 'skip' },
{ name: 'Skip all (might break extension)', value: 'skipAll' }
]
return await inquirer.prompt([
{
name: 'action',
type: 'select',
message: `Overwrite "${relative(ctx.appPaths.appDir, targetPath)}"?`,
choices:
options !== void 0
? choices.filter(choice => options.includes(choice.value))
: choices,
default: 'overwrite'
}
])
}
async function renderFile(
{ sourcePath, targetPath, rawCopy, scope, overwritePrompt },
ctx
) {
if (overwritePrompt && fse.existsSync(targetPath)) {
const answer = await promptOverwrite({
targetPath,
options: ['overwrite', 'skip'],
ctx
})
if (answer.action === 'skip') return
}
fse.ensureFileSync(targetPath)
if (rawCopy || isBinary(sourcePath)) {
fse.copyFileSync(sourcePath, targetPath)
} else {
const rawContent = fse.readFileSync(sourcePath, 'utf8')
fse.writeFileSync(
targetPath,
renderTemplate(rawContent, scope, { varName: false }),
'utf8'
)
}
}
async function renderFolders({ source, rawCopy, scope }, ctx) {
let overwrite
const { globSync } = await import('tinyglobby')
const files = globSync(['**/*'], { cwd: source })
for (const rawPath of files) {
const targetRelativePath = rawPath
.split('/')
.map(name => {
// dotfiles are ignored when published to npm, therefore in templates
// we need to use underscore instead (e.g. "_gitignore")
if (name.at(0) === '_' && name.at(1) !== '_') {
return `.${name.slice(1)}`
}
if (name.at(0) === '_' && name.at(1) === '_') {
return `${name.slice(1)}`
}
return name
})
.join('/')
const targetPath = ctx.appPaths.resolve.app(targetRelativePath)
const sourcePath = resolve(source, rawPath)
if (overwrite !== 'overwriteAll' && fse.existsSync(targetPath)) {
if (overwrite === 'skipAll') {
continue
} else {
const answer = await promptOverwrite({ targetPath, ctx })
if (answer.action === 'overwriteAll') {
overwrite = 'overwriteAll'
} else if (answer.action === 'skipAll') {
overwrite = 'skipAll'
continue
} else if (answer.action === 'skip') {
continue
}
}
}
await renderFile({ sourcePath, targetPath, rawCopy, scope }, ctx)
}
}
export class AppExtensionInstance {
#ctx
#appExtJson
extId
packageFullName
packageName
#isInstalled = null
constructor({ extName, ctx, appExtJson }) {
this.#ctx = ctx
this.#appExtJson = appExtJson
if (extName.at(0) === '@') {
const slashIndex = extName.indexOf('/')
if (slashIndex === -1) {
fatal(`Invalid Quasar App Extension name: "${extName}"`)
}
this.packageFullName =
extName.slice(0, slashIndex + 1) +
'quasar-app-extension-' +
extName.slice(slashIndex + 1)
this.packageName = '@' + this.#stripVersion(this.packageFullName.slice(1))
this.extId = '@' + this.#stripVersion(extName.slice(1))
} else {
this.packageFullName = `quasar-app-extension-${extName}`
this.packageName = this.#stripVersion(this.packageFullName)
this.extId = this.#stripVersion(extName)
}
}
get isInstalled() {
if (this.#isInstalled === null) {
this.#loadPackageInfo()
}
return this.#isInstalled
}
#loadPackageInfo() {
const { appDir } = this.#ctx.appPaths
try {
const resolvedPath =
// Try `import('quasar-app-extension-foo/package.json')`. It might not work if using `package.json > exports` and the file is not listed
getPackagePath(`${this.packageFullName}/package.json`, appDir) ||
// Try `import('quasar-app-extension-foo')` to see if the root import is available (through `package.json > exports` or `package.json > main`)
getPackagePath(this.packageFullName, appDir) ||
// As a last resort, try to resolve the index script. By not doing this as the only/first option, we can give a more precise error message
// if the package is installed but the index script is missing
this.#getScriptPath('index')
if (resolvedPath !== void 0) {
this.#isInstalled = true
return
}
} catch {}
this.#isInstalled = false
}
async install(skipPkgInstall) {
if (/quasar-app-extension-/.test(this.extId)) {
this.extId = this.extId.replace('quasar-app-extension-', '')
log(
`When using an extension, "quasar-app-extension-" is added automatically. Just run "quasar ext add ${
this.extId
}"`
)
}
log(
`${skipPkgInstall ? 'Invoking' : 'Installing'} "${this.extId}" Quasar App Extension`
)
log()
if (skipPkgInstall !== true) {
await this.#installPackage()
} else if (!this.isInstalled) {
fatal(
`Tried to invoke App Extension "${this.extId}" but its npm package is not installed`
)
}
const prompts = await this.#getScriptPrompts()
this.#appExtJson.set(this.extId, prompts)
// run extension install
const hooks = await this.#runInstallScript(prompts)
log(`Quasar App Extension "${this.extId}" successfully installed.`)
log()
if (hooks && hooks.exitLog.length !== 0) {
hooks.exitLog.forEach(msg => {
console.log(msg)
})
console.log()
}
}
async uninstall(skipPkgUninstall) {
log(
`${skipPkgUninstall ? 'Uninvoking' : 'Uninstalling'} "${this.extId}" Quasar App Extension`
)
log()
// verify if already installed
if (skipPkgUninstall) {
if (!this.isInstalled) {
fatal(
`Tried to uninvoke App Extension "${this.extId}" but there's no npm package installed for it.`
)
}
} else if (!this.isInstalled) {
warn(`Quasar App Extension "${this.packageName}" is not installed...`)
return
}
const prompts = this.getPrompts()
const hooks = await this.#runUninstallScript(prompts)
this.#appExtJson.remove(this.extId)
if (skipPkgUninstall !== true) {
await this.#uninstallPackage()
}
log(`Quasar App Extension "${this.extId}" successfully removed.`)
log()
if (hooks && hooks.exitLog.length !== 0) {
hooks.exitLog.forEach(msg => {
console.log(msg)
})
console.log()
}
}
async run() {
if (!this.isInstalled) {
warn(`Quasar App Extension "${this.extId}" is missing...`)
process.exit(1, 'ext-missing')
}
const script = await this.#getScript('index', true)
const api = new IndexAPI(
{
ctx: this.#ctx,
extId: this.extId,
prompts: this.getPrompts()
},
this.#appExtJson
)
log(`Running "${this.extId}" Quasar App Extension...`)
await script(api)
return api.__getHooks(this.#appExtJson)
}
#stripVersion(packageFullName) {
const index = packageFullName.indexOf('@')
return index !== -1 ? packageFullName.slice(0, index) : packageFullName
}
getPrompts() {
return this.#appExtJson.getPrompts(this.extId)
}
async #getScriptPrompts() {
const getPromptsObject = await this.#getScript('prompts')
if (typeof getPromptsObject !== 'function') return {}
const api = new PromptsAPI(
{
ctx: this.#ctx,
extId: this.extId
},
this.#appExtJson
)
const prompts = await inquirer.prompt(await getPromptsObject(api))
console.log()
return prompts
}
async #installPackage() {
const nodePackager = await this.#ctx.cacheProxy.getModule('nodePackager')
nodePackager.installPackage(this.packageFullName, { isDevDependency: true })
}
async #uninstallPackage() {
const nodePackager = await this.#ctx.cacheProxy.getModule('nodePackager')
nodePackager.uninstallPackage(this.packageFullName)
this.#isInstalled = false
}
#scriptsTargetFolderList = ['dist', 'src']
#scriptsExtensionList = ['', '.js', '.mjs', '.cjs']
/**
* Returns the absolute path to the script file.
*
* It uses Node import resolution rather than filesystem-based resolution, so `package.json > exports` will affect the result, if exists.
* It will try to resolve the file with no extension, then with `.js`, `.mjs` and `.cjs`.
* For each extension, it will first check the `dist` directory, then the `src` directory.
* To give some examples to the import resolution:
* - `quasar-app-extension-foo/dist/index`
* - `quasar-app-extension-foo/dist/index.js`
*
* This allows to use preprocessors (e.g. TypeScript) for all AE files (including index, install, uninstall, etc. AE scripts)
*/
#getScriptPath(scriptName) {
if (!this.isInstalled) return
for (const ext of this.#scriptsExtensionList) {
for (const folder of this.#scriptsTargetFolderList) {
const path = getPackagePath(
`${this.packageFullName}/${folder}/${scriptName}${ext}`,
this.#ctx.appPaths.appDir
)
if (path !== void 0) return path
}
}
}
async #getScript(scriptName, fatalError) {
const scriptPath = this.#getScriptPath(scriptName)
if (!scriptPath) {
if (fatalError) {
fatal(
`App Extension "${this.extId}" has missing ${scriptName} script...`
)
}
return
}
let fn
try {
const { default: defaultFn } = await import(pathToFileURL(scriptPath))
fn = defaultFn
} catch (err) {
console.error(err)
if (fatalError) {
fatal(
`App Extension "${this.extId}" > ${scriptName} script has thrown the error from above.`
)
}
}
if (typeof fn !== 'function') {
if (fatalError) {
fatal(
`App Extension "${this.extId}" > ${scriptName} script does not have a default export as a function...`
)
}
return
}
return fn
}
async #runInstallScript(prompts) {
const script = await this.#getScript('install')
if (typeof script !== 'function') return
log('Running App Extension install script...')
const api = new InstallAPI(
{
ctx: this.#ctx,
extId: this.extId,
prompts
},
this.#appExtJson
)
await script(api)
const hooks = api.__getHooks(this.#appExtJson)
if (hooks.renderFolders.length !== 0) {
for (const entry of hooks.renderFolders) {
await renderFolders(entry, this.#ctx)
}
}
if (hooks.renderFiles.length !== 0) {
for (const entry of hooks.renderFiles) {
await renderFile(entry, this.#ctx)
}
}
if (api.__getNodeModuleNeedsUpdate(this.#appExtJson)) {
const nodePackager = await this.#ctx.cacheProxy.getModule('nodePackager')
nodePackager.install()
}
return hooks
}
async #runUninstallScript(prompts) {
const script = await this.#getScript('uninstall')
if (typeof script !== 'function') return
log('Running App Extension uninstall script...')
const api = new UninstallAPI(
{
ctx: this.#ctx,
extId: this.extId,
prompts
},
this.#appExtJson
)
await script(api)
return api.__getHooks(this.#appExtJson)
}
}
================================================
FILE: app-vite/lib/app-extension/api-classes/BaseAPI.js
================================================
import { cliPkg } from '../../utils/cli-runtime.js'
import { getPackagePath } from '../../utils/get-package-path.js'
export class BaseAPI {
engine = cliPkg.name
hasWebpack = false
hasVite = true
ctx
extId
resolve
appDir
constructor({ ctx, extId }) {
this.ctx = ctx
this.extId = extId
this.resolve = ctx.appPaths.resolve
this.appDir = ctx.appPaths.appDir
}
/**
* Is the host project using Typescript?
*
* @return {Promise<boolean>}
*/
hasTypescript() {
// implicit async return value
return this.ctx.cacheProxy.getModule('hasTypescript')
}
/**
* Get the installed and active store package name, if any
*
* @return {'pinia' | undefined}
*/
getStorePackageName() {
if (getPackagePath('pinia', this.ctx.appPaths.appDir) !== void 0) {
return 'pinia'
}
}
/**
* What is the host project's node packager?
*
* @return {Promise<'npm' | 'yarn' | 'pnpm' | 'bun'>}
*/
async getNodePackagerName() {
const nodePackager = await this.ctx.cacheProxy.getModule('nodePackager')
return nodePackager.name
}
}
================================================
FILE: app-vite/lib/app-extension/api-classes/IndexAPI.js
================================================
import semver from 'semver'
import { merge } from 'webpack-merge'
import { fatal } from '../../utils/logger.js'
import { getPackageJson } from '../../utils/get-package-json.js'
import { getCallerPath } from '../../utils/get-caller-path.js'
import { BaseAPI } from './BaseAPI.js'
/**
* API for extension's /index.js script
*/
export class IndexAPI extends BaseAPI {
prompts
constructor(opts, appExtJson) {
super(opts)
this.prompts = opts.prompts
this.#appExtJson = appExtJson
}
/**
* Get the internal persistent config of this extension.
* Returns empty object if it has none.
*
* @return {object} cfg
*/
getPersistentConf() {
return this.#appExtJson.getInternal(this.extId)
}
/**
* Set the internal persistent config of this extension.
* If it already exists, it is overwritten.
*
* @param {object} cfg
*/
setPersistentConf(cfg) {
this.#appExtJson.setInternal(this.extId, cfg || {})
}
/**
* Deep merge into the internal persistent config of this extension.
* If extension does not have any config already set, this is
* essentially equivalent to setting it for the first time.
*
* @param {object} cfg
*/
mergePersistentConf(cfg = {}) {
const currentCfg = this.getPersistentConf()
this.setPersistentConf(merge({}, currentCfg, cfg))
}
/**
* Ensure the App Extension is compatible with
* host app package through a
* semver condition.
*
* If the semver condition is not met, then
* @quasar/app-vite errors out and halts execution
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
*/
compatibleWith(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
fatal(
`Extension(${this.extId}): Dependency not found - ${packageName}. Please install it.`
)
}
if (!semver.satisfies(json.version, semverCondition)) {
fatal(
`Extension(${this.extId}): is not compatible with ${packageName} v${json.version}. Required version: ${semverCondition}`
)
}
}
/**
* Check if a host app package is installed. Can also
* check its version against specific semver condition.
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
* @return {boolean} package is installed and meets optional semver condition
*/
hasPackage(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
return false
}
return semverCondition !== void 0
? semver.satisfies(json.version, semverCondition)
: true
}
/**
* Check if another app extension is installed
* (app extension npm package is installed and it was invoked)
*
* @param {string} extId
* @return {boolean} has the extension installed & invoked
*/
hasExtension(extId) {
return this.#appExtJson.has(extId)
}
/**
* Get the version of a host app package.
*
* @param {string} packageName
* @return {string|undefined} version of app's package
*/
getPackageVersion(packageName) {
const json = getPackageJson(packageName, this.appDir)
return json !== void 0 ? json.version : void 0
}
/**
* Extend quasar.config file
*
* @param {function} fn
* (cfg: Object, ctx: Object) => undefined
*/
extendQuasarConf(fn) {
this.#addHook('extendQuasarConf', fn)
}
/**
* Extend Vite config
*
* @param {function} fn
* (cfg: Object, invoke: Object {isClient, isServer}, api) => undefined
*/
extendViteConf(fn) {
this.#addHook('extendViteConf', fn)
}
/**
* Extend Bex scripts (background/content-script) Rolldown config
*
* @param {function} fn
* (cfg: Object, api) => undefined
*/
extendBexScriptsConf(fn) {
this.#addHook('extendBexScriptsConf', fn)
}
/**
* Extend Electron Main thread Rolldown config
*
* @param {function} fn
* (cfg: Object, api) => undefined
*/
extendElectronMainConf(fn) {
this.#addHook('extendElectronMainConf', fn)
}
/**
* Extend Electron Preload thread Rolldown config
*
* @param {function} fn
* (cfg: Object, api) => undefined
*/
extendElectronPreloadConf(fn) {
this.#addHook('extendElectronPreloadConf', fn)
}
/**
* Extend PWA custom service worker Rolldown config
* (when using Workbox InjectManifest mode)
*
* @param {function} fn
* (cfg: Object, api) => undefined
*/
extendPWACustomSWConf(fn) {
this.#addHook('extendPWACustomSWConf', fn)
}
/**
* Extend SSR Webserver Rolldown config
*
* @param {function} fn
* (cfg: Object, api) => undefined
*/
extendSSRWebserverConf(fn) {
this.#addHook('extendSSRWebserverConf', fn)
}
/**
* Register a command that will become available as
* `quasar run <ext-id> <cmd> [args]` and `quasar <ext-id> <cmd> [args]`
*
* @param {string} commandName
* @param {function} fn
* ({ args: [ string, ... ], params: {object} }) => ?Promise
*/
registerCommand(commandName, fn) {
this.#hooks.commands[commandName] = fn
}
/**
* Register an API file for "quasar describe" command
*
* @param {string} name
* @param {string} relativePath (or node_modules reference if it starts with "~")
* (relative path to Api file)
*/
registerDescribeApi(name, relativePath) {
const callerPath = getCallerPath()
this.#hooks.describeApi[name] = {
callerPath,
relativePath
}
}
/**
* Prepare external services before dev command runs.
*
* @param {function} fn
* (api, { quasarConf }) => ?Promise
*/
beforeDev(fn) {
this.#addHook('beforeDev', fn)
}
/**
* Run hook after Quasar dev server is started ($ quasar dev).
* At this point, the dev server has been started and is available
* should you wish to do something with it.
*
* @param {function} fn
* (api, { quasarConf }) => ?Promise
*/
afterDev(fn) {
this.#addHook('afterDev', fn)
}
/**
* Run hook before Quasar builds app for production ($ quasar build).
* At this point, the distributables folder hasn't been created yet.
*
* @param {function} fn
* (api, { quasarConf }) => ?Promise
*/
beforeBuild(fn) {
this.#addHook('beforeBuild', fn)
}
/**
* Run hook after Quasar built app for production ($ quasar build).
* At this point, the distributables folder has been created and is available
* should you wish to do something with it.
*
* @param {function} fn
* (api, { quasarConf }) => ?Promise
*/
afterBuild(fn) {
this.#addHook('afterBuild', fn)
}
/**
* Run hook if publishing was requested ("$ quasar build -P"),
* after Quasar built app for production and the afterBuild
* hook (if specified) was executed.
*
* @param {function} fn
* ({ arg, ...}) => ?Promise
* * arg - argument supplied to "--publish"/"-P" parameter
* * quasarConf - quasar.config file config object
* * distDir - folder where distributables were built
*/
onPublish(fn) {
this.#addHook('onPublish', fn)
}
/**
* Private stuff; to NOT be used in devland
*/
#appExtJson
#hooks = {
extendQuasarConf: [],
extendViteConf: [],
extendSSRWebserverConf: [],
extendElectronMainConf: [],
extendElectronPreloadConf: [],
extendPWACustomSWConf: [],
extendBexScriptsConf: [],
beforeDev: [],
afterDev: [],
beforeBuild: [],
afterBuild: [],
onPublish: [],
commands: {},
describeApi: {}
}
__getHooks(appExtJson) {
// protect against external access
if (appExtJson === this.#appExtJson) {
return this.#hooks
}
}
#addHook(name, fn) {
this.#hooks[name].push({ fn, api: this })
}
}
================================================
FILE: app-vite/lib/app-extension/api-classes/InstallAPI.js
================================================
import fs from 'fs-extra'
import path from 'node:path'
import { merge } from 'webpack-merge'
import semver from 'semver'
import { parseJSON, stringifyJSON } from 'confbox'
import { fatal, warn } from '../../utils/logger.js'
import { getPackageJson } from '../../utils/get-package-json.js'
import { getCallerPath } from '../../utils/get-caller-path.js'
import { BaseAPI } from './BaseAPI.js'
/**
* API for extension's /install.js script
*/
export class InstallAPI extends BaseAPI {
prompts
constructor(opts, appExtJson) {
super(opts)
this.prompts = opts.prompts
this.#appExtJson = appExtJson
}
/**
* Get the internal persistent config of this extension.
* Returns empty object if it has none.
*
* @return {object} cfg
*/
getPersistentConf() {
return this.#appExtJson.getInternal(this.extId)
}
/**
* Set the internal persistent config of this extension.
* If it already exists, it is overwritten.
*
* @param {object} cfg
*/
setPersistentConf(cfg) {
this.#appExtJson.setInternal(this.extId, cfg || {})
}
/**
* Deep merge into the internal persistent config of this extension.
* If extension does not have any config already set, this is
* essentially equivalent to setting it for the first time.
*
* @param {object} cfg
*/
mergePersistentConf(cfg = {}) {
const currentCfg = this.getPersistentConf()
this.setPersistentConf(merge({}, currentCfg, cfg))
}
/**
* Ensure the App Extension is compatible with
* host app installed package through a
* semver condition.
*
* If the semver condition is not met, then
* @quasar/app-vite errors out and halts execution
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
*/
compatibleWith(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
fatal(
`Extension(${this.extId}): Dependency not found - ${packageName}. Please install it.`
)
}
if (!semver.satisfies(json.version, semverCondition)) {
fatal(
`Extension(${this.extId}): is not compatible with ${packageName} v${json.version}. Required version: ${semverCondition}`
)
}
}
/**
* Check if an app package is installed. Can also
* check its version against specific semver condition.
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
* @return {boolean} package is installed and meets optional semver condition
*/
hasPackage(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
return false
}
return semverCondition !== void 0
? semver.satisfies(json.version, semverCondition)
: true
}
/**
* Check if another app extension is installed
* (app extension npm package is installed and it was invoked)
*
* @param {string} extId
* @return {boolean} has the extension installed & invoked
*/
hasExtension(extId) {
return this.#appExtJson.has(extId)
}
/**
* Get the version of an an app's package.
*
* @param {string} packageName
* @return {string|undefined} version of app's package
*/
getPackageVersion(packageName) {
const json = getPackageJson(packageName, this.appDir)
return json !== void 0 ? json.version : void 0
}
/**
* Extend package.json with new props.
* If specifying existing props, it will override them.
*
* @param {object|string} extPkg - Object to extend with or relative path to a JSON file
*/
extendPackageJson(extPkg) {
if (!extPkg) return
if (typeof extPkg === 'string') {
const dir = getCallerPath()
const source = path.resolve(dir, extPkg)
if (!fs.existsSync(source)) {
warn()
warn(
`Extension(${this.extId}): extendPackageJson() - cannot locate ${extPkg}. Skipping...`
)
warn()
return
}
if (fs.lstatSync(source).isDirectory()) {
warn()
warn(
`Extension(${this.extId}): extendPackageJson() - "${extPkg}" is a folder instead of file. Skipping...`
)
warn()
return
}
try {
extPkg = JSON.parse(fs.readFileSync(source, 'utf8'))
} catch {
warn(
`Extension(${this.extId}): extendPackageJson() - "${extPkg}" is malformed`
)
warn()
process.exit(1)
}
}
if (Object(extPkg) !== extPkg || Object.keys(extPkg).length === 0) return
const pkg = merge({}, this.ctx.pkg.appPkg, extPkg)
fs.writeFileSync(
this.resolve.app('package.json'),
stringifyJSON(pkg),
'utf8'
)
if (
extPkg.dependencies ||
extPkg.devDependencies ||
extPkg.optionalDependencies ||
extPkg.bundleDependencies ||
extPkg.peerDependencies
) {
this.#needsNodeModulesUpdate = true
}
}
/**
* Extend a JSON file with new props (deep merge).
* If specifying existing props, it will override them.
*
* @param {string} file (relative path to app root folder)
* @param {object} newData (Object to merge in)
*/
extendJsonFile(file, newData) {
if (
newData !== void 0 &&
Object(newData) === newData &&
Object.keys(newData).length !== 0
) {
const filePath = this.resolve.app(file)
// Try to parse the JSON with Node native tools.
// It will soft-fail and log a warning if the JSON isn't parseable
// which usually means we are dealing with an extended JSON flavour,
// for example JSON with comments or JSON5.
// Notable examples are TS 'tsconfig.json' or VSCode 'settings.json'
// TODO: use parseJSONC/stringifyJSONC from confbox
try {
const existingData = fs.existsSync(filePath)
? parseJSON(fs.readFileSync(filePath, 'utf8'))
: {}
const data = merge({}, existingData, newData)
fs.writeFileSync(
this.resolve.app(file),
// if file exists, preserve indentation, otherwise use 2 spaces
stringifyJSON(data, {
indent: Object.keys(existingData).length !== 0 ? void 0 : 2
}),
'utf8'
)
} catch {
warn()
warn(
`Extension(${this.extId}): extendJsonFile() - "${filePath}" doesn't conform to JSON format: this could happen if you are trying to update flavoured JSON files (eg. JSON with Comments or JSON5). Skipping...`
)
warn(
`Extension(${this.extId}): extendJsonFile() - The extension tried to apply these updates to "${filePath}" file: ${JSON.stringify(newData)}`
)
warn()
}
}
}
/**
* Render a folder from extension templates into devland.
* Needs a path (to a folder) relative to the path of the file where render() is called
*
* @param {string} templatePath (relative path to folder to render in app)
* @param {object} scope (optional; rendering scope variables)
*/
render(templatePath, scope) {
const dir = getCallerPath()
const source = path.resolve(dir, templatePath)
const rawCopy = !scope || Object.keys(scope).length === 0
if (!fs.existsSync(source)) {
warn()
warn(
`Extension(${this.extId}): render() - cannot locate ${templatePath}. Skipping...\n`
)
return
}
if (!fs.lstatSync(source).isDirectory()) {
warn()
warn(
`Extension(${this.extId}): render() - "${templatePath}" is a file instead of folder. Skipping...\n`
)
return
}
this.#hooks.renderFolders.push({
source,
rawCopy,
scope
})
}
/**
* Render a file from extension template into devland
* Needs a path (to a file) relative to the path of the file where renderFile() is called
*
* @param {string} relativeSourcePath (file path relative to the folder from which the install script is called)
* @param {string} relativeTargetPath (file path relative to the root of the app -- including filename!)
* @param {object} scope (optional; rendering scope variables)
*/
renderFile(relativeSourcePath, relativeTargetPath, scope) {
const dir = getCallerPath()
const sourcePath = path.resolve(dir, relativeSourcePath)
const targetPath = this.resolve.app(relativeTargetPath)
const rawCopy = !scope || Object.keys(scope).length === 0
if (!fs.existsSync(sourcePath)) {
warn()
warn(
`Extension(${this.extId}): renderFile() - cannot locate ${relativeSourcePath}. Skipping...\n`
)
return
}
if (fs.lstatSync(sourcePath).isDirectory()) {
warn()
warn(
`Extension(${this.extId}): renderFile() - "${relativeSourcePath}" is a folder instead of a file. Skipping...\n`
)
return
}
this.#hooks.renderFiles.push({
sourcePath,
targetPath,
rawCopy,
scope,
overwritePrompt: true
})
}
/**
* Add a message to be printed after App CLI finishes up install.
*
* @param {string} msg
*/
onExitLog(msg) {
this.#hooks.exitLog.push(msg)
}
/**
* Private stuff; to NOT be used in devland
*/
#appExtJson
#needsNodeModulesUpdate = false
__getNodeModuleNeedsUpdate(appExtJson) {
// protect against external access
if (appExtJson === this.#appExtJson) {
return this.#needsNodeModulesUpdate
}
}
#hooks = {
renderFolders: [],
renderFiles: [],
exitLog: []
}
__getHooks(appExtJson) {
// protect against external access
if (appExtJson === this.#appExtJson) {
return this.#hooks
}
}
}
================================================
FILE: app-vite/lib/app-extension/api-classes/PromptsAPI.js
================================================
import semver from 'semver'
import { fatal } from '../../utils/logger.js'
import { getPackageJson } from '../../utils/get-package-json.js'
import { BaseAPI } from './BaseAPI.js'
/**
* API for extension's /prompts.js script
*/
export class PromptsAPI extends BaseAPI {
constructor(opts, appExtJson) {
super(opts)
this.#appExtJson = appExtJson
}
/**
* Ensure the App Extension is compatible with
* host app installed package through a
* semver condition.
*
* If the semver condition is not met, then
* @quasar/app-vite errors out and halts execution
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
*/
compatibleWith(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
fatal(
`Extension(${this.extId}): Dependency not found - ${packageName}. Please install it.`
)
}
if (!semver.satisfies(json.version, semverCondition)) {
fatal(
`Extension(${this.extId}): is not compatible with ${packageName} v${json.version}. Required version: ${semverCondition}`
)
}
}
/**
* Check if an app package is installed. Can also
* check its version against specific semver condition.
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
* @return {boolean} package is installed and meets optional semver condition
*/
hasPackage(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
return false
}
return semverCondition !== void 0
? semver.satisfies(json.version, semverCondition)
: true
}
/**
* Check if another app extension is installed
* (app extension npm package is installed and it was invoked)
*
* @param {string} extId
* @return {boolean} has the extension installed & invoked
*/
hasExtension(extId) {
return this.#appExtJson.has(extId)
}
/**
* Get the version of an an app's package.
*
* @param {string} packageName
* @return {string|undefined} version of app's package
*/
getPackageVersion(packageName) {
const json = getPackageJson(packageName, this.appDir)
return json !== void 0 ? json.version : void 0
}
/**
* Private stuff; to NOT be used in devland
*/
#appExtJson
}
================================================
FILE: app-vite/lib/app-extension/api-classes/UninstallAPI.js
================================================
import fse from 'fs-extra'
import semver from 'semver'
import { getPackageJson } from '../../utils/get-package-json.js'
import { BaseAPI } from './BaseAPI.js'
/**
* API for extension's /uninstall.js script
*/
export class UninstallAPI extends BaseAPI {
prompts
constructor(opts, appExtJson) {
super(opts)
this.prompts = opts.prompts
this.#appExtJson = appExtJson
}
/**
* Get the internal persistent config of this extension.
* Returns empty object if it has none.
*
* @return {object} internal persistent config of this extension
*/
getPersistentConf() {
return this.#appExtJson.getInternal(this.extId)
}
/**
* Check if an app package is installed. Can also
* check its version against specific semver condition.
*
* Example of semver condition:
* '1.x || >=2.5.0 || 5.0.0 - 7.2.3'
*
* @param {string} packageName
* @param {string} semverCondition
* @return {boolean} package is installed and meets optional semver condition
*/
hasPackage(packageName, semverCondition) {
const json = getPackageJson(packageName, this.appDir)
if (json === void 0) {
return false
}
return semverCondition !== void 0
? semver.satisfies(json.version, semverCondition)
: true
}
/**
* Check if another app extension is installed.
*
* @param {string} extId
* @return {boolean} has the extension installed.
*/
hasExtension(extId) {
return this.#appExtJson.has(extId)
}
/**
* Get the version of an an app's package.
*
* @param {string} packageName
* @return {string|undefined} version of app's package
*/
getPackageVersion(packageName) {
const json = getPackageJson(packageName, this.appDir)
return json !== void 0 ? json.version : void 0
}
/**
* Remove a file or folder from devland which the
* extension has installed and is no longer needed.
*
* Be careful about it and do not delete the files
* that would break developer's app.
*
* The __path (file or folder) needs to be relative
* to project's root folder.
*
* @param {string} __path
*/
removePath(__path) {
fse.removeSync(this.resolve.app(__path))
}
/**
* Add a message to be printed after App CLI finishes up install.
*
* @param {string} msg
*/
onExitLog(msg) {
this.#hooks.exitLog.push(msg)
}
/**
* Private stuff; to NOT be used in devland
*/
#appExtJson
#hooks = {
exitLog: []
}
__getHooks(appExtJson) {
// protect against external access
if (appExtJson === this.#appExtJson) {
return this.#hooks
}
}
}
================================================
FILE: app-vite/lib/app-extension/create-app-ext.js
================================================
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
import { merge } from 'webpack-merge'
import { parseJSON, stringifyJSON } from 'confbox'
import { fatal, log } from '../utils/logger.js'
import { AppExtensionInstance } from './AppExtensionInstance.js'
function readJson(file) {
if (!existsSync(file)) return {}
try {
return parseJSON(readFileSync(file, 'utf8'))
} catch (err) {
console.log(err)
fatal('quasar.extensions.json is malformed', 'FAIL')
}
}
function getAppExtJson({ file, json, onListUpdate }) {
const fileExists = Object.keys(json).length !== 0
function save() {
writeFileSync(
file,
// if file exists, preserve indentation, otherwise use 2 spaces
stringifyJSON(json, { indent: fileExists ? void 0 : 2 }),
'utf8'
)
}
const acc = {
has(extId) {
return json[extId] !== void 0
},
set(extId, opts) {
log(`Updating /quasar.extensions.json for "${extId}" extension ...`)
const hasAppExt = json[extId] !== void 0
json[extId] = opts
save()
if (!hasAppExt) onListUpdate(json)
},
setInternal(extId, opts) {
const cfg = json[extId] || {}
cfg.__internal = opts
acc.set(extId, cfg)
},
remove(extId) {
if (acc.has(extId)) {
log(`Removing "${extId}" extension from /quasar.extensions.json ...`)
delete json[extId]
save()
onListUpdate(json)
}
},
getPrompts(extId) {
const { __internal, ...prompts } = json[extId] || {}
return structuredClone(prompts)
},
getInternal(extId) {
const cfg = json[extId] || {}
return cfg.__internal || {}
}
}
return acc
}
export function createAppExt(ctx) {
let hooksMap = null
const appExt = {
extensionList: [],
createInstance(extName) {
return new AppExtensionInstance({
extName,
ctx,
appExtJson
})
},
async registerAppExtensions() {
hooksMap = {}
for (const ext of appExt.extensionList) {
const extHooks = await ext.run()
hooksMap = merge(hooksMap, extHooks)
}
},
async runAppExtensionHook(hookName, fn) {
const hookList = hooksMap[hookName] || []
for (const hook of hookList) {
await fn(hook)
}
},
getInstance(extId) {
return appExt.extensionList.find(ext => ext.extId === extId)
}
}
const onListUpdate = json => {
appExt.extensionList = Object.keys(json).map(appExt.createInstance)
}
const file = ctx.appPaths.resolve.app('quasar.extensions.json')
const json = readJson(file)
const appExtJson = getAppExtJson({
file,
json,
onListUpdate
})
onListUpdate(json)
return appExt
}
================================================
FILE: app-vite/lib/app-tool.js
================================================
import { join } from 'node:path'
import fse from 'fs-extra'
import { build as viteBuild } from 'vite'
import { rolldown, watch as rolldownWatch } from 'rolldown'
import { progress } from './utils/logger.js'
const cordovaWWW = join('src-cordova', 'www')
const capacitorWWW = join('src-capacitor', 'www')
export class AppTool {
argv
ctx
constructor({ argv, ctx }) {
this.argv = argv
this.ctx = ctx
}
async buildWithVite(threadName, viteConfig) {
// ensure clean build
this.cleanArtifacts(viteConfig.build.outDir)
const done = progress(
'Compiling of ___ with Vite in progress...',
threadName
)
await viteBuild(viteConfig)
done('___ compiled with success by Vite')
}
watchWithRolldown(threadName, rolldownConfig, onRebuildSuccess) {
const { promise, resolve } = Promise.withResolvers()
const watcher = rolldownWatch({
...rolldownConfig,
watch: {
exclude: /node_modules/
}
})
let isFirstBuild = true
let done
watcher.on('event', event => {
if (event.code === 'START') {
done = progress(
'Compiling of ___ with Rolldown in progress...',
threadName
)
} else if (event.code === 'BUNDLE_END') {
event.result.close()
done('___ compiled with success by Rolldown')
if (isFirstBuild) {
isFirstBuild = false
resolve(watcher)
} else onRebuildSuccess()
} else if (event.code === 'ERROR') {
console.error(event.error)
event.result.close()
}
})
return promise
}
async buildWithRolldown(threadName, rolldownConfig) {
const done = progress(
'Compiling of ___ with Rolldown in progress...',
threadName
)
const bundle = await rolldown(rolldownConfig)
await bundle.write(rolldownConfig.output)
await bundle.close()
done('___ compiled with success by Rolldown')
}
cleanArtifacts(dir) {
if (dir.endsWith(cordovaWWW)) {
fse.emptyDirSync(dir)
} else if (dir.endsWith(capacitorWWW)) {
const { appPaths } = this.ctx
fse.emptyDirSync(dir)
fse.copySync(
appPaths.resolve.cli('templates/capacitor/www'),
appPaths.resolve.capacitor('www')
)
} else {
fse.removeSync(dir)
}
}
}
================================================
FILE: app-vite/lib/cache/create-cache-proxy.js
================================================
/**
* @param {import('../../types/configuration/context').InternalQuasarContext} ctx
*
* @returns {import('../../types/configuration/context').CacheProxy}
*/
export function createCacheProxy(ctx) {
const runtimeCache = {}
const moduleCache = {}
return {
getRuntime: (key, getInitialValue) => {
const value = runtimeCache[key]
return value !== void 0 ? value : (runtimeCache[key] = getInitialValue())
},
getAsyncRuntime: async (key, getInitialValue) => {
const value = runtimeCache[key]
return value !== void 0
? value
: (runtimeCache[key] = await getInitialValue())
},
setRuntime: (key, value) => {
runtimeCache[key] = value
},
getModule: key => {
const value = moduleCache[key]
if (value !== void 0) return value
return import(`./module.${key}.js`)
.then(({ createInstance }) => createInstance(ctx))
.then(val => {
moduleCache[key] = val
return val
})
}
}
}
================================================
FILE: app-vite/lib/cache/module.animations.js
================================================
import { getPackage } from '../utils/get-package.js'
export async function createInstance({ appPaths }) {
const { generalAnimations, inAnimations, outAnimations } = await getPackage(
'@quasar/extras/animate/animate-list.common',
appPaths.appDir
)
return [...generalAnimations, ...inAnimations, ...outAnimations]
}
================================================
FILE: app-vite/lib/cache/module.capCli.js
================================================
import { getPackagePath } from '../utils/get-package-path.js'
import { getPackageMajorVersion } from '../utils/get-package-major-version.js'
export function createInstance({ appPaths: { capacitorDir } }) {
return {
capBin: getPackagePath('@capacitor/cli/bin/capacitor', capacitorDir),
capVersion: getPackageMajorVersion('@capacitor/cli', capacitorDir)
}
}
================================================
FILE: app-vite/lib/cache/module.cssVariables.js
================================================
import fs from 'node:fs'
export function createInstance({ appPaths }) {
const cssVariables = {
quasarSrcExt: 'css',
variablesFile: false
}
for (const ext of ['scss', 'sass']) {
const file = `src/css/quasar.variables.${ext}`
if (fs.existsSync(appPaths.resolve.app(file))) {
cssVariables.quasarSrcExt = 'sass'
cssVariables.variablesFile = file
break
}
}
return cssVariables
}
================================================
FILE: app-vite/lib/cache/module.electron.js
================================================
import { getPackage } from '../utils/get-package.js'
import { fatal } from '../utils/logger.js'
const bundlerMap = {
packager: {
pkg: '@electron/packager',
version: '19.0.0'
},
builder: {
pkg: 'electron-builder',
version: '26.0.12'
}
}
function isValidName(bundlerName) {
return ['packager', 'builder'].includes(bundlerName)
}
function installBundler(bundlerName, nodePackager, appPaths) {
const bundler = bundlerMap[bundlerName]
nodePackager.installPackage(`${bundler.pkg}@^${bundler.version}`, {
cwd: appPaths.electronDir,
isDevDependency: true,
displayName: bundler.pkg
})
}
function hasPackage(pkgName, modePkg) {
return (
((modePkg.devDependencies && modePkg.devDependencies[pkgName]) ||
(modePkg.dependencies && modePkg.dependencies[pkgName])) !== void 0
)
}
export async function createInstance({
appPaths,
pkg: { modePkg },
cacheProxy
}) {
const nodePackager = await cacheProxy.getModule('nodePackager')
function bundlerIsInstalled(bundlerName) {
const bundler = bundlerMap[bundlerName]
return hasPackage(bundler.pkg, modePkg)
}
function ensureInstall(bundlerName) {
if (!isValidName(bundlerName)) {
fatal(`Unknown bundler "${bundlerName}" for Electron`)
}
if (!bundlerIsInstalled(bundlerName)) {
installBundler(bundlerName, nodePackager, appPaths)
}
}
function getDefaultName() {
if (bundlerIsInstalled('packager')) {
return 'packager'
}
if (bundlerIsInstalled('builder')) {
return 'builder'
}
return 'packager'
}
// Returns a Promise which resolves with the required bundler package.
// May return "{ packager }" (@electron/packager v19+) or
// "{ default }" (@electron/packager v18) or directly the package (electron-builder);
function getBundler(bundlerName) {
const bundler = bundlerMap[bundlerName]
return getPackage(bundler.pkg, appPaths.electronDir)
}
return {
bundlerIsInstalled,
ensureInstall,
getDefaultName,
getBundler
}
}
================================================
FILE: app-vite/lib/cache/module.hasTypescript.js
================================================
import { existsSync } from 'node:fs'
export function createInstance({ appPaths }) {
return existsSync(appPaths.resolve.app('tsconfig.json'))
}
================================================
FILE: app-vite/lib/cache/module.nodePackager.js
================================================
import fs from 'node:fs'
import { join, normalize, sep } from 'node:path'
import { sync as crossSpawnSync } from 'cross-spawn'
import { fatal, log } from '../utils/logger.js'
import { spawnSync } from '../utils/spawn.js'
function run({ name, params, cwd, onFail, env = 'development' }) {
spawnSync(
name,
params.filter(param => typeof param === 'string' && param.length !== 0),
{ cwd, env: { ...process.env, NODE_ENV: env } },
onFail
)
}
function getMajorVersion(name) {
try {
const child = crossSpawnSync(name, ['--version'])
if (child.status === 0) {
const version = String(child.output[1]).trim()
return Number.parseInt(version.split('.')[0], 10)
}
} catch {
/* do nothing; we return null below */
}
return null
}
class PackageManager {
appDir
constructor(appDir) {
this.appDir = appDir
}
/**
* To be declared by subclasses
*/
name = 'unknown'
lockFiles = ['unknown']
getInstallParams(/* env */) {
return []
}
getInstallPackageParams(/* names, isDev */) {
return []
}
getUninstallPackageParams(/* names */) {
return []
}
/**
* Implementation of the actual package manager
*/
majorVersion = null
cachedIsInstalled = null
isInstalled() {
if (this.cachedIsInstalled !== null) {
return this.cachedIsInstalled
}
this.majorVersion = getMajorVersion(this.name)
this.cachedIsInstalled = this.majorVersion !== null
return this.cachedIsInstalled
}
install({
cwd = this.appDir,
params,
displayName,
env = 'development'
} = {}) {
displayName = displayName ? displayName + ' ' : ''
log(`Installing ${displayName}dependencies...`)
run({
name: this.name,
params:
params && params.length !== 0 ? params : this.getInstallParams(env),
cwd,
env,
onFail: () =>
fatal(`Failed to install ${displayName}dependencies`, 'FAIL')
})
}
installPackage(
name,
{ cwd = this.appDir, displayName = name, isDevDependency = false } = {}
) {
log(`Installing ${displayName}...`)
run({
name: this.name,
params: this.getInstallPackageParams(
Array.isArray(name) ? name : [name],
isDevDependency
),
cwd,
onFail: () => fatal(`Failed to install ${displayName}`, 'FAIL')
})
}
uninstallPackage(name, { cwd = this.appDir, displayName = name } = {}) {
log(`Uninstalling ${displayName}...`)
run({
name: this.name,
params: this.getUninstallPackageParams(
Array.isArray(name) ? name : [name]
),
cwd,
onFail: () => fatal(`Failed to uninstall ${displayName}`, 'FAIL')
})
}
}
class Npm extends PackageManager {
name = 'npm'
lockFiles = ['package-lock.json']
getInstallParams(env) {
if (env === 'development') {
return ['install']
}
return this.majorVersion >= 9
? ['install'] // env will be set to production
: ['install', '--production']
}
getInstallPackageParams(names, isDevDependency) {
return ['install', isDevDependency ? '--save-dev' : '', ...names]
}
getUninstallPackageParams(names) {
return ['uninstall', ...names]
}
}
class Yarn extends PackageManager {
name = 'yarn'
lockFiles = ['yarn.lock']
getInstallParams(env) {
if (env === 'development') {
return ['install']
}
return this.majorVersion >= 2
? ['workspaces', 'focus', '--all', '--production']
: ['install', '--production']
}
getInstallPackageParams(names, isDevDependency) {
return ['add', isDevDependency ? '--dev' : '', ...names]
}
getUninstallPackageParams(names) {
return ['remove', ...names]
}
}
class Pnpm extends PackageManager {
name = 'pnpm'
lockFiles = ['pnpm-lock.yaml']
getInstallParams(env) {
return env === 'development' ? ['install'] : ['install', '--prod']
}
getInstallPackageParams(names, isDevDependency) {
return ['add', isDevDependency ? '--save-dev' : '', ...names]
}
getUninstallPackageParams(names) {
return ['remove', ...names]
}
}
class Bun extends PackageManager {
name = 'bun'
lockFiles = ['bun.lock', 'bun.lockb']
getInstallParams(env) {
return env === 'development' ? ['install'] : ['install', '--production']
}
getInstallPackageParams(names, isDevDependency) {
return ['add', isDevDependency ? '--dev' : '', ...names]
}
getUninstallPackageParams(names) {
return ['remove', ...names]
}
}
/**
* @returns {PackageManager}
*/
function getProjectPackageManager(packageManagersList, dir) {
// Recursively checks for presence of the lock file by traversing
// the dir tree up to the root
while (dir.length !== 0 && dir.at(-1) !== sep) {
for (const pm of packageManagersList) {
if (pm.lockFiles.some(lockFile => fs.existsSync(join(dir, lockFile)))) {
return pm
}
}
dir = normalize(join(dir, '..'))
}
}
export function createInstance({ appPaths }) {
const { appDir } = appPaths
const packageManagersList = [
new Yarn(appDir),
new Pnpm(appDir),
new Npm(appDir),
new Bun(appDir)
]
const projectPackageManager = getProjectPackageManager(
packageManagersList,
appDir
)
// if the project folder uses a supported package manager
// and it is installed on this machine then use it
if (projectPackageManager !== void 0 && projectPackageManager.isInstalled()) {
return projectPackageManager
}
// otherwise, use the first installed package manager
for (const pm of packageManagersList) {
if (pm.isInstalled()) {
return pm
}
}
fatal('Please install Yarn, PNPM, NPM or Bun before running this command.\n')
}
================================================
FILE: app-vite/lib/cache/module.storeProvider.js
================================================
import { getPackagePath } from '../utils/get-package-path.js'
// Structured this way to be able to support other store providers in the future, if any
// We used to support Vuex, but it was dropped because it was deprecated long ago and had TypeScript issues
export function createInstance({ appPaths: { appDir }, cacheProxy }) {
const name = 'pinia'
return {
name,
pathKey: 'stores',
isInstalled: getPackagePath(name, appDir) !== void 0,
async install() {
const nodePackager = await cacheProxy.getModule('nodePackager')
nodePackager.installPackage(name)
}
}
}
================================================
FILE: app-vite/lib/cache/module.workboxBuild.js
================================================
import { getPackage } from '../utils/get-package.js'
export async function createInstance({ appPaths }) {
return await getPackage('workbox-build', appPaths.appDir)
}
================================================
FILE: app-vite/lib/cmd/build.js
================================================
if (process.env.NODE_ENV === void 0) {
process.env.NODE_ENV = 'production'
}
import parseArgs from 'minimist'
const argv = parseArgs(process.argv.slice(2), {
alias: {
m: 'mode',
T: 'target', // cordova/capacitor/bex mode only
A: 'arch',
b: 'bundler',
s: 'skip-pkg',
i: 'ide',
d: 'debug',
h: 'help',
P: 'publish'
},
boolean: ['h', 'd', 'u', 'i'],
string: ['m', 'T', 'P'],
default: {
m: 'spa'
}
})
if (argv.help) {
console.log(`
Description
Builds distributables of your app.
Usage
$ quasar build
$ quasar build -p <port number>
$ quasar build -m ssr
# alias for "quasar build -m cordova -T ios"
$ quasar build -m ios
# alias for "quasar build -m cordova -T android"
$ quasar build -m android
# passing extra parameters and/or options to
# underlying "cordova" executable:
$ quasar build -m ios -- some params --and options --here
# when on Windows and using Powershell:
$ quasar build -m ios '--' some params --and options --here
Options
--mode, -m App mode [spa|ssr|pwa|cordova|capacitor|electron|bex] (default: spa)
--target, -T App target
- Cordova (default: all installed)
[android|ios]
- Capacitor
[android|ios]
- Electron with default "@electron/packager" bundler (default: yours)
[darwin|win32|linux|mas|all]
- Electron with "electron-builder" bundler (default: yours)
[darwin|mac|win32|win|linux|all]
- Bex
[chrome|firefox]
--publish, -P Also trigger publishing hooks (if any are specified)
- Has special meaning when building with Electron mode and using
electron-builder as bundler
--debug, -d Build for debugging purposes
--skip-pkg, -s Build only UI (skips creating Cordova/Capacitor/Electron executables)
- Cordova (it only fills in /src-cordova/www folder with the UI code)
- Capacitor (it only fills in /src-capacitor/www folder with the UI code)
- Electron (it only creates the /dist/electron/UnPackaged folder)
--nocolor Disable colored output
--help, -h Displays this message
ONLY for Cordova and Capacitor mode:
--ide, -i Open IDE (Android Studio / XCode) instead of finalizing with a
terminal/console-only build
ONLY for Electron mode:
--bundler, -b Bundler (@electron/packager or electron-builder)
[packager|builder]
--arch, -A App architecture (default: yours)
- with default "@electron/packager" bundler:
[ia32|x64|armv7l|arm64|mips64el|all]
- with "electron-builder" bundler:
[ia32|x64|armv7l|arm64|all]
ONLY for electron-builder (when using "publish" parameter):
--publish, -P Publish options [onTag|onTagOrDraft|always|never]
- see https://www.electron.build/configuration/publish
Only for BEX mode:
--target, -T (required) Browser family target [chrome|firefox]
`)
process.exit(0)
}
const { ensureArgv } = await import('../utils/ensure-argv.js')
ensureArgv(argv, 'build')
const path = await import('node:path')
const { readFileSync } = await import('node:fs')
console.log(
readFileSync(new URL('../../assets/logo.art', import.meta.url), 'utf8')
)
const { getCtx } = await import('../utils/get-ctx.js')
const ctx = getCtx({
mode: argv.mode,
target: argv.target,
arch: argv.arch,
bundler: argv.bundler,
debug: argv.debug,
prod: true,
publish: argv.publish
})
const { displayBanner } = await import('../utils/banner.js')
await displayBanner({ argv, ctx, cmd: 'build' })
const { log, fatal } = await import('../utils/logger.js')
// install mode if it's missing
const { addMode } = await import(
`../modes/${argv.mode}/${argv.mode}-installation.js`
)
await addMode({ ctx, silent: true, target: argv.target })
const { QuasarConfigFile } = await import('../quasar-config-file.js')
const quasarConfFile = new QuasarConfigFile({
ctx,
port: argv.port,
host: argv.hostname
})
const quasarConf = await quasarConfFile.read()
const { QuasarModeBuilder } = await import(
`../modes/${argv.mode}/${argv.mode}-builder.js`
)
const appBuilder = new QuasarModeBuilder({ argv, quasarConf })
const { default: fse } = await import('fs-extra')
let outputFolder = quasarConf.build.distDir
fse.removeSync(outputFolder)
const { EntryFilesGenerator } = await import('../entry-files-generator.js')
const entryFiles = new EntryFilesGenerator(ctx)
entryFiles.generate(quasarConf)
const { generateTypes } = await import('../types-generator.js')
generateTypes(quasarConf)
if (typeof quasarConf.build.beforeBuild === 'function') {
await quasarConf.build.beforeBuild({ quasarConf })
}
// run possible beforeBuild hooks
await ctx.appExt.runAppExtensionHook('beforeBuild', async hook => {
log(`Extension(${hook.api.extId}): Running beforeBuild hook...`)
await hook.fn(hook.api, { quasarConf })
})
log()
// oxlint-disable-next-line unicorn/prefer-top-level-await
appBuilder
.build()
.catch(err => {
console.error(err)
fatal('App build failed (check the log above)', 'FAIL')
})
.then(async signal => {
if (signal !== void 0) {
const { SIGNALS } = await import('../utils/signals.js')
if (signal === SIGNALS.BUILD_EXTERNAL_TOOL_SPAWNED) {
const { platform } = await import('node:process')
// We simply return and let Windows be able to
// spawn the external tool (requires extra time)
if (platform === 'win32') return
// Otherwise, we force exit the process.
// See process.exit(0) at the end of this then() for the explanation.
process.exit(0)
}
}
if (argv.mode === 'cordova') {
outputFolder = path.join(outputFolder, '..')
}
await displayBanner({
argv,
ctx,
cmd: 'build',
details: {
buildOutputFolder: outputFolder,
target: quasarConf.build.target
}
})
if (typeof quasarConf.build.afterBuild === 'function') {
await quasarConf.build.afterBuild({ quasarConf })
}
// run possible beforeBuild hooks
await ctx.appExt.runAppExtensionHook('afterBuild', async hook => {
log(`Extension(${hook.api.extId}): Running afterBuild hook...`)
await hook.fn(hook.api, { quasarConf })
})
if (argv.publish !== void 0) {
const opts = {
arg: argv.publish,
distDir: outputFolder,
quasarConf
}
if (typeof quasarConf.build.onPublish === 'function') {
await quasarConf.build.onPublish(opts)
}
// run possible onPublish hooks
await ctx.appExt.runAppExtensionHook('onPublish', async hook => {
log(`Extension(${hook.api.extId}): Running onPublish hook...`)
await hook.fn(hook.api, opts)
})
}
/**
* We're done, but there may be some underlying tools which
* haven't freed up the Node's JS execution stack yet (like Rolldown or Vite).
* So, we're forcing the process to exit to avoid losing time.
*/
process.exit(0)
})
================================================
FILE: app-vite/lib/cmd/clean.js
================================================
import parseArgs from 'minimist'
import { log } from '../utils/logger.js'
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
e: 'entry',
c: 'cache',
d: 'dist',
q: 'qconf'
},
boolean: ['h', 'e', 'c', 'd', 'q'],
default: {
e: false,
c: false,
d: false,
q: false
}
})
if (argv.help) {
console.log(`
Description
Cleans all build artifacts
(dev/build cache, /dist folder & entry points)
Usage
$ quasar clean
Options
--entry, -e Cleans generated entry points only
--cache, -c Cleans dev/build cache only
--dist, -d Cleans /dist folder only
--qconf, -q Cleans temporary compiled quasar.config files
(used for issue investigation)
--nocolor Disable colored output
--help, -h Displays this message
`)
process.exit(0)
}
import fse from 'fs-extra'
import { getCtx } from '../utils/get-ctx.js'
const { appPaths } = getCtx()
console.log()
const cleanAll =
argv.entry !== true &&
argv.cache !== true &&
argv.dist !== true &&
argv.qconf !== true
if (cleanAll || argv.entry) {
fse.removeSync(appPaths.resolve.app('.quasar'))
log('Cleaned generated entry points')
}
if (cleanAll || argv.cache) {
fse.removeSync(appPaths.cacheDir)
log('Cleaned dev/build cache')
}
if (cleanAll || argv.dist) {
// we empty the dist folder
// (will not work if build > distDir was changed outside of it)
fse.emptyDirSync(appPaths.resolve.app('dist'))
log('Cleaned /dist folder')
}
if (cleanAll || argv.qconf) {
const { globSync } = await import('tinyglobby')
const fileList = globSync(['quasar.config.*.temporary.compiled.*'], {
cwd: appPaths.appDir
})
fileList.forEach(file => {
fse.removeSync(appPaths.resolve.app(file))
})
log(
`Cleaned ${fileList.length} temporary compiled quasar.config file${fileList.length === 1 ? '' : 's'}`
)
}
console.log()
================================================
FILE: app-vite/lib/cmd/describe.js
================================================
import parseArgs from 'minimist'
import { green, italic, red, underline } from 'kolorist'
import { dot, fatal } from '../utils/logger.js'
import { getApi } from '../utils/get-api.js'
import { getCtx } from '../utils/get-ctx.js'
const partArgs = {
p: 'props',
s: 'slots',
m: 'methods',
c: 'computedProps',
e: 'events',
v: 'value',
a: 'arg',
M: 'modifiers',
i: 'injection',
q: 'quasar',
d: 'docs'
}
const partArgsKeys = Object.keys(partArgs)
const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
f: 'filter',
...partArgs
},
boolean: ['h', ...partArgsKeys],
string: ['f']
})
const item = argv._[0]
if (!item || argv.help) {
console.log(`
Description
Describes a component API for project's Quasar version being used
Usage
$ quasar describe <component/directive/Quasar plugin>
# list all available API entries:
$ quasar describe list
# list available API entries that contain a String (ex "storage"):
$ quasar describe list storage
# display everything:
$ quasar describe QIcon
# displaying only props:
$ quasar describe QIcon -p
# displaying props and methods only:
$ quasar describe QIcon -p -m
# filtering by "si":
$ quasar describe QIcon -f si
# filtering only props by "co":
$ quasar describe QIcon -p -f co
# Open docs URL:
$ quasar describe QIcon -d
Options
--filter, -f <filter> Filters the API
--props, -p Displays the API props
--slots, -s Displays the API slots
--events, -e Displays the API events
--methods, -m Displays the API methods
--computedProps, -c Displays the API computed props
--value, -v Displays the API value
--arg, -a Displays the API arg
--modifiers, -M Displays the API modifiers
--injection, -i Displays the API injection
--quasar, -q Displays the API quasar conf options
--docs, -d Opens the docs API URL
--nocolor Disable colored output
--help, -h Displays this message
`)
process.exit(0)
}
const ctx = getCtx()
const apiParts = {}
if (partArgsKeys.some(part => argv[part])) {
Object.values(partArgs).forEach(part => {
apiParts[part] = argv[part]
})
} else {
Object.values(partArgs).forEach(part => {
if (part !== 'docs') {
apiParts[part] = true
}
})
}
function getEventParams(event) {
const params =
!event.params || event.params.length === 0
? ''
: Object.keys(event.params).join(', ')
return ' -> function(' + params + ')'
}
function getMethodParams(method, noRequired) {
if (!method.params || method.params.length === 0) {
return ' ()'
}
if (noRequired) {
return ` (${Object.keys(method.params).join(', ')})`
}
const params = Object.keys(method.params)
const optionalIndex = params.findIndex(
param => method.params[param].required !== true
)
const str =
optionalIndex !== -1
? params.slice(0, optionalIndex).join(', ') +
(optionalIndex < params.length
? '[' +
(optionalIndex > 0 ? ', ' : '') +
params.slice(optionalIndex).join(', ') +
']'
: '')
: params.join(', ')
return ' (' + str + ')'
}
function getMethodReturnValue(method) {
return ' => ' + (!method.returns ? 'void 0' : method.returns.type)
}
function getStringType(type) {
return Array.isArray(type) ? type.join(' | ') : type
}
function printProp(prop, propName, indentLevel) {
let indent = ' '.repeat(indentLevel)
const type = getStringType(prop.type)
if (propName !== void 0) {
console.log(
`${indent}${green(propName)} ${type ? `(${type})` : ''}${type !== 'Function' && prop.required ? red(' [Required]') : ''}${prop.reactive ? red(' [Reactive]') : ''}`
)
indentLevel += 2
indent += ' '
}
console.log(`${indent}Description: ${prop.desc}`)
if (prop.alias) {
console.log(`${indent}Alias: ${prop.alias}`)
}
if (type === 'Function') {
console.log(
`${indent}Function form:${getMethodParams(prop, true)}${getMethodReturnValue(prop)}`
)
}
if (prop.sync) {
console.log(`${indent}".sync" modifier required!`)
}
if (prop.link) {
console.log(`${indent}Link: ${prop.link}`)
}
if (prop.values) {
console.log(`${indent}Accepted values: ${prop.values.join(' | ')}`)
}
if (prop.default) {
console.log(`${indent}Default value: ${prop.default}`)
}
if (prop.definition) {
console.log(`${indent}Props:`)
for (const defPropName in prop.definition) {
printProp(prop.definition[defPropName], defPropName, indentLevel + 2)
}
}
if (prop.params) {
console.log(`${indent}Params:`)
for (const paramName in prop.params) {
printProp(prop.params[paramName], paramName, indentLevel + 2)
}
}
if (prop.returns) {
console.log(`${indent}Returns ${getStringType(prop.returns.type)}:`)
printProp(prop.returns, void 0, indentLevel + 2)
}
if (prop.scope) {
console.log(`${indent}Scope:`)
for (const scopePropName in prop.scope) {
printProp(prop.scope[scopePropName], scopePropName, indentLevel + 2)
}
}
if (prop.examples !== void 0) {
console.log(`${indent}Example${prop.examples.length > 1 ? 's' : ''}:`)
prop.examples.forEach(example => {
console.log(`${indent} ${example}`)
})
}
}
function printProperties({ props }) {
const keys = Object.keys(props || {})
console.log('\n ' + underline('Properties'))
if (keys.length === 0) {
console.log('\n ' + italic('*No properties*'))
return
}
if (argv.filter) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete props[key]
}
})
if (Object.keys(props).length === 0) {
console.log('\n ' + italic('*No matching properties*'))
return
}
}
for (const propName in props) {
console.log()
printProp(props[propName], propName, 3)
}
}
function printSlots({ slots }) {
const keys = Object.keys(slots || {})
console.log('\n ' + underline('Slots'))
if (keys.length === 0) {
console.log('\n ' + italic('*No slots*'))
return
}
if (argv.filter !== void 0) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete slots[key]
}
})
if (Object.keys(slots).length === 0) {
console.log('\n ' + italic('*No matching slots*'))
return
}
}
for (const slot in slots) {
console.log()
printProp(slots[slot], slot, 3)
}
}
function printEvents({ events }) {
const keys = Object.keys(events || {})
console.log('\n ' + underline('Events'))
if (keys.length === 0) {
console.log('\n ' + italic('*No events*'))
return
}
if (argv.filter !== void 0) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete events[key]
}
})
if (Object.keys(events).length === 0) {
console.log('\n ' + italic('*No matching events*'))
return
}
}
for (const eventName in events) {
const event = events[eventName]
console.log('\n @' + green(eventName) + getEventParams(event))
console.log(' Description: ' + event.desc)
if (!event.params) {
console.log(' Parameters: ' + italic('*None*'))
} else {
console.log(' Parameters:')
for (const paramName in event.params) {
printProp(event.params[paramName], paramName, 7)
}
}
}
}
function printMethods({ methods }) {
const keys = Object.keys(methods || {})
console.log('\n ' + underline('Methods'))
if (keys.length === 0) {
console.log('\n ' + italic('*No methods*'))
return
}
if (argv.filter !== void 0) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete methods[key]
}
})
if (Object.keys(methods).length === 0) {
console.log('\n ' + italic('*No matching methods*'))
return
}
}
for (const methodName in methods) {
const method = methods[methodName]
console.log(
'\n ' +
green(methodName) +
getMethodParams(method) +
getMethodReturnValue(method)
)
console.log(' ' + method.desc)
if (method.params) {
console.log(' Parameters:')
for (const paramName in method.params) {
printProp(method.params[paramName], paramName, 7)
}
}
if (method.returns) {
console.log(` Returns ${getStringType(method.returns.type)}:`)
printProp(method.returns, void 0, 7)
}
}
}
function printComputedProps({ computedProps }) {
const keys = Object.keys(computedProps || {})
console.log('\n ' + underline('Computed Properties'))
if (keys.length === 0) {
console.log('\n ' + italic('*No computed properties*'))
return
}
if (argv.filter) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete computedProps[key]
}
})
if (Object.keys(computedProps).length === 0) {
console.log('\n ' + italic('*No matching computed properties*'))
return
}
}
for (const propName in computedProps) {
console.log()
printProp(computedProps[propName], propName, 3)
}
}
function printValue({ value }) {
console.log('\n ' + underline('Value'))
if (value === void 0) {
console.log('\n ' + italic('*No value*'))
} else {
console.log('\n Type:', value.type)
printProp(value, void 0, 3)
}
}
function printArg({ arg }) {
console.log('\n ' + underline('Arg'))
if (arg === void 0) {
console.log('\n ' + italic('*No arg*'))
} else {
console.log('\n Type:', arg.type)
printProp(arg, void 0, 3)
}
}
function printModifiers({ modifiers }) {
const keys = Object.keys(modifiers || {})
console.log('\n ' + underline('Modifiers'))
if (keys.length === 0) {
console.log('\n ' + italic('*No modifiers*'))
return
}
if (argv.filter !== void 0) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete modifiers[key]
}
})
if (Object.keys(modifiers).length === 0) {
console.log('\n ' + italic('*No matching modifiers*'))
return
}
}
for (const modifierName in modifiers) {
const modifier = modifiers[modifierName]
console.log('\n ' + green(modifierName))
printProp(modifier, modifierName, 5)
}
}
function printInjection({ injection }) {
console.log('\n ' + underline('Injection'))
if (injection === void 0) {
console.log('\n ' + italic('*No injection*'))
} else {
console.log('\n ' + green(injection))
}
}
function printQuasarConfOptions({ quasarConfOptions }) {
const conf =
quasarConfOptions !== void 0 ? quasarConfOptions.definition || {} : {}
const keys = Object.keys(conf)
console.log('\n ' + underline('quasar.config file > framework > config'))
if (keys.length === 0) {
console.log('\n ' + italic('*No configuration options*'))
return
}
if (argv.filter !== void 0) {
keys.forEach(key => {
if (!key.includes(argv.filter)) {
delete conf[key]
}
})
if (Object.keys(conf).length === 0) {
console.log('\n ' + italic('*No matching configuration options*'))
return
}
}
console.log('\n Property name: ' + green(quasarConfOptions.propName))
console.log(' Definition:')
for (const propName in conf) {
console.log()
printProp(conf[propName], propName, 5)
}
}
function describe(api) {
switch (api.type) {
case 'component': {
if (apiParts.quasar) printQuasarConfOptions(api)
if (apiParts.props) printProperties(api)
if (apiParts.slots) printSlots(api)
if (apiParts.events) printEvents(api)
if (apiParts.methods) printMethods(api)
if (apiParts.computedProps) printComputedProps(api)
break
}
case 'directive': {
if (apiParts.quasar) printQuasarConfOptions(api)
if (apiParts.value) printValue(api)
if (apiParts.arg) printArg(api)
if (apiParts.modifiers) printModifiers(api)
break
}
case 'plugin': {
if (apiParts.injection) printInjection(api)
if (apiParts.quasar) printQuasarConfOptions(api)
if (apiParts.props) printProperties(api)
if (apiParts.methods) printMethods(api)
break
}
}
if (api.meta && api.meta.docsUrl) {
console.log('\n ' + underline('Documentation URL'))
console.log('\n ' + green(api.meta.docsUrl))
}
}
async function run() {
try {
const { api, supplier } = await getApi(item, ctx)
console.log()
if (apiParts.docs) {
if (api.meta && api.meta.docsUrl) {
const { openBrowser } = await import('../utils/open-browser.js')
openBrowser({ url: api.meta.docsUrl, wait: false })
} else {
console.log(
' Please report this issue to: https://github.com/quasarframework/quasar/issues/'
)
console.log(
' Write down the command that you tried along with a complete log of "quasar info" command output'
)
console.log()
}
} else {
console.log(` Describing ${green(item)} ${api.type} API`)
if (supplier === void 0) {
console.log(
` ${italic("Description is based on your project's Quasar version")}`
)
} else {
console.log(` ${italic(`Supplied by "${supplier}" App Extension`)}`)
}
describe(api)
console.log()
}
} catch (err) {
fatal(err)
}
}
async function listElements() {
const { getPackage } = await import('../utils/get-package.js')
let api = await getPackage(
'quasar/dist/transforms/api-list.json',
ctx.appPaths.appDir
)
if (api === void 0) {
fatal(' Could not retrieve list...')
}
const filter = argv._[1]
if (filter) {
const needle = filter.toLowerCase()
const filterBanner = green(filter)
api = api.filter(entry => entry.toLowerCase().includes(needle))
if (api.length === 0) {
console.log(
`\n Nothing matches "${filterBanner}". Please refine the search term.\n`
)
process.exit(0)
}
console.log(`\n The list of API elements that match "${filterBanner}":\n`)
} else {
console.log('\n The complete list of API elements:\n')
}
const prefix = green(` ${dot} `)
api.forEach(entry => {
console.log(prefix + entry)
})
console.log()
}
if (item === 'list') {
// oxlint-disable-next-line unicorn/prefer-top-level-await
listElements()
} else {
// oxlint-disable-next-line unicorn/prefer-top-level-await
run()
}
================================================
FILE: app-vite/lib/cmd/dev.js
================================================
if (process.env.NODE_ENV === void 0) {
process.env.NODE_ENV = 'development'
}
import parseArgs
Showing preview only (231K chars total). Download the full file or copy to clipboard to get everything.
gitextract_0inuvllc/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report--quasar-v2.yml │ │ ├── config.yml │ │ └── docs-report--quasar-v2.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── RELEASE-TEMPLATE.md │ └── workflows/ │ ├── build-types.yml │ ├── comment-build-results.yml │ ├── process-created-issue.yml │ ├── project-creation-tests.yml │ ├── release-notes.yml │ ├── tests-on-pr-report.yml │ └── tests-on-pr.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .npmrc ├── .oxfmtrc.json ├── .oxlintrc.json ├── .sasslintrc ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── ROADMAP.md ├── SECURITY.md ├── app-vite/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── assets/ │ │ └── logo.art │ ├── bin/ │ │ └── quasar.js │ ├── exports/ │ │ ├── bex/ │ │ │ ├── background.js │ │ │ ├── content.js │ │ │ └── private/ │ │ │ └── bex-bridge.js │ │ ├── eslint/ │ │ │ ├── eslint.cjs │ │ │ └── eslint.js │ │ ├── testing/ │ │ │ └── testing.js │ │ └── wrappers.js │ ├── lib/ │ │ ├── app-builder.js │ │ ├── app-devserver.js │ │ ├── app-extension/ │ │ │ ├── AppExtensionInstance.js │ │ │ ├── api-classes/ │ │ │ │ ├── BaseAPI.js │ │ │ │ ├── IndexAPI.js │ │ │ │ ├── InstallAPI.js │ │ │ │ ├── PromptsAPI.js │ │ │ │ └── UninstallAPI.js │ │ │ └── create-app-ext.js │ │ ├── app-tool.js │ │ ├── cache/ │ │ │ ├── create-cache-proxy.js │ │ │ ├── module.animations.js │ │ │ ├── module.capCli.js │ │ │ ├── module.cssVariables.js │ │ │ ├── module.electron.js │ │ │ ├── module.hasTypescript.js │ │ │ ├── module.nodePackager.js │ │ │ ├── module.storeProvider.js │ │ │ └── module.workboxBuild.js │ │ ├── cmd/ │ │ │ ├── build.js │ │ │ ├── clean.js │ │ │ ├── describe.js │ │ │ ├── dev.js │ │ │ ├── ext.js │ │ │ ├── help.js │ │ │ ├── info.js │ │ │ ├── inspect.js │ │ │ ├── mode.js │ │ │ ├── new.js │ │ │ ├── prepare.js │ │ │ └── run.js │ │ ├── config-tools.js │ │ ├── entry-files-generator.js │ │ ├── modes/ │ │ │ ├── bex/ │ │ │ │ ├── bex-builder.js │ │ │ │ ├── bex-config.js │ │ │ │ ├── bex-devserver.js │ │ │ │ ├── bex-installation.js │ │ │ │ └── bex-utils.js │ │ │ ├── capacitor/ │ │ │ │ ├── capacitor-builder.js │ │ │ │ ├── capacitor-config.js │ │ │ │ ├── capacitor-consistency.js │ │ │ │ ├── capacitor-devserver.js │ │ │ │ ├── capacitor-installation.js │ │ │ │ └── config-file.js │ │ │ ├── cordova/ │ │ │ │ ├── android-cleartext.js │ │ │ │ ├── config-file.js │ │ │ │ ├── cordova-builder.js │ │ │ │ ├── cordova-config.js │ │ │ │ ├── cordova-consistency.js │ │ │ │ ├── cordova-devserver.js │ │ │ │ ├── cordova-installation.js │ │ │ │ └── vite-plugin.dev.cordova-platform-inject.js │ │ │ ├── electron/ │ │ │ │ ├── electron-builder.js │ │ │ │ ├── electron-config.js │ │ │ │ ├── electron-consistency.js │ │ │ │ ├── electron-devserver.js │ │ │ │ └── electron-installation.js │ │ │ ├── modes-utils.js │ │ │ ├── pwa/ │ │ │ │ ├── pwa-builder.js │ │ │ │ ├── pwa-config.js │ │ │ │ ├── pwa-devserver.js │ │ │ │ ├── pwa-installation.js │ │ │ │ ├── utils.js │ │ │ │ └── vite-plugin.pwa-resources.js │ │ │ ├── spa/ │ │ │ │ ├── spa-builder.js │ │ │ │ ├── spa-config.js │ │ │ │ ├── spa-devserver.js │ │ │ │ └── spa-installation.js │ │ │ └── ssr/ │ │ │ ├── ssr-builder.js │ │ │ ├── ssr-config.js │ │ │ ├── ssr-consistency.js │ │ │ ├── ssr-devserver.js │ │ │ └── ssr-installation.js │ │ ├── node-version-check.js │ │ ├── plugins/ │ │ │ ├── rolldown.inject-replacements.js │ │ │ ├── rolldown.vue-shim.js │ │ │ ├── vite.index-html-transform.js │ │ │ └── vite.strip-filename-hashes.js │ │ ├── quasar-config-file.js │ │ ├── types-generator.js │ │ └── utils/ │ │ ├── app-files-validations.js │ │ ├── banner.js │ │ ├── build-targets.js │ │ ├── cli-runtime.js │ │ ├── encode-for-diff.js │ │ ├── ensure-argv.js │ │ ├── env.js │ │ ├── escape-regex-string.js │ │ ├── get-api.js │ │ ├── get-app-paths.js │ │ ├── get-caller-path.js │ │ ├── get-ctx.js │ │ ├── get-external-ip.js │ │ ├── get-fixed-deps.js │ │ ├── get-package-json.js │ │ ├── get-package-major-version.js │ │ ├── get-package-path.js │ │ ├── get-package.js │ │ ├── get-pkg.js │ │ ├── html-template.js │ │ ├── is-terminal.js │ │ ├── logger.js │ │ ├── net.js │ │ ├── on-shutdown.js │ │ ├── open-browser.js │ │ ├── open-ide.js │ │ ├── print-build-summary.js │ │ ├── rate-limit.js │ │ ├── resolve-extension.js │ │ ├── signals.js │ │ ├── spawn.js │ │ └── template.js │ ├── package.json │ ├── playground-js/ │ │ ├── index.html │ │ ├── jsconfig.json │ │ ├── package.json │ │ ├── public/ │ │ │ └── .gitkeep │ │ ├── quasar.config.js │ │ └── src/ │ │ ├── App.vue │ │ ├── assets/ │ │ │ └── .gitkeep │ │ ├── boot/ │ │ │ └── .gitkeep │ │ ├── components/ │ │ │ └── EssentialLink.vue │ │ ├── css/ │ │ │ ├── app.scss │ │ │ └── quasar.variables.scss │ │ ├── layouts/ │ │ │ └── MainLayout.vue │ │ ├── pages/ │ │ │ ├── ErrorNotFound.vue │ │ │ └── IndexPage.vue │ │ └── router/ │ │ ├── index.js │ │ └── routes.js │ ├── playground-ts/ │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── .gitkeep │ │ ├── quasar.config.ts │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ └── .gitkeep │ │ │ ├── boot/ │ │ │ │ └── .gitkeep │ │ │ ├── components/ │ │ │ │ ├── EssentialLink.vue │ │ │ │ ├── ExampleComponent.vue │ │ │ │ └── models.ts │ │ │ ├── css/ │ │ │ │ ├── app.scss │ │ │ │ └── quasar.variables.scss │ │ │ ├── env.d.ts │ │ │ ├── layouts/ │ │ │ │ └── MainLayout.vue │ │ │ ├── pages/ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ └── IndexPage.vue │ │ │ └── router/ │ │ │ ├── index.ts │ │ │ └── routes.ts │ │ └── tsconfig.json │ ├── templates/ │ │ ├── app/ │ │ │ ├── js/ │ │ │ │ ├── boot.js │ │ │ │ ├── component.vue │ │ │ │ ├── layout.vue │ │ │ │ ├── page.vue │ │ │ │ ├── ssrmiddleware.js │ │ │ │ └── store.js │ │ │ └── ts/ │ │ │ ├── boot.ts │ │ │ ├── component.vue │ │ │ ├── layout.vue │ │ │ ├── page.vue │ │ │ ├── ssrmiddleware.ts │ │ │ └── store.ts │ │ ├── bex/ │ │ │ ├── common/ │ │ │ │ └── assets/ │ │ │ │ └── content.css │ │ │ ├── js/ │ │ │ │ ├── background.js │ │ │ │ ├── manifest.json │ │ │ │ └── my-content-script.js │ │ │ └── ts/ │ │ │ ├── background.ts │ │ │ ├── bex-env.d.ts │ │ │ ├── manifest.json │ │ │ └── my-content-script.ts │ │ ├── capacitor/ │ │ │ ├── capacitor.config.json │ │ │ ├── package.json │ │ │ ├── pnpm-workspace.yaml │ │ │ └── www/ │ │ │ └── index.html │ │ ├── cordova/ │ │ │ └── www/ │ │ │ └── index.html │ │ ├── electron/ │ │ │ ├── common/ │ │ │ │ ├── icons/ │ │ │ │ │ └── icon.icns │ │ │ │ ├── package.json │ │ │ │ └── pnpm-workspace.yaml │ │ │ ├── js/ │ │ │ │ ├── electron-main.js │ │ │ │ └── electron-preload.js │ │ │ └── ts/ │ │ │ ├── electron-env.d.ts │ │ │ ├── electron-main.ts │ │ │ └── electron-preload.ts │ │ ├── entry/ │ │ │ ├── app.js │ │ │ ├── bex-app.js │ │ │ ├── client-entry.js │ │ │ ├── client-prefetch.js │ │ │ ├── quasar-user-options.js │ │ │ ├── server-entry.js │ │ │ ├── ssr-dev-webserver.js │ │ │ ├── ssr-middlewares.js │ │ │ └── ssr-prod-webserver.js │ │ ├── pwa/ │ │ │ ├── js/ │ │ │ │ ├── custom-service-worker.js │ │ │ │ ├── manifest.json │ │ │ │ └── register-service-worker.js │ │ │ └── ts/ │ │ │ ├── custom-service-worker.ts │ │ │ ├── manifest.json │ │ │ ├── pwa-env.d.ts │ │ │ ├── register-service-worker.ts │ │ │ └── tsconfig.json │ │ ├── ssr/ │ │ │ ├── express/ │ │ │ │ ├── common/ │ │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ │ └── server-assets/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── js/ │ │ │ │ │ ├── middlewares/ │ │ │ │ │ │ └── render.js │ │ │ │ │ ├── package.json │ │ │ │ │ └── server.js │ │ │ │ └── ts/ │ │ │ │ ├── middlewares/ │ │ │ │ │ └── render.ts │ │ │ │ ├── package.json │ │ │ │ ├── server.ts │ │ │ │ └── ssr-env.d.ts │ │ │ ├── fastify/ │ │ │ │ ├── common/ │ │ │ │ │ ├── package.json │ │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ │ └── server-assets/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── js/ │ │ │ │ │ ├── middlewares/ │ │ │ │ │ │ └── render.js │ │ │ │ │ └── server.js │ │ │ │ └── ts/ │ │ │ │ ├── middlewares/ │ │ │ │ │ └── render.ts │ │ │ │ ├── server.ts │ │ │ │ └── ssr-env.d.ts │ │ │ ├── hono/ │ │ │ │ ├── common/ │ │ │ │ │ ├── package.json │ │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ │ └── server-assets/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── js/ │ │ │ │ │ ├── middlewares/ │ │ │ │ │ │ └── render.js │ │ │ │ │ └── server.js │ │ │ │ └── ts/ │ │ │ │ ├── middlewares/ │ │ │ │ │ └── render.ts │ │ │ │ ├── server.ts │ │ │ │ └── ssr-env.d.ts │ │ │ └── koa/ │ │ │ ├── common/ │ │ │ │ ├── pnpm-workspace.yaml │ │ │ │ └── server-assets/ │ │ │ │ └── .gitkeep │ │ │ ├── js/ │ │ │ │ ├── middlewares/ │ │ │ │ │ └── render.js │ │ │ │ ├── package.json │ │ │ │ └── server.js │ │ │ └── ts/ │ │ │ ├── middlewares/ │ │ │ │ └── render.ts │ │ │ ├── package.json │ │ │ ├── server.ts │ │ │ └── ssr-env.d.ts │ │ └── store/ │ │ └── pinia/ │ │ ├── js/ │ │ │ └── index.js │ │ └── ts/ │ │ └── index.ts │ └── types/ │ ├── app-extension.d.ts │ ├── app-paths.d.ts │ ├── app-wrappers.d.ts │ ├── bex/ │ │ ├── bridge.d.ts │ │ ├── entrypoints/ │ │ │ ├── background.d.ts │ │ │ ├── content.d.ts │ │ │ └── create-bridge.d.ts │ │ └── index.d.ts │ ├── boot.d.ts │ ├── client/ │ │ ├── src-bex.d.ts │ │ ├── src-electron.d.ts │ │ ├── src-pwa.d.ts │ │ ├── src-ssr.d.ts │ │ └── src.d.ts │ ├── configuration/ │ │ ├── bex.d.ts │ │ ├── boot.d.ts │ │ ├── build.d.ts │ │ ├── capacitor-conf.d.ts │ │ ├── conf.d.ts │ │ ├── context.d.ts │ │ ├── cordova-conf.d.ts │ │ ├── electron-conf.d.ts │ │ ├── framework-conf.d.ts │ │ ├── mobile-conf.d.ts │ │ ├── pwa-conf.d.ts │ │ └── ssr-conf.d.ts │ ├── configuration.d.ts │ ├── globals.d.ts │ ├── index.d.ts │ ├── prefetch.d.ts │ ├── route.d.ts │ ├── ssr/ │ │ ├── context.d.ts │ │ ├── driver.d.ts │ │ ├── index.d.ts │ │ └── ssrmiddleware.d.ts │ ├── store.d.ts │ └── tsconfig.json ├── app-webpack/ │ ├── .gitignore │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── assets/ │ │ └── logo.art │ ├── bin/ │ │ └── quasar │ ├── exports/ │ │ ├── bex/ │ │ │ ├── background.mjs │ │ │ ├── content.mjs │ │ │ └── private/ │ │ │ └── bex-bridge.mjs │ │ ├── eslint/ │ │ │ ├── eslint.js │ │ │ └── eslint.mjs │ │ ├── testing/ │ │ │ └── testing.js │ │ └── wrappers/ │ │ ├── wrappers.js │ │ └── wrappers.mjs │ ├── lib/ │ │ ├── app-builder.js │ │ ├── app-devserver.js │ │ ├── app-extension/ │ │ │ ├── AppExtensionInstance.js │ │ │ ├── api-classes/ │ │ │ │ ├── BaseAPI.js │ │ │ │ ├── IndexAPI.js │ │ │ │ ├── InstallAPI.js │ │ │ │ ├── PromptsAPI.js │ │ │ │ └── UninstallAPI.js │ │ │ ├── create-app-ext.js │ │ │ └── utils.app-extension.js │ │ ├── app-tool.js │ │ ├── cache/ │ │ │ ├── create-cache-proxy.js │ │ │ ├── module.animations.js │ │ │ ├── module.capCli.js │ │ │ ├── module.cssVariables.js │ │ │ ├── module.electron.js │ │ │ ├── module.eslint.js │ │ │ ├── module.extrasPath.js │ │ │ ├── module.hasTypescript.js │ │ │ ├── module.nodePackager.js │ │ │ ├── module.quasarMeta.js │ │ │ ├── module.storeProvider.js │ │ │ ├── module.vueRouterVersion.js │ │ │ └── module.workboxWebpackPlugin.js │ │ ├── cmd/ │ │ │ ├── build.js │ │ │ ├── clean.js │ │ │ ├── describe.js │ │ │ ├── dev.js │ │ │ ├── ext.js │ │ │ ├── help.js │ │ │ ├── info.js │ │ │ ├── inspect.js │ │ │ ├── mode.js │ │ │ ├── new.js │ │ │ ├── prepare.js │ │ │ └── run.js │ │ ├── config-tools.js │ │ ├── entry-files-generator.js │ │ ├── loaders/ │ │ │ ├── loader.js.transform-quasar-imports.js │ │ │ ├── loader.quasar-scss-variables.js │ │ │ ├── loader.vue.auto-import-quasar.js │ │ │ ├── runtime.auto-import.js │ │ │ └── runtime.inject-module-id.js │ │ ├── modes/ │ │ │ ├── bex/ │ │ │ │ ├── bex-builder.js │ │ │ │ ├── bex-config.js │ │ │ │ ├── bex-devserver.js │ │ │ │ ├── bex-installation.js │ │ │ │ └── bex-utils.js │ │ │ ├── capacitor/ │ │ │ │ ├── capacitor-builder.js │ │ │ │ ├── capacitor-config.js │ │ │ │ ├── capacitor-devserver.js │ │ │ │ ├── capacitor-installation.js │ │ │ │ ├── config-file.js │ │ │ │ └── ensure-consistency.js │ │ │ ├── cordova/ │ │ │ │ ├── android-cleartext.js │ │ │ │ ├── config-file.js │ │ │ │ ├── cordova-builder.js │ │ │ │ ├── cordova-config.js │ │ │ │ ├── cordova-devserver.js │ │ │ │ ├── cordova-installation.js │ │ │ │ └── ensure-consistency.js │ │ │ ├── electron/ │ │ │ │ ├── electron-builder.js │ │ │ │ ├── electron-config.js │ │ │ │ ├── electron-devserver.js │ │ │ │ └── electron-installation.js │ │ │ ├── modes-utils.js │ │ │ ├── pwa/ │ │ │ │ ├── plugin.webpack.pwa-manifest.js │ │ │ │ ├── plugin.webpack.workbox-warning.js │ │ │ │ ├── pwa-builder.js │ │ │ │ ├── pwa-config.js │ │ │ │ ├── pwa-devserver.js │ │ │ │ └── pwa-installation.js │ │ │ ├── spa/ │ │ │ │ ├── spa-builder.js │ │ │ │ ├── spa-config.js │ │ │ │ ├── spa-devserver.js │ │ │ │ └── spa-installation.js │ │ │ └── ssr/ │ │ │ ├── plugin.webpack.client-side.js │ │ │ ├── plugin.webpack.server-side.js │ │ │ ├── ssr-builder.js │ │ │ ├── ssr-config.js │ │ │ ├── ssr-devserver.js │ │ │ └── ssr-installation.js │ │ ├── node-version-check.js │ │ ├── plugins/ │ │ │ ├── esbuild.eslint.js │ │ │ ├── esbuild.inject-replacements.js │ │ │ ├── esbuild.vue-shim.js │ │ │ ├── webpack.boot-default-export.js │ │ │ ├── webpack.html-transform.js │ │ │ └── webpack.progress.js │ │ ├── quasar-config-file.js │ │ ├── testing.js │ │ ├── types-generator.js │ │ └── utils/ │ │ ├── app-files-validations.js │ │ ├── banner.js │ │ ├── cli-runtime.js │ │ ├── encode-for-diff.js │ │ ├── ensure-argv.js │ │ ├── env.js │ │ ├── escape-regex-string.js │ │ ├── get-api.js │ │ ├── get-app-paths.js │ │ ├── get-caller-path.js │ │ ├── get-ctx.js │ │ ├── get-external-ip.js │ │ ├── get-fixed-deps.js │ │ ├── get-package-json.js │ │ ├── get-package-major-version.js │ │ ├── get-package-path.js │ │ ├── get-package.js │ │ ├── get-pkg.js │ │ ├── html-template.js │ │ ├── inject-eslint-plugin.js │ │ ├── inject-style-rules.js │ │ ├── is-minimal-terminal.js │ │ ├── logger.js │ │ ├── net.js │ │ ├── on-shutdown.js │ │ ├── open-browser.js │ │ ├── open-ide.js │ │ ├── print-build-summary.js │ │ ├── print-webpack-issue/ │ │ │ ├── extractWebpackError.js │ │ │ ├── formatters/ │ │ │ │ ├── babelError.js │ │ │ │ ├── defaultError.js │ │ │ │ ├── eslintError.js │ │ │ │ ├── moduleNotFound.js │ │ │ │ └── stringError.js │ │ │ ├── index.js │ │ │ ├── transformErrors.js │ │ │ ├── transformers/ │ │ │ │ ├── babelSyntax.js │ │ │ │ ├── defaultTransformer.js │ │ │ │ ├── esLintError.js │ │ │ │ ├── index.js │ │ │ │ ├── moduleNotFound.js │ │ │ │ └── stringError.js │ │ │ └── utils.js │ │ ├── progress-log.js │ │ ├── resolve-extension.js │ │ ├── signals.js │ │ └── spawn.js │ ├── package.json │ ├── playground-js/ │ │ ├── babel.config.js │ │ ├── index.html │ │ ├── jsconfig.json │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── public/ │ │ │ └── .gitkeep │ │ ├── quasar.config.js │ │ └── src/ │ │ ├── App.vue │ │ ├── assets/ │ │ │ └── .gitkeep │ │ ├── boot/ │ │ │ └── .gitkeep │ │ ├── components/ │ │ │ └── EssentialLink.vue │ │ ├── css/ │ │ │ ├── app.scss │ │ │ └── quasar.variables.scss │ │ ├── layouts/ │ │ │ └── MainLayout.vue │ │ ├── pages/ │ │ │ ├── ErrorNotFound.vue │ │ │ └── IndexPage.vue │ │ └── router/ │ │ ├── index.js │ │ └── routes.js │ ├── playground-ts/ │ │ ├── babel.config.cjs │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.cjs │ │ ├── public/ │ │ │ └── .gitkeep │ │ ├── quasar.config.ts │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ └── .gitkeep │ │ │ ├── boot/ │ │ │ │ └── .gitkeep │ │ │ ├── components/ │ │ │ │ ├── EssentialLink.vue │ │ │ │ ├── ExampleComponent.vue │ │ │ │ └── models.ts │ │ │ ├── css/ │ │ │ │ ├── app.scss │ │ │ │ └── quasar.variables.scss │ │ │ ├── env.d.ts │ │ │ ├── layouts/ │ │ │ │ └── MainLayout.vue │ │ │ ├── pages/ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ └── IndexPage.vue │ │ │ └── router/ │ │ │ ├── index.ts │ │ │ └── routes.ts │ │ └── tsconfig.json │ ├── templates/ │ │ ├── app/ │ │ │ ├── js/ │ │ │ │ ├── boot.js │ │ │ │ ├── component.vue │ │ │ │ ├── layout.vue │ │ │ │ ├── page.vue │ │ │ │ ├── ssrmiddleware.js │ │ │ │ └── store.js │ │ │ └── ts/ │ │ │ ├── boot.ts │ │ │ ├── component.vue │ │ │ ├── layout.vue │ │ │ ├── page.vue │ │ │ ├── ssrmiddleware.ts │ │ │ └── store.ts │ │ ├── bex/ │ │ │ ├── common/ │ │ │ │ └── assets/ │ │ │ │ └── content.css │ │ │ ├── js/ │ │ │ │ ├── background.js │ │ │ │ ├── manifest.json │ │ │ │ └── my-content-script.js │ │ │ └── ts/ │ │ │ ├── background.ts │ │ │ ├── manifest.json │ │ │ └── my-content-script.ts │ │ ├── capacitor/ │ │ │ ├── capacitor.config.json │ │ │ ├── package.json │ │ │ └── www/ │ │ │ └── index.html │ │ ├── cordova/ │ │ │ └── www/ │ │ │ └── index.html │ │ ├── electron/ │ │ │ ├── icons/ │ │ │ │ └── icon.icns │ │ │ ├── js/ │ │ │ │ ├── electron-main.js │ │ │ │ └── electron-preload.js │ │ │ └── ts/ │ │ │ ├── electron-env.d.ts │ │ │ ├── electron-main.ts │ │ │ └── electron-preload.ts │ │ ├── entry/ │ │ │ ├── app.js │ │ │ ├── bex-app.js │ │ │ ├── client-entry.js │ │ │ ├── client-prefetch.js │ │ │ ├── quasar-user-options.js │ │ │ ├── server-entry.js │ │ │ ├── ssr-dev-webserver.js │ │ │ ├── ssr-middlewares.js │ │ │ └── ssr-prod-webserver.js │ │ ├── pwa/ │ │ │ ├── js/ │ │ │ │ ├── custom-service-worker.js │ │ │ │ ├── manifest.json │ │ │ │ └── register-service-worker.js │ │ │ └── ts/ │ │ │ ├── custom-service-worker.ts │ │ │ ├── manifest.json │ │ │ ├── pwa-env.d.ts │ │ │ ├── register-service-worker.ts │ │ │ └── tsconfig.json │ │ ├── ssr/ │ │ │ ├── js/ │ │ │ │ ├── middlewares/ │ │ │ │ │ └── render.js │ │ │ │ └── server.js │ │ │ └── ts/ │ │ │ ├── middlewares/ │ │ │ │ └── render.ts │ │ │ └── server.ts │ │ └── store/ │ │ └── pinia/ │ │ ├── js/ │ │ │ └── index.js │ │ └── ts/ │ │ └── index.ts │ └── types/ │ ├── app-extension.d.ts │ ├── app-paths.d.ts │ ├── app-wrappers.d.ts │ ├── bex/ │ │ ├── bridge.d.ts │ │ ├── entrypoints/ │ │ │ ├── background.d.ts │ │ │ ├── content.d.ts │ │ │ └── create-bridge.d.ts │ │ └── index.d.ts │ ├── boot.d.ts │ ├── configuration/ │ │ ├── bex.d.ts │ │ ├── boot.d.ts │ │ ├── build.d.ts │ │ ├── capacitor-conf.d.ts │ │ ├── conf.d.ts │ │ ├── context.d.ts │ │ ├── cordova-conf.d.ts │ │ ├── electron-conf.d.ts │ │ ├── eslint.d.ts │ │ ├── framework-conf.d.ts │ │ ├── mobile-conf.d.ts │ │ ├── pwa-conf.d.ts │ │ └── ssr-conf.d.ts │ ├── configuration.d.ts │ ├── globals.d.ts │ ├── index.d.ts │ ├── prefetch.d.ts │ ├── route.d.ts │ ├── ssr/ │ │ ├── context.d.ts │ │ ├── driver.d.ts │ │ ├── index.d.ts │ │ └── ssrmiddleware.d.ts │ ├── store.d.ts │ ├── tsconfig.json │ └── ui-wrappers.d.ts ├── backers.md ├── cli/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── assets/ │ │ └── logo.art │ ├── bin/ │ │ └── quasar.js │ ├── lib/ │ │ ├── app-paths.js │ │ ├── app-pkg.js │ │ ├── cli-pkg.js │ │ ├── cmd/ │ │ │ ├── create.js │ │ │ ├── help.js │ │ │ ├── info.js │ │ │ ├── serve.js │ │ │ └── upgrade.js │ │ ├── get-package-json.js │ │ ├── get-package-path.js │ │ ├── is-terminal.js │ │ ├── logger.js │ │ ├── net.js │ │ ├── node-packager.js │ │ ├── node-version-check.js │ │ └── spawn.js │ └── package.json ├── create-quasar/ │ ├── .gitignore │ ├── README.md │ ├── assets/ │ │ └── logo.art │ ├── index.js │ ├── package.json │ ├── scripts/ │ │ ├── create-test-project.ts │ │ └── tsconfig.json │ ├── templates/ │ │ ├── __eslint.config.base.js │ │ ├── app/ │ │ │ ├── __eslint.config.js │ │ │ ├── create-quasar-script.js │ │ │ └── quasar-v2/ │ │ │ ├── create-quasar-script.js │ │ │ ├── js-vite-2/ │ │ │ │ ├── BASE/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.editorconfig │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _.vscode/ │ │ │ │ │ │ ├── extensions.json │ │ │ │ │ │ └── settings.json │ │ │ │ │ ├── _jsconfig.json │ │ │ │ │ ├── _package.json │ │ │ │ │ ├── _pnpm-workspace.yaml │ │ │ │ │ ├── index.html │ │ │ │ │ ├── postcss.config.js │ │ │ │ │ ├── quasar.config.js │ │ │ │ │ └── src/ │ │ │ │ │ ├── App.vue │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── _.gitkeep │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── EssentialLink.vue │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ └── MainLayout.vue │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ │ └── IndexPage.vue │ │ │ │ │ └── router/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── routes.js │ │ │ │ ├── __.eslintrc.cjs │ │ │ │ ├── create-quasar-script.js │ │ │ │ ├── css/ │ │ │ │ │ └── src/ │ │ │ │ │ └── css/ │ │ │ │ │ └── app.css │ │ │ │ ├── eslint/ │ │ │ │ │ └── _eslint.config.js │ │ │ │ ├── i18n/ │ │ │ │ │ └── src/ │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── i18n.js │ │ │ │ │ └── i18n/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── pinia/ │ │ │ │ │ └── src/ │ │ │ │ │ └── stores/ │ │ │ │ │ ├── example-store.js │ │ │ │ │ └── index.js │ │ │ │ ├── prettier/ │ │ │ │ │ └── _.prettierrc.json │ │ │ │ └── sass/ │ │ │ │ └── src/ │ │ │ │ └── css/ │ │ │ │ ├── app.scss │ │ │ │ └── quasar.variables.scss │ │ │ ├── js-webpack-4/ │ │ │ │ ├── BASE/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.editorconfig │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _.vscode/ │ │ │ │ │ │ ├── extensions.json │ │ │ │ │ │ └── settings.json │ │ │ │ │ ├── _jsconfig.json │ │ │ │ │ ├── _package.json │ │ │ │ │ ├── _pnpm-workspace.yaml │ │ │ │ │ ├── babel.config.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── postcss.config.js │ │ │ │ │ ├── quasar.config.js │ │ │ │ │ └── src/ │ │ │ │ │ ├── App.vue │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── _.gitkeep │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── EssentialLink.vue │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ └── MainLayout.vue │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ │ └── IndexPage.vue │ │ │ │ │ └── router/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── routes.js │ │ │ │ ├── __.eslintrc.cjs │ │ │ │ ├── create-quasar-script.js │ │ │ │ ├── css/ │ │ │ │ │ └── src/ │ │ │ │ │ └── css/ │ │ │ │ │ └── app.css │ │ │ │ ├── eslint/ │ │ │ │ │ └── _eslint.config.js │ │ │ │ ├── i18n/ │ │ │ │ │ └── src/ │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── i18n.js │ │ │ │ │ └── i18n/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── index.js │ │ │ │ ├── pinia/ │ │ │ │ │ └── src/ │ │ │ │ │ └── stores/ │ │ │ │ │ ├── example-store.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── store-flag.d.ts │ │ │ │ ├── prettier/ │ │ │ │ │ └── _.prettierrc.json │ │ │ │ └── sass/ │ │ │ │ └── src/ │ │ │ │ └── css/ │ │ │ │ ├── app.scss │ │ │ │ └── quasar.variables.scss │ │ │ ├── ts-vite-2/ │ │ │ │ ├── BASE/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.editorconfig │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _.vscode/ │ │ │ │ │ │ ├── extensions.json │ │ │ │ │ │ └── settings.json │ │ │ │ │ ├── _package.json │ │ │ │ │ ├── _pnpm-workspace.yaml │ │ │ │ │ ├── _tsconfig.json │ │ │ │ │ ├── index.html │ │ │ │ │ ├── postcss.config.js │ │ │ │ │ ├── quasar.config.ts │ │ │ │ │ └── src/ │ │ │ │ │ ├── App.vue │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── _.gitkeep │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── EssentialLink.vue │ │ │ │ │ │ ├── ExampleComponent.vue │ │ │ │ │ │ └── models.ts │ │ │ │ │ ├── env.d.ts │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ └── MainLayout.vue │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ │ └── IndexPage.vue │ │ │ │ │ └── router/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── routes.ts │ │ │ │ ├── __.eslintrc.cjs │ │ │ │ ├── create-quasar-script.js │ │ │ │ ├── css/ │ │ │ │ │ └── src/ │ │ │ │ │ └── css/ │ │ │ │ │ └── app.css │ │ │ │ ├── eslint/ │ │ │ │ │ └── _eslint.config.js │ │ │ │ ├── i18n/ │ │ │ │ │ └── src/ │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── i18n.ts │ │ │ │ │ └── i18n/ │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── pinia/ │ │ │ │ │ └── src/ │ │ │ │ │ └── stores/ │ │ │ │ │ ├── example-store.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── prettier/ │ │ │ │ │ └── _.prettierrc.json │ │ │ │ └── sass/ │ │ │ │ └── src/ │ │ │ │ └── css/ │ │ │ │ ├── app.scss │ │ │ │ └── quasar.variables.scss │ │ │ └── ts-webpack-4/ │ │ │ ├── BASE/ │ │ │ │ ├── README.md │ │ │ │ ├── _.editorconfig │ │ │ │ ├── _.gitignore │ │ │ │ ├── _.vscode/ │ │ │ │ │ ├── extensions.json │ │ │ │ │ └── settings.json │ │ │ │ ├── _package.json │ │ │ │ ├── _pnpm-workspace.yaml │ │ │ │ ├── _tsconfig.json │ │ │ │ ├── babel.config.cjs │ │ │ │ ├── index.html │ │ │ │ ├── postcss.config.cjs │ │ │ │ ├── quasar.config.ts │ │ │ │ └── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── boot/ │ │ │ │ │ └── _.gitkeep │ │ │ │ ├── components/ │ │ │ │ │ ├── EssentialLink.vue │ │ │ │ │ ├── ExampleComponent.vue │ │ │ │ │ └── models.ts │ │ │ │ ├── env.d.ts │ │ │ │ ├── layouts/ │ │ │ │ │ └── MainLayout.vue │ │ │ │ ├── pages/ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ └── IndexPage.vue │ │ │ │ └── router/ │ │ │ │ ├── index.ts │ │ │ │ └── routes.ts │ │ │ ├── __.eslintrc.cjs │ │ │ ├── create-quasar-script.js │ │ │ ├── css/ │ │ │ │ └── src/ │ │ │ │ └── css/ │ │ │ │ └── app.css │ │ │ ├── eslint/ │ │ │ │ └── _eslint.config.js │ │ │ ├── i18n/ │ │ │ │ └── src/ │ │ │ │ ├── boot/ │ │ │ │ │ └── i18n.ts │ │ │ │ └── i18n/ │ │ │ │ ├── en-US/ │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── pinia/ │ │ │ │ └── src/ │ │ │ │ └── stores/ │ │ │ │ ├── example-store.ts │ │ │ │ └── index.ts │ │ │ ├── prettier/ │ │ │ │ └── _.prettierrc.json │ │ │ └── sass/ │ │ │ └── src/ │ │ │ └── css/ │ │ │ ├── app.scss │ │ │ └── quasar.variables.scss │ │ ├── app-extension/ │ │ │ ├── __eslint.config.js │ │ │ ├── ae-js/ │ │ │ │ ├── BASE/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _package.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── templates/ │ │ │ │ │ └── _.gitkeep │ │ │ │ ├── create-quasar-script.js │ │ │ │ ├── install-script/ │ │ │ │ │ └── src/ │ │ │ │ │ └── install.js │ │ │ │ ├── prompts-script/ │ │ │ │ │ └── src/ │ │ │ │ │ └── prompts.js │ │ │ │ └── uninstall-script/ │ │ │ │ └── src/ │ │ │ │ └── uninstall.js │ │ │ ├── ae-ts/ │ │ │ │ ├── BASE/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _.vscode/ │ │ │ │ │ │ ├── extensions.json │ │ │ │ │ │ └── settings.json │ │ │ │ │ ├── _eslint.config.js │ │ │ │ │ ├── _package.json │ │ │ │ │ ├── _tsconfig.json │ │ │ │ │ ├── app-extension/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── _.npmignore │ │ │ │ │ │ ├── _package.json │ │ │ │ │ │ ├── _tsconfig.json │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── quasar.d.ts │ │ │ │ │ │ └── runtime/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── boot/ │ │ │ │ │ │ │ └── register.ts │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── MyButton.vue │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── quasar.d.ts │ │ │ │ │ │ └── shims-vue.d.ts │ │ │ │ │ └── playground/ │ │ │ │ │ ├── quasar-cli-vite/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── _.gitignore │ │ │ │ │ │ ├── _package.json │ │ │ │ │ │ ├── _tsconfig.json │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ ├── postcss.config.cjs │ │ │ │ │ │ ├── quasar.config.ts │ │ │ │ │ │ ├── quasar.extensions.json │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── App.vue │ │ │ │ │ │ ├── boot/ │ │ │ │ │ │ │ └── _.gitkeep │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ └── EssentialLink.vue │ │ │ │ │ │ ├── css/ │ │ │ │ │ │ │ ├── app.scss │ │ │ │ │ │ │ └── quasar.variables.scss │ │ │ │ │ │ ├── env.d.ts │ │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ │ └── MainLayout.vue │ │ │ │ │ │ ├── pages/ │ │ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ │ │ └── IndexPage.vue │ │ │ │ │ │ ├── quasar.d.ts │ │ │ │ │ │ ├── router/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── routes.ts │ │ │ │ │ │ └── shims-vue.d.ts │ │ │ │ │ └── quasar-cli-webpack/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.gitignore │ │ │ │ │ ├── _package.json │ │ │ │ │ ├── _tsconfig.json │ │ │ │ │ ├── babel.config.cjs │ │ │ │ │ ├── index.html │ │ │ │ │ ├── postcss.config.cjs │ │ │ │ │ ├── quasar.config.ts │ │ │ │ │ ├── quasar.extensions.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── App.vue │ │ │ │ │ ├── boot/ │ │ │ │ │ │ └── _.gitkeep │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── EssentialLink.vue │ │ │ │ │ ├── css/ │ │ │ │ │ │ ├── app.scss │ │ │ │ │ │ └── quasar.variables.scss │ │ │ │ │ ├── env.d.ts │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ └── MainLayout.vue │ │ │ │ │ ├── pages/ │ │ │ │ │ │ ├── ErrorNotFound.vue │ │ │ │ │ │ └── IndexPage.vue │ │ │ │ │ ├── quasar.d.ts │ │ │ │ │ ├── router/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── routes.ts │ │ │ │ │ └── shims-vue.d.ts │ │ │ │ ├── create-quasar-script.js │ │ │ │ ├── install-script/ │ │ │ │ │ └── app-extension/ │ │ │ │ │ └── src/ │ │ │ │ │ ├── install.ts │ │ │ │ │ └── templates/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── _.gitkeep │ │ │ │ │ └── base/ │ │ │ │ │ └── _.gitkeep │ │ │ │ ├── pnpm/ │ │ │ │ │ └── _pnpm-workspace.yaml │ │ │ │ ├── prompts-script/ │ │ │ │ │ └── app-extension/ │ │ │ │ │ └── src/ │ │ │ │ │ └── prompts.ts │ │ │ │ └── uninstall-script/ │ │ │ │ └── app-extension/ │ │ │ │ └── src/ │ │ │ │ └── uninstall.ts │ │ │ └── create-quasar-script.js │ │ └── ui-kit/ │ │ ├── __eslint.config.js │ │ ├── create-quasar-script.js │ │ └── quasar-v2/ │ │ ├── BASE/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── _.gitignore │ │ │ ├── _jsconfig.json │ │ │ └── ui/ │ │ │ ├── README.md │ │ │ ├── _.npmignore │ │ │ ├── _package.json │ │ │ ├── build/ │ │ │ │ ├── config.js │ │ │ │ ├── index.js │ │ │ │ ├── script.clean.js │ │ │ │ ├── script.css.js │ │ │ │ ├── script.javascript.js │ │ │ │ ├── script.open-umd.js │ │ │ │ └── utils.js │ │ │ ├── dev/ │ │ │ │ ├── README.md │ │ │ │ ├── _.editorconfig │ │ │ │ ├── _.gitignore │ │ │ │ ├── _.postcssrc.js │ │ │ │ ├── _package.json │ │ │ │ ├── babel.config.js │ │ │ │ ├── quasar.config.js │ │ │ │ └── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── assets/ │ │ │ │ │ └── _.gitkeep │ │ │ │ ├── boot/ │ │ │ │ │ └── register.js │ │ │ │ ├── components/ │ │ │ │ │ └── _.gitkeep │ │ │ │ ├── css/ │ │ │ │ │ ├── app.sass │ │ │ │ │ └── quasar.variables.sass │ │ │ │ ├── index.template.html │ │ │ │ ├── layouts/ │ │ │ │ │ └── MyLayout.vue │ │ │ │ ├── pages/ │ │ │ │ │ ├── Error404.vue │ │ │ │ │ ├── Index.vue │ │ │ │ │ └── Test1.vue │ │ │ │ └── router/ │ │ │ │ ├── index.js │ │ │ │ ├── pages.js │ │ │ │ └── routes.js │ │ │ ├── src/ │ │ │ │ ├── index.common.js │ │ │ │ ├── index.esm.js │ │ │ │ ├── index.sass │ │ │ │ ├── index.umd.js │ │ │ │ └── vue-plugin.js │ │ │ └── umd-test.html │ │ ├── ae/ │ │ │ └── app-extension/ │ │ │ ├── README.md │ │ │ ├── _.npmignore │ │ │ ├── _package.json │ │ │ └── src/ │ │ │ ├── boot/ │ │ │ │ └── register.js │ │ │ ├── index.js │ │ │ └── templates/ │ │ │ └── _.gitkeep │ │ ├── ae-install/ │ │ │ └── app-extension/ │ │ │ └── src/ │ │ │ └── install.js │ │ ├── ae-prompts/ │ │ │ └── app-extension/ │ │ │ └── src/ │ │ │ └── prompts.js │ │ ├── ae-uninstall/ │ │ │ └── app-extension/ │ │ │ └── src/ │ │ │ └── uninstall.js │ │ ├── create-quasar-script.js │ │ ├── ui-ae/ │ │ │ └── ui/ │ │ │ └── build/ │ │ │ └── script.app-ext.js │ │ ├── ui-component/ │ │ │ └── ui/ │ │ │ └── src/ │ │ │ └── components/ │ │ │ ├── Component.js │ │ │ └── Component.sass │ │ └── ui-directive/ │ │ └── ui/ │ │ └── src/ │ │ └── directives/ │ │ ├── Directive.js │ │ └── Directive.sass │ └── utils/ │ ├── index.js │ ├── logger.js │ └── template.js ├── docs/ │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── build/ │ │ ├── chunks.js │ │ ├── copy-quasar-api.js │ │ ├── examples.js │ │ ├── fix-ssr-manifest.js │ │ ├── md/ │ │ │ ├── flat-menu.js │ │ │ ├── index.js │ │ │ ├── md-parse-utils.js │ │ │ ├── md-parse.js │ │ │ ├── md-plugin-blockquote.js │ │ │ ├── md-plugin-codeblock.js │ │ │ ├── md-plugin-containers.js │ │ │ ├── md-plugin-heading.js │ │ │ ├── md-plugin-image.js │ │ │ ├── md-plugin-link.js │ │ │ ├── md-plugin-table.js │ │ │ ├── md-plugin-token.js │ │ │ └── md.js │ │ ├── release-notes/ │ │ │ ├── highlight.js │ │ │ ├── index.js │ │ │ ├── md.mjs │ │ │ └── request.js │ │ ├── search.js │ │ ├── ssg.js │ │ └── utils.js │ ├── index.html │ ├── jsconfig.json │ ├── package.json │ ├── pnpm-workspace.yaml │ ├── public/ │ │ └── search_manifest.xml │ ├── quasar.config.js │ ├── src/ │ │ ├── App.vue │ │ ├── assets/ │ │ │ ├── docs-homepage.js │ │ │ ├── get-meta.js │ │ │ ├── layout-gallery.js │ │ │ ├── links.components.js │ │ │ ├── links.footer.js │ │ │ ├── links.header.js │ │ │ ├── links.integrations.js │ │ │ ├── links.social.js │ │ │ ├── menu.js │ │ │ ├── page-utils.js │ │ │ ├── sponsors.js │ │ │ └── tutorials.js │ │ ├── boot/ │ │ │ └── gdpr.js │ │ ├── components/ │ │ │ ├── CodePrism.js │ │ │ ├── CopyButton.vue │ │ │ ├── DocApi.vue │ │ │ ├── DocApiEntry.js │ │ │ ├── DocCardLink.vue │ │ │ ├── DocCardTitle.vue │ │ │ ├── DocCode.vue │ │ │ ├── DocCodepen.vue │ │ │ ├── DocExample.vue │ │ │ ├── DocInstallation.vue │ │ │ ├── DocLink.vue │ │ │ ├── DocPrerender.js │ │ │ ├── DocStars.vue │ │ │ ├── DocTree.vue │ │ │ └── SurveyCountdown.vue │ │ ├── css/ │ │ │ ├── app.sass │ │ │ ├── fonts.sass │ │ │ ├── prism-theme.sass │ │ │ └── quasar.variables.sass │ │ ├── examples/ │ │ │ ├── AppFullscreen/ │ │ │ │ ├── Basic.vue │ │ │ │ └── Targeted.vue │ │ │ ├── AppVisibility/ │ │ │ │ └── Basic.vue │ │ │ ├── BottomSheet/ │ │ │ │ ├── Basic.vue │ │ │ │ └── Dark.vue │ │ │ ├── ClosePopup/ │ │ │ │ ├── Dialog.vue │ │ │ │ ├── DialogInDialog.vue │ │ │ │ ├── DialogMenu.vue │ │ │ │ ├── Menu.vue │ │ │ │ └── MenuTree.vue │ │ │ ├── Dialog/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── NativeAttributes.vue │ │ │ │ ├── OtherOptions.vue │ │ │ │ ├── Pickers.vue │ │ │ │ ├── Progress.vue │ │ │ │ ├── UnsafeHtml.vue │ │ │ │ ├── ValidationOptions.vue │ │ │ │ └── ValidationPrompt.vue │ │ │ ├── Intersection/ │ │ │ │ ├── Advanced.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── ObjectForm.vue │ │ │ │ ├── Once.vue │ │ │ │ └── ScrollingCards.vue │ │ │ ├── Loading/ │ │ │ │ ├── Customized.vue │ │ │ │ ├── Default.vue │ │ │ │ ├── MultipleGroups.vue │ │ │ │ ├── ShowAndChange.vue │ │ │ │ ├── WithBox.vue │ │ │ │ ├── WithMessage.vue │ │ │ │ └── WithMessageSanitized.vue │ │ │ ├── Morph/ │ │ │ │ ├── BasicGroup.vue │ │ │ │ └── Card.vue │ │ │ ├── MorphUtils/ │ │ │ │ ├── FabCard.vue │ │ │ │ ├── ImageGallery.vue │ │ │ │ ├── ImageStripHorizontal.vue │ │ │ │ ├── ImageStripVertical.vue │ │ │ │ └── SameElement.vue │ │ │ ├── Mutation/ │ │ │ │ ├── CatchAll.vue │ │ │ │ ├── DragDrop.vue │ │ │ │ └── UndoRedo.vue │ │ │ ├── Notify/ │ │ │ │ ├── Actions.vue │ │ │ │ ├── Avatar.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Caption.vue │ │ │ │ ├── Grouping.vue │ │ │ │ ├── GroupingCustomBadge.vue │ │ │ │ ├── Icon.vue │ │ │ │ ├── Multiline.vue │ │ │ │ ├── Positioning.vue │ │ │ │ ├── PredefinedTypesCustom.vue │ │ │ │ ├── PredefinedTypesDefault.vue │ │ │ │ ├── Spinner.vue │ │ │ │ ├── TimeoutProgress.vue │ │ │ │ ├── UnsafeHtml.vue │ │ │ │ └── Updatable.vue │ │ │ ├── Platform/ │ │ │ │ └── Basic.vue │ │ │ ├── QAjaxBar/ │ │ │ │ └── Basic.vue │ │ │ ├── QAvatar/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Integrated.vue │ │ │ │ ├── Overlapping.vue │ │ │ │ ├── Rounded.vue │ │ │ │ ├── Square.vue │ │ │ │ ├── Squarish.vue │ │ │ │ └── StandardSizes.vue │ │ │ ├── QBadge/ │ │ │ │ ├── Align.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Floating.vue │ │ │ │ ├── Indicators.vue │ │ │ │ ├── Outline.vue │ │ │ │ ├── Rounded.vue │ │ │ │ └── Transparent.vue │ │ │ ├── QBanner/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── Image.vue │ │ │ │ ├── Inline.vue │ │ │ │ └── Rounded.vue │ │ │ ├── QBar/ │ │ │ │ ├── Android.vue │ │ │ │ ├── Dialog.vue │ │ │ │ ├── Header.vue │ │ │ │ ├── MacOS.vue │ │ │ │ ├── Menu.vue │ │ │ │ ├── Windows.vue │ │ │ │ └── iOS.vue │ │ │ ├── QBreadcrumbs/ │ │ │ │ ├── Align.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Gutters.vue │ │ │ │ ├── LinksWithGo.vue │ │ │ │ ├── RouterLinks.vue │ │ │ │ ├── Separator.vue │ │ │ │ └── Toolbar.vue │ │ │ ├── QBtn/ │ │ │ │ ├── ButtonAlignment.vue │ │ │ │ ├── ButtonDesign.vue │ │ │ │ ├── ButtonPadding.vue │ │ │ │ ├── ButtonSize.vue │ │ │ │ ├── CustomColor.vue │ │ │ │ ├── CustomContent.vue │ │ │ │ ├── CustomRipple.vue │ │ │ │ ├── DeterministicProgress.vue │ │ │ │ ├── Disabled.vue │ │ │ │ ├── FormSubmission.vue │ │ │ │ ├── IndeterminateProgress.vue │ │ │ │ ├── Links.vue │ │ │ │ ├── LinksWithGo.vue │ │ │ │ ├── OtherOptions.vue │ │ │ │ ├── Round.vue │ │ │ │ ├── RouterLinkExample.vue │ │ │ │ ├── Square.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── TruncateLabel.vue │ │ │ │ └── WithIcons.vue │ │ │ ├── QBtnDropdown/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomButton.vue │ │ │ │ ├── CustomDropdownIcon.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── LabelSlot.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── Model.vue │ │ │ │ ├── Split.vue │ │ │ │ └── VariousContent.vue │ │ │ ├── QBtnGroup/ │ │ │ │ ├── Group.vue │ │ │ │ ├── GroupSpread.vue │ │ │ │ └── WithDropdown.vue │ │ │ ├── QBtnToggle/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomContent.vue │ │ │ │ ├── Design.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ └── Spread.vue │ │ │ ├── QCard/ │ │ │ │ ├── Actions.vue │ │ │ │ ├── ActionsAlignment.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Expandable.vue │ │ │ │ ├── HorizontalBasic.vue │ │ │ │ ├── HorizontalMoreInvolved.vue │ │ │ │ ├── Media.vue │ │ │ │ ├── Parallax.vue │ │ │ │ ├── Table.vue │ │ │ │ ├── Tabs.vue │ │ │ │ ├── VariousContent.vue │ │ │ │ └── Video.vue │ │ │ ├── QCarousel/ │ │ │ │ ├── AutoPadding.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Captions.vue │ │ │ │ ├── ControlType.vue │ │ │ │ ├── Controls.vue │ │ │ │ ├── CustomNavigation.vue │ │ │ │ ├── Fullscreen.vue │ │ │ │ ├── ImageSlides.vue │ │ │ │ ├── InfiniteAutoplay.vue │ │ │ │ ├── MultiImageSlides.vue │ │ │ │ ├── NavigationPosition.vue │ │ │ │ ├── Thumbnails.vue │ │ │ │ ├── Transitions.vue │ │ │ │ ├── Vertical.vue │ │ │ │ ├── VideoSlides.vue │ │ │ │ ├── WithScrollareaFull.vue │ │ │ │ └── WithScrollareaPadding.vue │ │ │ ├── QChatMessage/ │ │ │ │ ├── Avatar.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Color.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── Name.vue │ │ │ │ ├── Sanitize.vue │ │ │ │ ├── Size.vue │ │ │ │ ├── SlotAvatarStampName.vue │ │ │ │ ├── SlotDefault.vue │ │ │ │ └── Stamp.vue │ │ │ ├── QCheckbox/ │ │ │ │ ├── ArrayAsModel.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── CustomModel.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── InaList.vue │ │ │ │ ├── IndeterminateState.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── OnDarkBackground.vue │ │ │ │ ├── OptionGroup.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── StandardSizes.vue │ │ │ │ ├── ToggleOrder.vue │ │ │ │ └── WithIcons.vue │ │ │ ├── QChip/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Clickable.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── LongLabel.vue │ │ │ │ ├── Outline.vue │ │ │ │ ├── Removable.vue │ │ │ │ ├── Selected.vue │ │ │ │ ├── Sizes.vue │ │ │ │ └── Square.vue │ │ │ ├── QCircularProgress/ │ │ │ │ ├── Angle.vue │ │ │ │ ├── CustomMinMax.vue │ │ │ │ ├── Determined.vue │ │ │ │ ├── Indeterminate.vue │ │ │ │ ├── Reverse.vue │ │ │ │ ├── RoundedStyle.vue │ │ │ │ ├── ShowValue.vue │ │ │ │ └── StandardSizes.vue │ │ │ ├── QColor/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomDefaultView.vue │ │ │ │ ├── CustomPalette.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DefaultValue.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── Input.vue │ │ │ │ ├── LazyModel.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ └── NoHeaderFooter.vue │ │ │ ├── QDate/ │ │ │ │ ├── AdditionalButtons.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Color.vue │ │ │ │ ├── CustomLocale.vue │ │ │ │ ├── CustomTitleSubtitle.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DefaultView.vue │ │ │ │ ├── DefaultYearMonth.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── EventColor.vue │ │ │ │ ├── Events.vue │ │ │ │ ├── FirstDayOfWeek.vue │ │ │ │ ├── Input.vue │ │ │ │ ├── InputFull.vue │ │ │ │ ├── Landscape.vue │ │ │ │ ├── MaskDateTime.vue │ │ │ │ ├── MaskEscape.vue │ │ │ │ ├── MaskSimple.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── NavigationBoundaries.vue │ │ │ │ ├── Options.vue │ │ │ │ ├── Persian.vue │ │ │ │ ├── SelectionMultiple.vue │ │ │ │ ├── SelectionRange.vue │ │ │ │ ├── SelectionRangeMultiple.vue │ │ │ │ ├── Splitter.vue │ │ │ │ └── TodayBtn.vue │ │ │ ├── QDialog/ │ │ │ │ ├── BackdropFilter.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Inception.vue │ │ │ │ ├── Layout.vue │ │ │ │ ├── Maximized.vue │ │ │ │ ├── Persistent.vue │ │ │ │ ├── Positioning.vue │ │ │ │ ├── Scrollable.vue │ │ │ │ ├── Seamless.vue │ │ │ │ ├── Sizing.vue │ │ │ │ ├── Style.vue │ │ │ │ └── VariousContent.vue │ │ │ ├── QDrawer/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── HeaderPicture.vue │ │ │ │ ├── Menu.vue │ │ │ │ ├── MenuSeamless.vue │ │ │ │ ├── MiniClickEvent.vue │ │ │ │ ├── MiniMouseEvents.vue │ │ │ │ ├── MiniSlot.vue │ │ │ │ ├── MiniToOverlay.vue │ │ │ │ └── OverlayMode.vue │ │ │ ├── QEditor/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Custom.vue │ │ │ │ ├── KitchenSink.vue │ │ │ │ ├── NewBold.vue │ │ │ │ ├── NewCommands.vue │ │ │ │ ├── Pasting.vue │ │ │ │ └── ToolbarSlot.vue │ │ │ ├── QExpansionItem/ │ │ │ │ ├── Accordion.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── ControlExpansionState.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── HandlingEvents.vue │ │ │ │ ├── HeaderSlot.vue │ │ │ │ ├── IconToggle.vue │ │ │ │ ├── InsetLevels.vue │ │ │ │ ├── Popup.vue │ │ │ │ └── SwitchToggleSide.vue │ │ │ ├── QFab/ │ │ │ │ ├── Draggable.vue │ │ │ │ ├── Expandable.vue │ │ │ │ ├── ExternalLabel.vue │ │ │ │ ├── ExternalLabelStyled.vue │ │ │ │ ├── ExternalLabelToggling.vue │ │ │ │ ├── FabSlots.vue │ │ │ │ ├── HideIcon.vue │ │ │ │ ├── InternalLabel.vue │ │ │ │ ├── InternalLabelToggling.vue │ │ │ │ ├── NonExpandable.vue │ │ │ │ ├── Padding.vue │ │ │ │ ├── PageSticky.vue │ │ │ │ ├── SquareStyle.vue │ │ │ │ └── VerticalActionsAlignment.vue │ │ │ ├── QField/ │ │ │ │ ├── Borderless.vue │ │ │ │ ├── Clearable.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── ControlTypes.vue │ │ │ │ ├── CustomLabel.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DesignFilled.vue │ │ │ │ ├── DesignOutlined.vue │ │ │ │ ├── DesignOverview.vue │ │ │ │ ├── DesignStandard.vue │ │ │ │ ├── DesignStandout.vue │ │ │ │ ├── LoadingState.vue │ │ │ │ ├── PrefixSuffix.vue │ │ │ │ ├── Rounded.vue │ │ │ │ ├── SquareBorders.vue │ │ │ │ ├── StandoutToolbar.vue │ │ │ │ ├── ValidationAsync.vue │ │ │ │ ├── ValidationExternal.vue │ │ │ │ ├── ValidationLazy.vue │ │ │ │ ├── ValidationMaxValue.vue │ │ │ │ ├── ValidationRequired.vue │ │ │ │ └── ValidationSlots.vue │ │ │ ├── QFile/ │ │ │ │ ├── AppendingFiles.vue │ │ │ │ ├── BasicMultiple.vue │ │ │ │ ├── BasicSingle.vue │ │ │ │ ├── Clearable.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── CounterBasic.vue │ │ │ │ ├── CounterLabel.vue │ │ │ │ ├── Decorators.vue │ │ │ │ ├── DesignOverview.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── RestrictionBasic.vue │ │ │ │ ├── RestrictionFilter.vue │ │ │ │ ├── WithChips.vue │ │ │ │ └── WithProgress.vue │ │ │ ├── QForm/ │ │ │ │ └── Basic.vue │ │ │ ├── QHeader/ │ │ │ │ ├── AppLike.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Breadcrumbs.vue │ │ │ │ ├── Extended.vue │ │ │ │ ├── Glossy.vue │ │ │ │ ├── LookingIOS.vue │ │ │ │ ├── Reveal.vue │ │ │ │ └── Tabs.vue │ │ │ ├── QIcon/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── DynamicSvg.vue │ │ │ │ └── StandardSizes.vue │ │ │ ├── QImg/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Caption.vue │ │ │ │ ├── ContextMenu.vue │ │ │ │ ├── CustomImageStyle.vue │ │ │ │ ├── ErrorState.vue │ │ │ │ ├── FitModes.vue │ │ │ │ ├── LoadingLazy.vue │ │ │ │ ├── LoadingState.vue │ │ │ │ ├── PlaceholderSrc.vue │ │ │ │ ├── Ratio.vue │ │ │ │ └── Responsive.vue │ │ │ ├── QInfiniteScroll/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Container.vue │ │ │ │ ├── Menu.vue │ │ │ │ └── Reverse.vue │ │ │ ├── QInnerLoading/ │ │ │ │ ├── Basic.vue │ │ │ │ └── LabelProp.vue │ │ │ ├── QInput/ │ │ │ │ ├── Autogrow.vue │ │ │ │ ├── Borderless.vue │ │ │ │ ├── Clearable.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── CustomLabel.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── Debouncing.vue │ │ │ │ ├── DesignFilled.vue │ │ │ │ ├── DesignOutlined.vue │ │ │ │ ├── DesignOverview.vue │ │ │ │ ├── DesignStandard.vue │ │ │ │ ├── DesignStandout.vue │ │ │ │ ├── InputTypeFile.vue │ │ │ │ ├── InputTypeNumber.vue │ │ │ │ ├── InputTypes.vue │ │ │ │ ├── LoadingState.vue │ │ │ │ ├── MaskBasic.vue │ │ │ │ ├── MaskCustomTokens.vue │ │ │ │ ├── MaskFill.vue │ │ │ │ ├── MaskFillReverse.vue │ │ │ │ ├── MaskUnmaskedModel.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── PrefixSuffix.vue │ │ │ │ ├── Rounded.vue │ │ │ │ ├── ShadowText.vue │ │ │ │ ├── SquareBorders.vue │ │ │ │ ├── StandoutToolbar.vue │ │ │ │ ├── Textarea.vue │ │ │ │ ├── ValidationAsync.vue │ │ │ │ ├── ValidationExternal.vue │ │ │ │ ├── ValidationForm.vue │ │ │ │ ├── ValidationLazy.vue │ │ │ │ ├── ValidationMaxLength.vue │ │ │ │ ├── ValidationRequired.vue │ │ │ │ └── ValidationSlots.vue │ │ │ ├── QIntersection/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── List.vue │ │ │ │ ├── Once.vue │ │ │ │ ├── Root.vue │ │ │ │ └── Transition.vue │ │ │ ├── QItem/ │ │ │ │ ├── ActiveState.vue │ │ │ │ ├── AvatarLeft.vue │ │ │ │ ├── AvatarRight.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── ExampleContacts.vue │ │ │ │ ├── ExampleEmails.vue │ │ │ │ ├── ExampleFolders.vue │ │ │ │ ├── ExampleMenu.vue │ │ │ │ ├── ExampleSettings.vue │ │ │ │ ├── ItemLabel.vue │ │ │ │ ├── LinksWithGo.vue │ │ │ │ └── SideSection.vue │ │ │ ├── QKnob/ │ │ │ │ ├── Angle.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── InnerMinMax.vue │ │ │ │ ├── MinMax.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── ShowValue.vue │ │ │ │ └── Step.vue │ │ │ ├── QLayout/ │ │ │ │ ├── Container.vue │ │ │ │ └── ContainerDialog.vue │ │ │ ├── QLinearProgress/ │ │ │ │ ├── Buffering.vue │ │ │ │ ├── CustomHeight.vue │ │ │ │ ├── Determinate.vue │ │ │ │ ├── Indeterminate.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── OnDarkBackground.vue │ │ │ │ ├── Query.vue │ │ │ │ ├── Reverse.vue │ │ │ │ ├── StandardSizes.vue │ │ │ │ └── Stripe.vue │ │ │ ├── QMarkupTable/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Customization.vue │ │ │ │ ├── Dark.vue │ │ │ │ └── Separators.vue │ │ │ ├── QMenu/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── ContextMenu.vue │ │ │ │ ├── MenuInMenu.vue │ │ │ │ ├── Persistent.vue │ │ │ │ ├── Positions.vue │ │ │ │ ├── Sizing.vue │ │ │ │ ├── Style.vue │ │ │ │ ├── Target.vue │ │ │ │ ├── Transitions.vue │ │ │ │ ├── VModel.vue │ │ │ │ └── VariousContent.vue │ │ │ ├── QOptionGroup/ │ │ │ │ ├── Checkbox.vue │ │ │ │ ├── CustomOptionProps.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DenseInline.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── DisableCertainOptions.vue │ │ │ │ ├── Inline.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── LabelSlots.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── Standard.vue │ │ │ │ └── Toggle.vue │ │ │ ├── QPage/ │ │ │ │ └── Basic.vue │ │ │ ├── QPageScroller/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Expanded.vue │ │ │ │ └── Reverse.vue │ │ │ ├── QPageSticky/ │ │ │ │ ├── Basic.vue │ │ │ │ └── Expanded.vue │ │ │ ├── QPagination/ │ │ │ │ ├── BoundaryLinks.vue │ │ │ │ ├── BoundaryNumbers.vue │ │ │ │ ├── BtnDesign.vue │ │ │ │ ├── BtnGutter.vue │ │ │ │ ├── DirectionLinks.vue │ │ │ │ ├── Ellipses.vue │ │ │ │ ├── Icons.vue │ │ │ │ ├── Input.vue │ │ │ │ ├── InputColor.vue │ │ │ │ ├── MaxPages.vue │ │ │ │ └── Standard.vue │ │ │ ├── QParallax/ │ │ │ │ ├── Image.vue │ │ │ │ ├── ScopedSlot.vue │ │ │ │ ├── Speed.vue │ │ │ │ └── Video.vue │ │ │ ├── QPopupEdit/ │ │ │ │ ├── Customizing.vue │ │ │ │ ├── DefaultSlotParameters.vue │ │ │ │ ├── PopupWithEditor.vue │ │ │ │ ├── Standalone.vue │ │ │ │ ├── TextArea.vue │ │ │ │ ├── WithButtons.vue │ │ │ │ ├── WithTable.vue │ │ │ │ └── WithValidation.vue │ │ │ ├── QPopupProxy/ │ │ │ │ ├── Breakpoint.vue │ │ │ │ ├── ContextMenu.vue │ │ │ │ ├── Passthrough.vue │ │ │ │ └── Standard.vue │ │ │ ├── QPullToRefresh/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomColoring.vue │ │ │ │ └── Icon.vue │ │ │ ├── QRadio/ │ │ │ │ ├── Coloring.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── InaList.vue │ │ │ │ ├── KeepColor.vue │ │ │ │ ├── LabelPosition.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── OnDarkBackground.vue │ │ │ │ ├── OptionGroup.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── StandardSizes.vue │ │ │ │ └── WithIcons.vue │ │ │ ├── QRange/ │ │ │ │ ├── Dark.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── Drag.vue │ │ │ │ ├── DragOnly.vue │ │ │ │ ├── DragSnap.vue │ │ │ │ ├── FloatingPoint.vue │ │ │ │ ├── InnerMinMax.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── LabelAlways.vue │ │ │ │ ├── LabelLong.vue │ │ │ │ ├── LabelValue.vue │ │ │ │ ├── Lazy.vue │ │ │ │ ├── List.vue │ │ │ │ ├── MarkerLabelSlots.vue │ │ │ │ ├── MarkerLabels.vue │ │ │ │ ├── Markers.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── NoSelection.vue │ │ │ │ ├── Null.vue │ │ │ │ ├── RangeColoring.vue │ │ │ │ ├── RangeSizes.vue │ │ │ │ ├── Readonly.vue │ │ │ │ ├── Reverse.vue │ │ │ │ ├── Snap.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── Step.vue │ │ │ │ ├── TrackImages.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QRating/ │ │ │ │ ├── ArrayIcon.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Colors.vue │ │ │ │ ├── HalfSelected.vue │ │ │ │ ├── Images.vue │ │ │ │ ├── Max.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── NoDimming.vue │ │ │ │ ├── ReadonlyDisable.vue │ │ │ │ ├── SelectedIcon.vue │ │ │ │ ├── SlotTip.vue │ │ │ │ └── StandardSizes.vue │ │ │ ├── QResizeObserver/ │ │ │ │ └── Basic.vue │ │ │ ├── QResponsive/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Card.vue │ │ │ │ ├── CardSection.vue │ │ │ │ ├── Carousel.vue │ │ │ │ ├── FlexRow.vue │ │ │ │ ├── MaxHeight.vue │ │ │ │ └── Table.vue │ │ │ ├── QScrollArea/ │ │ │ │ ├── Dark.vue │ │ │ │ ├── Delay.vue │ │ │ │ ├── Horizontal.vue │ │ │ │ ├── ScrollPosition.vue │ │ │ │ ├── ScrollbarVisibility.vue │ │ │ │ ├── Styled.vue │ │ │ │ ├── StyledBar.vue │ │ │ │ ├── Synchronized.vue │ │ │ │ ├── VertHoriz.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QScrollObserver/ │ │ │ │ └── Basic.vue │ │ │ ├── QSelect/ │ │ │ │ ├── BasicFiltering.vue │ │ │ │ ├── BehaviorDialog.vue │ │ │ │ ├── BehaviorMenu.vue │ │ │ │ ├── Clearable.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── CreateListener.vue │ │ │ │ ├── CreateListenerUnique.vue │ │ │ │ ├── CreateNewValueMode.vue │ │ │ │ ├── Decorators.vue │ │ │ │ ├── DesignOverview.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── DisableTabSelection.vue │ │ │ │ ├── DisplayChips.vue │ │ │ │ ├── DisplayCustomValue.vue │ │ │ │ ├── DisplaySelectedItemSlot.vue │ │ │ │ ├── FilteringAddMultiple.vue │ │ │ │ ├── FilteringAddsToMenu.vue │ │ │ │ ├── FilteringNoAddToMenu.vue │ │ │ │ ├── HtmlDisplayValue.vue │ │ │ │ ├── HtmlOptions.vue │ │ │ │ ├── InputFilterAfter.vue │ │ │ │ ├── InputFilterLazy.vue │ │ │ │ ├── InputFilterMin.vue │ │ │ │ ├── InputFilterOptions.vue │ │ │ │ ├── MenuTransitions.vue │ │ │ │ ├── ModelMultipleCounter.vue │ │ │ │ ├── ModelSingleMultiple.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── OptionCover.vue │ │ │ │ ├── OptionCustomProps.vue │ │ │ │ ├── OptionEmitValue.vue │ │ │ │ ├── OptionLazyLoad.vue │ │ │ │ ├── OptionMapOptions.vue │ │ │ │ ├── OptionNoneSlot.vue │ │ │ │ ├── OptionObject.vue │ │ │ │ ├── OptionQToggle.vue │ │ │ │ ├── OptionSlot.vue │ │ │ │ ├── OptionString.vue │ │ │ │ ├── OptionsDynamic.vue │ │ │ │ ├── RenderPerf.vue │ │ │ │ └── TextAutocomplete.vue │ │ │ ├── QSeparator/ │ │ │ │ ├── Colored.vue │ │ │ │ ├── Horizontal.vue │ │ │ │ ├── HorizontalWithInset.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QSkeleton/ │ │ │ │ ├── Animations.vue │ │ │ │ ├── Card.vue │ │ │ │ ├── RecipeFacebook.vue │ │ │ │ ├── RecipeList.vue │ │ │ │ ├── RecipeTable.vue │ │ │ │ ├── RecipeTwitch.vue │ │ │ │ ├── RecipeTwitter.vue │ │ │ │ ├── RecipeYoutube.vue │ │ │ │ ├── Sizing.vue │ │ │ │ ├── StylingBordered.vue │ │ │ │ ├── StylingColor.vue │ │ │ │ ├── StylingCustomBorder.vue │ │ │ │ ├── StylingSquare.vue │ │ │ │ └── Types.vue │ │ │ ├── QSlideItem/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomColors.vue │ │ │ │ ├── CustomizeSlide.vue │ │ │ │ ├── OneSided.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QSlideTransition/ │ │ │ │ └── Basic.vue │ │ │ ├── QSlider/ │ │ │ │ ├── Dark.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── FloatingPoint.vue │ │ │ │ ├── InnerMinMax.vue │ │ │ │ ├── Label.vue │ │ │ │ ├── LabelAlways.vue │ │ │ │ ├── LabelLong.vue │ │ │ │ ├── LabelValue.vue │ │ │ │ ├── Lazy.vue │ │ │ │ ├── List.vue │ │ │ │ ├── MarkerLabelSlots.vue │ │ │ │ ├── MarkerLabels.vue │ │ │ │ ├── Markers.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── NoSelection.vue │ │ │ │ ├── Null.vue │ │ │ │ ├── Readonly.vue │ │ │ │ ├── Reverse.vue │ │ │ │ ├── SliderColoring.vue │ │ │ │ ├── SliderSizes.vue │ │ │ │ ├── Snap.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── Step.vue │ │ │ │ ├── TrackImages.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QSpace/ │ │ │ │ └── Basic.vue │ │ │ ├── QSpinner/ │ │ │ │ ├── Color.vue │ │ │ │ ├── Default.vue │ │ │ │ ├── Others.vue │ │ │ │ ├── Size.vue │ │ │ │ └── StandardSizes.vue │ │ │ ├── QSplitter/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomizedSeparator.vue │ │ │ │ ├── Embedded.vue │ │ │ │ ├── Horizontal.vue │ │ │ │ ├── ImageFun.vue │ │ │ │ ├── Limits.vue │ │ │ │ ├── PixelModel.vue │ │ │ │ ├── ReactiveImages.vue │ │ │ │ ├── ReverseModel.vue │ │ │ │ └── SeparatorSlot.vue │ │ │ ├── QStepper/ │ │ │ │ ├── AlternativeLabels.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── Contracted.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── HeaderClass.vue │ │ │ │ ├── LinearNavigation.vue │ │ │ │ ├── MessageSlot.vue │ │ │ │ ├── NonLinearNavigation.vue │ │ │ │ ├── Prefix.vue │ │ │ │ ├── StepError.vue │ │ │ │ ├── TypeHorizontal.vue │ │ │ │ └── TypeVertical.vue │ │ │ ├── QTabPanels/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── Swipeable.vue │ │ │ │ ├── TabsAndSplitter.vue │ │ │ │ ├── Transition.vue │ │ │ │ ├── VerticalSwipeable.vue │ │ │ │ ├── WithNestedQTabs.vue │ │ │ │ └── WithQTabs.vue │ │ │ ├── QTable/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── BeforeAfterHeaderFooter.vue │ │ │ │ ├── CustomColor.vue │ │ │ │ ├── CustomColumn.vue │ │ │ │ ├── CustomLoading.vue │ │ │ │ ├── CustomSelection.vue │ │ │ │ ├── CustomSorting.vue │ │ │ │ ├── CustomTop.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── ExpandedRowExternal.vue │ │ │ │ ├── ExpandedRowInternal.vue │ │ │ │ ├── ExportCsv.vue │ │ │ │ ├── GridHeader.vue │ │ │ │ ├── GridMasonry.vue │ │ │ │ ├── GridStyle.vue │ │ │ │ ├── GridStyleColored.vue │ │ │ │ ├── GridStyleSlot.vue │ │ │ │ ├── HideBottom.vue │ │ │ │ ├── InferColumns.vue │ │ │ │ ├── InputEditing.vue │ │ │ │ ├── KeyboardNavigation.vue │ │ │ │ ├── Loading.vue │ │ │ │ ├── MultipleSelection.vue │ │ │ │ ├── NoData.vue │ │ │ │ ├── NoDataSlot.vue │ │ │ │ ├── NoHeaderFooter.vue │ │ │ │ ├── PaginationInitial.vue │ │ │ │ ├── PaginationSlot.vue │ │ │ │ ├── PaginationSync.vue │ │ │ │ ├── PopupEditing.vue │ │ │ │ ├── ResponsiveDense.vue │ │ │ │ ├── ResponsiveGrid.vue │ │ │ │ ├── SelectionSlots.vue │ │ │ │ ├── SelectionSlotsRange.vue │ │ │ │ ├── Separators.vue │ │ │ │ ├── SingleSelection.vue │ │ │ │ ├── SlotBody.vue │ │ │ │ ├── SlotBodyCell.vue │ │ │ │ ├── SlotBodyCellName.vue │ │ │ │ ├── SlotHeader.vue │ │ │ │ ├── SlotHeaderCell.vue │ │ │ │ ├── SlotHeaderCellName.vue │ │ │ │ ├── StickyColumn.vue │ │ │ │ ├── StickyHeader.vue │ │ │ │ ├── StickyHeaderAndColumn.vue │ │ │ │ ├── StickyHeaderAndLastColumn.vue │ │ │ │ ├── StickyLastColumn.vue │ │ │ │ ├── Synchronizing.vue │ │ │ │ ├── VirtscrollBasic.vue │ │ │ │ ├── VirtscrollDynamic.vue │ │ │ │ ├── VirtscrollExpandedRow.vue │ │ │ │ ├── VirtscrollMultipleRows.vue │ │ │ │ ├── VirtscrollPagination.vue │ │ │ │ ├── VirtscrollSticky.vue │ │ │ │ ├── VisibleColumns.vue │ │ │ │ └── VisibleColumns2.vue │ │ │ ├── QTabs/ │ │ │ │ ├── Alignment.vue │ │ │ │ ├── ArrowsModifiers.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomIndicator.vue │ │ │ │ ├── Dense.vue │ │ │ │ ├── Dropdown.vue │ │ │ │ ├── DynamicTabs.vue │ │ │ │ ├── IndividualColor.vue │ │ │ │ ├── Notifying.vue │ │ │ │ ├── Ripples.vue │ │ │ │ ├── TabsInToolbar.vue │ │ │ │ ├── TabsWithTabpanels.vue │ │ │ │ └── Vertical.vue │ │ │ ├── QTime/ │ │ │ │ ├── AdditionalButtons.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Color.vue │ │ │ │ ├── CustomLocale.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DisableReadonly.vue │ │ │ │ ├── Format24h.vue │ │ │ │ ├── Input.vue │ │ │ │ ├── InputFull.vue │ │ │ │ ├── Landscape.vue │ │ │ │ ├── MaskDateTime.vue │ │ │ │ ├── MaskEscape.vue │ │ │ │ ├── MaskSimple.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── NowBtn.vue │ │ │ │ └── Options.vue │ │ │ ├── QTimeline/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── Layouts.vue │ │ │ │ ├── PropsOnly.vue │ │ │ │ ├── Responsive.vue │ │ │ │ └── SlotsOnly.vue │ │ │ ├── QToggle/ │ │ │ │ ├── ArrayValue.vue │ │ │ │ ├── CustomValues.vue │ │ │ │ ├── DarkBackground.vue │ │ │ │ ├── Disabled.vue │ │ │ │ ├── Icons.vue │ │ │ │ ├── IndeterminateState.vue │ │ │ │ ├── KeepColor.vue │ │ │ │ ├── Labels.vue │ │ │ │ ├── List.vue │ │ │ │ ├── NativeForm.vue │ │ │ │ ├── OptionGroup.vue │ │ │ │ ├── Standard.vue │ │ │ │ ├── StandardSizes.vue │ │ │ │ └── ToggleOrder.vue │ │ │ ├── QToolbar/ │ │ │ │ ├── Avatar.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Glossy.vue │ │ │ │ ├── GroupedHorizontally.vue │ │ │ │ ├── GroupedVertically.vue │ │ │ │ ├── WithBtnToggle.vue │ │ │ │ ├── WithDropdown.vue │ │ │ │ └── WithTabs.vue │ │ │ ├── QTooltip/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Coloring.vue │ │ │ │ ├── CustomTransition.vue │ │ │ │ ├── Offset.vue │ │ │ │ ├── OneSecond.vue │ │ │ │ ├── Target.vue │ │ │ │ └── VModel.vue │ │ │ ├── QTree/ │ │ │ │ ├── Accordion.vue │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── DenseTree.vue │ │ │ │ ├── FilterCustom.vue │ │ │ │ ├── FilterDefault.vue │ │ │ │ ├── LazyLoad.vue │ │ │ │ ├── NoConnectors.vue │ │ │ │ ├── Selectable.vue │ │ │ │ ├── SlotsCustomized.vue │ │ │ │ ├── SlotsDefault.vue │ │ │ │ ├── Splitter.vue │ │ │ │ ├── Sync.vue │ │ │ │ └── TickStrategy.vue │ │ │ ├── QUploader/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Dark.vue │ │ │ │ ├── FactoryImmediate.vue │ │ │ │ ├── FactoryPromise.vue │ │ │ │ ├── Headers.vue │ │ │ │ ├── Multiple.vue │ │ │ │ ├── RestrictionBasic.vue │ │ │ │ ├── RestrictionFilter.vue │ │ │ │ ├── SlotHeader.vue │ │ │ │ ├── SlotList.vue │ │ │ │ ├── UploadAuto.vue │ │ │ │ └── UploadURL.vue │ │ │ ├── QVideo/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── HtmlMarkup.vue │ │ │ │ └── Ratio.vue │ │ │ ├── QVirtualScroll/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── BasicHorizontal.vue │ │ │ │ ├── GenerateItems.vue │ │ │ │ ├── ScrollArea.vue │ │ │ │ ├── ScrollTargetId.vue │ │ │ │ ├── ScrollTargetRef.vue │ │ │ │ ├── ScrollTo.vue │ │ │ │ ├── TableBasic.vue │ │ │ │ ├── TableBasicHeader.vue │ │ │ │ ├── TableSticky.vue │ │ │ │ ├── TableSticky2.vue │ │ │ │ ├── VariousContent.vue │ │ │ │ ├── VariousContentHorizontal.vue │ │ │ │ ├── VirtscrollExpandedRow.vue │ │ │ │ └── VirtscrollMultipleRows.vue │ │ │ ├── Ripple/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Colored.vue │ │ │ │ ├── Disable.vue │ │ │ │ ├── Early.vue │ │ │ │ └── Positioning.vue │ │ │ ├── ScrollFire/ │ │ │ │ └── Basic.vue │ │ │ ├── TouchHold/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── CustomSensitivity.vue │ │ │ │ └── CustomTimer.vue │ │ │ ├── TouchPan/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Custom.vue │ │ │ │ ├── Draggable.vue │ │ │ │ ├── Horizontal.vue │ │ │ │ └── Vertical.vue │ │ │ ├── TouchRepeat/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Buttons.vue │ │ │ │ └── Keys.vue │ │ │ ├── TouchSwipe/ │ │ │ │ ├── Basic.vue │ │ │ │ ├── Right.vue │ │ │ │ └── UpOrLeft.vue │ │ │ ├── frameless-electron-window/ │ │ │ │ └── StatusBar.vue │ │ │ ├── grid/ │ │ │ │ ├── BreakColumn.vue │ │ │ │ ├── BreakRow.vue │ │ │ │ ├── ChildrenSizeCompare.vue │ │ │ │ ├── ChildrenStyling.vue │ │ │ │ ├── ColGutterHorizontal.vue │ │ │ │ ├── ColGutterMixed.vue │ │ │ │ ├── ColGutterSize.vue │ │ │ │ ├── ColGutterVertical.vue │ │ │ │ ├── ColumnAllBreakpoints.vue │ │ │ │ ├── ColumnEqualWidth.vue │ │ │ │ ├── ColumnFlexOrder.vue │ │ │ │ ├── ColumnHorizontalAlignment.vue │ │ │ │ ├── ColumnMixAndMatch.vue │ │ │ │ ├── ColumnNesting.vue │ │ │ │ ├── ColumnReverse.vue │ │ │ │ ├── ColumnRowWidth.vue │ │ │ │ ├── ColumnRowWrapping.vue │ │ │ │ ├── ColumnVariableWidth.vue │ │ │ │ ├── ColumnVerticalAlignment.vue │ │ │ │ ├── GutterHorizontal.vue │ │ │ │ ├── GutterMixed.vue │ │ │ │ ├── GutterSize.vue │ │ │ │ ├── GutterVertical.vue │ │ │ │ ├── Masonry.vue │ │ │ │ ├── MasonryTableGrid.vue │ │ │ │ ├── ParentStyling.vue │ │ │ │ ├── RowAllBreakpoints.vue │ │ │ │ ├── RowColumnWidth.vue │ │ │ │ ├── RowColumnWrapping.vue │ │ │ │ ├── RowEqualWidth.vue │ │ │ │ ├── RowFlexOrder.vue │ │ │ │ ├── RowHorizontalAlignment.vue │ │ │ │ ├── RowMixAndMatch.vue │ │ │ │ ├── RowNesting.vue │ │ │ │ ├── RowOffsettingColumns.vue │ │ │ │ ├── RowReverse.vue │ │ │ │ ├── RowStackedToHorizontal.vue │ │ │ │ ├── RowVariableWidth.vue │ │ │ │ └── RowVerticalAlignment.vue │ │ │ └── shadows/ │ │ │ ├── Inset.vue │ │ │ ├── PointingUp.vue │ │ │ └── Standard.vue │ │ ├── layouts/ │ │ │ ├── builder/ │ │ │ │ └── LayoutBuilder.vue │ │ │ ├── doc-layout/ │ │ │ │ ├── DocDrawerMenu.vue │ │ │ │ ├── DocDrawerToc.vue │ │ │ │ ├── DocHeader.vue │ │ │ │ ├── DocHeaderIconLinks.vue │ │ │ │ ├── DocHeaderMenu.js │ │ │ │ ├── DocHeaderTextLinks.vue │ │ │ │ ├── DocLayout.vue │ │ │ │ ├── DocPage.vue │ │ │ │ ├── DocPageFooter.vue │ │ │ │ ├── DocPageMenu.js │ │ │ │ ├── DocPageMenu.sass │ │ │ │ ├── DocPageToc.vue │ │ │ │ ├── DocSearch.vue │ │ │ │ ├── search/ │ │ │ │ │ ├── ResultEmpty.vue │ │ │ │ │ ├── ResultEntry.vue │ │ │ │ │ ├── ResultError.vue │ │ │ │ │ └── SearchResults.vue │ │ │ │ └── store/ │ │ │ │ ├── index.js │ │ │ │ ├── inject-scroll.js │ │ │ │ └── inject-toc.js │ │ │ └── gallery/ │ │ │ ├── LayoutGalleryPage.vue │ │ │ ├── github.vue │ │ │ ├── google-news.vue │ │ │ ├── google-photos.vue │ │ │ ├── google-play.vue │ │ │ ├── listing.js │ │ │ ├── quasar-classic-dark.vue │ │ │ ├── quasar-classic.vue │ │ │ ├── whatsapp.vue │ │ │ └── youtube.vue │ │ ├── pages/ │ │ │ ├── Page404.vue │ │ │ ├── __elements.md │ │ │ ├── api-explorer/ │ │ │ │ ├── DocApiExplorer.vue │ │ │ │ └── api-explorer.md │ │ │ ├── app-extensions/ │ │ │ │ ├── development-guide/ │ │ │ │ │ ├── index-api.md │ │ │ │ │ ├── install-api.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── prompts-api.md │ │ │ │ │ └── uninstall-api.md │ │ │ │ ├── discover.md │ │ │ │ ├── introduction.md │ │ │ │ └── tips-and-tricks/ │ │ │ │ ├── chain-webpack.md │ │ │ │ ├── inject-quasar-plugin.md │ │ │ │ ├── introduction.md │ │ │ │ ├── json-api.md │ │ │ │ ├── provide-a-directive.md │ │ │ │ ├── provide-a-ui-component.md │ │ │ │ └── starter-kit-equivalent.md │ │ │ ├── components/ │ │ │ │ ├── ComponentsListing.vue │ │ │ │ └── components.md │ │ │ ├── docs/ │ │ │ │ ├── DocsHomepage.vue │ │ │ │ └── docs.md │ │ │ ├── how-to-contribute/ │ │ │ │ ├── commit-conventions.md │ │ │ │ ├── contribution-guide.md │ │ │ │ ├── new-project.md │ │ │ │ ├── project-maintainer.md │ │ │ │ └── running-projects.md │ │ │ ├── icongenie/ │ │ │ │ ├── app-icons-list.md │ │ │ │ ├── command-list.md │ │ │ │ ├── installation.md │ │ │ │ ├── introduction.md │ │ │ │ └── profile-files.md │ │ │ ├── integrations/ │ │ │ │ ├── QuasarIntegrations.vue │ │ │ │ └── integrations.md │ │ │ ├── introduction-to-quasar/ │ │ │ │ ├── IntroductionVideo.vue │ │ │ │ └── introduction-to-quasar.md │ │ │ ├── landing/ │ │ │ │ ├── PageLanding.vue │ │ │ │ ├── SponsorList.vue │ │ │ │ ├── TwitterCards.vue │ │ │ │ └── WhyQuasarCard.vue │ │ │ ├── layout/ │ │ │ │ ├── drawer.md │ │ │ │ ├── gallery/ │ │ │ │ │ ├── LayoutGallery.vue │ │ │ │ │ └── gallery.md │ │ │ │ ├── grid/ │ │ │ │ │ ├── column.md │ │ │ │ │ ├── flex-playground/ │ │ │ │ │ │ ├── FlexChild.vue │ │ │ │ │ │ ├── FlexPlaygroundDemo.vue │ │ │ │ │ │ └── flex-playground.md │ │ │ │ │ ├── flexbox-patterns.md │ │ │ │ │ ├── gutter.md │ │ │ │ │ ├── introduction-to-flexbox.md │ │ │ │ │ └── row.md │ │ │ │ ├── header-and-footer.md │ │ │ │ ├── layout/ │ │ │ │ │ ├── ViewPlay.vue │ │ │ │ │ ├── ViewProp.vue │ │ │ │ │ └── layout.md │ │ │ │ ├── page-scroller.md │ │ │ │ ├── page-sticky.md │ │ │ │ ├── page.md │ │ │ │ └── routing-with-layouts-and-pages.md │ │ │ ├── listing.js │ │ │ ├── meet-the-team/ │ │ │ │ ├── TeamMember.vue │ │ │ │ └── meet-the-team.md │ │ │ ├── options/ │ │ │ │ ├── animations.md │ │ │ │ ├── app-icons.md │ │ │ │ ├── app-internationalization.md │ │ │ │ ├── global-node.md │ │ │ │ ├── installing-icon-libraries.md │ │ │ │ ├── platform-detection.md │ │ │ │ ├── quasar-icon-sets.md │ │ │ │ ├── quasar-language-packs.md │ │ │ │ ├── rtl-support.md │ │ │ │ ├── screen-plugin.md │ │ │ │ ├── seo.md │ │ │ │ ├── the-q-object.md │ │ │ │ └── transitions/ │ │ │ │ ├── TransitionList.vue │ │ │ │ └── transitions.md │ │ │ ├── quasar-cli-vite/ │ │ │ │ ├── ajax-requests.md │ │ │ │ ├── api-proxying.md │ │ │ │ ├── boot-files.md │ │ │ │ ├── browser-compatibility.md │ │ │ │ ├── commands-list.md │ │ │ │ ├── convert-to-quasar-cli-with-vite.md │ │ │ │ ├── css-preprocessors.md │ │ │ │ ├── developing-browser-extensions/ │ │ │ │ │ ├── app-icons-browser-extension.md │ │ │ │ │ ├── background-script.md │ │ │ │ │ ├── bex-bridge.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-bex.md │ │ │ │ │ ├── content-scripts.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── types-of-bex.md │ │ │ │ ├── developing-capacitor-apps/ │ │ │ │ │ ├── app-icons-capacitor.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── capacitor-api.md │ │ │ │ │ ├── capacitor-version-support.md │ │ │ │ │ ├── configuring-capacitor.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── live-updates.md │ │ │ │ │ ├── managing-google-analytics.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── publishing-to-store.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-cordova-apps/ │ │ │ │ │ ├── app-icons-cordova.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-cordova.md │ │ │ │ │ ├── cordova-plugins.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── managing-google-analytics.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── publishing-to-store.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-electron-apps/ │ │ │ │ │ ├── app-icons-electron.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-electron.md │ │ │ │ │ ├── electron-accessing-files.md │ │ │ │ │ ├── electron-packages.md │ │ │ │ │ ├── electron-preload-script.md │ │ │ │ │ ├── electron-security-concerns.md │ │ │ │ │ ├── electron-upgrade-guide.md │ │ │ │ │ ├── electron-with-typescript.md │ │ │ │ │ ├── frameless-electron-window.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-mobile-apps.md │ │ │ │ ├── developing-pwa/ │ │ │ │ │ ├── app-icons-pwa.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-pwa.md │ │ │ │ │ ├── handling-service-worker.md │ │ │ │ │ ├── hmr-for-dev.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── pwa-with-typescript.md │ │ │ │ ├── developing-spa/ │ │ │ │ │ ├── app-icons-spa.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── deploying.md │ │ │ │ │ └── introduction.md │ │ │ │ ├── developing-ssr/ │ │ │ │ │ ├── app-icons-ssr.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── client-side-hydration.md │ │ │ │ │ ├── configuring-ssr.md │ │ │ │ │ ├── deploying.md │ │ │ │ │ ├── handling-404-and-500-errors.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── seo-for-ssr.md │ │ │ │ │ ├── ssr-context.md │ │ │ │ │ ├── ssr-frequently-asked-questions.md │ │ │ │ │ ├── ssr-middleware.md │ │ │ │ │ ├── ssr-webserver.md │ │ │ │ │ ├── ssr-with-pwa.md │ │ │ │ │ ├── ssr-with-typescript.md │ │ │ │ │ ├── vue-ssr-directives.md │ │ │ │ │ └── writing-universal-code.md │ │ │ │ ├── directory-structure.md │ │ │ │ ├── handling-assets.md │ │ │ │ ├── handling-process-env.md │ │ │ │ ├── handling-vite.md │ │ │ │ ├── lazy-loading.md │ │ │ │ ├── linter.md │ │ │ │ ├── opening-dev-server-to-public.md │ │ │ │ ├── prefetch-feature.md │ │ │ │ ├── quasar-config-file.md │ │ │ │ ├── routing.md │ │ │ │ ├── state-management-with-pinia.md │ │ │ │ ├── supporting-ts.md │ │ │ │ ├── testing-and-auditing.md │ │ │ │ └── upgrade-guide.md │ │ │ ├── quasar-cli-webpack/ │ │ │ │ ├── ajax-requests.md │ │ │ │ ├── api-proxying.md │ │ │ │ ├── boot-files.md │ │ │ │ ├── browser-compatibility.md │ │ │ │ ├── commands-list.md │ │ │ │ ├── convert-to-quasar-cli-with-webpack.md │ │ │ │ ├── css-preprocessors.md │ │ │ │ ├── developing-browser-extensions/ │ │ │ │ │ ├── app-icons-browser-extension.md │ │ │ │ │ ├── background-script.md │ │ │ │ │ ├── bex-bridge.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-bex.md │ │ │ │ │ ├── content-scripts.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── types-of-bex.md │ │ │ │ ├── developing-capacitor-apps/ │ │ │ │ │ ├── app-icons-capacitor.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── capacitor-api.md │ │ │ │ │ ├── capacitor-version-support.md │ │ │ │ │ ├── configuring-capacitor.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── live-updates.md │ │ │ │ │ ├── managing-google-analytics.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── publishing-to-store.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-cordova-apps/ │ │ │ │ │ ├── app-icons-cordova.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-cordova.md │ │ │ │ │ ├── cordova-plugins.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── managing-google-analytics.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── publishing-to-store.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-electron-apps/ │ │ │ │ │ ├── app-icons-electron.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-electron.md │ │ │ │ │ ├── electron-accessing-files.md │ │ │ │ │ ├── electron-packages.md │ │ │ │ │ ├── electron-preload-script.md │ │ │ │ │ ├── electron-security-concerns.md │ │ │ │ │ ├── electron-upgrade-guide.md │ │ │ │ │ ├── electron-with-typescript.md │ │ │ │ │ ├── frameless-electron-window.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── troubleshooting-and-tips.md │ │ │ │ ├── developing-mobile-apps.md │ │ │ │ ├── developing-pwa/ │ │ │ │ │ ├── app-icons-pwa.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── configuring-pwa.md │ │ │ │ │ ├── handling-service-worker.md │ │ │ │ │ ├── hmr-for-dev.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ └── pwa-with-typescript.md │ │ │ │ ├── developing-spa/ │ │ │ │ │ ├── app-icons-spa.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── deploying.md │ │ │ │ │ └── introduction.md │ │ │ │ ├── developing-ssr/ │ │ │ │ │ ├── app-icons-ssr.md │ │ │ │ │ ├── build-commands.md │ │ │ │ │ ├── client-side-hydration.md │ │ │ │ │ ├── configuring-ssr.md │ │ │ │ │ ├── deploying.md │ │ │ │ │ ├── handling-404-and-500-errors.md │ │ │ │ │ ├── introduction.md │ │ │ │ │ ├── preparation.md │ │ │ │ │ ├── seo-for-ssr.md │ │ │ │ │ ├── ssr-context.md │ │ │ │ │ ├── ssr-frequently-asked-questions.md │ │ │ │ │ ├── ssr-middleware.md │ │ │ │ │ ├── ssr-webserver.md │ │ │ │ │ ├── ssr-with-pwa.md │ │ │ │ │ ├── ssr-with-typescript.md │ │ │ │ │ ├── vue-ssr-directives.md │ │ │ │ │ └── writing-universal-code.md │ │ │ │ ├── directory-structure.md │ │ │ │ ├── handling-assets.md │ │ │ │ ├── handling-process-env.md │ │ │ │ ├── handling-webpack.md │ │ │ │ ├── lazy-loading.md │ │ │ │ ├── linter.md │ │ │ │ ├── opening-dev-server-to-public.md │ │ │ │ ├── prefetch-feature.md │ │ │ │ ├── quasar-config-file.md │ │ │ │ ├── routing.md │ │ │ │ ├── state-management-with-pinia.md │ │ │ │ ├── supporting-ts.md │ │ │ │ ├── testing-and-auditing.md │ │ │ │ └── upgrade-guide.md │ │ │ ├── quasar-plugins/ │ │ │ │ ├── addressbar-color.md │ │ │ │ ├── app-fullscreen.md │ │ │ │ ├── app-visibility.md │ │ │ │ ├── bottom-sheet.md │ │ │ │ ├── cookies.md │ │ │ │ ├── dark.md │ │ │ │ ├── dialog.md │ │ │ │ ├── loading-bar.md │ │ │ │ ├── loading.md │ │ │ │ ├── meta.md │ │ │ │ ├── notify.md │ │ │ │ └── web-storage.md │ │ │ ├── quasar-utils/ │ │ │ │ ├── color-utils.md │ │ │ │ ├── date-utils.md │ │ │ │ ├── dom-utils.md │ │ │ │ ├── event-bus-util.md │ │ │ │ ├── formatter-utils.md │ │ │ │ ├── morph-utils.md │ │ │ │ ├── other-utils.md │ │ │ │ ├── scrolling-utils.md │ │ │ │ └── type-checking-utils.md │ │ │ ├── security/ │ │ │ │ ├── dos-and-donts.md │ │ │ │ ├── get-help._md_ │ │ │ │ └── report-a-vulnerability.md │ │ │ ├── sponsors-and-backers/ │ │ │ │ ├── DonatingButtons.vue │ │ │ │ ├── SponsorList.vue │ │ │ │ ├── SponsorTile.vue │ │ │ │ └── sponsors-and-backers.md │ │ │ ├── start/ │ │ │ │ ├── how-to-use-vue.md │ │ │ │ ├── pick-quasar-flavour.md │ │ │ │ ├── playground.md │ │ │ │ ├── quasar-cli.md │ │ │ │ ├── quick-start.md │ │ │ │ ├── release-notes/ │ │ │ │ │ ├── PackageReleases.vue │ │ │ │ │ ├── QuasarReleases.vue │ │ │ │ │ └── release-notes.md │ │ │ │ ├── umd/ │ │ │ │ │ ├── UmdTags.vue │ │ │ │ │ └── umd.md │ │ │ │ ├── upgrade-guide/ │ │ │ │ │ ├── UpgradeVideoLink.vue │ │ │ │ │ └── upgrade-guide.md │ │ │ │ ├── vite-plugin/ │ │ │ │ │ ├── VitePluginUsage.vue │ │ │ │ │ └── vite-plugin.md │ │ │ │ ├── vs-code-configuration.md │ │ │ │ └── vue-cli-plugin.md │ │ │ ├── style/ │ │ │ │ ├── body-classes.md │ │ │ │ ├── breakpoints.md │ │ │ │ ├── color-palette/ │ │ │ │ │ ├── BrandColors.vue │ │ │ │ │ ├── ColorList.vue │ │ │ │ │ └── color-palette.md │ │ │ │ ├── dark-mode.md │ │ │ │ ├── other-helper-classes.md │ │ │ │ ├── positioning.md │ │ │ │ ├── sass-scss-variables/ │ │ │ │ │ ├── SassVariables.vue │ │ │ │ │ └── sass-scss-variables.md │ │ │ │ ├── shadows.md │ │ │ │ ├── spacing.md │ │ │ │ ├── theme-builder/ │ │ │ │ │ ├── ThemePicker.vue │ │ │ │ │ └── theme-builder.md │ │ │ │ ├── typography/ │ │ │ │ │ ├── TypographyHeadings.vue │ │ │ │ │ ├── TypographyWeights.vue │ │ │ │ │ └── typography.md │ │ │ │ └── visibility.md │ │ │ ├── video-tutorials/ │ │ │ │ ├── TutorialLink.vue │ │ │ │ ├── TutorialListing.vue │ │ │ │ └── video-tutorials.md │ │ │ ├── vue-components/ │ │ │ │ ├── ajax-bar.md │ │ │ │ ├── avatar.md │ │ │ │ ├── badge.md │ │ │ │ ├── banner.md │ │ │ │ ├── bar.md │ │ │ │ ├── breadcrumbs.md │ │ │ │ ├── button-dropdown.md │ │ │ │ ├── button-group.md │ │ │ │ ├── button-toggle.md │ │ │ │ ├── button.md │ │ │ │ ├── card.md │ │ │ │ ├── carousel.md │ │ │ │ ├── chat.md │ │ │ │ ├── checkbox.md │ │ │ │ ├── chip.md │ │ │ │ ├── circular-progress.md │ │ │ │ ├── color-picker.md │ │ │ │ ├── date.md │ │ │ │ ├── dialog.md │ │ │ │ ├── editor.md │ │ │ │ ├── expansion-item.md │ │ │ │ ├── field.md │ │ │ │ ├── file.md │ │ │ │ ├── floating-action-button.md │ │ │ │ ├── form.md │ │ │ │ ├── icon.md │ │ │ │ ├── img.md │ │ │ │ ├── infinite-scroll.md │ │ │ │ ├── inner-loading.md │ │ │ │ ├── input.md │ │ │ │ ├── intersection.md │ │ │ │ ├── knob.md │ │ │ │ ├── linear-progress.md │ │ │ │ ├── list-and-list-items.md │ │ │ │ ├── markup-table.md │ │ │ │ ├── menu/ │ │ │ │ │ ├── MenuPositioning.vue │ │ │ │ │ └── menu.md │ │ │ │ ├── no-ssr.md │ │ │ │ ├── option-group.md │ │ │ │ ├── pagination.md │ │ │ │ ├── parallax.md │ │ │ │ ├── popup-edit.md │ │ │ │ ├── popup-proxy.md │ │ │ │ ├── pull-to-refresh.md │ │ │ │ ├── radio.md │ │ │ │ ├── range.md │ │ │ │ ├── rating.md │ │ │ │ ├── resize-observer.md │ │ │ │ ├── responsive.md │ │ │ │ ├── scroll-area.md │ │ │ │ ├── scroll-observer.md │ │ │ │ ├── select.md │ │ │ │ ├── separator.md │ │ │ │ ├── skeleton.md │ │ │ │ ├── slide-item.md │ │ │ │ ├── slide-transition.md │ │ │ │ ├── slider.md │ │ │ │ ├── space.md │ │ │ │ ├── spinners.md │ │ │ │ ├── splitter.md │ │ │ │ ├── stepper.md │ │ │ │ ├── tab-panels.md │ │ │ │ ├── table.md │ │ │ │ ├── tabs.md │ │ │ │ ├── time.md │ │ │ │ ├── timeline.md │ │ │ │ ├── toggle.md │ │ │ │ ├── toolbar.md │ │ │ │ ├── tooltip/ │ │ │ │ │ ├── TooltipPositioning.vue │ │ │ │ │ └── tooltip.md │ │ │ │ ├── tree.md │ │ │ │ ├── uploader.md │ │ │ │ ├── video.md │ │ │ │ └── virtual-scroll.md │ │ │ ├── vue-composables/ │ │ │ │ ├── use-dialog-plugin-component.md │ │ │ │ ├── use-form-child.md │ │ │ │ ├── use-hydration.md │ │ │ │ ├── use-id.md │ │ │ │ ├── use-interval.md │ │ │ │ ├── use-meta.md │ │ │ │ ├── use-quasar.md │ │ │ │ ├── use-render-cache.md │ │ │ │ ├── use-split-attrs.md │ │ │ │ ├── use-tick.md │ │ │ │ └── use-timeout.md │ │ │ ├── vue-directives/ │ │ │ │ ├── close-popup.md │ │ │ │ ├── intersection.md │ │ │ │ ├── material-ripples.md │ │ │ │ ├── morph.md │ │ │ │ ├── mutation.md │ │ │ │ ├── scroll-fire.md │ │ │ │ ├── scroll.md │ │ │ │ ├── touch-hold.md │ │ │ │ ├── touch-pan.md │ │ │ │ ├── touch-repeat.md │ │ │ │ └── touch-swipe.md │ │ │ └── why-donate.md │ │ └── router/ │ │ ├── index.js │ │ └── routes.js │ ├── src-pwa/ │ │ ├── custom-service-worker.js │ │ ├── manifest.json │ │ ├── pwa-flag.d.ts │ │ └── register-service-worker.js │ └── src-ssr/ │ ├── middlewares/ │ │ └── render.js │ ├── server.js │ └── ssr-flag.d.ts ├── extras/ │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── animate/ │ │ ├── LICENSE │ │ ├── animate-list.common.d.ts │ │ ├── animate-list.common.js │ │ ├── animate-list.d.ts │ │ ├── animate-list.js │ │ ├── animate-list.mjs │ │ ├── backInDown.css │ │ ├── backInLeft.css │ │ ├── backInRight.css │ │ ├── backInUp.css │ │ ├── backOutDown.css │ │ ├── backOutLeft.css │ │ ├── backOutRight.css │ │ ├── backOutUp.css │ │ ├── bounce.css │ │ ├── bounceIn.css │ │ ├── bounceInDown.css │ │ ├── bounceInLeft.css │ │ ├── bounceInRight.css │ │ ├── bounceInUp.css │ │ ├── bounceOut.css │ │ ├── bounceOutDown.css │ │ ├── bounceOutLeft.css │ │ ├── bounceOutRight.css │ │ ├── bounceOutUp.css │ │ ├── fadeIn.css │ │ ├── fadeInBottomLeft.css │ │ ├── fadeInBottomRight.css │ │ ├── fadeInDown.css │ │ ├── fadeInDownBig.css │ │ ├── fadeInLeft.css │ │ ├── fadeInLeftBig.css │ │ ├── fadeInRight.css │ │ ├── fadeInRightBig.css │ │ ├── fadeInTopLeft.css │ │ ├── fadeInTopRight.css │ │ ├── fadeInUp.css │ │ ├── fadeInUpBig.css │ │ ├── fadeOut.css │ │ ├── fadeOutBottomLeft.css │ │ ├── fadeOutBottomRight.css │ │ ├── fadeOutDown.css │ │ ├── fadeOutDownBig.css │ │ ├── fadeOutLeft.css │ │ ├── fadeOutLeftBig.css │ │ ├── fadeOutRight.css │ │ ├── fadeOutRightBig.css │ │ ├── fadeOutTopLeft.css │ │ ├── fadeOutTopRight.css │ │ ├── fadeOutUp.css │ │ ├── fadeOutUpBig.css │ │ ├── flash.css │ │ ├── flip.css │ │ ├── flipInX.css │ │ ├── flipInY.css │ │ ├── flipOutX.css │ │ ├── flipOutY.css │ │ ├── headShake.css │ │ ├── heartBeat.css │ │ ├── hinge.css │ │ ├── jackInTheBox.css │ │ ├── jello.css │ │ ├── lightSpeedIn.css │ │ ├── lightSpeedInLeft.css │ │ ├── lightSpeedInRight.css │ │ ├── lightSpeedOut.css │ │ ├── lightSpeedOutLeft.css │ │ ├── lightSpeedOutRight.css │ │ ├── pulse.css │ │ ├── rollIn.css │ │ ├── rollOut.css │ │ ├── rotateIn.css │ │ ├── rotateInDownLeft.css │ │ ├── rotateInDownRight.css │ │ ├── rotateInUpLeft.css │ │ ├── rotateInUpRight.css │ │ ├── rotateOut.css │ │ ├── rotateOutDownLeft.css │ │ ├── rotateOutDownRight.css │ │ ├── rotateOutUpLeft.css │ │ ├── rotateOutUpRight.css │ │ ├── rubberBand.css │ │ ├── shake.css │ │ ├── shakeX.css │ │ ├── shakeY.css │ │ ├── slideInDown.css │ │ ├── slideInLeft.css │ │ ├── slideInRight.css │ │ ├── slideInUp.css │ │ ├── slideOutDown.css │ │ ├── slideOutLeft.css │ │ ├── slideOutRight.css │ │ ├── slideOutUp.css │ │ ├── swing.css │ │ ├── tada.css │ │ ├── wobble.css │ │ ├── zoomIn.css │ │ ├── zoomInDown.css │ │ ├── zoomInLeft.css │ │ ├── zoomInRight.css │ │ ├── zoomInUp.css │ │ ├── zoomOut.css │ │ ├── zoomOutDown.css │ │ ├── zoomOutLeft.css │ │ ├── zoomOutRight.css │ │ └── zoomOutUp.css │ ├── bootstrap-icons/ │ │ ├── LICENSE │ │ ├── bootstrap-icons.css │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── build/ │ │ ├── README.template.md │ │ ├── animate.js │ │ ├── bootstrap-icons.js │ │ ├── eva-icons.js │ │ ├── fontawesome-v5.js │ │ ├── fontawesome-v6.js │ │ ├── fontawesome-v7.js │ │ ├── index.js │ │ ├── ionicons-v8.js │ │ ├── line-awesome.js │ │ ├── material-icons.js │ │ ├── material-symbols.js │ │ ├── mdi-v7.js │ │ ├── readme-data.js │ │ ├── readme.js │ │ ├── themify.js │ │ ├── utils/ │ │ │ ├── buildExports.js │ │ │ └── index.js │ │ └── webfonts.js │ ├── eva-icons/ │ │ ├── LICENSE │ │ ├── eva-icons.css │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── fontawesome-v5/ │ │ ├── LICENSE.txt │ │ ├── fontawesome-v5.css │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── fontawesome-v6/ │ │ ├── LICENSE.txt │ │ ├── fontawesome-v6.css │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── fontawesome-v7/ │ │ ├── LICENSE.txt │ │ ├── fontawesome-v7.css │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── index.d.ts │ ├── index.js │ ├── ionicons-v4/ │ │ ├── LICENSE │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ └── ionicons-v4.css │ ├── ionicons-v5/ │ │ ├── LICENSE │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── ionicons-v6/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── ionicons-v7/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── ionicons-v8/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ └── index.mjs │ ├── line-awesome/ │ │ ├── LICENSE.md │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ └── line-awesome.css │ ├── material-icons/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-icons.css │ │ └── update.sh │ ├── material-icons-outlined/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-icons-outlined.css │ │ └── update.sh │ ├── material-icons-round/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-icons-round.css │ │ └── update.sh │ ├── material-icons-sharp/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-icons-sharp.css │ │ └── update.sh │ ├── material-symbols-outlined/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-symbols-outlined.css │ │ └── update.sh │ ├── material-symbols-rounded/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-symbols-rounded.css │ │ └── update.sh │ ├── material-symbols-sharp/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── material-symbols-sharp.css │ │ └── update.sh │ ├── mdi-v3/ │ │ ├── LICENSE │ │ └── mdi-v3.css │ ├── mdi-v4/ │ │ ├── LICENSE │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── license.md │ │ └── mdi-v4.css │ ├── mdi-v5/ │ │ ├── LICENSE │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── license.md │ │ └── mdi-v5.css │ ├── mdi-v6/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── license.md │ │ └── mdi-v6.css │ ├── mdi-v7/ │ │ ├── LICENSE │ │ ├── icons.json │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── license.md │ │ └── mdi-v7.css │ ├── package.json │ ├── roboto-font/ │ │ ├── LICENSE │ │ ├── roboto-font.css │ │ └── update.sh │ ├── roboto-font-latin-ext/ │ │ ├── LICENSE │ │ ├── roboto-font-latin-ext.css │ │ └── update.sh │ └── themify/ │ ├── LICENSE │ ├── icons.json │ ├── index.d.ts │ ├── index.js │ ├── index.mjs │ └── themify.css ├── icongenie/ │ ├── .gitignore │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── bin/ │ │ └── icongenie.js │ ├── lib/ │ │ ├── cmd/ │ │ │ ├── generate.js │ │ │ ├── help.js │ │ │ ├── profile.js │ │ │ └── verify.js │ │ ├── generators/ │ │ │ ├── icns.js │ │ │ ├── ico.js │ │ │ ├── index.js │ │ │ ├── png.js │ │ │ ├── splashscreen.js │ │ │ └── svg.js │ │ ├── modes/ │ │ │ ├── index.js │ │ │ ├── quasar-app-v1/ │ │ │ │ ├── bex.js │ │ │ │ ├── capacitor.js │ │ │ │ ├── cordova.js │ │ │ │ ├── electron.js │ │ │ │ ├── index.js │ │ │ │ ├── pwa.js │ │ │ │ ├── spa.js │ │ │ │ └── ssr.js │ │ │ └── quasar-app-v2/ │ │ │ ├── bex.js │ │ │ ├── capacitor.js │ │ │ ├── cordova.js │ │ │ ├── electron.js │ │ │ ├── index.js │ │ │ ├── pwa.js │ │ │ ├── spa.js │ │ │ └── ssr.js │ │ ├── mount/ │ │ │ ├── index.js │ │ │ ├── mount-cordova.js │ │ │ └── mount-tag.js │ │ ├── runner/ │ │ │ ├── generate.js │ │ │ ├── profile.js │ │ │ └── verify.js │ │ └── utils/ │ │ ├── app-paths.js │ │ ├── default-params.js │ │ ├── filter-argv-params.js │ │ ├── get-assets-files.js │ │ ├── get-compression.js │ │ ├── get-file-size.js │ │ ├── get-files-options.js │ │ ├── get-png-size.js │ │ ├── get-profile-content.js │ │ ├── get-profile-files.js │ │ ├── get-square-icon.js │ │ ├── logger.js │ │ ├── merge-objects.js │ │ ├── node-version-check.js │ │ ├── package-json.js │ │ ├── parse-argv.js │ │ ├── spawn-sync.js │ │ └── validate-profile-object.js │ ├── package.json │ ├── pnpm-workspace.yaml │ └── samples/ │ └── icongenie-profile.json ├── package.json ├── pnpm-workspace.yaml ├── ui/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── build/ │ │ ├── build.api.js │ │ ├── build.icon-sets.js │ │ ├── build.lang.js │ │ ├── build.transforms.js │ │ ├── build.types.js │ │ ├── build.utils.js │ │ ├── build.web-types.js │ │ ├── prepare-diff.js │ │ ├── script.build.css.js │ │ ├── script.build.javascript.js │ │ ├── script.build.js │ │ ├── script.clean.js │ │ └── script.test-umd.js │ ├── icon-set/ │ │ ├── bootstrap-icons.js │ │ ├── eva-icons.js │ │ ├── fontawesome-v5-pro.js │ │ ├── fontawesome-v5.js │ │ ├── fontawesome-v6-pro.js │ │ ├── fontawesome-v6.js │ │ ├── fontawesome-v7-pro.js │ │ ├── fontawesome-v7.js │ │ ├── ionicons-v4.js │ │ ├── line-awesome.js │ │ ├── material-icons-outlined.js │ │ ├── material-icons-round.js │ │ ├── material-icons-sharp.js │ │ ├── material-icons.js │ │ ├── material-symbols-outlined.js │ │ ├── material-symbols-rounded.js │ │ ├── material-symbols-sharp.js │ │ ├── mdi-v3.js │ │ ├── mdi-v4.js │ │ ├── mdi-v5.js │ │ ├── mdi-v6.js │ │ ├── mdi-v7.js │ │ ├── svg-bootstrap-icons.js │ │ ├── svg-eva-icons.js │ │ ├── svg-fontawesome-v5.js │ │ ├── svg-fontawesome-v6.js │ │ ├── svg-fontawesome-v7.js │ │ ├── svg-ionicons-v4.js │ │ ├── svg-ionicons-v5.js │ │ ├── svg-ionicons-v6.js │ │ ├── svg-ionicons-v7.js │ │ ├── svg-ionicons-v8.js │ │ ├── svg-line-awesome.js │ │ ├── svg-material-icons-outlined.js │ │ ├── svg-material-icons-round.js │ │ ├── svg-material-icons-sharp.js │ │ ├── svg-material-icons.js │ │ ├── svg-material-symbols-outlined.js │ │ ├── svg-material-symbols-rounded.js │ │ ├── svg-material-symbols-sharp.js │ │ ├── svg-mdi-v6.js │ │ ├── svg-mdi-v7.js │ │ ├── svg-themify.js │ │ └── themify.js │ ├── jsconfig.json │ ├── lang/ │ │ ├── ar-TN.js │ │ ├── ar.js │ │ ├── az-Latn.js │ │ ├── bg.js │ │ ├── bn.js │ │ ├── bs-BA.js │ │ ├── ca.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de-CH.js │ │ ├── de-DE.js │ │ ├── de.js │ │ ├── el.js │ │ ├── en-GB.js │ │ ├── en-US.js │ │ ├── eo.js │ │ ├── es.js │ │ ├── et.js │ │ ├── eu.js │ │ ├── fa-IR.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── gn.js │ │ ├── he.js │ │ ├── hi.js │ │ ├── hr.js │ │ ├── hu.js │ │ ├── id.js │ │ ├── index.json │ │ ├── is.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── kk.js │ │ ├── km.js │ │ ├── ko-KR.js │ │ ├── kur-CKB.js │ │ ├── lt.js │ │ ├── lu.js │ │ ├── lv.js │ │ ├── mk.js │ │ ├── ml.js │ │ ├── mm.js │ │ ├── ms-MY.js │ │ ├── ms.js │ │ ├── my.js │ │ ├── nb-NO.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── pt-BR.js │ │ ├── pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sl.js │ │ ├── sm.js │ │ ├── sq.js │ │ ├── sr-CYR.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── ta.js │ │ ├── th.js │ │ ├── tl.js │ │ ├── tr.js │ │ ├── ug.js │ │ ├── uk.js │ │ ├── ur-PK.js │ │ ├── uz-Cyrl.js │ │ ├── uz-Latn.js │ │ ├── vi.js │ │ ├── zh-CN.js │ │ └── zh-TW.js │ ├── package.json │ ├── playground/ │ │ ├── .editorconfig │ │ ├── .npmrc │ │ ├── README.md │ │ ├── __postcss.config.js │ │ ├── index.html │ │ ├── jsconfig.json │ │ ├── package.json │ │ ├── quasar.config.js │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ └── grid-data.json │ │ │ ├── boot/ │ │ │ │ └── ssr-client.js │ │ │ ├── composables/ │ │ │ │ └── useLocalStorageConfig.js │ │ │ ├── css/ │ │ │ │ └── quasar.variables.sass │ │ │ ├── mock-data/ │ │ │ │ └── tree/ │ │ │ │ ├── bigTree.json │ │ │ │ └── smallTree.json │ │ │ ├── pages/ │ │ │ │ ├── Error404.vue │ │ │ │ ├── IndexPage.vue │ │ │ │ ├── components/ │ │ │ │ │ ├── ajax-bar.vue │ │ │ │ │ ├── avatar.vue │ │ │ │ │ ├── badge.vue │ │ │ │ │ ├── banner.vue │ │ │ │ │ ├── bar.vue │ │ │ │ │ ├── breadcrumbs.vue │ │ │ │ │ ├── button-align-1.vue │ │ │ │ │ ├── button-align-2.vue │ │ │ │ │ ├── button-align-3.vue │ │ │ │ │ ├── button-dropdown.vue │ │ │ │ │ ├── button-events.vue │ │ │ │ │ ├── button-functional.vue │ │ │ │ │ ├── button-group.vue │ │ │ │ │ ├── button-in-flex.vue │ │ │ │ │ ├── button-links.vue │ │ │ │ │ ├── button-prevent.vue │ │ │ │ │ ├── button-toggle.vue │ │ │ │ │ ├── button.vue │ │ │ │ │ ├── card.vue │ │ │ │ │ ├── carousel-part1.vue │ │ │ │ │ ├── carousel-part2.vue │ │ │ │ │ ├── chat.vue │ │ │ │ │ ├── chat2.vue │ │ │ │ │ ├── chip.vue │ │ │ │ │ ├── circular-progress.vue │ │ │ │ │ ├── data-table-part1.vue │ │ │ │ │ ├── data-table-part2.vue │ │ │ │ │ ├── data-table-part3.vue │ │ │ │ │ ├── data-table-part4.vue │ │ │ │ │ ├── data-table-part5-fixed.vue │ │ │ │ │ ├── data-table-part6-virt-loading.vue │ │ │ │ │ ├── data-table-part6-virt-slots.vue │ │ │ │ │ ├── data-table-part7-infercols.vue │ │ │ │ │ ├── data-table-part8-expanded.vue │ │ │ │ │ ├── data-table-part9-selection-slot.vue │ │ │ │ │ ├── fab-extended.vue │ │ │ │ │ ├── fab.vue │ │ │ │ │ ├── focus-tests.vue │ │ │ │ │ ├── icon-extras.vue │ │ │ │ │ ├── icon.vue │ │ │ │ │ ├── img-queue.vue │ │ │ │ │ ├── img.vue │ │ │ │ │ ├── infinite-scroll.vue │ │ │ │ │ ├── intersection-1.vue │ │ │ │ │ ├── intersection-2.vue │ │ │ │ │ ├── intersection-3.vue │ │ │ │ │ ├── intersection-4.vue │ │ │ │ │ ├── intersection-5-ssr.vue │ │ │ │ │ ├── intersection-6-iframe.vue │ │ │ │ │ ├── linear-progress.vue │ │ │ │ │ ├── link.vue │ │ │ │ │ ├── list-expansion-item.vue │ │ │ │ │ ├── list-item.vue │ │ │ │ │ ├── list-slide-item.vue │ │ │ │ │ ├── menu-2-nested-divs.vue │ │ │ │ │ ├── menu-align.vue │ │ │ │ │ ├── menu-max-width-height.vue │ │ │ │ │ ├── menu-test.vue │ │ │ │ │ ├── menu.vue │ │ │ │ │ ├── no-ssr.vue │ │ │ │ │ ├── pagination-design.vue │ │ │ │ │ ├── pagination-functionality.vue │ │ │ │ │ ├── parallax.vue │ │ │ │ │ ├── popup-proxy.vue │ │ │ │ │ ├── portal-focus.vue │ │ │ │ │ ├── pull-to-refresh-part1.vue │ │ │ │ │ ├── pull-to-refresh-part2.vue │ │ │ │ │ ├── pull-to-refresh-part3.vue │ │ │ │ │ ├── responsive.vue │ │ │ │ │ ├── scroll-area-resize.vue │ │ │ │ │ ├── scroll-area-update.vue │ │ │ │ │ ├── scroll-area.vue │ │ │ │ │ ├── scroll-fire.vue │ │ │ │ │ ├── skeleton.vue │ │ │ │ │ ├── spinner.vue │ │ │ │ │ ├── splitter.vue │ │ │ │ │ ├── stepper-scroll-tests.vue │ │ │ │ │ ├── stepper.vue │ │ │ │ │ ├── tabs-cleanup.vue │ │ │ │ │ ├── tabs-dynamic-1.vue │ │ │ │ │ ├── tabs-dynamic-2.vue │ │ │ │ │ ├── tabs-resize.vue │ │ │ │ │ ├── tabs-router.vue │ │ │ │ │ ├── tabs.vue │ │ │ │ │ ├── timeline.vue │ │ │ │ │ ├── toolbar.vue │ │ │ │ │ ├── tooltip.vue │ │ │ │ │ ├── transition-animatecss.vue │ │ │ │ │ ├── tree.vue │ │ │ │ │ ├── video-embedding.vue │ │ │ │ │ ├── virtual-scroll-1.vue │ │ │ │ │ ├── virtual-scroll-2.vue │ │ │ │ │ ├── virtual-scroll-3.vue │ │ │ │ │ ├── virtual-scroll-4.vue │ │ │ │ │ ├── virtual-scroll-5.vue │ │ │ │ │ ├── virtual-scroll-6.vue │ │ │ │ │ ├── virtual-scroll-7-align.vue │ │ │ │ │ └── virtual-scroll-8-focus.vue │ │ │ │ ├── css/ │ │ │ │ │ ├── colors.vue │ │ │ │ │ ├── flex-addon.vue │ │ │ │ │ ├── flex-columns.vue │ │ │ │ │ ├── flex-gutter.vue │ │ │ │ │ ├── flex-rows.vue │ │ │ │ │ ├── flex-test.vue │ │ │ │ │ ├── material-ripples-1.vue │ │ │ │ │ ├── material-ripples-2.vue │ │ │ │ │ ├── shadows.vue │ │ │ │ │ ├── size-addon.vue │ │ │ │ │ └── typography.vue │ │ │ │ ├── form/ │ │ │ │ │ ├── checkbox-radio-toggle-test.vue │ │ │ │ │ ├── checkbox.vue │ │ │ │ │ ├── color-picker.vue │ │ │ │ │ ├── composition.vue │ │ │ │ │ ├── date-part1-basic.vue │ │ │ │ │ ├── date-part2-multiple-range.vue │ │ │ │ │ ├── date-time-timestamp-test.vue │ │ │ │ │ ├── date-time-timezone.vue │ │ │ │ │ ├── editor-part1.vue │ │ │ │ │ ├── editor-part2-model.vue │ │ │ │ │ ├── editor-part3.vue │ │ │ │ │ ├── editor-part4.vue │ │ │ │ │ ├── field-align.vue │ │ │ │ │ ├── field-attrs.vue │ │ │ │ │ ├── field-focus-unfocus.vue │ │ │ │ │ ├── field-label.vue │ │ │ │ │ ├── field.vue │ │ │ │ │ ├── file-picker.vue │ │ │ │ │ ├── form-async-validation.vue │ │ │ │ │ ├── form-focus.vue │ │ │ │ │ ├── form-native.vue │ │ │ │ │ ├── form-validation-reactive-lazy.vue │ │ │ │ │ ├── form.vue │ │ │ │ │ ├── form2.vue │ │ │ │ │ ├── input-and-qselect-test.vue │ │ │ │ │ ├── input-autocomplete.vue │ │ │ │ │ ├── input-composition.vue │ │ │ │ │ ├── input-debounce-test.vue │ │ │ │ │ ├── input-mask.vue │ │ │ │ │ ├── input-number.vue │ │ │ │ │ ├── input-validate.vue │ │ │ │ │ ├── input.vue │ │ │ │ │ ├── knob.vue │ │ │ │ │ ├── optiongroup.vue │ │ │ │ │ ├── radio.vue │ │ │ │ │ ├── range.vue │ │ │ │ │ ├── rating.vue │ │ │ │ │ ├── select-mobile.vue │ │ │ │ │ ├── select-part-1.vue │ │ │ │ │ ├── select-part-2.vue │ │ │ │ │ ├── select-part-3.vue │ │ │ │ │ ├── select-part-4.vue │ │ │ │ │ ├── select-part-5-kbd.vue │ │ │ │ │ ├── select-part-6-autocomplete.vue │ │ │ │ │ ├── select-part-7-text.vue │ │ │ │ │ ├── select-part-8.vue │ │ │ │ │ ├── select-part-9-dynamic.vue │ │ │ │ │ ├── slider-marker-label-part1.vue │ │ │ │ │ ├── slider-marker-label-part2.vue │ │ │ │ │ ├── slider-marker-label-part3-img.vue │ │ │ │ │ ├── slider-range-change-test.vue │ │ │ │ │ ├── slider-range-label.vue │ │ │ │ │ ├── slider-range-limits.vue │ │ │ │ │ ├── slider.vue │ │ │ │ │ ├── time-limits.vue │ │ │ │ │ ├── time.vue │ │ │ │ │ ├── toggle.vue │ │ │ │ │ ├── uploader-exposed-api.vue │ │ │ │ │ └── uploader.vue │ │ │ │ ├── global/ │ │ │ │ │ ├── bottom-sheet.vue │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ └── TestDialog.vue │ │ │ │ │ ├── dialog-component-composition-api.js │ │ │ │ │ ├── dialog-component-options-api.js │ │ │ │ │ ├── dialog-plugin.vue │ │ │ │ │ ├── dialog-spawn.vue │ │ │ │ │ ├── dialog.vue │ │ │ │ │ ├── inner-loading.vue │ │ │ │ │ ├── loading-bar.vue │ │ │ │ │ ├── loading.vue │ │ │ │ │ ├── notify-part2-updatable.vue │ │ │ │ │ └── notify.vue │ │ │ │ ├── layout/ │ │ │ │ │ ├── layout-container-drawer-loop.vue │ │ │ │ │ ├── layout-container.vue │ │ │ │ │ ├── layout-drawer-loop.vue │ │ │ │ │ ├── layout-drawer-mini.vue │ │ │ │ │ ├── layout-keep-state-above.vue │ │ │ │ │ ├── layout-page-scroller.vue │ │ │ │ │ ├── layout.vue │ │ │ │ │ └── pages/ │ │ │ │ │ ├── a.vue │ │ │ │ │ ├── b.vue │ │ │ │ │ ├── c.vue │ │ │ │ │ └── default.vue │ │ │ │ ├── meta/ │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ ├── layout_1.vue │ │ │ │ │ │ ├── layout_2.vue │ │ │ │ │ │ └── title.vue │ │ │ │ │ └── pages/ │ │ │ │ │ ├── first.vue │ │ │ │ │ ├── second.vue │ │ │ │ │ └── third.vue │ │ │ │ ├── other/ │ │ │ │ │ ├── app-fullscreen-portals.vue │ │ │ │ │ ├── app-fullscreen.vue │ │ │ │ │ ├── app-visibility.vue │ │ │ │ │ ├── clipboard.vue │ │ │ │ │ ├── close-popup.vue │ │ │ │ │ ├── cookies.vue │ │ │ │ │ ├── date-utils.vue │ │ │ │ │ ├── event-bus.vue │ │ │ │ │ ├── export-file.vue │ │ │ │ │ ├── focus-tests.vue │ │ │ │ │ ├── intersection.vue │ │ │ │ │ ├── model-toggle.vue │ │ │ │ │ ├── morph-1.vue │ │ │ │ │ ├── morph-directive-boxes-obj.vue │ │ │ │ │ ├── morph-directive-boxes.vue │ │ │ │ │ ├── morph-directive-card.vue │ │ │ │ │ ├── morph-fab-card.vue │ │ │ │ │ ├── morph-img-1.vue │ │ │ │ │ ├── morph-img-2.vue │ │ │ │ │ ├── morph-img-3.vue │ │ │ │ │ ├── morph-same-element.vue │ │ │ │ │ ├── mutation.vue │ │ │ │ │ ├── platform-detection.vue │ │ │ │ │ ├── run-sequential-promises.vue │ │ │ │ │ ├── screen-plugin.vue │ │ │ │ │ ├── scroll-animated.vue │ │ │ │ │ ├── size-prop-test.vue │ │ │ │ │ ├── slide-transition.vue │ │ │ │ │ ├── transitions.vue │ │ │ │ │ ├── uid.vue │ │ │ │ │ ├── viewport-resize.vue │ │ │ │ │ └── web-storage.vue │ │ │ │ ├── touch-directives/ │ │ │ │ │ ├── pan-complex-test.vue │ │ │ │ │ ├── touch-hold.vue │ │ │ │ │ ├── touch-pan.vue │ │ │ │ │ ├── touch-repeat.vue │ │ │ │ │ ├── touch-style.sass │ │ │ │ │ └── touch-swipe.vue │ │ │ │ └── web-tests/ │ │ │ │ ├── a.vue │ │ │ │ ├── b.vue │ │ │ │ ├── breakpoints.vue │ │ │ │ ├── c.vue │ │ │ │ ├── fast-table-test.vue │ │ │ │ ├── fast-test.vue │ │ │ │ ├── get-normalized-vnodes.vue │ │ │ │ ├── hover.vue │ │ │ │ ├── keep-alive-events.vue │ │ │ │ ├── layout.vue │ │ │ │ ├── panel-keep-alive.vue │ │ │ │ ├── panel-vfor-loop.vue │ │ │ │ ├── portal-inject-test.vue │ │ │ │ ├── screen-height.vue │ │ │ │ └── tabs-router/ │ │ │ │ ├── One.vue │ │ │ │ ├── TabsLayout.vue │ │ │ │ └── Two.vue │ │ │ └── router/ │ │ │ ├── index.js │ │ │ ├── pages.js │ │ │ └── routes.js │ │ ├── src-ssr/ │ │ │ ├── middlewares/ │ │ │ │ └── render.js │ │ │ ├── package.json │ │ │ ├── pnpm-workspace.yaml │ │ │ └── server.js │ │ └── upload-server/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ └── server.js │ ├── playground-umd/ │ │ ├── index-multiapp.umd.html │ │ └── index.umd.html │ ├── src/ │ │ ├── Brand.json │ │ ├── api.extends.json │ │ ├── components/ │ │ │ ├── ajax-bar/ │ │ │ │ ├── QAjaxBar.js │ │ │ │ ├── QAjaxBar.json │ │ │ │ ├── QAjaxBar.sass │ │ │ │ └── index.js │ │ │ ├── avatar/ │ │ │ │ ├── QAvatar.js │ │ │ │ ├── QAvatar.json │ │ │ │ ├── QAvatar.sass │ │ │ │ ├── QAvatar.test.js │ │ │ │ └── index.js │ │ │ ├── badge/ │ │ │ │ ├── QBadge.js │ │ │ │ ├── QBadge.json │ │ │ │ ├── QBadge.sass │ │ │ │ ├── QBadge.test.js │ │ │ │ └── index.js │ │ │ ├── banner/ │ │ │ │ ├── QBanner.js │ │ │ │ ├── QBanner.json │ │ │ │ ├── QBanner.sass │ │ │ │ ├── QBanner.test.js │ │ │ │ └── index.js │ │ │ ├── bar/ │ │ │ │ ├── QBar.js │ │ │ │ ├── QBar.json │ │ │ │ ├── QBar.sass │ │ │ │ ├── QBar.test.js │ │ │ │ └── index.js │ │ │ ├── breadcrumbs/ │ │ │ │ ├── QBreadcrumbs.js │ │ │ │ ├── QBreadcrumbs.json │ │ │ │ ├── QBreadcrumbs.sass │ │ │ │ ├── QBreadcrumbs.test.js │ │ │ │ ├── QBreadcrumbsEl.js │ │ │ │ ├── QBreadcrumbsEl.json │ │ │ │ ├── QBreadcrumbsEl.test.js │ │ │ │ ├── index.js │ │ │ │ └── test/ │ │ │ │ ├── BasicBreadcrumbs.vue │ │ │ │ └── BreadcrumbWithSeparatorSlot.vue │ │ │ ├── btn/ │ │ │ │ ├── QBtn.js │ │ │ │ ├── QBtn.json │ │ │ │ ├── QBtn.sass │ │ │ │ ├── QBtn.test.js │ │ │ │ ├── index.js │ │ │ │ ├── use-btn.js │ │ │ │ ├── use-btn.json │ │ │ │ └── use-btn.test.js │ │ │ ├── btn-dropdown/ │ │ │ │ ├── QBtnDropdown.js │ │ │ │ ├── QBtnDropdown.json │ │ │ │ ├── QBtnDropdown.sass │ │ │ │ └── index.js │ │ │ ├── btn-group/ │ │ │ │ ├── QBtnGroup.js │ │ │ │ ├── QBtnGroup.json │ │ │ │ ├── QBtnGroup.sass │ │ │ │ └── index.js │ │ │ ├── btn-toggle/ │ │ │ │ ├── QBtnToggle.js │ │ │ │ ├── QBtnToggle.json │ │ │ │ ├── QBtnToggle.sass │ │ │ │ └── index.js │ │ │ ├── card/ │ │ │ │ ├── QCard.js │ │ │ │ ├── QCard.json │ │ │ │ ├── QCard.sass │ │ │ │ ├── QCardActions.js │ │ │ │ ├── QCardActions.json │ │ │ │ ├── QCardSection.js │ │ │ │ ├── QCardSection.json │ │ │ │ └── index.js │ │ │ ├── carousel/ │ │ │ │ ├── QCarousel.js │ │ │ │ ├── QCarousel.json │ │ │ │ ├── QCarousel.sass │ │ │ │ ├── QCarouselControl.js │ │ │ │ ├── QCarouselControl.json │ │ │ │ ├── QCarouselSlide.js │ │ │ │ ├── QCarouselSlide.json │ │ │ │ └── index.js │ │ │ ├── chat/ │ │ │ │ ├── QChatMessage.js │ │ │ │ ├── QChatMessage.json │ │ │ │ ├── QChatMessage.sass │ │ │ │ └── index.js │ │ │ ├── checkbox/ │ │ │ │ ├── QCheckbox.js │ │ │ │ ├── QCheckbox.json │ │ │ │ ├── QCheckbox.sass │ │ │ │ ├── index.js │ │ │ │ ├── use-checkbox.js │ │ │ │ └── use-checkbox.json │ │ │ ├── chip/ │ │ │ │ ├── QChip.js │ │ │ │ ├── QChip.json │ │ │ │ ├── QChip.sass │ │ │ │ ├── QChip.test.js │ │ │ │ └── index.js │ │ │ ├── circular-progress/ │ │ │ │ ├── QCircularProgress.js │ │ │ │ ├── QCircularProgress.json │ │ │ │ ├── QCircularProgress.sass │ │ │ │ ├── circular-progress.js │ │ │ │ ├── circular-progress.test.js │ │ │ │ └── index.js │ │ │ ├── color/ │ │ │ │ ├── QColor.js │ │ │ │ ├── QColor.json │ │ │ │ ├── QColor.sass │ │ │ │ └── index.js │ │ │ ├── date/ │ │ │ │ ├── QDate.js │ │ │ │ ├── QDate.json │ │ │ │ ├── QDate.sass │ │ │ │ ├── index.js │ │ │ │ ├── use-datetime.js │ │ │ │ └── use-datetime.json │ │ │ ├── dialog/ │ │ │ │ ├── QDialog.js │ │ │ │ ├── QDialog.json │ │ │ │ ├── QDialog.sass │ │ │ │ ├── QDialog.test.js │ │ │ │ ├── index.js │ │ │ │ └── test/ │ │ │ │ └── DialogWrapper.vue │ │ │ ├── drawer/ │ │ │ │ ├── QDrawer.js │ │ │ │ ├── QDrawer.json │ │ │ │ └── index.js │ │ │ ├── editor/ │ │ │ │ ├── QEditor.js │ │ │ │ ├── QEditor.json │ │ │ │ ├── QEditor.sass │ │ │ │ ├── editor-caret.js │ │ │ │ ├── editor-utils.js │ │ │ │ └── index.js │ │ │ ├── expansion-item/ │ │ │ │ ├── QExpansionItem.js │ │ │ │ ├── QExpansionItem.json │ │ │ │ ├── QExpansionItem.sass │ │ │ │ └── index.js │ │ │ ├── fab/ │ │ │ │ ├── QFab.js │ │ │ │ ├── QFab.json │ │ │ │ ├── QFab.sass │ │ │ │ ├── QFabAction.js │ │ │ │ ├── QFabAction.json │ │ │ │ ├── index.js │ │ │ │ ├── use-fab.js │ │ │ │ └── use-fab.json │ │ │ ├── field/ │ │ │ │ ├── QField.js │ │ │ │ ├── QField.json │ │ │ │ ├── QField.sass │ │ │ │ └── index.js │ │ │ ├── file/ │ │ │ │ ├── QFile.js │ │ │ │ ├── QFile.json │ │ │ │ ├── QFile.sass │ │ │ │ └── index.js │ │ │ ├── footer/ │ │ │ │ ├── QFooter.js │ │ │ │ ├── QFooter.json │ │ │ │ └── index.js │ │ │ ├── form/ │ │ │ │ ├── QForm.js │ │ │ │ ├── QForm.json │ │ │ │ ├── QForm.sass │ │ │ │ ├── QFormChildMixin.js │ │ │ │ ├── QFormChildMixin.json │ │ │ │ └── index.js │ │ │ ├── header/ │ │ │ │ ├── QHeader.js │ │ │ │ ├── QHeader.json │ │ │ │ └── index.js │ │ │ ├── icon/ │ │ │ │ ├── QIcon.js │ │ │ │ ├── QIcon.json │ │ │ │ ├── QIcon.sass │ │ │ │ └── index.js │ │ │ ├── img/ │ │ │ │ ├── QImg.js │ │ │ │ ├── QImg.json │ │ │ │ ├── QImg.sass │ │ │ │ └── index.js │ │ │ ├── infinite-scroll/ │ │ │ │ ├── QInfiniteScroll.js │ │ │ │ ├── QInfiniteScroll.json │ │ │ │ └── index.js │ │ │ ├── inner-loading/ │ │ │ │ ├── QInnerLoading.js │ │ │ │ ├── QInnerLoading.json │ │ │ │ ├── QInnerLoading.sass │ │ │ │ └── index.js │ │ │ ├── input/ │ │ │ │ ├── QInput.js │ │ │ │ ├── QInput.json │ │ │ │ ├── QInput.sass │ │ │ │ ├── index.js │ │ │ │ ├── use-mask.js │ │ │ │ └── use-mask.json │ │ │ ├── intersection/ │ │ │ │ ├── QIntersection.js │ │ │ │ ├── QIntersection.json │ │ │ │ ├── QIntersection.sass │ │ │ │ └── index.js │ │ │ ├── item/ │ │ │ │ ├── QItem.js │ │ │ │ ├── QItem.json │ │ │ │ ├── QItem.sass │ │ │ │ ├── QItemLabel.js │ │ │ │ ├── QItemLabel.json │ │ │ │ ├── QItemSection.js │ │ │ │ ├── QItemSection.json │ │ │ │ ├── QList.js │ │ │ │ ├── QList.json │ │ │ │ ├── QList.test.js │ │ │ │ └── index.js │ │ │ ├── knob/ │ │ │ │ ├── QKnob.js │ │ │ │ ├── QKnob.json │ │ │ │ ├── QKnob.sass │ │ │ │ └── index.js │ │ │ ├── layout/ │ │ │ │ ├── QLayout.js │ │ │ │ ├── QLayout.json │ │ │ │ ├── QLayout.sass │ │ │ │ └── index.js │ │ │ ├── linear-progress/ │ │ │ │ ├── QLinearProgress.js │ │ │ │ ├── QLinearProgress.json │ │ │ │ ├── QLinearProgress.sass │ │ │ │ └── index.js │ │ │ ├── markup-table/ │ │ │ │ ├── QMarkupTable.js │ │ │ │ ├── QMarkupTable.json │ │ │ │ └── index.js │ │ │ ├── menu/ │ │ │ │ ├── QMenu.js │ │ │ │ ├── QMenu.json │ │ │ │ ├── QMenu.sass │ │ │ │ └── index.js │ │ │ ├── no-ssr/ │ │ │ │ ├── QNoSsr.js │ │ │ │ ├── QNoSsr.json │ │ │ │ └── index.js │ │ │ ├── option-group/ │ │ │ │ ├── QOptionGroup.js │ │ │ │ ├── QOptionGroup.json │ │ │ │ ├── QOptionGroup.sass │ │ │ │ └── index.js │ │ │ ├── page/ │ │ │ │ ├── QPage.js │ │ │ │ ├── QPage.json │ │ │ │ ├── QPageContainer.js │ │ │ │ ├── QPageContainer.json │ │ │ │ └── index.js │ │ │ ├── page-scroller/ │ │ │ │ ├── QPageScroller.js │ │ │ │ ├── QPageScroller.json │ │ │ │ └── index.js │ │ │ ├── page-sticky/ │ │ │ │ ├── QPageSticky.js │ │ │ │ ├── QPageSticky.json │ │ │ │ ├── index.js │ │ │ │ └── use-page-sticky.js │ │ │ ├── pagination/ │ │ │ │ ├── QPagination.js │ │ │ │ ├── QPagination.json │ │ │ │ ├── QPagination.sass │ │ │ │ └── index.js │ │ │ ├── parallax/ │ │ │ │ ├── QParallax.js │ │ │ │ ├── QParallax.json │ │ │ │ ├── QParallax.sass │ │ │ │ └── index.js │ │ │ ├── popup-edit/ │ │ │ │ ├── QPopupEdit.js │ │ │ │ ├── QPopupEdit.json │ │ │ │ ├── QPopupEdit.sass │ │ │ │ └── index.js │ │ │ ├── popup-proxy/ │ │ │ │ ├── QPopupProxy.js │ │ │ │ ├── QPopupProxy.json │ │ │ │ └── index.js │ │ │ ├── pull-to-refresh/ │ │ │ │ ├── QPullToRefresh.js │ │ │ │ ├── QPullToRefresh.json │ │ │ │ ├── QPullToRefresh.sass │ │ │ │ └── index.js │ │ │ ├── radio/ │ │ │ │ ├── QRadio.js │ │ │ │ ├── QRadio.json │ │ │ │ ├── QRadio.sass │ │ │ │ └── index.js │ │ │ ├── range/ │ │ │ │ ├── QRange.js │ │ │ │ ├── QRange.json │ │ │ │ └── index.js │ │ │ ├── rating/ │ │ │ │ ├── QRating.js │ │ │ │ ├── QRating.json │ │ │ │ ├── QRating.sass │ │ │ │ └── index.js │ │ │ ├── resize-observer/ │ │ │ │ ├── QResizeObserver.js │ │ │ │ ├── QResizeObserver.json │ │ │ │ └── index.js │ │ │ ├── responsive/ │ │ │ │ ├── QResponsive.js │ │ │ │ ├── QResponsive.json │ │ │ │ ├── QResponsive.sass │ │ │ │ └── index.js │ │ │ ├── scroll-area/ │ │ │ │ ├── QScrollArea.js │ │ │ │ ├── QScrollArea.json │ │ │ │ ├── QScrollArea.sass │ │ │ │ ├── ScrollAreaControls.js │ │ │ │ └── index.js │ │ │ ├── scroll-observer/ │ │ │ │ ├── QScrollObserver.js │ │ │ │ ├── QScrollObserver.json │ │ │ │ └── index.js │ │ │ ├── select/ │ │ │ │ ├── QSelect.js │ │ │ │ ├── QSelect.json │ │ │ │ ├── QSelect.sass │ │ │ │ └── index.js │ │ │ ├── separator/ │ │ │ │ ├── QSeparator.js │ │ │ │ ├── QSeparator.json │ │ │ │ ├── QSeparator.sass │ │ │ │ └── index.js │ │ │ ├── skeleton/ │ │ │ │ ├── QSkeleton.js │ │ │ │ ├── QSkeleton.json │ │ │ │ ├── QSkeleton.sass │ │ │ │ └── index.js │ │ │ ├── slide-item/ │ │ │ │ ├── QSlideItem.js │ │ │ │ ├── QSlideItem.json │ │ │ │ ├── QSlideItem.sass │ │ │ │ └── index.js │ │ │ ├── slide-transition/ │ │ │ │ ├── QSlideTransition.js │ │ │ │ ├── QSlideTransition.json │ │ │ │ └── index.js │ │ │ ├── slider/ │ │ │ │ ├── QSlider.js │ │ │ │ ├── QSlider.json │ │ │ │ ├── QSlider.sass │ │ │ │ ├── index.js │ │ │ │ ├── use-slider.js │ │ │ │ └── use-slider.json │ │ │ ├── space/ │ │ │ │ ├── QSpace.js │ │ │ │ ├── QSpace.json │ │ │ │ ├── QSpace.sass │ │ │ │ ├── QSpace.test.js │ │ │ │ └── index.js │ │ │ ├── spinner/ │ │ │ │ ├── QSpinner.js │ │ │ │ ├── QSpinner.json │ │ │ │ ├── QSpinner.sass │ │ │ │ ├── QSpinner.test.js │ │ │ │ ├── QSpinnerAudio.js │ │ │ │ ├── QSpinnerAudio.json │ │ │ │ ├── QSpinnerAudio.test.js │ │ │ │ ├── QSpinnerBall.js │ │ │ │ ├── QSpinnerBall.json │ │ │ │ ├── QSpinnerBall.test.js │ │ │ │ ├── QSpinnerBars.js │ │ │ │ ├── QSpinnerBars.json │ │ │ │ ├── QSpinnerBars.test.js │ │ │ │ ├── QSpinnerBox.js │ │ │ │ ├── QSpinnerBox.json │ │ │ │ ├── QSpinnerBox.test.js │ │ │ │ ├── QSpinnerClock.js │ │ │ │ ├── QSpinnerClock.json │ │ │ │ ├── QSpinnerClock.test.js │ │ │ │ ├── QSpinnerComment.js │ │ │ │ ├── QSpinnerComment.json │ │ │ │ ├── QSpinnerComment.test.js │ │ │ │ ├── QSpinnerCube.js │ │ │ │ ├── QSpinnerCube.json │ │ │ │ ├── QSpinnerCube.test.js │ │ │ │ ├── QSpinnerDots.js │ │ │ │ ├── QSpinnerDots.json │ │ │ │ ├── QSpinnerDots.test.js │ │ │ │ ├── QSpinnerFacebook.js │ │ │ │ ├── QSpinnerFacebook.json │ │ │ │ ├── QSpinnerFacebook.test.js │ │ │ │ ├── QSpinnerGears.js │ │ │ │ ├── QSpinnerGears.json │ │ │ │ ├── QSpinnerGears.test.js │ │ │ │ ├── QSpinnerGrid.js │ │ │ │ ├── QSpinnerGrid.json │ │ │ │ ├── QSpinnerGrid.test.js │ │ │ │ ├── QSpinnerHearts.js │ │ │ │ ├── QSpinnerHearts.json │ │ │ │ ├── QSpinnerHearts.test.js │ │ │ │ ├── QSpinnerHourglass.js │ │ │ │ ├── QSpinnerHourglass.json │ │ │ │ ├── QSpinnerHourglass.test.js │ │ │ │ ├── QSpinnerInfinity.js │ │ │ │ ├── QSpinnerInfinity.json │ │ │ │ ├── QSpinnerInfinity.test.js │ │ │ │ ├── QSpinnerIos.js │ │ │ │ ├── QSpinnerIos.json │ │ │ │ ├── QSpinnerIos.test.js │ │ │ │ ├── QSpinnerOrbit.js │ │ │ │ ├── QSpinnerOrbit.json │ │ │ │ ├── QSpinnerOrbit.test.js │ │ │ │ ├── QSpinnerOval.js │ │ │ │ ├── QSpinnerOval.json │ │ │ │ ├── QSpinnerOval.test.js │ │ │ │ ├── QSpinnerPie.js │ │ │ │ ├── QSpinnerPie.json │ │ │ │ ├── QSpinnerPie.test.js │ │ │ │ ├── QSpinnerPuff.js │ │ │ │ ├── QSpinnerPuff.json │ │ │ │ ├── QSpinnerPuff.test.js │ │ │ │ ├── QSpinnerRadio.js │ │ │ │ ├── QSpinnerRadio.json │ │ │ │ ├── QSpinnerRadio.test.js │ │ │ │ ├── QSpinnerRings.js │ │ │ │ ├── QSpinnerRings.json │ │ │ │ ├── QSpinnerRings.test.js │ │ │ │ ├── QSpinnerTail.js │ │ │ │ ├── QSpinnerTail.json │ │ │ │ ├── QSpinnerTail.test.js │ │ │ │ ├── index.js │ │ │ │ ├── spinner.json │ │ │ │ ├── use-spinner.js │ │ │ │ └── use-spinner.test.js │ │ │ ├── splitter/ │ │ │ │ ├── QSplitter.js │ │ │ │ ├── QSplitter.json │ │ │ │ ├── QSplitter.sass │ │ │ │ └── index.js │ │ │ ├── stepper/ │ │ │ │ ├── QStep.js │ │ │ │ ├── QStep.json │ │ │ │ ├── QStepper.js │ │ │ │ ├── QStepper.json │ │ │ │ ├── QStepper.sass │ │ │ │ ├── QStepperNavigation.js │ │ │ │ ├── QStepperNavigation.json │ │ │ │ ├── StepHeader.js │ │ │ │ └── index.js │ │ │ ├── tab-panels/ │ │ │ │ ├── QTabPanel.js │ │ │ │ ├── QTabPanel.json │ │ │ │ ├── QTabPanel.sass │ │ │ │ ├── QTabPanels.js │ │ │ │ ├── QTabPanels.json │ │ │ │ └── index.js │ │ │ ├── table/ │ │ │ │ ├── QTable.js │ │ │ │ ├── QTable.json │ │ │ │ ├── QTable.sass │ │ │ │ ├── QTd.js │ │ │ │ ├── QTd.json │ │ │ │ ├── QTh.js │ │ │ │ ├── QTh.json │ │ │ │ ├── QTr.js │ │ │ │ ├── QTr.json │ │ │ │ ├── get-table-middle.js │ │ │ │ ├── index.js │ │ │ │ ├── table-column-selection.js │ │ │ │ ├── table-filter.js │ │ │ │ ├── table-pagination.js │ │ │ │ ├── table-row-expand.js │ │ │ │ ├── table-row-selection.js │ │ │ │ └── table-sort.js │ │ │ ├── tabs/ │ │ │ │ ├── QRouteTab.js │ │ │ │ ├── QRouteTab.json │ │ │ │ ├── QTab.js │ │ │ │ ├── QTab.json │ │ │ │ ├── QTabs.js │ │ │ │ ├── QTabs.json │ │ │ │ ├── QTabs.sass │ │ │ │ ├── index.js │ │ │ │ ├── use-tab.js │ │ │ │ └── use-tab.json │ │ │ ├── time/ │ │ │ │ ├── QTime.js │ │ │ │ ├── QTime.json │ │ │ │ ├── QTime.sass │ │ │ │ └── index.js │ │ │ ├── timeline/ │ │ │ │ ├── QTimeline.js │ │ │ │ ├── QTimeline.json │ │ │ │ ├── QTimeline.sass │ │ │ │ ├── QTimelineEntry.js │ │ │ │ ├── QTimelineEntry.json │ │ │ │ └── index.js │ │ │ ├── toggle/ │ │ │ │ ├── QToggle.js │ │ │ │ ├── QToggle.json │ │ │ │ ├── QToggle.sass │ │ │ │ └── index.js │ │ │ ├── toolbar/ │ │ │ │ ├── QToolbar.js │ │ │ │ ├── QToolbar.json │ │ │ │ ├── QToolbar.sass │ │ │ │ ├── QToolbar.test.js │ │ │ │ ├── QToolbarTitle.js │ │ │ │ ├── QToolbarTitle.json │ │ │ │ ├── QToolbarTitle.test.js │ │ │ │ └── index.js │ │ │ ├── tooltip/ │ │ │ │ ├── QTooltip.js │ │ │ │ ├── QTooltip.json │ │ │ │ ├── QTooltip.sass │ │ │ │ └── index.js │ │ │ ├── tree/ │ │ │ │ ├── QTree.js │ │ │ │ ├── QTree.json │ │ │ │ ├── QTree.sass │ │ │ │ └── index.js │ │ │ ├── uploader/ │ │ │ │ ├── QUploader.js │ │ │ │ ├── QUploader.json │ │ │ │ ├── QUploader.sass │ │ │ │ ├── QUploaderAddTrigger.js │ │ │ │ ├── QUploaderAddTrigger.json │ │ │ │ ├── index.js │ │ │ │ ├── uploader-core.js │ │ │ │ ├── xhr-uploader-plugin.js │ │ │ │ └── xhr-uploader-plugin.json │ │ │ ├── video/ │ │ │ │ ├── QVideo.js │ │ │ │ ├── QVideo.json │ │ │ │ ├── QVideo.sass │ │ │ │ ├── QVideo.test.js │ │ │ │ └── index.js │ │ │ └── virtual-scroll/ │ │ │ ├── QVirtualScroll.js │ │ │ ├── QVirtualScroll.json │ │ │ ├── QVirtualScroll.sass │ │ │ ├── index.js │ │ │ ├── use-virtual-scroll.js │ │ │ └── use-virtual-scroll.json │ │ ├── components.js │ │ ├── composables/ │ │ │ ├── private.use-align/ │ │ │ │ ├── use-align.js │ │ │ │ └── use-align.test.js │ │ │ ├── private.use-anchor/ │ │ │ │ ├── use-anchor-static.json │ │ │ │ ├── use-anchor.js │ │ │ │ └── use-anchor.json │ │ │ ├── private.use-dark/ │ │ │ │ ├── use-dark.js │ │ │ │ └── use-dark.test.js │ │ │ ├── private.use-field/ │ │ │ │ ├── use-field.js │ │ │ │ └── use-field.json │ │ │ ├── private.use-file/ │ │ │ │ ├── use-file-dom-props.js │ │ │ │ ├── use-file.js │ │ │ │ └── use-file.json │ │ │ ├── private.use-fullscreen/ │ │ │ │ ├── use-fullscreen.js │ │ │ │ └── use-fullscreen.json │ │ │ ├── private.use-history/ │ │ │ │ ├── use-history.js │ │ │ │ └── use-history.test.js │ │ │ ├── private.use-key-composition/ │ │ │ │ └── use-key-composition.js │ │ │ ├── private.use-model-toggle/ │ │ │ │ ├── use-model-toggle.js │ │ │ │ └── use-model-toggle.json │ │ │ ├── private.use-panel/ │ │ │ │ ├── use-panel.child.json │ │ │ │ ├── use-panel.js │ │ │ │ ├── use-panel.json │ │ │ │ └── use-panel.sass │ │ │ ├── private.use-portal/ │ │ │ │ ├── use-portal.js │ │ │ │ └── use-portal.json │ │ │ ├── private.use-prevent-scroll/ │ │ │ │ └── use-prevent-scroll.js │ │ │ ├── private.use-ratio/ │ │ │ │ ├── use-ratio.js │ │ │ │ ├── use-ratio.json │ │ │ │ └── use-ratio.test.js │ │ │ ├── private.use-refocus-target/ │ │ │ │ └── use-refocus-target.js │ │ │ ├── private.use-router-link/ │ │ │ │ ├── use-router-link.js │ │ │ │ └── use-router-link.json │ │ │ ├── private.use-scroll-target/ │ │ │ │ └── use-scroll-target.js │ │ │ ├── private.use-size/ │ │ │ │ ├── use-size.js │ │ │ │ ├── use-size.json │ │ │ │ └── use-size.test.js │ │ │ ├── private.use-transition/ │ │ │ │ ├── use-transition.js │ │ │ │ ├── use-transition.json │ │ │ │ └── use-transition.test.js │ │ │ ├── private.use-validate/ │ │ │ │ ├── use-validate.js │ │ │ │ └── use-validate.json │ │ │ ├── use-dialog-plugin-component/ │ │ │ │ └── use-dialog-plugin-component.js │ │ │ ├── use-form/ │ │ │ │ ├── private.use-form.js │ │ │ │ ├── private.use-form.json │ │ │ │ ├── private.use-form.test.js │ │ │ │ └── use-form-child.js │ │ │ ├── use-hydration/ │ │ │ │ ├── use-hydration.js │ │ │ │ └── use-hydration.test.js │ │ │ ├── use-id/ │ │ │ │ ├── use-id.js │ │ │ │ └── use-id.test.js │ │ │ ├── use-interval/ │ │ │ │ ├── use-interval.js │ │ │ │ └── use-interval.test.js │ │ │ ├── use-meta/ │ │ │ │ └── use-meta.js │ │ │ ├── use-quasar/ │ │ │ │ ├── use-quasar.js │ │ │ │ └── use-quasar.test.js │ │ │ ├── use-render-cache/ │ │ │ │ ├── use-render-cache.js │ │ │ │ └── use-render-cache.test.js │ │ │ ├── use-split-attrs/ │ │ │ │ ├── use-split-attrs.js │ │ │ │ └── use-split-attrs.test.js │ │ │ ├── use-tick/ │ │ │ │ ├── use-tick.js │ │ │ │ └── use-tick.test.js │ │ │ └── use-timeout/ │ │ │ ├── use-timeout.js │ │ │ └── use-timeout.test.js │ │ ├── composables.js │ │ ├── css/ │ │ │ ├── core/ │ │ │ │ ├── animations.sass │ │ │ │ ├── colors.sass │ │ │ │ ├── dark.sass │ │ │ │ ├── elevation.sass │ │ │ │ ├── flex.sass │ │ │ │ ├── helpers.sass │ │ │ │ ├── mouse.sass │ │ │ │ ├── orientation.sass │ │ │ │ ├── positioning.sass │ │ │ │ ├── size.sass │ │ │ │ ├── touch.sass │ │ │ │ ├── transitions.sass │ │ │ │ ├── typography.sass │ │ │ │ └── visibility.sass │ │ │ ├── flex-addon.sass │ │ │ ├── helpers/ │ │ │ │ ├── math.sass │ │ │ │ └── string.sass │ │ │ ├── index.sass │ │ │ ├── normalize.sass │ │ │ └── variables.sass │ │ ├── directives/ │ │ │ ├── close-popup/ │ │ │ │ ├── ClosePopup.js │ │ │ │ └── ClosePopup.json │ │ │ ├── intersection/ │ │ │ │ ├── Intersection.js │ │ │ │ └── Intersection.json │ │ │ ├── morph/ │ │ │ │ ├── Morph.js │ │ │ │ ├── Morph.json │ │ │ │ └── Morph.sass │ │ │ ├── mutation/ │ │ │ │ ├── Mutation.js │ │ │ │ └── Mutation.json │ │ │ ├── ripple/ │ │ │ │ ├── Ripple.js │ │ │ │ ├── Ripple.json │ │ │ │ ├── Ripple.sass │ │ │ │ └── Ripple.test.js │ │ │ ├── scroll/ │ │ │ │ ├── Scroll.js │ │ │ │ └── Scroll.json │ │ │ ├── scroll-fire/ │ │ │ │ ├── ScrollFire.js │ │ │ │ └── ScrollFire.json │ │ │ ├── touch-hold/ │ │ │ │ ├── TouchHold.js │ │ │ │ └── TouchHold.json │ │ │ ├── touch-pan/ │ │ │ │ ├── TouchPan.js │ │ │ │ └── TouchPan.json │ │ │ ├── touch-repeat/ │ │ │ │ ├── TouchRepeat.js │ │ │ │ └── TouchRepeat.json │ │ │ └── touch-swipe/ │ │ │ ├── TouchSwipe.js │ │ │ └── TouchSwipe.json │ │ ├── directives.js │ │ ├── flags.dev.js │ │ ├── index.dev.js │ │ ├── index.ssr.js │ │ ├── index.umd.js │ │ ├── install-quasar.js │ │ ├── plugins/ │ │ │ ├── addressbar/ │ │ │ │ ├── AddressbarColor.js │ │ │ │ ├── AddressbarColor.json │ │ │ │ └── AddressbarColor.test.js │ │ │ ├── app-fullscreen/ │ │ │ │ ├── AppFullscreen.js │ │ │ │ ├── AppFullscreen.json │ │ │ │ ├── AppFullscreen.test.js │ │ │ │ └── test/ │ │ │ │ └── mock-fullscreen.js │ │ │ ├── app-visibility/ │ │ │ │ ├── AppVisibility.js │ │ │ │ ├── AppVisibility.json │ │ │ │ └── AppVisibility.test.js │ │ │ ├── bottom-sheet/ │ │ │ │ ├── BottomSheet.js │ │ │ │ ├── BottomSheet.json │ │ │ │ └── component/ │ │ │ │ ├── BottomSheetComponent.js │ │ │ │ └── BottomSheetComponent.sass │ │ │ ├── cookies/ │ │ │ │ ├── Cookies.js │ │ │ │ └── Cookies.json │ │ │ ├── dark/ │ │ │ │ ├── Dark.js │ │ │ │ ├── Dark.json │ │ │ │ └── Dark.test.js │ │ │ ├── dialog/ │ │ │ │ ├── Dialog.js │ │ │ │ ├── Dialog.json │ │ │ │ └── component/ │ │ │ │ ├── DialogPluginComponent.js │ │ │ │ └── DialogPluginComponent.sass │ │ │ ├── icon-set/ │ │ │ │ ├── IconSet.js │ │ │ │ ├── IconSet.json │ │ │ │ └── IconSet.test.js │ │ │ ├── lang/ │ │ │ │ ├── Lang.js │ │ │ │ ├── Lang.json │ │ │ │ └── Lang.test.js │ │ │ ├── loading/ │ │ │ │ ├── Loading.js │ │ │ │ ├── Loading.json │ │ │ │ └── Loading.sass │ │ │ ├── loading-bar/ │ │ │ │ ├── LoadingBar.js │ │ │ │ └── LoadingBar.json │ │ │ ├── meta/ │ │ │ │ ├── Meta.js │ │ │ │ └── Meta.json │ │ │ ├── notify/ │ │ │ │ ├── Notify.js │ │ │ │ ├── Notify.json │ │ │ │ └── Notify.sass │ │ │ ├── platform/ │ │ │ │ ├── Platform.js │ │ │ │ ├── Platform.json │ │ │ │ └── Platform.test.js │ │ │ ├── private.body/ │ │ │ │ ├── Body.js │ │ │ │ └── Body.test.js │ │ │ ├── private.history/ │ │ │ │ ├── History.js │ │ │ │ └── History.test.js │ │ │ ├── screen/ │ │ │ │ ├── Screen.js │ │ │ │ ├── Screen.json │ │ │ │ └── Screen.test.js │ │ │ └── storage/ │ │ │ ├── LocalStorage.js │ │ │ ├── LocalStorage.json │ │ │ ├── LocalStorage.test.js │ │ │ ├── SessionStorage.js │ │ │ ├── SessionStorage.json │ │ │ ├── SessionStorage.test.js │ │ │ └── engine/ │ │ │ ├── web-storage.js │ │ │ ├── web-storage.json │ │ │ └── web-storage.test.js │ │ ├── plugins.js │ │ ├── utils/ │ │ │ ├── EventBus/ │ │ │ │ ├── EventBus.js │ │ │ │ └── EventBus.test.js │ │ │ ├── clone/ │ │ │ │ ├── clone.js │ │ │ │ └── clone.test.js │ │ │ ├── colors/ │ │ │ │ ├── colors.js │ │ │ │ └── colors.test.js │ │ │ ├── copy-to-clipboard/ │ │ │ │ └── copy-to-clipboard.js │ │ │ ├── create-meta-mixin/ │ │ │ │ └── create-meta-mixin.js │ │ │ ├── create-uploader-component/ │ │ │ │ └── create-uploader-component.js │ │ │ ├── css-var/ │ │ │ │ ├── get-css-var.js │ │ │ │ ├── get-css-var.test.js │ │ │ │ ├── set-css-var.js │ │ │ │ └── set-css-var.test.js │ │ │ ├── date/ │ │ │ │ ├── date.js │ │ │ │ └── private.persian.js │ │ │ ├── debounce/ │ │ │ │ ├── debounce.js │ │ │ │ └── debounce.test.js │ │ │ ├── dom/ │ │ │ │ ├── dom.js │ │ │ │ └── dom.test.js │ │ │ ├── event/ │ │ │ │ └── event.js │ │ │ ├── export-file/ │ │ │ │ └── export-file.js │ │ │ ├── extend/ │ │ │ │ ├── extend.js │ │ │ │ └── extend.test.js │ │ │ ├── format/ │ │ │ │ ├── format.js │ │ │ │ └── format.test.js │ │ │ ├── frame-debounce/ │ │ │ │ ├── frame-debounce.js │ │ │ │ └── frame-debounce.test.js │ │ │ ├── is/ │ │ │ │ ├── is.js │ │ │ │ └── is.test.js │ │ │ ├── morph/ │ │ │ │ └── morph.js │ │ │ ├── open-url/ │ │ │ │ └── open-url.js │ │ │ ├── patterns/ │ │ │ │ ├── patterns.js │ │ │ │ └── patterns.test.js │ │ │ ├── private.click-outside/ │ │ │ │ └── click-outside.js │ │ │ ├── private.config/ │ │ │ │ ├── instance-config.js │ │ │ │ ├── instance-config.test.js │ │ │ │ ├── nodes.js │ │ │ │ └── nodes.test.js │ │ │ ├── private.create/ │ │ │ │ ├── create.js │ │ │ │ └── create.test.js │ │ │ ├── private.dialog/ │ │ │ │ ├── create-dialog.js │ │ │ │ └── create-dialog.json │ │ │ ├── private.focus/ │ │ │ │ ├── focus-manager.js │ │ │ │ ├── focus-manager.test.js │ │ │ │ ├── focusout.js │ │ │ │ └── focusout.test.js │ │ │ ├── private.get-emits-object/ │ │ │ │ ├── get-emits-object.js │ │ │ │ └── get-emits-object.test.js │ │ │ ├── private.inject-obj-prop/ │ │ │ │ ├── inject-obj-prop.js │ │ │ │ └── inject-obj-prop.test.js │ │ │ ├── private.keyboard/ │ │ │ │ ├── escape-key.js │ │ │ │ ├── escape-key.test.js │ │ │ │ └── key-composition.js │ │ │ ├── private.noop-ssr-directive-transform/ │ │ │ │ ├── noop-ssr-directive-transform.js │ │ │ │ └── noop-ssr-directive-transform.test.js │ │ │ ├── private.option-sizes/ │ │ │ │ └── option-sizes.js │ │ │ ├── private.portal/ │ │ │ │ └── portal.js │ │ │ ├── private.position-engine/ │ │ │ │ └── position-engine.js │ │ │ ├── private.render/ │ │ │ │ ├── render.js │ │ │ │ └── render.test.js │ │ │ ├── private.rtl/ │ │ │ │ ├── rtl.js │ │ │ │ └── rtl.test.js │ │ │ ├── private.selection/ │ │ │ │ ├── selection.js │ │ │ │ └── selection.test.js │ │ │ ├── private.sort/ │ │ │ │ ├── sort.js │ │ │ │ └── sort.test.js │ │ │ ├── private.symbols/ │ │ │ │ └── symbols.js │ │ │ ├── private.touch/ │ │ │ │ ├── touch.js │ │ │ │ └── touch.test.js │ │ │ ├── private.vm/ │ │ │ │ ├── vm.js │ │ │ │ └── vm.test.js │ │ │ ├── run-sequential-promises/ │ │ │ │ └── run-sequential-promises.js │ │ │ ├── scroll/ │ │ │ │ ├── prevent-scroll.js │ │ │ │ └── scroll.js │ │ │ ├── throttle/ │ │ │ │ ├── throttle.js │ │ │ │ └── throttle.test.js │ │ │ └── uid/ │ │ │ ├── uid.js │ │ │ └── uid.test.js │ │ ├── utils.js │ │ └── vue-plugin.js │ ├── testing/ │ │ ├── README.md │ │ ├── package.json │ │ ├── runtime/ │ │ │ └── router.js │ │ ├── specs/ │ │ │ ├── astParser.js │ │ │ ├── cmd.createTestFile.js │ │ │ ├── cmd.dryRun.js │ │ │ ├── cmd.generateSection.js │ │ │ ├── cmd.validateTestFile.js │ │ │ ├── ctx.js │ │ │ ├── generators/ │ │ │ │ ├── generator.component.js │ │ │ │ ├── generator.composable.js │ │ │ │ ├── generator.directive.js │ │ │ │ ├── generator.generic.js │ │ │ │ ├── generator.plugin.js │ │ │ │ └── map.js │ │ │ ├── ignoredTestFiles.conf │ │ │ ├── ignoredTestFiles.js │ │ │ ├── readAssociatedJsonFile.js │ │ │ ├── script.js │ │ │ ├── specs.utils.js │ │ │ ├── target.js │ │ │ └── testFile.js │ │ ├── vitest.config.js │ │ └── vitest.setup.js │ ├── tsconfig.json │ ├── types/ │ │ ├── api/ │ │ │ ├── color.d.ts │ │ │ ├── cookies.d.ts │ │ │ ├── dialog.d.ts │ │ │ ├── qeditor.d.ts │ │ │ ├── qfile.d.ts │ │ │ ├── qform.d.ts │ │ │ ├── qinput.d.ts │ │ │ ├── qloading.d.ts │ │ │ ├── qloadingbar.d.ts │ │ │ ├── qnotify.d.ts │ │ │ ├── qpopupproxy.d.ts │ │ │ ├── qselect.d.ts │ │ │ ├── qtable.d.ts │ │ │ ├── qtree.d.ts │ │ │ ├── quploader.d.ts │ │ │ ├── slider.d.ts │ │ │ ├── touchswipe.d.ts │ │ │ ├── validation.d.ts │ │ │ ├── vue-prop-types.d.ts │ │ │ └── web-storage.d.ts │ │ ├── api.d.ts │ │ ├── composables.d.ts │ │ ├── config.d.ts │ │ ├── feature-flag.d.ts │ │ ├── globals.d.ts │ │ ├── icon-set.d.ts │ │ ├── lang.d.ts │ │ ├── meta.d.ts │ │ ├── plugin.d.ts │ │ ├── shim-icon-set.d.ts │ │ ├── shim-lang.d.ts │ │ ├── ts-helpers.d.ts │ │ ├── tsconfig.json │ │ ├── utils/ │ │ │ ├── colors.d.ts │ │ │ ├── date.d.ts │ │ │ ├── dom.d.ts │ │ │ ├── event.d.ts │ │ │ ├── format.d.ts │ │ │ ├── is.d.ts │ │ │ ├── patterns.d.ts │ │ │ ├── run-sequential-promises.d.ts │ │ │ └── scroll.d.ts │ │ └── utils.d.ts │ └── wrappers/ │ ├── index.cjs │ └── index.js ├── utils/ │ ├── babel-preset-app/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── index.js │ │ ├── package.json │ │ └── polyfills.js │ ├── render-ssr-error/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── build/ │ │ │ └── index.js │ │ ├── compiled-assets/ │ │ │ ├── after-injection │ │ │ └── before-injection │ │ ├── package.json │ │ ├── src/ │ │ │ ├── env.js │ │ │ ├── error-details.js │ │ │ ├── index.js │ │ │ └── stack.js │ │ └── src-ui/ │ │ ├── README.md │ │ ├── build/ │ │ │ └── vite.plugin.single-file.js │ │ ├── index.html │ │ ├── jsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ ├── data.js │ │ │ │ └── store.js │ │ │ ├── components/ │ │ │ │ ├── AppCode.vue │ │ │ │ ├── AppEnvironment.vue │ │ │ │ ├── AppHeader.vue │ │ │ │ └── AppStack.vue │ │ │ ├── main.js │ │ │ └── quasar.variables.sass │ │ └── vite.config.js │ ├── ssl-certificate/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ └── index.js │ └── ssr-helpers/ │ ├── README.md │ ├── create-renderer.js │ ├── lib/ │ │ └── create-bundle.js │ └── package.json ├── vite-plugin/ │ ├── LICENSE │ ├── README.md │ ├── build/ │ │ ├── clean.js │ │ └── rolldown.config.js │ ├── index.d.ts │ ├── package.json │ ├── playground/ │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── components/ │ │ │ │ ├── AssetTransform.vue │ │ │ │ ├── JsPug.vue │ │ │ │ ├── JsScript.vue │ │ │ │ ├── JsScriptSetup.vue │ │ │ │ ├── SassTransform.vue │ │ │ │ ├── TsScript.vue │ │ │ │ ├── TsScriptSetup.vue │ │ │ │ ├── asset-transform/ │ │ │ │ │ ├── ChatMessageWithAvatar.vue │ │ │ │ │ ├── ImgWithPlaceholderSrc.vue │ │ │ │ │ ├── ImgWithSrc.vue │ │ │ │ │ └── NativeImage.vue │ │ │ │ ├── js-pug/ │ │ │ │ │ ├── AliasedImports.vue │ │ │ │ │ ├── BasicTest.vue │ │ │ │ │ ├── CustomWithAliasedImports.vue │ │ │ │ │ ├── CustomWithImports.vue │ │ │ │ │ ├── ExtendBtn.vue │ │ │ │ │ ├── ImportsTest.vue │ │ │ │ │ ├── MixedCase.vue │ │ │ │ │ ├── MixedCaseWithDuplicates.vue │ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue │ │ │ │ │ └── WithDirective.vue │ │ │ │ ├── js-script/ │ │ │ │ │ ├── AliasedImports.vue │ │ │ │ │ ├── BasicTest.vue │ │ │ │ │ ├── CustomComp.vue │ │ │ │ │ ├── CustomWithAliasedImports.vue │ │ │ │ │ ├── CustomWithImports.vue │ │ │ │ │ ├── ExtendBtn.vue │ │ │ │ │ ├── ImportsTest.vue │ │ │ │ │ ├── MixedCase.vue │ │ │ │ │ ├── MixedCaseWithDuplicates.vue │ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithImports.vue │ │ │ │ │ ├── WithDirective.vue │ │ │ │ │ └── custom-component.js │ │ │ │ ├── js-script-setup/ │ │ │ │ │ ├── AliasedImports.vue │ │ │ │ │ ├── BasicTest.vue │ │ │ │ │ ├── CustomComp.vue │ │ │ │ │ ├── CustomWithAliasedImports.vue │ │ │ │ │ ├── CustomWithImports.vue │ │ │ │ │ ├── ExtendBtn.vue │ │ │ │ │ ├── ImportsTest.vue │ │ │ │ │ ├── MixedCase.vue │ │ │ │ │ ├── MixedCaseWithDuplicates.vue │ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithImports.vue │ │ │ │ │ ├── WithDirective.vue │ │ │ │ │ └── custom-component.js │ │ │ │ ├── sass-transform/ │ │ │ │ │ ├── ColorOverride.vue │ │ │ │ │ ├── ColorSassUse.vue │ │ │ │ │ ├── ColorScssUse.vue │ │ │ │ │ └── PaddingTest.vue │ │ │ │ ├── ts-script/ │ │ │ │ │ ├── AliasedImports.vue │ │ │ │ │ ├── BasicTest.vue │ │ │ │ │ ├── CustomComp.vue │ │ │ │ │ ├── CustomWithAliasedImports.vue │ │ │ │ │ ├── CustomWithImports.vue │ │ │ │ │ ├── ExtendBtn.vue │ │ │ │ │ ├── ImportsTest.vue │ │ │ │ │ ├── MixedCase.vue │ │ │ │ │ ├── MixedCaseWithDuplicates.vue │ │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithAliasedImports.vue │ │ │ │ │ ├── OnlyCustomWithImports.vue │ │ │ │ │ ├── WithDirective.vue │ │ │ │ │ └── custom-component.ts │ │ │ │ └── ts-script-setup/ │ │ │ │ ├── AliasedImports.vue │ │ │ │ ├── BasicTest.vue │ │ │ │ ├── CustomComp.vue │ │ │ │ ├── CustomWithAliasedImports.vue │ │ │ │ ├── CustomWithImports.vue │ │ │ │ ├── ExtendBtn.vue │ │ │ │ ├── ImportsTest.vue │ │ │ │ ├── MixedCase.vue │ │ │ │ ├── MixedCaseWithDuplicates.vue │ │ │ │ ├── MixedCaseWithDuplicatesAndAliasedImports.vue │ │ │ │ ├── OnlyCustomWithAliasedImports.vue │ │ │ │ ├── OnlyCustomWithImports.vue │ │ │ │ ├── WithDirective.vue │ │ │ │ └── custom-component.ts │ │ │ ├── main.js │ │ │ └── quasar-variables.sass │ │ └── vite.config.js │ ├── src/ │ │ ├── index.js │ │ ├── js-transform.js │ │ ├── plugin.js │ │ ├── quasar-path.js │ │ ├── query.js │ │ ├── scss-transform.js │ │ ├── vite-config.js │ │ └── vue-transform.js │ └── testing/ │ ├── runtime/ │ │ ├── tests/ │ │ │ ├── asset-transform.test.js │ │ │ ├── js-transform.test.js │ │ │ ├── sass-transform.test.js │ │ │ ├── ts-transform.test.ts │ │ │ ├── vue-pug-transform.test.js │ │ │ └── vue-transform.test.js │ │ ├── vitest.config.js │ │ └── vitest.setup.js │ └── usage/ │ ├── tests/ │ │ └── usage.test.js │ └── vitest.config.js └── vitest.workspace.js
Showing preview only (234K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2769 symbols across 814 files)
FILE: app-vite/exports/bex/background.js
function interceptRequests (line 3) | function interceptRequests(devServerPort) {
function connectToDevServer (line 43) | function connectToDevServer(devServerPort, wsToken) {
function createBridge (line 141) | function createBridge({ debug } = {}) {
FILE: app-vite/exports/bex/content.js
function createBridge (line 58) | function createBridge({ debug } = {}) {
FILE: app-vite/exports/bex/private/bex-bridge.js
function getRandomId (line 9) | function getRandomId(max) {
class BexBridge (line 21) | class BexBridge {
method constructor (line 49) | constructor({ type, name = '', debug }) {
method connectToBackground (line 116) | connectToBackground() {
method disconnectFromBackground (line 179) | disconnectFromBackground() {
method on (line 200) | on(event, callback) {
method once (line 220) | once(event, callback) {
method off (line 240) | off(event, callback) {
method send (line 289) | async send({ event, to, payload } = {}) {
method setDebug (line 346) | setDebug(value) {
method log (line 350) | log(...args) {
method warn (line 365) | warn(...args) {
method #onPortChange (line 385) | #onPortChange(reason) {
method #triggerMessageEvent (line 406) | async #triggerMessageEvent(message) {
method #cleanupPort (line 454) | #cleanupPort(portName) {
method #onPacket (line 472) | #onPacket(packet) {
method #sendPacket (line 590) | #sendPacket(packet) {
method #sendMessage (line 630) | #sendMessage({
method #onMessage (line 690) | #onMessage(message) {
FILE: app-vite/exports/eslint/eslint.cjs
method recommended (line 13) | recommended() {
FILE: app-vite/exports/eslint/eslint.js
method recommended (line 13) | recommended() {
FILE: app-vite/exports/testing/testing.js
function getTestingConfig (line 14) | async function getTestingConfig(ctxParams = {}) {
FILE: app-vite/lib/app-builder.js
class AppBuilder (line 7) | class AppBuilder extends AppTool {
method constructor (line 10) | constructor({ argv, quasarConf }) {
method readFile (line 15) | readFile(filename) {
method writeFile (line 23) | writeFile(filename, content) {
method copyFiles (line 32) | copyFiles(patterns, targetFolder = this.quasarConf.build.distDir) {
method moveFile (line 60) | moveFile(source, destination) {
method removeFile (line 72) | removeFile(filename) {
method printSummary (line 80) | printSummary(folder, showGzipped) {
FILE: app-vite/lib/app-devserver.js
function getConfSnapshot (line 7) | function getConfSnapshot(extractFn, quasarConf, diffExtractFnMap) {
class AppDevserver (line 13) | class AppDevserver extends AppTool {
method constructor (line 20) | constructor(opts) {
method run (line 85) | run(quasarConf, __isRetry) {
method #queue (line 107) | #queue(runId, quasarConf, fn) {
method registerDiff (line 119) | registerDiff(name, extractFn) {
method #diff (line 128) | #diff(name, quasarConf) {
method clearWatcherList (line 159) | clearWatcherList([...watcherList], clearFn) {
method printBanner (line 164) | printBanner(quasarConf) {
FILE: app-vite/lib/app-extension/AppExtensionInstance.js
function promptOverwrite (line 16) | async function promptOverwrite({ targetPath, options, ctx }) {
function renderFile (line 38) | async function renderFile(
function renderFolders (line 66) | async function renderFolders({ source, rawCopy, scope }, ctx) {
class AppExtensionInstance (line 111) | class AppExtensionInstance {
method constructor (line 121) | constructor({ extName, ctx, appExtJson }) {
method isInstalled (line 145) | get isInstalled() {
method #loadPackageInfo (line 153) | #loadPackageInfo() {
method install (line 175) | async install(skipPkgInstall) {
method uninstall (line 216) | async uninstall(skipPkgUninstall) {
method run (line 254) | async run() {
method #stripVersion (line 277) | #stripVersion(packageFullName) {
method getPrompts (line 282) | getPrompts() {
method #getScriptPrompts (line 286) | async #getScriptPrompts() {
method #installPackage (line 305) | async #installPackage() {
method #uninstallPackage (line 310) | async #uninstallPackage() {
method #getScriptPath (line 330) | #getScriptPath(scriptName) {
method #getScript (line 345) | async #getScript(scriptName, fatalError) {
method #runInstallScript (line 386) | async #runInstallScript(prompts) {
method #runUninstallScript (line 426) | async #runUninstallScript(prompts) {
FILE: app-vite/lib/app-extension/api-classes/BaseAPI.js
class BaseAPI (line 4) | class BaseAPI {
method constructor (line 15) | constructor({ ctx, extId }) {
method hasTypescript (line 27) | hasTypescript() {
method getStorePackageName (line 37) | getStorePackageName() {
method getNodePackagerName (line 48) | async getNodePackagerName() {
FILE: app-vite/lib/app-extension/api-classes/IndexAPI.js
class IndexAPI (line 12) | class IndexAPI extends BaseAPI {
method constructor (line 15) | constructor(opts, appExtJson) {
method getPersistentConf (line 28) | getPersistentConf() {
method setPersistentConf (line 38) | setPersistentConf(cfg) {
method mergePersistentConf (line 49) | mergePersistentConf(cfg = {}) {
method compatibleWith (line 68) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 95) | hasPackage(packageName, semverCondition) {
method hasExtension (line 114) | hasExtension(extId) {
method getPackageVersion (line 124) | getPackageVersion(packageName) {
method extendQuasarConf (line 135) | extendQuasarConf(fn) {
method extendViteConf (line 145) | extendViteConf(fn) {
method extendBexScriptsConf (line 155) | extendBexScriptsConf(fn) {
method extendElectronMainConf (line 165) | extendElectronMainConf(fn) {
method extendElectronPreloadConf (line 175) | extendElectronPreloadConf(fn) {
method extendPWACustomSWConf (line 186) | extendPWACustomSWConf(fn) {
method extendSSRWebserverConf (line 196) | extendSSRWebserverConf(fn) {
method registerCommand (line 208) | registerCommand(commandName, fn) {
method registerDescribeApi (line 219) | registerDescribeApi(name, relativePath) {
method beforeDev (line 234) | beforeDev(fn) {
method afterDev (line 246) | afterDev(fn) {
method beforeBuild (line 257) | beforeBuild(fn) {
method afterBuild (line 269) | afterBuild(fn) {
method onPublish (line 284) | onPublish(fn) {
method __getHooks (line 313) | __getHooks(appExtJson) {
method #addHook (line 320) | #addHook(name, fn) {
FILE: app-vite/lib/app-extension/api-classes/InstallAPI.js
class InstallAPI (line 15) | class InstallAPI extends BaseAPI {
method constructor (line 18) | constructor(opts, appExtJson) {
method getPersistentConf (line 31) | getPersistentConf() {
method setPersistentConf (line 41) | setPersistentConf(cfg) {
method mergePersistentConf (line 52) | mergePersistentConf(cfg = {}) {
method compatibleWith (line 71) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 98) | hasPackage(packageName, semverCondition) {
method hasExtension (line 117) | hasExtension(extId) {
method getPackageVersion (line 127) | getPackageVersion(packageName) {
method extendPackageJson (line 138) | extendPackageJson(extPkg) {
method extendJsonFile (line 201) | extendJsonFile(file, newData) {
method render (line 249) | render(templatePath, scope) {
method renderFile (line 284) | renderFile(relativeSourcePath, relativeTargetPath, scope) {
method onExitLog (line 319) | onExitLog(msg) {
method __getNodeModuleNeedsUpdate (line 330) | __getNodeModuleNeedsUpdate(appExtJson) {
method __getHooks (line 343) | __getHooks(appExtJson) {
FILE: app-vite/lib/app-extension/api-classes/PromptsAPI.js
class PromptsAPI (line 10) | class PromptsAPI extends BaseAPI {
method constructor (line 11) | constructor(opts, appExtJson) {
method compatibleWith (line 30) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 57) | hasPackage(packageName, semverCondition) {
method hasExtension (line 76) | hasExtension(extId) {
method getPackageVersion (line 86) | getPackageVersion(packageName) {
FILE: app-vite/lib/app-extension/api-classes/UninstallAPI.js
class UninstallAPI (line 10) | class UninstallAPI extends BaseAPI {
method constructor (line 13) | constructor(opts, appExtJson) {
method getPersistentConf (line 26) | getPersistentConf() {
method hasPackage (line 41) | hasPackage(packageName, semverCondition) {
method hasExtension (line 59) | hasExtension(extId) {
method getPackageVersion (line 69) | getPackageVersion(packageName) {
method removePath (line 86) | removePath(__path) {
method onExitLog (line 95) | onExitLog(msg) {
method __getHooks (line 109) | __getHooks(appExtJson) {
FILE: app-vite/lib/app-extension/create-app-ext.js
function readJson (line 8) | function readJson(file) {
function getAppExtJson (line 19) | function getAppExtJson({ file, json, onListUpdate }) {
function createAppExt (line 73) | function createAppExt(ctx) {
FILE: app-vite/lib/app-tool.js
class AppTool (line 12) | class AppTool {
method constructor (line 16) | constructor({ argv, ctx }) {
method buildWithVite (line 21) | async buildWithVite(threadName, viteConfig) {
method watchWithRolldown (line 34) | watchWithRolldown(threadName, rolldownConfig, onRebuildSuccess) {
method buildWithRolldown (line 69) | async buildWithRolldown(threadName, rolldownConfig) {
method cleanArtifacts (line 82) | cleanArtifacts(dir) {
FILE: app-vite/lib/cache/create-cache-proxy.js
function createCacheProxy (line 6) | function createCacheProxy(ctx) {
FILE: app-vite/lib/cache/module.animations.js
function createInstance (line 3) | async function createInstance({ appPaths }) {
FILE: app-vite/lib/cache/module.capCli.js
function createInstance (line 4) | function createInstance({ appPaths: { capacitorDir } }) {
FILE: app-vite/lib/cache/module.cssVariables.js
function createInstance (line 3) | function createInstance({ appPaths }) {
FILE: app-vite/lib/cache/module.electron.js
function isValidName (line 16) | function isValidName(bundlerName) {
function installBundler (line 20) | function installBundler(bundlerName, nodePackager, appPaths) {
function hasPackage (line 30) | function hasPackage(pkgName, modePkg) {
function createInstance (line 37) | async function createInstance({
FILE: app-vite/lib/cache/module.hasTypescript.js
function createInstance (line 3) | function createInstance({ appPaths }) {
FILE: app-vite/lib/cache/module.nodePackager.js
function run (line 8) | function run({ name, params, cwd, onFail, env = 'development' }) {
function getMajorVersion (line 17) | function getMajorVersion(name) {
class PackageManager (line 31) | class PackageManager {
method constructor (line 34) | constructor(appDir) {
method getInstallParams (line 44) | getInstallParams(/* env */) {
method getInstallPackageParams (line 48) | getInstallPackageParams(/* names, isDev */) {
method getUninstallPackageParams (line 52) | getUninstallPackageParams(/* names */) {
method isInstalled (line 63) | isInstalled() {
method install (line 74) | install({
method installPackage (line 94) | installPackage(
method uninstallPackage (line 110) | uninstallPackage(name, { cwd = this.appDir, displayName = name } = {}) {
class Npm (line 123) | class Npm extends PackageManager {
method getInstallParams (line 127) | getInstallParams(env) {
method getInstallPackageParams (line 137) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 141) | getUninstallPackageParams(names) {
class Yarn (line 146) | class Yarn extends PackageManager {
method getInstallParams (line 150) | getInstallParams(env) {
method getInstallPackageParams (line 160) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 164) | getUninstallPackageParams(names) {
class Pnpm (line 169) | class Pnpm extends PackageManager {
method getInstallParams (line 173) | getInstallParams(env) {
method getInstallPackageParams (line 177) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 181) | getUninstallPackageParams(names) {
class Bun (line 186) | class Bun extends PackageManager {
method getInstallParams (line 190) | getInstallParams(env) {
method getInstallPackageParams (line 194) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 198) | getUninstallPackageParams(names) {
function getProjectPackageManager (line 206) | function getProjectPackageManager(packageManagersList, dir) {
function createInstance (line 220) | function createInstance({ appPaths }) {
FILE: app-vite/lib/cache/module.storeProvider.js
function createInstance (line 5) | function createInstance({ appPaths: { appDir }, cacheProxy }) {
FILE: app-vite/lib/cache/module.workboxBuild.js
function createInstance (line 3) | async function createInstance({ appPaths }) {
FILE: app-vite/lib/cmd/describe.js
function getEventParams (line 98) | function getEventParams(event) {
function getMethodParams (line 107) | function getMethodParams(method, noRequired) {
function getMethodReturnValue (line 135) | function getMethodReturnValue(method) {
function getStringType (line 139) | function getStringType(type) {
function printProp (line 143) | function printProp(prop, propName, indentLevel) {
function printProperties (line 209) | function printProperties({ props }) {
function printSlots (line 237) | function printSlots({ slots }) {
function printEvents (line 265) | function printEvents({ events }) {
function printMethods (line 303) | function printMethods({ methods }) {
function printComputedProps (line 348) | function printComputedProps({ computedProps }) {
function printValue (line 376) | function printValue({ value }) {
function printArg (line 387) | function printArg({ arg }) {
function printModifiers (line 398) | function printModifiers({ modifiers }) {
function printInjection (line 427) | function printInjection({ injection }) {
function printQuasarConfOptions (line 437) | function printQuasarConfOptions({ quasarConfOptions }) {
function describe (line 469) | function describe(api) {
function run (line 504) | async function run() {
function listElements (line 542) | async function listElements() {
FILE: app-vite/lib/cmd/dev.js
function startVueDevtools (line 89) | async function startVueDevtools(ctx, devtoolsPort) {
FILE: app-vite/lib/cmd/ext.js
function showHelp (line 10) | function showHelp() {
FILE: app-vite/lib/cmd/info.js
function getSpawnOutput (line 37) | function getSpawnOutput(command) {
function safePkgInfo (line 48) | function safePkgInfo(pkg, dir) {
function print (line 62) | function print(m) {
FILE: app-vite/lib/cmd/mode.js
function showHelp (line 13) | function showHelp() {
function run (line 51) | async function run() {
function displayModes (line 115) | function displayModes() {
FILE: app-vite/lib/cmd/new.js
function showHelp (line 18) | function showHelp(returnCode) {
function showError (line 60) | function showError(message) {
function createFile (line 118) | function createFile({ targetFile, ext, reference }) {
function getAsset (line 145) | async function getAsset(assetType) {
FILE: app-vite/lib/cmd/run.js
function getArgv (line 39) | function getArgv({ _, ...params }) {
FILE: app-vite/lib/config-tools.js
function parseVitePlugins (line 18) | async function parseVitePlugins(entries, appDir, compileId) {
function getQuasarVitePluginRunMode (line 111) | function getQuasarVitePluginRunMode(compileId) {
function createViteConfig (line 123) | async function createViteConfig(
function extendViteConfig (line 276) | function extendViteConfig(viteConf, quasarConf, invokeParams) {
function createNodeRolldownConfig (line 305) | function createNodeRolldownConfig(
function createBrowserRolldownConfig (line 350) | function createBrowserRolldownConfig(quasarConf, { shippedToClient }) {
function extendRolldownConfig (line 388) | function extendRolldownConfig(
FILE: app-vite/lib/entry-files-generator.js
class EntryFilesGenerator (line 6) | class EntryFilesGenerator {
method constructor (line 10) | constructor(ctx) {
method generate (line 49) | generate(quasarConf) {
FILE: app-vite/lib/modes/bex/bex-builder.js
class QuasarModeBuilder (line 10) | class QuasarModeBuilder extends AppBuilder {
method build (line 11) | async build() {
method #bundlePackage (line 32) | #bundlePackage(dir) {
FILE: app-vite/lib/modes/bex/bex-config.js
function generateDefaultEntry (line 12) | function generateDefaultEntry(quasarConf) {
method configResolved (line 55) | configResolved(viteConfig) {
method bexScript (line 66) | bexScript(quasarConf, entry = generateDefaultEntry(quasarConf)) {
FILE: app-vite/lib/modes/bex/bex-devserver.js
class QuasarModeDevserver (line 11) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 21) | constructor(opts) {
method run (line 49) | run(quasarConf, __isRetry) {
method #onDistDir (line 69) | async #onDistDir(quasarConf) {
method #compileBexManifest (line 92) | async #compileBexManifest(quasarConf, queue) {
method #compileBexScripts (line 135) | async #compileBexScripts(quasarConf) {
method #runVite (line 158) | async #runVite(quasarConf, queue) {
method #getBexAssetsDirWatcher (line 192) | #getBexAssetsDirWatcher(quasarConf) {
method #getAppSourceWatcher (line 212) | #getAppSourceWatcher(quasarConf, viteConfig, queue) {
method #getPublicDirWatcher (line 236) | #getPublicDirWatcher(quasarConf) {
FILE: app-vite/lib/modes/bex/bex-installation.js
function addMode (line 12) | async function addMode({ ctx: { appPaths, cacheProxy }, silent }) {
function removeMode (line 37) | function removeMode({ ctx: { appPaths } }) {
FILE: app-vite/lib/modes/bex/bex-utils.js
function createManifest (line 7) | function createManifest(quasarConf) {
function getCompilationEntry (line 80) | function getCompilationEntry(quasarConf, inputFile, scriptName) {
function extractBexScripts (line 90) | function extractBexScripts(quasarConf, bexManifest) {
function copyBexAssets (line 185) | function copyBexAssets(quasarConf) {
FILE: app-vite/lib/modes/capacitor/capacitor-builder.js
class QuasarModeBuilder (line 14) | class QuasarModeBuilder extends AppBuilder {
method build (line 18) | async build() {
method #buildFiles (line 25) | async #buildFiles() {
method #packageFiles (line 31) | async #packageFiles() {
method #cleanup (line 64) | #cleanup() {
method #runCapacitorCommand (line 68) | #runCapacitorCommand(args, capBin) {
method #buildIos (line 82) | async #buildIos() {
method #buildAndroid (line 106) | async #buildAndroid() {
FILE: app-vite/lib/modes/capacitor/capacitor-consistency.js
function ensureWWW (line 4) | function ensureWWW({ appPaths, forced }) {
function ensureDeps (line 14) | async function ensureDeps({ appPaths, cacheProxy }) {
function ensureConsistency (line 25) | async function ensureConsistency(opts) {
FILE: app-vite/lib/modes/capacitor/capacitor-devserver.js
class QuasarModeDevserver (line 11) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 17) | constructor(opts) {
method run (line 32) | run(quasarConf, __isRetry) {
method #runVite (line 44) | async #runVite(quasarConf) {
method #runCapacitor (line 57) | async #runCapacitor(quasarConf) {
method #stopCapacitor (line 79) | #stopCapacitor() {
method #runCapacitorCommand (line 87) | #runCapacitorCommand(args, cwd, capBin) {
method #cleanup (line 101) | #cleanup() {
FILE: app-vite/lib/modes/capacitor/capacitor-installation.js
function addMode (line 19) | async function addMode({
function removeMode (line 111) | function removeMode({ ctx: { appPaths } }) {
function addPlatform (line 123) | async function addPlatform(target, appPaths, cacheProxy) {
FILE: app-vite/lib/modes/capacitor/config-file.js
class CapacitorConfigFile (line 15) | class CapacitorConfigFile {
method prepare (line 19) | async prepare(quasarConf, target) {
method reset (line 47) | reset() {
method #save (line 58) | #save() {
method #updateCapJson (line 65) | #updateCapJson(quasarConf, originalCapCfg, capVersion, target) {
method #updateCapPkg (line 93) | #updateCapPkg(quasarConf) {
method #updateSSL (line 112) | async #updateSSL(quasarConf, target, capVersion) {
FILE: app-vite/lib/modes/cordova/android-cleartext.js
function fixAndroidCleartext (line 3) | function fixAndroidCleartext(appPaths, action) {
FILE: app-vite/lib/modes/cordova/config-file.js
function setFields (line 8) | function setFields(root, cfg) {
class CordovaConfigFile (line 31) | class CordovaConfigFile {
method prepare (line 37) | prepare(quasarConf) {
method reset (line 87) | reset() {
method #save (line 109) | #save(doc) {
method #prepareAppDelegate (line 120) | #prepareAppDelegate(node) {
method #prepareWkWebEngine (line 172) | #prepareWkWebEngine(node) {
FILE: app-vite/lib/modes/cordova/cordova-builder.js
function ensureArray (line 28) | function ensureArray(val) {
class QuasarModeBuilder (line 32) | class QuasarModeBuilder extends AppBuilder {
method build (line 35) | async build() {
method #buildFiles (line 40) | async #buildFiles() {
method #packageFiles (line 65) | async #packageFiles() {
method #cleanup (line 144) | #cleanup() {
method #runCordovaCommand (line 148) | #runCordovaCommand(args, target) {
FILE: app-vite/lib/modes/cordova/cordova-consistency.js
function ensureWWW (line 7) | function ensureWWW({ appPaths, forced }) {
function ensureDeps (line 17) | function ensureDeps({ appPaths }) {
function ensureConsistency (line 36) | function ensureConsistency(opts) {
FILE: app-vite/lib/modes/cordova/cordova-devserver.js
class QuasarModeDevserver (line 12) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 18) | constructor(opts) {
method run (line 37) | run(quasarConf, __isRetry) {
method #runVite (line 49) | async #runVite(quasarConf) {
method #runCordova (line 62) | async #runCordova(quasarConf) {
method #stopCordova (line 92) | #stopCordova() {
method #runCordovaCommand (line 100) | #runCordovaCommand(quasarConf, args) {
method #cleanup (line 126) | #cleanup() {
FILE: app-vite/lib/modes/cordova/cordova-installation.js
function addMode (line 16) | async function addMode({
function removeMode (line 103) | function removeMode({ ctx: { appPaths } }) {
function addPlatform (line 113) | function addPlatform(appPaths, target) {
FILE: app-vite/lib/modes/cordova/vite-plugin.dev.cordova-platform-inject.js
function quasarVitePluginDevCordovaPlatformInject (line 8) | function quasarVitePluginDevCordovaPlatformInject(quasarConf) {
FILE: app-vite/lib/modes/electron/electron-builder.js
class QuasarModeBuilder (line 10) | class QuasarModeBuilder extends AppBuilder {
method build (line 11) | async build() {
method #buildFiles (line 23) | async #buildFiles() {
method #writePackageJson (line 41) | #writePackageJson() {
method #copyElectronFiles (line 70) | #copyElectronFiles() {
method #packageFiles (line 88) | async #packageFiles() {
FILE: app-vite/lib/modes/electron/electron-config.js
function preloadScript (line 16) | async function preloadScript(quasarConf, name) {
method preloadScriptList (line 148) | async preloadScriptList(quasarConf) {
FILE: app-vite/lib/modes/electron/electron-consistency.js
function ensureDeps (line 3) | async function ensureDeps({ appPaths, cacheProxy }) {
function ensureConsistency (line 14) | async function ensureConsistency(opts) {
FILE: app-vite/lib/modes/electron/electron-devserver.js
function wait (line 11) | function wait(time) {
class QuasarModeDevserver (line 17) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 24) | constructor(opts) {
method run (line 52) | run(quasarConf, __isRetry) {
method #runVite (line 64) | async #runVite(quasarConf) {
method #runElectronFiles (line 77) | async #runElectronFiles(quasarConf) {
method #runElectron (line 110) | async #runElectron(quasarConf) {
FILE: app-vite/lib/modes/electron/electron-installation.js
function addMode (line 14) | async function addMode({ ctx: { appPaths, cacheProxy }, silent }) {
function removeMode (line 53) | function removeMode({ ctx: { appPaths } }) {
FILE: app-vite/lib/modes/modes-utils.js
function isModeInstalled (line 8) | function isModeInstalled(appPaths, modeName) {
FILE: app-vite/lib/modes/pwa/pwa-builder.js
class QuasarModeBuilder (line 8) | class QuasarModeBuilder extends AppBuilder {
method build (line 9) | async build() {
FILE: app-vite/lib/modes/pwa/pwa-devserver.js
class QuasarModeDevserver (line 11) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 18) | constructor(opts) {
method run (line 56) | run(quasarConf, __isRetry) {
method #runVite (line 75) | async #runVite(quasarConf, urlDiffers) {
method #compilePwaManifest (line 99) | async #compilePwaManifest(quasarConf) {
method #compilePwaServiceWorker (line 130) | async #compilePwaServiceWorker(quasarConf, queue) {
FILE: app-vite/lib/modes/pwa/pwa-installation.js
function addMode (line 28) | async function addMode({ ctx: { appPaths, cacheProxy }, silent }) {
function removeMode (line 70) | async function removeMode({ ctx: { appPaths, cacheProxy } }) {
FILE: app-vite/lib/modes/pwa/utils.js
function createHeadTags (line 10) | function createHeadTags(quasarConf) {
function injectPwaManifest (line 42) | function injectPwaManifest(quasarConf, ifNotAlreadyGenerated) {
function buildPwaServiceWorker (line 70) | async function buildPwaServiceWorker(quasarConf, workboxConfig) {
FILE: app-vite/lib/modes/pwa/vite-plugin.pwa-resources.js
function quasarVitePluginPwaResources (line 5) | function quasarVitePluginPwaResources(quasarConf) {
FILE: app-vite/lib/modes/spa/spa-builder.js
class QuasarModeBuilder (line 4) | class QuasarModeBuilder extends AppBuilder {
method build (line 5) | async build() {
FILE: app-vite/lib/modes/spa/spa-devserver.js
class QuasarModeDevserver (line 7) | class QuasarModeDevserver extends AppDevserver {
method run (line 10) | run(quasarConf, __isRetry) {
method #runVite (line 18) | async #runVite(quasarConf, urlDiffers) {
FILE: app-vite/lib/modes/spa/spa-installation.js
function addMode (line 3) | function addMode() {}
function removeMode (line 4) | function removeMode() {}
FILE: app-vite/lib/modes/ssr/ssr-builder.js
class QuasarModeBuilder (line 19) | class QuasarModeBuilder extends AppBuilder {
method build (line 20) | async build() {
method #buildWebserver (line 81) | async #buildWebserver() {
method #copyWebserverFiles (line 86) | #copyWebserverFiles() {
method #writePackageJson (line 97) | #writePackageJson() {
method #writeRenderTemplate (line 136) | async #writeRenderTemplate(clientDir) {
method #writeSsrManifest (line 155) | #writeSsrManifest() {
FILE: app-vite/lib/modes/ssr/ssr-consistency.js
function ensureDeps (line 3) | async function ensureDeps({ appPaths, cacheProxy }) {
function ensureConsistency (line 14) | async function ensureConsistency(opts) {
FILE: app-vite/lib/modes/ssr/ssr-devserver.js
function logServerMessage (line 25) | function logServerMessage(title, msg, additional) {
function renderStoreState (line 37) | function renderStoreState(ssrContext) {
class QuasarModeDevserver (line 45) | class QuasarModeDevserver extends AppDevserver {
method constructor (line 68) | constructor(opts) {
method run (line 131) | run(quasarConf, __isRetry) {
method #compileWebserver (line 157) | async #compileWebserver(quasarConf, queue) {
method #runVite (line 173) | async #runVite(quasarConf, urlDiffers) {
method #bootWebserver (line 305) | async #bootWebserver(quasarConf) {
method #compilePwaManifest (line 398) | async #compilePwaManifest(quasarConf) {
method #compilePwaServiceWorker (line 429) | async #compilePwaServiceWorker(quasarConf, queue) {
FILE: app-vite/lib/modes/ssr/ssr-installation.js
function addMode (line 14) | async function addMode({ ctx: { appPaths, cacheProxy }, silent }) {
function removeMode (line 62) | function removeMode({ ctx: { appPaths } }) {
FILE: app-vite/lib/plugins/rolldown.inject-replacements.js
function quasarRolldownInjectReplacementsPlugin (line 17) | function quasarRolldownInjectReplacementsPlugin() {
FILE: app-vite/lib/plugins/rolldown.vue-shim.js
function quasarRolldownVueShimPlugin (line 5) | function quasarRolldownVueShimPlugin() {
FILE: app-vite/lib/plugins/vite.index-html-transform.js
function quasarViteIndexHtmlTransformPlugin (line 3) | function quasarViteIndexHtmlTransformPlugin(quasarConf) {
FILE: app-vite/lib/plugins/vite.strip-filename-hashes.js
function quasarViteStripFilenameHashesPlugin (line 18) | function quasarViteStripFilenameHashesPlugin() {
FILE: app-vite/lib/quasar-config-file.js
function escapeHTMLTagContent (line 61) | function escapeHTMLTagContent(str) {
function escapeHTMLAttribute (line 64) | function escapeHTMLAttribute(str) {
function formatPublicPath (line 68) | function formatPublicPath(publicPath) {
function formatRouterBase (line 84) | function formatRouterBase(publicPath) {
function parseAssetProperty (line 95) | function parseAssetProperty(prefix) {
function getUniqueArray (line 115) | function getUniqueArray(original) {
function uniquePathFilter (line 119) | function uniquePathFilter(value, index, self) {
function formatQuasarAssetPath (line 124) | function formatQuasarAssetPath(asset, type) {
function onAddress (line 135) | async function onAddress({ host, port }, mode) {
function createWsToken (line 185) | function createWsToken() {
class QuasarConfigFile (line 199) | class QuasarConfigFile {
method constructor (line 229) | constructor({ ctx, host, port, verifyAddress, watch = false }) {
method #getRolldownConfig (line 243) | #getRolldownConfig() {
method watch (line 294) | watch(onUpdate) {
method read (line 304) | async read() {
method #readBuiltFile (line 357) | async #readBuiltFile() {
method #getConfEnv (line 400) | #getConfEnv() {
method #injectAppEnv (line 412) | #injectAppEnv(quasarConf) {
method #createConfEnvWatcher (line 469) | #createConfEnvWatcher() {
method #createAppEnvWatcher (line 526) | #createAppEnvWatcher(initialAppEnv) {
method #watchBuild (line 543) | #watchBuild() {
method #build (line 606) | async #build() {
method #computeConfig (line 631) | async #computeConfig(quasarConfigFn) {
FILE: app-vite/lib/types-generator.js
function generateTypes (line 35) | function generateTypes(quasarConf) {
function generateTsConfig (line 62) | function generateTsConfig(quasarConf, fsUtils) {
function writeFeatureFlags (line 210) | function writeFeatureFlags(quasarConf, fsUtils) {
function writeDeclarations (line 272) | function writeDeclarations(quasarConf, fsUtils) {
FILE: app-vite/lib/utils/app-files-validations.js
function appFilesValidations (line 6) | function appFilesValidations(appPaths) {
FILE: app-vite/lib/utils/banner.js
function getPackager (line 7) | function getPackager(argv, cmd) {
function getCompilationTarget (line 19) | function getCompilationTarget(target) {
function displayBanner (line 23) | async function displayBanner({ argv, ctx, cmd, details }) {
function getIPList (line 124) | function getIPList() {
function capitalize (line 133) | function capitalize(str) {
function printDevRunningBanner (line 137) | function printDevRunningBanner(quasarConf) {
FILE: app-vite/lib/utils/build-targets.js
constant BASELINE_WIDELY_AVAILABLE_TARGET_STRING (line 2) | const BASELINE_WIDELY_AVAILABLE_TARGET_STRING =
constant BASELINE_WIDELY_AVAILABLE (line 5) | const BASELINE_WIDELY_AVAILABLE = [
FILE: app-vite/lib/utils/cli-runtime.js
function resolveToCliDir (line 6) | function resolveToCliDir(dir) {
FILE: app-vite/lib/utils/encode-for-diff.js
function encodeForDiff (line 1) | function encodeForDiff(obj) {
FILE: app-vite/lib/utils/ensure-argv.js
function ensureArgv (line 3) | function ensureArgv(argv, cmd) {
function ensureElectronArgv (line 79) | function ensureElectronArgv(bundlerName, ctx) {
FILE: app-vite/lib/utils/env.js
function getEnvFilesPrefix (line 18) | function getEnvFilesPrefix({ prefix, defaultPrefix, banner }) {
function getQuasarConfEnv (line 82) | function getQuasarConfEnv({ ctx, envCfg, useSnapshot }) {
function getAppEnv (line 146) | function getAppEnv({ ctx, envCfg, useSnapshot }) {
function getFileEnvResult (line 248) | function getFileEnvResult({ appDir, fileList, folderList }) {
function parseEnvDefineList (line 293) | function parseEnvDefineList(env, regex) {
FILE: app-vite/lib/utils/escape-regex-string.js
function escapeRegexString (line 10) | function escapeRegexString(str) {
FILE: app-vite/lib/utils/get-api.js
function getApi (line 10) | async function getApi(item, ctx) {
FILE: app-vite/lib/utils/get-app-paths.js
function getAppInfo (line 15) | function getAppInfo() {
function getRunType (line 35) | function getRunType(ctx) {
function getPrefixDir (line 41) | function getPrefixDir(ctx) {
function getAppPaths (line 51) | function getAppPaths({ ctx, defineHiddenProp } = {}) {
FILE: app-vite/lib/utils/get-caller-path.js
function getCallerPath (line 4) | function getCallerPath() {
FILE: app-vite/lib/utils/get-ctx.js
function defineHiddenProp (line 6) | function defineHiddenProp(target, propName, value) {
function getCtx (line 18) | function getCtx(opts = {}) {
FILE: app-vite/lib/utils/get-external-ip.js
function getExternalIP (line 6) | async function getExternalIP() {
FILE: app-vite/lib/utils/get-fixed-deps.js
function getFixedDeps (line 15) | function getFixedDeps(deps, rootDir) {
FILE: app-vite/lib/utils/get-package-json.js
function getPackageJson (line 9) | function getPackageJson(pkgName, dir) {
FILE: app-vite/lib/utils/get-package-major-version.js
function getMajorVersion (line 3) | function getMajorVersion(version) {
function getPackageMajorVersion (line 11) | function getPackageMajorVersion(pkgName, dir) {
FILE: app-vite/lib/utils/get-package-path.js
function getPackagePath (line 15) | function getPackagePath(pkgName, dir) {
FILE: app-vite/lib/utils/get-package.js
function getPackage (line 9) | async function getPackage(pkgName, dir) {
FILE: app-vite/lib/utils/get-pkg.js
function getPkg (line 12) | function getPkg(appPaths, mode) {
FILE: app-vite/lib/utils/html-template.js
function injectPublicPath (line 28) | function injectPublicPath(html, publicPath) {
function injectSsrRuntimeInterpolation (line 38) | function injectSsrRuntimeInterpolation(html) {
function injectVueDevtools (line 79) | function injectVueDevtools(html, { host, port }, nonce = '') {
function transformHtml (line 87) | async function transformHtml(template, quasarConf) {
function transformProdSsrPwaOfflineHtml (line 122) | async function transformProdSsrPwaOfflineHtml(html, quasarConf) {
function getDevSsrTemplateFn (line 142) | function getDevSsrTemplateFn(template, quasarConf) {
function getProdSsrRenderTemplateFileContent (line 181) | async function getProdSsrRenderTemplateFileContent(
FILE: app-vite/lib/utils/logger.js
function tip (line 47) | function tip(msg) {
function log (line 51) | function log(msg) {
function warn (line 55) | function warn(msg, pill) {
function fatal (line 64) | function fatal(msg, pill) {
function success (line 80) | function success(msg, title = 'SUCCESS') {
function getSuccess (line 83) | function getSuccess(msg, title) {
function info (line 87) | function info(msg, title = 'INFO') {
function getInfo (line 90) | function getInfo(msg, title) {
function error (line 94) | function error(msg, title = 'ERROR') {
function getError (line 97) | function getError(msg, title = 'ERROR') {
function warning (line 101) | function warning(msg, title = 'WARNING') {
function getWarning (line 106) | function getWarning(msg, title = 'WARNING') {
function progress (line 114) | function progress(msg, token) {
FILE: app-vite/lib/utils/net.js
function getExternalNetworkInterface (line 6) | function getExternalNetworkInterface() {
function getIPs (line 23) | function getIPs() {
function findClosestOpenPort (line 40) | async function findClosestOpenPort(port, host) {
function isPortAvailable (line 53) | function isPortAvailable(port, host) {
FILE: app-vite/lib/utils/on-shutdown.js
function onShutdown (line 3) | function onShutdown(fn, msg) {
FILE: app-vite/lib/utils/open-browser.js
function openBrowser (line 5) | function openBrowser({ url, opts, wait = true }) {
FILE: app-vite/lib/utils/open-ide.js
function findXcodeWorkspace (line 8) | function findXcodeWorkspace(folder) {
function runMacOS (line 20) | function runMacOS(mode, target, appPaths) {
function getLinuxPath (line 41) | function getLinuxPath(bin) {
function runLinux (line 62) | function runLinux(mode, bin, target, appPaths) {
function getWindowsPath (line 88) | function getWindowsPath(bin) {
function runWindows (line 120) | function runWindows(mode, bin, target, appPaths) {
function openIDE (line 158) | function openIDE({ mode, bin, target, dev, appPaths }) {
FILE: app-vite/lib/utils/print-build-summary.js
function getAssets (line 22) | function getAssets(distDir) {
function getHumanSize (line 44) | function getHumanSize(bytes) {
function getGzippedSize (line 48) | function getGzippedSize(file) {
function getAssetLines (line 57) | function getAssetLines(assetList, showGzipped) {
function getAssetColumnWidth (line 126) | function getAssetColumnWidth(assetList) {
function capitalize (line 152) | function capitalize(str) {
function getTable (line 156) | function getTable(widthMap) {
function printBuildSummary (line 230) | function printBuildSummary(distDir, showGzipped) {
FILE: app-vite/lib/utils/rate-limit.js
function debounce (line 2) | function debounce(fn, wait = 250, immediate) {
function throttle (line 29) | function throttle(fn, limit = 250) {
FILE: app-vite/lib/utils/resolve-extension.js
function resolveExtension (line 5) | function resolveExtension(file, extList = extensions) {
FILE: app-vite/lib/utils/signals.js
constant SIGNALS (line 1) | const SIGNALS = {
FILE: app-vite/lib/utils/spawn.js
function spawn (line 8) | function spawn(cmd, params, opts, onClose) {
function spawnSync (line 41) | function spawnSync(cmd, params, opts, onFail) {
FILE: app-vite/lib/utils/template.js
function throwParseError (line 24) | function throwParseError(message, str, index) {
function escapeRegExp (line 45) | function escapeRegExp(str) {
function trimWS (line 50) | function trimWS(str, wsLeft, wsRight) {
function getAST (line 82) | function getAST(str, opts) {
function compileBody (line 226) | function compileBody(ast, opts) {
function compileTemplateToFile (line 257) | function compileTemplateToFile(str, rawOpts = {}) {
function compileTemplateToFn (line 264) | function compileTemplateToFn(str, rawOpts = {}) {
function renderTemplate (line 272) | function renderTemplate(str, scope, rawOpts) {
FILE: app-vite/playground-ts/src/components/models.ts
type Todo (line 1) | interface Todo {
type Meta (line 6) | interface Meta {
FILE: app-vite/playground-ts/src/env.d.ts
type ImportMetaEnv (line 4) | interface ImportMetaEnv {}
FILE: app-vite/templates/bex/js/background.js
function openExtension (line 12) | function openExtension () {
FILE: app-vite/templates/bex/ts/background.ts
function openExtension (line 12) | function openExtension () {
type BexEventMap (line 27) | interface BexEventMap {
FILE: app-vite/templates/bex/ts/bex-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/bex/ts/my-content-script.ts
type BexEventMap (line 21) | interface BexEventMap {
FILE: app-vite/templates/electron/js/electron-main.js
function createWindow (line 11) | async function createWindow () {
FILE: app-vite/templates/electron/ts/electron-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/electron/ts/electron-main.ts
function createWindow (line 11) | async function createWindow() {
FILE: app-vite/templates/entry/app.js
method setup (line 40) | setup (props) {
FILE: app-vite/templates/entry/server-entry.js
function getRedirectUrl (line 59) | function getRedirectUrl (url, router) {
FILE: app-vite/templates/entry/ssr-middlewares.js
function injectMiddlewares (line 7) | function injectMiddlewares (opts) {
FILE: app-vite/templates/entry/ssr-prod-webserver.js
function renderModulesPreload (line 33) | function renderModulesPreload (modules, opts) {
function renderStoreState (line 66) | function renderStoreState (ssrContext) {
function render (line 76) | async function render (ssrContext) {
FILE: app-vite/templates/pwa/js/register-service-worker.js
method ready (line 14) | ready (/* registration */) {
method registered (line 18) | registered (/* registration */) {
method cached (line 22) | cached (/* registration */) {
method updatefound (line 26) | updatefound (/* registration */) {
method updated (line 30) | updated (/* registration */) {
method offline (line 34) | offline () {
method error (line 38) | error (/* err */) {
FILE: app-vite/templates/pwa/ts/pwa-env.d.ts
type ImportMetaEnv (line 4) | interface ImportMetaEnv {}
FILE: app-vite/templates/pwa/ts/register-service-worker.ts
method ready (line 14) | ready(/* registration */) {
method registered (line 18) | registered(/* registration */) {
method cached (line 22) | cached(/* registration */) {
method updatefound (line 26) | updatefound(/* registration */) {
method updated (line 30) | updated(/* registration */) {
method offline (line 34) | offline() {
method error (line 38) | error(/* err */) {
FILE: app-vite/templates/ssr/express/ts/middlewares/render.ts
function isRedirectError (line 7) | function isRedirectError(err: unknown): err is SsrRenderRedirectError {
function isRouteNotFoundError (line 16) | function isRouteNotFoundError(
FILE: app-vite/templates/ssr/express/ts/server.ts
type SsrDriver (line 24) | interface SsrDriver {
FILE: app-vite/templates/ssr/express/ts/ssr-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/ssr/fastify/ts/middlewares/render.ts
function isRedirectError (line 7) | function isRedirectError(err: unknown): err is SsrRenderRedirectError {
function isRouteNotFoundError (line 16) | function isRouteNotFoundError(
FILE: app-vite/templates/ssr/fastify/ts/server.ts
type SsrDriver (line 32) | interface SsrDriver {
FILE: app-vite/templates/ssr/fastify/ts/ssr-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/ssr/hono/ts/middlewares/render.ts
function isRedirectError (line 7) | function isRedirectError(err: unknown): err is SsrRenderRedirectError {
function isRouteNotFoundError (line 16) | function isRouteNotFoundError(
FILE: app-vite/templates/ssr/hono/ts/server.ts
type NodeEnv (line 25) | interface NodeEnv {
type SsrDriver (line 33) | interface SsrDriver {
FILE: app-vite/templates/ssr/hono/ts/ssr-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/ssr/koa/ts/middlewares/render.ts
function isRedirectError (line 7) | function isRedirectError(err: unknown): err is SsrRenderRedirectError {
function isRouteNotFoundError (line 16) | function isRouteNotFoundError(
FILE: app-vite/templates/ssr/koa/ts/server.ts
type SsrDriver (line 22) | interface SsrDriver {
FILE: app-vite/templates/ssr/koa/ts/ssr-env.d.ts
type ImportMetaEnv (line 3) | interface ImportMetaEnv {}
FILE: app-vite/templates/store/pinia/ts/index.ts
type PiniaCustomProperties (line 11) | interface PiniaCustomProperties {
FILE: app-vite/types/app-extension.d.ts
type ExtendViteConfHandler (line 6) | type ExtendViteConfHandler = (
type GetPersistentConfHandler (line 15) | type GetPersistentConfHandler = () => Record<string, unknown>;
type HasExtensionHandler (line 16) | type HasExtensionHandler = (extId: string) => boolean;
type BaseAPI (line 18) | interface BaseAPI {
type SharedIndexInstallAPI (line 34) | interface SharedIndexInstallAPI {
type Callback (line 50) | type Callback<T> = (callback: T) => void;
type IndexAPI (line 52) | interface IndexAPI extends BaseAPI, SharedIndexInstallAPI {
type ExitLogHandler (line 105) | type ExitLogHandler = (msg: string) => void;
type InstallAPI (line 106) | interface InstallAPI extends BaseAPI, SharedIndexInstallAPI {
type UninstallAPI (line 120) | interface UninstallAPI extends BaseAPI {
type PromptsAPI (line 129) | interface PromptsAPI extends BaseAPI {
FILE: app-vite/types/app-paths.d.ts
type IResolve (line 1) | interface IResolve {
type QuasarAppPaths (line 14) | interface QuasarAppPaths {
FILE: app-vite/types/bex/bridge.d.ts
type BexEventMap (line 29) | interface BexEventMap {}
type BexEventName (line 31) | type BexEventName = LiteralUnion<Exclude<keyof BexEventMap, number>>;
type BexEventEntry (line 32) | type BexEventEntry<
type BexEventData (line 40) | type BexEventData<T extends BexEventName> = BexEventEntry<T>[0];
type BexEventResponse (line 41) | type BexEventResponse<T extends BexEventName> = BexEventEntry<T>[1];
type PortName (line 46) | type PortName = "background" | "app" | `content@${string}-${string}`;
type BexPayload (line 48) | type BexPayload<T extends BexEventName> =
type BexMessage (line 55) | type BexMessage<T extends BexEventName> = {
type BexEventListener (line 61) | type BexEventListener<T extends BexEventName> = (
type BexBridgeOptions (line 65) | type BexBridgeOptions = {
type BexBridge (line 104) | interface BexBridge {
FILE: app-vite/types/boot.d.ts
type BootFileParams (line 6) | interface BootFileParams extends HasSsrParam, HasStoreParam {
type BootCallback (line 23) | type BootCallback = (params: BootFileParams) => void | Promise<void>;
FILE: app-vite/types/client/src-bex.d.ts
type ImportMetaEnv (line 1) | interface ImportMetaEnv extends Record<string, any> {
type ImportMeta (line 16) | interface ImportMeta {
FILE: app-vite/types/client/src-electron.d.ts
type ImportMetaEnv (line 1) | interface ImportMetaEnv extends Record<string, any> {
type ImportMeta (line 28) | interface ImportMeta {
FILE: app-vite/types/client/src-pwa.d.ts
type ImportMetaEnv (line 1) | interface ImportMetaEnv {
FILE: app-vite/types/client/src-ssr.d.ts
type ImportMetaEnv (line 1) | interface ImportMetaEnv extends Record<string, any> {
type ImportMeta (line 16) | interface ImportMeta {
FILE: app-vite/types/client/src.d.ts
type ImportMetaEnv (line 1) | interface ImportMetaEnv {
FILE: app-vite/types/configuration.d.ts
type ConfigureCallback (line 4) | type ConfigureCallback = (
FILE: app-vite/types/configuration/bex.d.ts
type QuasarBexConfiguration (line 3) | interface QuasarBexConfiguration {
FILE: app-vite/types/configuration/boot.d.ts
type BootConfigurationItem (line 1) | interface BootConfigurationItem {
type QuasarBootConfiguration (line 7) | type QuasarBootConfiguration = (string | BootConfigurationItem)[];
FILE: app-vite/types/configuration/build.d.ts
type HtmlMinifierOptions (line 6) | interface HtmlMinifierOptions {
type StripEnums (line 48) | type StripEnums<T extends Record<string, any>> = {
type TSConfig (line 61) | interface TSConfig {
type InvokeParams (line 71) | interface InvokeParams {
type BuildTargetOptions (line 76) | interface BuildTargetOptions {
type PluginEntryRunOptions (line 87) | interface PluginEntryRunOptions {
type PluginEntry (line 92) | type PluginEntry =
type QuasarBuildEnv (line 104) | interface QuasarBuildEnv {
type QuasarStaticBuildConfiguration (line 159) | interface QuasarStaticBuildConfiguration {
type QuasarDynamicBuildConfiguration (line 435) | interface QuasarDynamicBuildConfiguration {
type QuasarBuildConfiguration (line 469) | type QuasarBuildConfiguration = QuasarStaticBuildConfiguration &
FILE: app-vite/types/configuration/capacitor-conf.d.ts
type QuasarCapacitorTargets (line 1) | type QuasarCapacitorTargets = "android" | "ios";
type QuasarCapacitorConfiguration (line 3) | interface QuasarCapacitorConfiguration {
FILE: app-vite/types/configuration/conf.d.ts
type DevServerOptions (line 22) | type DevServerOptions = Omit<ViteServerOptions, "open" | "https"> & {
type QuasarSourceFilesConfiguration (line 45) | interface QuasarSourceFilesConfiguration {
type BaseQuasarConfiguration (line 56) | interface BaseQuasarConfiguration {
type QuasarHookParams (line 102) | interface QuasarHookParams {
type QuasarConf (line 106) | interface QuasarConf
type QuasarMetaConf (line 122) | interface QuasarMetaConf {
type ResolvedQuasarConf (line 156) | interface ResolvedQuasarConf extends DeepRequired<
type IsObject (line 164) | type IsObject<T> =
type MaxDepth (line 172) | type MaxDepth = 5;
type BuildPaths (line 173) | type BuildPaths<
type DotNotation (line 186) | type DotNotation<
type QuasarConfPath (line 199) | type QuasarConfPath = BuildPaths<ResolvedQuasarConf>;
type ResolvedQuasarConfValue (line 200) | type ResolvedQuasarConfValue<Path extends QuasarConfPath> = DotNotation<
FILE: app-vite/types/configuration/context.d.ts
type QuasarMode (line 13) | type QuasarMode =
type BaseQuasarContext (line 22) | interface BaseQuasarContext {
type CapacitorQuasarContext (line 38) | interface CapacitorQuasarContext extends BaseQuasarContext {
type CordovaQuasarContext (line 53) | interface CordovaQuasarContext extends BaseQuasarContext {
type BaseElectronQuasarContext (line 75) | interface BaseElectronQuasarContext extends BaseQuasarContext {
type ElectronBuilderQuasarContext (line 82) | interface ElectronBuilderQuasarContext extends BaseElectronQuasarContext {
type ElectronPackagerQuasarContext (line 113) | interface ElectronPackagerQuasarContext extends BaseElectronQuasarContext {
type ElectronQuasarContext (line 132) | type ElectronQuasarContext =
type SpaQuasarContext (line 136) | interface SpaQuasarContext extends BaseQuasarContext {
type PwaQuasarContext (line 141) | interface PwaQuasarContext extends BaseQuasarContext {
type SsrQuasarContext (line 146) | interface SsrQuasarContext extends BaseQuasarContext {
type QuasarBexTargets (line 151) | type QuasarBexTargets = "chrome" | "firefox";
type BexQuasarContext (line 152) | interface BexQuasarContext extends BaseQuasarContext {
type QuasarContext (line 163) | type QuasarContext =
type CacheProxyModuleKey (line 172) | type CacheProxyModuleKey =
type CacheProxy (line 181) | interface CacheProxy {
type InternalQuasarContext (line 194) | type InternalQuasarContext = QuasarContext & {
FILE: app-vite/types/configuration/cordova-conf.d.ts
type QuasarCordovaTargets (line 1) | type QuasarCordovaTargets =
type QuasarCordovaConfiguration (line 11) | interface QuasarCordovaConfiguration {
FILE: app-vite/types/configuration/electron-conf.d.ts
type QuasarElectronBundlersInternal (line 7) | type QuasarElectronBundlersInternal = "builder" | "packager";
type ElectronBuilderConfiguration (line 9) | type ElectronBuilderConfiguration = ElectronBuilder.Configuration;
type ElectronPackagerOptions (line 10) | type ElectronPackagerOptions = ElectronPackager.Options;
type QuasarBaseElectronConfiguration (line 12) | interface QuasarBaseElectronConfiguration {
type QuasarElectronPackagerConfiguration (line 69) | interface QuasarElectronPackagerConfiguration extends QuasarBaseElectron...
type QuasarElectronBuilderConfiguration (line 79) | interface QuasarElectronBuilderConfiguration extends QuasarBaseElectronC...
type QuasarElectronBundlers (line 86) | type QuasarElectronBundlers = QuasarElectronBundlersInternal;
type ElectronBuilderArchs (line 88) | type ElectronBuilderArchs = ElectronBuilderUtil.Arch;
type ElectronBuilderTargets (line 90) | type ElectronBuilderTargets =
type ElectronPackagerArchs (line 98) | type ElectronPackagerArchs = LiteralUnion<
type ElectronPackagerTargets (line 101) | type ElectronPackagerTargets = LiteralUnion<
type QuasarElectronConfiguration (line 105) | type QuasarElectronConfiguration =
FILE: app-vite/types/configuration/framework-conf.d.ts
type AnyFn (line 10) | type AnyFn = (...args: any) => any;
type SerializableConfiguration (line 11) | type SerializableConfiguration<T> = {
type QuasarFrameworkConfiguration (line 17) | interface QuasarFrameworkConfiguration {
FILE: app-vite/types/configuration/mobile-conf.d.ts
type QuasarMobileConfiguration (line 1) | interface QuasarMobileConfiguration {
FILE: app-vite/types/configuration/pwa-conf.d.ts
type PwaManifestDirection (line 5) | type PwaManifestDirection = "ltr" | "rtl" | "auto";
type PwaManifestDisplay (line 7) | type PwaManifestDisplay =
type PwaManifestOrientation (line 13) | type PwaManifestOrientation =
type PwaManifestScreenshot (line 23) | interface PwaManifestScreenshot {
type PwaManifestServiceWorker (line 29) | interface PwaManifestServiceWorker {
type PwaManifestRelatedApplications (line 33) | interface PwaManifestRelatedApplications {
type PwaManifestIcon (line 39) | interface PwaManifestIcon {
type PwaManifestOptions (line 46) | interface PwaManifestOptions {
type InjectPwaMetaTagsParams (line 69) | interface InjectPwaMetaTagsParams {
type QuasarPwaConfiguration (line 79) | interface QuasarPwaConfiguration {
FILE: app-vite/types/configuration/ssr-conf.d.ts
type QuasarSsrConfiguration (line 3) | interface QuasarSsrConfiguration {
FILE: app-vite/types/globals.d.ts
type GlobalsTypesHolder (line 6) | interface GlobalsTypesHolder {
FILE: app-vite/types/prefetch.d.ts
type PreFetchOptions (line 5) | interface PreFetchOptions extends HasSsrParam, HasStoreParam {
type PrefetchCallback (line 24) | type PrefetchCallback = (
type ComponentCustomOptions (line 29) | interface ComponentCustomOptions {
FILE: app-vite/types/route.d.ts
type RouteParams (line 5) | type RouteParams = {} & HasSsrParam & HasStoreParam;
type RouteCallback (line 7) | type RouteCallback = (params: RouteParams) => Router | Promise<Router>;
FILE: app-vite/types/ssr/context.d.ts
type QSsrContext (line 5) | interface QSsrContext extends HasStoreParam {
FILE: app-vite/types/ssr/driver.d.ts
type SsrDriver (line 14) | interface SsrDriver extends Record<string, unknown> {}
type SsrDriverTypes (line 19) | interface SsrDriverTypes {
FILE: app-vite/types/ssr/index.d.ts
type HasSsrParam (line 4) | type HasSsrParam = HasSsr<{ ssrContext?: QSsrContext | null }>;
FILE: app-vite/types/ssr/ssrmiddleware.d.ts
type RenderParams (line 10) | interface RenderParams extends Pick<
type RenderVueParams (line 15) | interface RenderVueParams extends RenderParams, Record<string, any> {}
type HttpRedirectStatusCode (line 17) | type HttpRedirectStatusCode = 301 | 302 | 303 | 307 | 308;
type SsrRenderRouteNotFoundError (line 19) | interface SsrRenderRouteNotFoundError {
type SsrRenderRedirectError (line 22) | interface SsrRenderRedirectError {
type SsrMiddlewareResolve (line 27) | interface SsrMiddlewareResolve {
type SsrMiddlewareFolders (line 49) | interface SsrMiddlewareFolders {
type SsrCreateParams (line 55) | interface SsrCreateParams {
type SsrCreateCallback (line 78) | type SsrCreateCallback = (
type SsrServeStaticContentParams (line 82) | interface SsrServeStaticContentParams extends SsrCreateParams {
type SsrServeStaticFnParams (line 86) | interface SsrServeStaticFnParams {
type SsrServeStaticFn (line 104) | type SsrServeStaticFn = (
type SsrServeStaticContentCallback (line 108) | type SsrServeStaticContentCallback = (
type SsrRenderErrorFn (line 112) | type SsrRenderErrorFn = (params: {
type SsrMiddlewareServe (line 122) | interface SsrMiddlewareServe {
type SsrMiddlewareParams (line 137) | interface SsrMiddlewareParams extends SsrServeStaticContentParams {
type SsrMiddlewareCallback (line 141) | type SsrMiddlewareCallback = (
type SsrListenHandlerResult (line 145) | interface SsrListenHandlerResult {
type SsrListenCallback (line 149) | type SsrListenCallback = (
type SsrCloseParams (line 157) | interface SsrCloseParams extends SsrMiddlewareParams {
type SsrCloseCallback (line 161) | type SsrCloseCallback = (params: SsrCloseParams) => any | Promise<any>;
type SsrRenderPreloadTagCallbackOptions (line 163) | interface SsrRenderPreloadTagCallbackOptions {
type SsrRenderPreloadTagCallback (line 167) | type SsrRenderPreloadTagCallback = (
type SsrInjectDevMiddlewareParam (line 177) | type SsrInjectDevMiddlewareParam = (
type SsrInjectDevMiddlewareFn (line 183) | type SsrInjectDevMiddlewareFn = (
type SsrInjectDevMiddlewareCallback (line 187) | type SsrInjectDevMiddlewareCallback = (
FILE: app-vite/types/store.d.ts
type StoreInstance (line 5) | type StoreInstance = Pinia;
type HasStoreParam (line 7) | type HasStoreParam = HasStore<{
type StoreParams (line 14) | type StoreParams = {} & HasSsrParam;
type StoreCallback (line 16) | type StoreCallback = (
FILE: app-webpack/exports/bex/background.mjs
function interceptRequests (line 3) | function interceptRequests(devServerPort) {
function connectToDevServer (line 43) | function connectToDevServer(devServerPort) {
function createBridge (line 136) | function createBridge({ debug } = {}) {
FILE: app-webpack/exports/bex/content.mjs
function createBridge (line 58) | function createBridge({ debug } = {}) {
FILE: app-webpack/exports/bex/private/bex-bridge.mjs
function getRandomId (line 8) | function getRandomId(max) {
class BexBridge (line 20) | class BexBridge {
method constructor (line 48) | constructor({ type, name = '', debug }) {
method connectToBackground (line 115) | connectToBackground() {
method disconnectFromBackground (line 178) | disconnectFromBackground() {
method on (line 199) | on(event, callback) {
method once (line 219) | once(event, callback) {
method off (line 239) | off(event, callback) {
method send (line 288) | async send({ event, to, payload } = {}) {
method setDebug (line 345) | setDebug(value) {
method log (line 349) | log(...args) {
method warn (line 364) | warn(...args) {
method #onPortChange (line 384) | #onPortChange(reason) {
method #triggerMessageEvent (line 405) | async #triggerMessageEvent(message) {
method #cleanupPort (line 446) | #cleanupPort(portName) {
method #onPacket (line 464) | #onPacket(packet) {
method #sendPacket (line 582) | #sendPacket(packet) {
method #sendMessage (line 622) | #sendMessage({
method #onMessage (line 682) | #onMessage(message) {
FILE: app-webpack/exports/eslint/eslint.js
method recommended (line 13) | recommended() {
FILE: app-webpack/exports/eslint/eslint.mjs
method recommended (line 13) | recommended() {
FILE: app-webpack/lib/app-builder.js
method constructor (line 11) | constructor({ argv, quasarConf }) {
method readFile (line 16) | readFile(filename) {
method writeFile (line 25) | writeFile(filename, content) {
method copyFiles (line 35) | copyFiles(patterns, targetFolder = this.quasarConf.build.distDir) {
method moveFile (line 54) | moveFile(source, destination) {
method removeFile (line 68) | removeFile(filename) {
method printSummary (line 77) | printSummary(folder, showGzipped) {
FILE: app-webpack/lib/app-devserver.js
function getConfSnapshot (line 7) | function getConfSnapshot(extractFn, quasarConf, diffExtractFnMap) {
method constructor (line 20) | constructor(opts) {
method run (line 74) | run(quasarConf, __isRetry) {
method #queue (line 96) | #queue(runId, quasarConf, fn) {
method registerDiff (line 108) | registerDiff(name, extractFn) {
method #diff (line 117) | #diff(name, quasarConf) {
method clearWatcherList (line 148) | async clearWatcherList(watcherList, clearFn) {
method printBanner (line 157) | printBanner(quasarConf) {
FILE: app-webpack/lib/app-extension/AppExtensionInstance.js
function promptOverwrite (line 15) | async function promptOverwrite({ targetPath, options, ctx }) {
function renderFile (line 38) | async function renderFile(
function renderFolders (line 65) | async function renderFolders({ source, rawCopy, scope }, ctx) {
method constructor (line 120) | constructor({ extName, ctx, appExtJson }) {
method isInstalled (line 144) | get isInstalled() {
method #loadPackageInfo (line 152) | #loadPackageInfo() {
method install (line 174) | async install(skipPkgInstall) {
method uninstall (line 232) | async uninstall(skipPkgUninstall) {
method run (line 270) | async run() {
method #stripVersion (line 293) | #stripVersion(packageFullName) {
method getPrompts (line 299) | getPrompts() {
method #getScriptPrompts (line 303) | async #getScriptPrompts() {
method #installPackage (line 323) | async #installPackage() {
method #uninstallPackage (line 329) | async #uninstallPackage() {
method #getScriptPath (line 349) | #getScriptPath(scriptName) {
method #getScript (line 364) | async #getScript(scriptName, fatalError) {
method #runInstallScript (line 405) | async #runInstallScript(prompts) {
method #runUninstallScript (line 445) | async #runUninstallScript(prompts) {
FILE: app-webpack/lib/app-extension/api-classes/BaseAPI.js
method constructor (line 15) | constructor({ ctx, extId }) {
method hasTypescript (line 27) | hasTypescript() {
method hasLint (line 36) | hasLint() {
method getStorePackageName (line 46) | getStorePackageName() {
method getNodePackagerName (line 57) | getNodePackagerName() {
FILE: app-webpack/lib/app-extension/api-classes/IndexAPI.js
method constructor (line 18) | constructor(opts, appExtJson) {
method getPersistentConf (line 31) | getPersistentConf() {
method setPersistentConf (line 41) | setPersistentConf(cfg) {
method mergePersistentConf (line 52) | mergePersistentConf(cfg = {}) {
method compatibleWith (line 71) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 99) | hasPackage(packageName, semverCondition) {
method hasExtension (line 119) | hasExtension(extId) {
method getPackageVersion (line 129) | getPackageVersion(packageName) {
method extendQuasarConf (line 141) | extendQuasarConf(fn) {
method chainWebpack (line 151) | chainWebpack(fn) {
method extendWebpack (line 161) | extendWebpack(fn) {
method extendBexScriptsConf (line 171) | extendBexScriptsConf(fn) {
method extendElectronMainConf (line 181) | extendElectronMainConf(fn) {
method extendElectronPreloadConf (line 191) | extendElectronPreloadConf(fn) {
method extendPWACustomSWConf (line 202) | extendPWACustomSWConf(fn) {
method extendSSRWebserverConf (line 212) | extendSSRWebserverConf(fn) {
method registerCommand (line 224) | registerCommand(commandName, fn) {
method registerDescribeApi (line 235) | registerDescribeApi(name, relativePath) {
method beforeDev (line 250) | beforeDev(fn) {
method afterDev (line 262) | afterDev(fn) {
method beforeBuild (line 273) | beforeBuild(fn) {
method afterBuild (line 285) | afterBuild(fn) {
method onPublish (line 300) | onPublish(fn) {
method __getHooks (line 331) | __getHooks(appExtJson) {
method #addHook (line 338) | #addHook(name, fn) {
FILE: app-webpack/lib/app-extension/api-classes/InstallAPI.js
method constructor (line 21) | constructor(opts, appExtJson) {
method getPersistentConf (line 34) | getPersistentConf() {
method setPersistentConf (line 44) | setPersistentConf(cfg) {
method mergePersistentConf (line 55) | mergePersistentConf(cfg = {}) {
method compatibleWith (line 74) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 102) | hasPackage(packageName, semverCondition) {
method hasExtension (line 122) | hasExtension(extId) {
method getPackageVersion (line 132) | getPackageVersion(packageName) {
method extendPackageJson (line 144) | extendPackageJson(extPkg) {
method extendJsonFile (line 207) | extendJsonFile(file, newData) {
method render (line 255) | render(templatePath, scope) {
method renderFile (line 290) | renderFile(relativeSourcePath, relativeTargetPath, scope) {
method onExitLog (line 325) | onExitLog(msg) {
method __getNodeModuleNeedsUpdate (line 336) | __getNodeModuleNeedsUpdate(appExtJson) {
method __getHooks (line 349) | __getHooks(appExtJson) {
FILE: app-webpack/lib/app-extension/api-classes/PromptsAPI.js
method constructor (line 14) | constructor(opts, appExtJson) {
method compatibleWith (line 33) | compatibleWith(packageName, semverCondition) {
method hasPackage (line 61) | hasPackage(packageName, semverCondition) {
method hasExtension (line 81) | hasExtension(extId) {
method getPackageVersion (line 91) | getPackageVersion(packageName) {
FILE: app-webpack/lib/app-extension/api-classes/UninstallAPI.js
method constructor (line 16) | constructor(opts, appExtJson) {
method getPersistentConf (line 29) | getPersistentConf() {
method hasPackage (line 44) | hasPackage(packageName, semverCondition) {
method hasExtension (line 63) | hasExtension(extId) {
method getPackageVersion (line 73) | getPackageVersion(packageName) {
method removePath (line 91) | removePath(__path) {
method onExitLog (line 100) | onExitLog(msg) {
method __getHooks (line 114) | __getHooks(appExtJson) {
FILE: app-webpack/lib/app-extension/create-app-ext.js
function readJson (line 8) | function readJson(file) {
function getAppExtJson (line 21) | function getAppExtJson({ file, json, onListUpdate }) {
method createInstance (line 81) | createInstance(extName) {
method registerAppExtensions (line 89) | async registerAppExtensions() {
method runAppExtensionHook (line 97) | async runAppExtensionHook(hookName, fn) {
method getInstance (line 104) | getInstance(extId) {
FILE: app-webpack/lib/app-tool.js
method constructor (line 16) | constructor({ argv, ctx }) {
method buildWithWebpack (line 21) | buildWithWebpack(threadName, webpackConf) {
method watchWithEsbuild (line 64) | async watchWithEsbuild(threadName, esbuildConfig, onRebuildSuccess) {
method buildWithEsbuild (line 107) | async buildWithEsbuild(threadName, esbuildConfig) {
method cleanArtifacts (line 119) | cleanArtifacts(dir) {
FILE: app-webpack/lib/cache/module.electron.js
function isValidName (line 16) | function isValidName(bundlerName) {
function installBundler (line 20) | function installBundler(bundlerName, nodePackager) {
function hasPackage (line 29) | function hasPackage(pkgName, appPkg) {
function bundlerIsInstalled (line 43) | function bundlerIsInstalled(bundlerName) {
function ensureInstall (line 48) | function ensureInstall(bundlerName) {
function getDefaultName (line 58) | function getDefaultName() {
function getBundler (line 70) | function getBundler(bundlerName) {
FILE: app-webpack/lib/cache/module.nodePackager.js
function run (line 8) | function run({ name, params, cwd, onFail, env = 'development' }) {
function getMajorVersion (line 17) | function getMajorVersion(name) {
class PackageManager (line 31) | class PackageManager {
method constructor (line 34) | constructor(appDir) {
method getInstallParams (line 44) | getInstallParams(/* env */) {
method getInstallPackageParams (line 48) | getInstallPackageParams(/* names, isDev */) {
method getUninstallPackageParams (line 52) | getUninstallPackageParams(/* names */) {
method isInstalled (line 63) | isInstalled() {
method install (line 74) | install({
method installPackage (line 94) | installPackage(
method uninstallPackage (line 110) | uninstallPackage(name, { cwd = this.appDir, displayName = name } = {}) {
class Npm (line 123) | class Npm extends PackageManager {
method getInstallParams (line 127) | getInstallParams(env) {
method getInstallPackageParams (line 137) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 141) | getUninstallPackageParams(names) {
class Yarn (line 146) | class Yarn extends PackageManager {
method getInstallParams (line 150) | getInstallParams(env) {
method getInstallPackageParams (line 160) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 164) | getUninstallPackageParams(names) {
class Pnpm (line 169) | class Pnpm extends PackageManager {
method getInstallParams (line 173) | getInstallParams(env) {
method getInstallPackageParams (line 177) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 181) | getUninstallPackageParams(names) {
class Bun (line 186) | class Bun extends PackageManager {
method getInstallParams (line 190) | getInstallParams(env) {
method getInstallPackageParams (line 194) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 198) | getUninstallPackageParams(names) {
function getProjectPackageManager (line 206) | function getProjectPackageManager(packageManagersList, dir) {
FILE: app-webpack/lib/cache/module.quasarMeta.js
method importTransformation (line 20) | importTransformation(importName) {
FILE: app-webpack/lib/cache/module.storeProvider.js
method install (line 16) | install() {
FILE: app-webpack/lib/cmd/build.js
function runBuild (line 117) | async function runBuild() {
FILE: app-webpack/lib/cmd/describe.js
function getEventParams (line 97) | function getEventParams(event) {
function getMethodParams (line 106) | function getMethodParams(method, noRequired) {
function getMethodReturnValue (line 134) | function getMethodReturnValue(method) {
function getStringType (line 138) | function getStringType(type) {
function printProp (line 142) | function printProp(prop, propName, indentLevel) {
function printProperties (line 212) | function printProperties({ props }) {
function printSlots (line 240) | function printSlots({ slots }) {
function printEvents (line 268) | function printEvents({ events }) {
function printMethods (line 306) | function printMethods({ methods }) {
function printComputedProps (line 351) | function printComputedProps({ computedProps }) {
function printValue (line 379) | function printValue({ value }) {
function printArg (line 390) | function printArg({ arg }) {
function printModifiers (line 401) | function printModifiers({ modifiers }) {
function printInjection (line 430) | function printInjection({ injection }) {
function printQuasarConfOptions (line 440) | function printQuasarConfOptions({ quasarConfOptions }) {
function describe (line 472) | function describe(api) {
function run (line 507) | async function run() {
function listElements (line 545) | function listElements() {
FILE: app-webpack/lib/cmd/dev.js
function startVueDevtools (line 87) | function startVueDevtools(ctx, devtoolsPort) {
function runDev (line 137) | async function runDev() {
FILE: app-webpack/lib/cmd/ext.js
function showHelp (line 10) | function showHelp() {
function runExtAction (line 57) | async function runExtAction() {
FILE: app-webpack/lib/cmd/info.js
function getSpawnOutput (line 36) | function getSpawnOutput(command) {
function safePkgInfo (line 47) | function safePkgInfo(pkg, dir) {
function print (line 61) | function print(m) {
FILE: app-webpack/lib/cmd/mode.js
function showHelp (line 13) | function showHelp() {
function run (line 50) | async function run() {
function displayModes (line 114) | function displayModes() {
FILE: app-webpack/lib/cmd/new.js
function showHelp (line 18) | function showHelp(returnCode) {
function showError (line 59) | function showError(message) {
function createFile (line 116) | function createFile({ targetFile, ext, reference }) {
function getAsset (line 143) | async function getAsset(assetType) {
function generate (line 219) | async function generate() {
FILE: app-webpack/lib/cmd/prepare.js
function runPrepare (line 54) | async function runPrepare() {
FILE: app-webpack/lib/cmd/run.js
function getArgv (line 38) | function getArgv({ _, ...params }) {
function run (line 57) | async function run() {
FILE: app-webpack/lib/config-tools.js
function getDependenciesRegex (line 20) | function getDependenciesRegex(list) {
function getRawDefine (line 39) | function getRawDefine(rootDefines, compileId) {
FILE: app-webpack/lib/entry-files-generator.js
method constructor (line 9) | constructor(ctx) {
method generate (line 48) | generate(quasarConf) {
FILE: app-webpack/lib/loaders/loader.vue.auto-import-quasar.js
function transform (line 7) | function transform(itemArray, importTransformation) {
function extract (line 13) | function extract(
function getModuleIdentifierCode (line 71) | function getModuleIdentifierCode(ctx) {
FILE: app-webpack/lib/loaders/runtime.inject-module-id.js
method created (line 16) | created() {
FILE: app-webpack/lib/modes/bex/bex-builder.js
method build (line 11) | async build() {
method #bundlePackage (line 32) | #bundlePackage(dir) {
FILE: app-webpack/lib/modes/bex/bex-config.js
function generateDefaultEntry (line 13) | function generateDefaultEntry(quasarConf) {
method bexScript (line 41) | async bexScript(quasarConf, entry = generateDefaultEntry(quasarConf)) {
FILE: app-webpack/lib/modes/bex/bex-devserver.js
method constructor (line 30) | constructor(opts) {
method run (line 59) | run(quasarConf, __isRetry) {
method #onDistDir (line 79) | async #onDistDir(quasarConf) {
method #compileBexManifest (line 101) | #compileBexManifest(quasarConf, queue) {
method #compileBexScripts (line 144) | async #compileBexScripts(quasarConf) {
method #runWebpack (line 167) | async #runWebpack(quasarConf, queue) {
method #getBexAssetsDirWatcher (line 222) | #getBexAssetsDirWatcher(quasarConf) {
method #getAppSourceWatcher (line 242) | #getAppSourceWatcher(quasarConf, webpackConf, queue) {
method #getPublicDirWatcher (line 269) | #getPublicDirWatcher(quasarConf) {
FILE: app-webpack/lib/modes/bex/bex-utils.js
function getCompilationEntry (line 80) | function getCompilationEntry(quasarConf, inputFile, scriptName) {
function extractBexScripts (line 90) | function extractBexScripts(quasarConf, bexManifest) {
FILE: app-webpack/lib/modes/capacitor/capacitor-builder.js
method build (line 18) | async build() {
method #buildFiles (line 25) | async #buildFiles() {
method #packageFiles (line 31) | async #packageFiles() {
method #cleanup (line 64) | #cleanup() {
method #runCapacitorCommand (line 68) | #runCapacitorCommand(args, capBin) {
method #buildIos (line 82) | async #buildIos() {
method #buildAndroid (line 106) | async #buildAndroid() {
FILE: app-webpack/lib/modes/capacitor/capacitor-devserver.js
method constructor (line 21) | constructor(opts) {
method run (line 36) | run(quasarConf, __isRetry) {
method #runWebpack (line 48) | async #runWebpack(quasarConf) {
method #runCapacitor (line 82) | async #runCapacitor(quasarConf) {
method #stopCapacitor (line 104) | #stopCapacitor() {
method #runCapacitorCommand (line 112) | #runCapacitorCommand(args, cwd, capBin) {
method #cleanup (line 126) | #cleanup() {
FILE: app-webpack/lib/modes/capacitor/capacitor-installation.js
function addPlatform (line 131) | function addPlatform(target, appPaths, cacheProxy) {
FILE: app-webpack/lib/modes/capacitor/config-file.js
function getAndroidMainActivity (line 13) | function getAndroidMainActivity(capVersion, appId) {
method prepare (line 67) | async prepare(quasarConf, target) {
method reset (line 96) | reset() {
method #save (line 107) | #save() {
method #updateCapJson (line 114) | #updateCapJson(quasarConf, originalCapCfg, capVersion, target) {
method #updateCapPkg (line 146) | #updateCapPkg(quasarConf) {
method #updateSSL (line 165) | #updateSSL(quasarConf, target, capVersion) {
method #handleSSLonIOS (line 203) | #handleSSLonIOS(add) {
method #getIosCapacitorBridgeFile (line 225) | #getIosCapacitorBridgeFile() {
method #injectIntoFile (line 244) | #injectIntoFile(file, needle, content) {
method #removeFromFile (line 287) | #removeFromFile(file, content) {
method #handleSSLonAndroid (line 300) | #handleSSLonAndroid(add, capVersion) {
FILE: app-webpack/lib/modes/capacitor/ensure-consistency.js
function ensureWWW (line 4) | function ensureWWW({ appPaths, forced }) {
function ensureDeps (line 15) | function ensureDeps({ appPaths, cacheProxy }) {
FILE: app-webpack/lib/modes/cordova/config-file.js
function setFields (line 9) | function setFields(root, cfg) {
method prepare (line 38) | prepare(quasarConf) {
method reset (line 93) | reset() {
method #save (line 115) | #save(doc) {
method #prepareAppDelegate (line 126) | #prepareAppDelegate(node) {
method #prepareWkWebEngine (line 178) | #prepareWkWebEngine(node) {
FILE: app-webpack/lib/modes/cordova/cordova-builder.js
function ensureArray (line 28) | function ensureArray(val) {
method build (line 35) | async build() {
method #buildFiles (line 40) | async #buildFiles() {
method #packageFiles (line 46) | async #packageFiles() {
method #cleanup (line 125) | #cleanup() {
method #runCordovaCommand (line 129) | #runCordovaCommand(args, target) {
FILE: app-webpack/lib/modes/cordova/cordova-devserver.js
method constructor (line 22) | constructor(opts) {
method run (line 41) | run(quasarConf, __isRetry) {
method #runWebpack (line 53) | async #runWebpack(quasarConf) {
method #runCordova (line 87) | async #runCordova(quasarConf) {
method #stopCordova (line 117) | #stopCordova() {
method #runCordovaCommand (line 125) | #runCordovaCommand(quasarConf, args) {
method #cleanup (line 151) | #cleanup() {
FILE: app-webpack/lib/modes/cordova/cordova-installation.js
function addPlatform (line 114) | function addPlatform(appPaths, target) {
FILE: app-webpack/lib/modes/cordova/ensure-consistency.js
function ensureWWW (line 7) | function ensureWWW({ appPaths, forced }) {
function ensureDeps (line 18) | function ensureDeps({ appPaths }) {
FILE: app-webpack/lib/modes/electron/electron-builder.js
method build (line 12) | async build() {
method #buildFiles (line 24) | async #buildFiles() {
method #writePackageJson (line 43) | #writePackageJson() {
method #copyElectronFiles (line 75) | #copyElectronFiles() {
method #packageFiles (line 115) | async #packageFiles() {
FILE: app-webpack/lib/modes/electron/electron-config.js
function preloadScript (line 12) | async function preloadScript(quasarConf, name) {
method preloadScriptList (line 113) | async preloadScriptList(quasarConf) {
FILE: app-webpack/lib/modes/electron/electron-devserver.js
function wait (line 13) | function wait(time) {
method constructor (line 28) | constructor(opts) {
method run (line 55) | run(quasarConf, __isRetry) {
method #runWebpack (line 67) | async #runWebpack(quasarConf) {
method #runElectronFiles (line 101) | async #runElectronFiles(quasarConf) {
method #runElectron (line 134) | async #runElectron(quasarConf) {
FILE: app-webpack/lib/modes/pwa/plugin.webpack.pwa-manifest.js
function warn (line 6) | function warn(msg) {
method constructor (line 13) | constructor(cfg = {}) {
method #createManifest (line 17) | #createManifest() {
method apply (line 53) | apply(compiler) {
FILE: app-webpack/lib/modes/pwa/plugin.webpack.workbox-warning.js
method apply (line 7) | apply(compiler) {
FILE: app-webpack/lib/modes/pwa/pwa-builder.js
method build (line 5) | async build() {
FILE: app-webpack/lib/modes/pwa/pwa-config.js
function injectWebpackPwa (line 14) | function injectWebpackPwa(webpackChain, quasarConf) {
FILE: app-webpack/lib/modes/pwa/pwa-devserver.js
method constructor (line 15) | constructor(opts) {
method run (line 55) | run(quasarConf, __isRetry) {
method #runWebpack (line 71) | async #runWebpack(quasarConf, urlDiffers) {
method #compileCustomServiceWorker (line 116) | async #compileCustomServiceWorker(quasarConf) {
FILE: app-webpack/lib/modes/spa/spa-builder.js
method build (line 5) | async build() {
FILE: app-webpack/lib/modes/spa/spa-devserver.js
method run (line 14) | run(quasarConf, __isRetry) {
method #runWebpack (line 24) | async #runWebpack(quasarConf, urlDiffers) {
FILE: app-webpack/lib/modes/ssr/plugin.webpack.client-side.js
function ensureTrailingSlash (line 17) | function ensureTrailingSlash(path) {
function groupFiles (line 21) | function groupFiles(fileList) {
function getClientManifest (line 33) | function getClientManifest(compilation) {
method apply (line 108) | apply(compiler) {
FILE: app-webpack/lib/modes/ssr/plugin.webpack.server-side.js
function warn (line 13) | function warn(msg) {
function error (line 17) | function error(msg) {
function extractAndValidateCompilationStats (line 21) | function extractAndValidateCompilationStats(compilation) {
method apply (line 77) | apply(compiler) {
FILE: app-webpack/lib/modes/ssr/ssr-builder.js
method build (line 18) | async build() {
method #buildWebserver (line 50) | async #buildWebserver() {
method #copyWebserverFiles (line 55) | #copyWebserverFiles() {
method #writePackageJson (line 65) | #writePackageJson() {
method #writeRenderTemplate (line 108) | async #writeRenderTemplate() {
FILE: app-webpack/lib/modes/ssr/ssr-config.js
function getModuleDirs (line 20) | function getModuleDirs(dir) {
FILE: app-webpack/lib/modes/ssr/ssr-devserver.js
function logServerMessage (line 23) | function logServerMessage(title, msg, additional) {
function getClientHMRScriptQuery (line 35) | function getClientHMRScriptQuery(devServerCfg) {
function injectHMREntryPoints (line 53) | function injectHMREntryPoints(webpackConf, devServerCfg) {
function promisify (line 65) | function promisify(fn) {
method constructor (line 91) | constructor(opts) {
method run (line 156) | run(quasarConf, __isRetry) {
method #compileWebserver (line 180) | async #compileWebserver(quasarConf, queue) {
method #runWebpack (line 198) | async #runWebpack(quasarConf, urlDiffers) {
method #bootWebserver (line 377) | async #bootWebserver(quasarConf) {
method #createLazyDevHttpsServer (line 524) | #createLazyDevHttpsServer(httpsOptions, app) {
method #compileCustomServiceWorker (line 571) | async #compileCustomServiceWorker(quasarConf) {
FILE: app-webpack/lib/plugins/esbuild.eslint.js
function normalizePath (line 15) | function normalizePath(id) {
function parseIssue (line 21) | function parseIssue(path, reportEntry) {
function extractStore (line 44) | function extractStore(
function getLinter (line 95) | function getLinter(quasarConf, compileId) {
method setup (line 137) | setup(build) {
FILE: app-webpack/lib/plugins/esbuild.inject-replacements.js
method setup (line 17) | setup(build) {
FILE: app-webpack/lib/plugins/esbuild.vue-shim.js
method setup (line 7) | setup(build) {
FILE: app-webpack/lib/plugins/webpack.boot-default-export.js
method apply (line 2) | apply(compiler) {
FILE: app-webpack/lib/plugins/webpack.html-transform.js
method constructor (line 6) | constructor(transformHtmlFn) {
method apply (line 10) | apply(compiler) {
FILE: app-webpack/lib/plugins/webpack.progress.js
function isCompilationIdle (line 25) | function isCompilationIdle() {
function createState (line 29) | function createState(name) {
function printBars (line 67) | function printBars() {
function printStatus (line 112) | function printStatus() {
method constructor (line 151) | constructor({ name, quasarConf }) {
method apply (line 175) | apply(compiler) {
method resetStats (line 269) | resetStats() {
method updateBars (line 274) | updateBars(percent, msg, details) {
FILE: app-webpack/lib/quasar-config-file.js
function escapeHTMLTagContent (line 55) | function escapeHTMLTagContent(str) {
function escapeHTMLAttribute (line 58) | function escapeHTMLAttribute(str) {
function formatPublicPath (line 62) | function formatPublicPath(publicPath) {
function formatRouterBase (line 82) | function formatRouterBase(publicPath) {
function parseAssetProperty (line 93) | function parseAssetProperty(prefix) {
function getUniqueArray (line 113) | function getUniqueArray(original) {
function uniquePathFilter (line 117) | function uniquePathFilter(value, index, self) {
function uniqueRegexFilter (line 121) | function uniqueRegexFilter(value, index, self) {
function formatQuasarAssetPath (line 126) | function formatQuasarAssetPath(asset, type) {
function onAddress (line 137) | async function onAddress({ host, port }, mode) {
method constructor (line 204) | constructor({ ctx, host, port, verifyAddress, watch }) {
method init (line 227) | async init() {
method read (line 266) | read() {
method watch (line 274) | watch() {
method #createEsbuildConfig (line 278) | #createEsbuildConfig() {
method #build (line 317) | async #build(esbuildConfig) {
method #buildAndWatch (line 349) | async #buildAndWatch(esbuildConfig) {
method #computeConfig (line 459) | async #computeConfig(quasarConfigFn, failOnError) {
FILE: app-webpack/lib/types-generator.js
method writeFileSync (line 38) | writeFileSync(filename, content) {
function generateTsConfig (line 62) | function generateTsConfig(quasarConf, fsUtils) {
function writeFeatureFlags (line 196) | function writeFeatureFlags(quasarConf, fsUtils) {
function writeDeclarations (line 258) | function writeDeclarations(quasarConf, fsUtils) {
FILE: app-webpack/lib/utils/app-files-validations.js
function getRelativePath (line 7) | function getRelativePath(appPaths, file) {
FILE: app-webpack/lib/utils/banner.js
function getPackager (line 7) | function getPackager(argv, cmd) {
function getCompilationTarget (line 19) | function getCompilationTarget(target) {
function getIPList (line 141) | function getIPList() {
function capitalize (line 150) | function capitalize(str) {
FILE: app-webpack/lib/utils/env.js
function getFileEnvResult (line 52) | function getFileEnvResult({
function getFileEnv (line 135) | function getFileEnv(env) {
FILE: app-webpack/lib/utils/get-app-paths.js
function getAppInfo (line 14) | function getAppInfo(appDir) {
function getPostcssConfigFile (line 43) | function getPostcssConfigFile(appDir) {
function getBabelConfigFile (line 62) | function getBabelConfigFile(appDir) {
function getRunType (line 71) | function getRunType(ctx) {
function getPrefixDir (line 77) | function getPrefixDir(ctx) {
FILE: app-webpack/lib/utils/get-ctx.js
function defineHiddenProp (line 6) | function defineHiddenProp(target, propName, value) {
FILE: app-webpack/lib/utils/get-package-major-version.js
function getMajorVersion (line 3) | function getMajorVersion(version) {
FILE: app-webpack/lib/utils/get-pkg.js
function getAppPackageJson (line 19) | function getAppPackageJson() {
FILE: app-webpack/lib/utils/html-template.js
function injectPublicPath (line 23) | function injectPublicPath(html, publicPath) {
function injectSsrRuntimeInterpolation (line 33) | function injectSsrRuntimeInterpolation(html) {
function injectPwaTags (line 74) | function injectPwaTags(html, quasarConf) {
function transformHtml (line 106) | async function transformHtml({ html, quasarConf, renderSsrPwaOffline }) {
FILE: app-webpack/lib/utils/inject-eslint-plugin.js
function extractPluginConfig (line 5) | function extractPluginConfig({
FILE: app-webpack/lib/utils/inject-style-rules.js
function shouldRequireUrl (line 21) | function shouldRequireUrl(url) {
function createRule (line 35) | async function createRule({ rule, isModules, pref, loader, loaderOptions...
function injectRule (line 174) | function injectRule(chain, pref, lang, test, loader, loaderOptions) {
FILE: app-webpack/lib/utils/logger.js
function log (line 57) | function log(msg) {
function success (line 87) | function success(msg, title = 'SUCCESS') {
function info (line 95) | function info(msg, title = 'INFO') {
FILE: app-webpack/lib/utils/net.js
function isPortAvailable (line 57) | function isPortAvailable(port, host) {
FILE: app-webpack/lib/utils/open-ide.js
function findXcodeWorkspace (line 7) | function findXcodeWorkspace(folder) {
function runMacOS (line 19) | function runMacOS({ mode, target, appPaths, open }) {
function getLinuxPath (line 42) | function getLinuxPath(bin) {
function runLinux (line 63) | function runLinux({ mode, bin, target, appPaths, open }) {
function getWindowsPath (line 89) | function getWindowsPath(bin) {
function runWindows (line 120) | function runWindows({ mode, bin, target, appPaths, open }) {
FILE: app-webpack/lib/utils/print-build-summary.js
function getAssets (line 22) | function getAssets(distDir) {
function getHumanSize (line 44) | function getHumanSize(bytes) {
function getGzippedSize (line 48) | function getGzippedSize(file) {
function getAssetLines (line 57) | function getAssetLines(assetList, showGzipped) {
function getAssetColumnWidth (line 127) | function getAssetColumnWidth(assetList) {
function capitalize (line 153) | function capitalize(str) {
function getTable (line 157) | function getTable(widthMap) {
FILE: app-webpack/lib/utils/print-webpack-issue/extractWebpackError.js
function getOriginalErrorStack (line 11) | function getOriginalErrorStack(e) {
function getFile (line 20) | function getFile(e) {
function getOrigin (line 32) | function getOrigin(e) {
FILE: app-webpack/lib/utils/print-webpack-issue/formatters/babelError.js
function cleanMessage (line 6) | function cleanMessage(message) {
FILE: app-webpack/lib/utils/print-webpack-issue/formatters/stringError.js
function extract (line 3) | function extract(message) {
FILE: app-webpack/lib/utils/print-webpack-issue/index.js
function extract (line 9) | function extract(stats, severity) {
function getMaxSeverityErrors (line 26) | function getMaxSeverityErrors(errors) {
function display (line 35) | function display(stats, severity, titleFn) {
FILE: app-webpack/lib/utils/progress-log.js
function progressLog (line 5) | function progressLog(str) {
FILE: app-webpack/playground-js/babel.config.js
function babelConfig (line 1) | function babelConfig(api) {
FILE: app-webpack/playground-ts/src/components/models.ts
type Todo (line 1) | interface Todo {
type Meta (line 6) | interface Meta {
FILE: app-webpack/playground-ts/src/env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: app-webpack/templates/bex/js/background.js
function openExtension (line 12) | function openExtension () {
FILE: app-webpack/templates/bex/ts/background.ts
function openExtension (line 12) | function openExtension () {
type BexEventMap (line 27) | interface BexEventMap {
FILE: app-webpack/templates/bex/ts/my-content-script.ts
type BexEventMap (line 21) | interface BexEventMap {
FILE: app-webpack/templates/electron/js/electron-main.js
function createWindow (line 13) | async function createWindow () {
FILE: app-webpack/templates/electron/ts/electron-env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: app-webpack/templates/electron/ts/electron-main.ts
function createWindow (line 13) | async function createWindow() {
FILE: app-webpack/templates/entry/app.js
method setup (line 45) | setup (props) {
FILE: app-webpack/templates/entry/client-entry.js
method if (line 112) | if (err && err.url) {
FILE: app-webpack/templates/entry/server-entry.js
function getRedirectUrl (line 58) | function getRedirectUrl (url, router) {
FILE: app-webpack/templates/entry/ssr-middlewares.js
function injectMiddlewares (line 7) | function injectMiddlewares (opts) {
FILE: app-webpack/templates/entry/ssr-prod-webserver.js
function resolvePublicFolder (line 30) | function resolvePublicFolder () {
method root (line 51) | root () { return join(rootFolder, ...arguments) }
function startServer (line 65) | async function startServer () {
FILE: app-webpack/templates/pwa/js/register-service-worker.js
method ready (line 14) | ready (/* registration */) {
method registered (line 18) | registered (/* registration */) {
method cached (line 22) | cached (/* registration */) {
method updatefound (line 26) | updatefound (/* registration */) {
method updated (line 30) | updated (/* registration */) {
method offline (line 34) | offline () {
method error (line 38) | error (/* err */) {
FILE: app-webpack/templates/pwa/ts/pwa-env.d.ts
type ProcessEnv (line 4) | interface ProcessEnv {
FILE: app-webpack/templates/pwa/ts/register-service-worker.ts
method ready (line 14) | ready (/* registration */) {
method registered (line 18) | registered (/* registration */) {
method cached (line 22) | cached (/* registration */) {
method updatefound (line 26) | updatefound (/* registration */) {
method updated (line 30) | updated (/* registration */) {
method offline (line 34) | offline () {
method error (line 38) | error (/* err */) {
FILE: app-webpack/templates/ssr/ts/server.ts
type SsrDriver (line 26) | interface SsrDriver {
FILE: app-webpack/templates/store/pinia/ts/index.ts
type PiniaCustomProperties (line 11) | interface PiniaCustomProperties {
FILE: app-webpack/types/app-extension.d.ts
type QuasarConfProxy (line 7) | type QuasarConfProxy = DeepRequired<DeepNonNullable<QuasarConf>>;
type ExtractQuasarConfParameters (line 8) | type ExtractQuasarConfParameters<
type ChainWebpackHandler (line 16) | type ChainWebpackHandler = (
type ExtendWebpackHandler (line 21) | type ExtendWebpackHandler = (
type GetPersistentConfHandler (line 30) | type GetPersistentConfHandler = () => Record<string, unknown>;
type HasExtensionHandler (line 31) | type HasExtensionHandler = (extId: string) => boolean;
type BaseAPI (line 33) | interface BaseAPI {
type SharedIndexInstallAPI (line 50) | interface SharedIndexInstallAPI {
type Callback (line 60) | type Callback<T> = (callback: T) => void;
type IndexAPI (line 62) | interface IndexAPI extends BaseAPI, SharedIndexInstallAPI {
type ExitLogHandler (line 116) | type ExitLogHandler = (msg: string) => void;
type InstallAPI (line 117) | interface InstallAPI extends BaseAPI, SharedIndexInstallAPI {
type UninstallAPI (line 131) | interface UninstallAPI extends BaseAPI {
type PromptsAPI (line 140) | interface PromptsAPI extends BaseAPI {
FILE: app-webpack/types/app-paths.d.ts
type IResolve (line 1) | interface IResolve {
type QuasarAppPaths (line 14) | interface QuasarAppPaths {
FILE: app-webpack/types/bex/bridge.d.ts
type BexEventMap (line 29) | interface BexEventMap {}
type BexEventName (line 31) | type BexEventName = LiteralUnion<Exclude<keyof BexEventMap, number>>;
type BexEventEntry (line 32) | type BexEventEntry<
type BexEventData (line 40) | type BexEventData<T extends BexEventName> = BexEventEntry<T>[0];
type BexEventResponse (line 41) | type BexEventResponse<T extends BexEventName> = BexEventEntry<T>[1];
type PortName (line 46) | type PortName = "background" | "app" | `content@${string}-${string}`;
type BexPayload (line 48) | type BexPayload<T extends BexEventName> =
type BexMessage (line 55) | type BexMessage<T extends BexEventName> = {
type BexEventListener (line 61) | type BexEventListener<T extends BexEventName> = (
type BexBridgeOptions (line 65) | type BexBridgeOptions = {
type BexBridge (line 104) | interface BexBridge {
FILE: app-webpack/types/boot.d.ts
type BootFileParams (line 6) | interface BootFileParams extends HasSsrParam, HasStoreParam {
type BootCallback (line 14) | type BootCallback = (params: BootFileParams) => void | Promise<void>;
FILE: app-webpack/types/configuration.d.ts
type ConfigureCallback (line 4) | type ConfigureCallback = (
FILE: app-webpack/types/configuration/bex.d.ts
type QuasarBexConfiguration (line 3) | interface QuasarBexConfiguration {
FILE: app-webpack/types/configuration/boot.d.ts
type BootConfigurationItem (line 1) | interface BootConfigurationItem {
type QuasarBootConfiguration (line 7) | type QuasarBootConfiguration = (string | BootConfigurationItem)[];
FILE: app-webpack/types/configuration/build.d.ts
type HtmlMinifierOptions (line 9) | interface HtmlMinifierOptions {
type StripEnums (line 51) | type StripEnums<T extends Record<string, any>> = {
type TSConfig (line 64) | interface TSConfig {
type InvokeParams (line 74) | interface InvokeParams {
type EsbuildTargetOptions (line 79) | interface EsbuildTargetOptions {
type QuasarStaticBuildConfiguration (line 90) | interface QuasarStaticBuildConfiguration {
type QuasarDynamicBuildConfiguration (line 364) | interface QuasarDynamicBuildConfiguration {
type QuasarBuildConfiguration (line 395) | type QuasarBuildConfiguration = QuasarStaticBuildConfiguration &
FILE: app-webpack/types/configuration/capacitor-conf.d.ts
type QuasarCapacitorTargets (line 1) | type QuasarCapacitorTargets = "android" | "ios";
type QuasarCapacitorConfiguration (line 3) | interface QuasarCapacitorConfiguration {
FILE: app-webpack/types/configuration/conf.d.ts
type DevServerOptions (line 20) | type DevServerOptions = Omit<WebpackDevServerConfiguration, "open"> & {
type QuasarSourceFilesConfiguration (line 43) | interface QuasarSourceFilesConfiguration {
type BaseQuasarConfiguration (line 55) | interface BaseQuasarConfiguration {
type QuasarHookParams (line 104) | interface QuasarHookParams {
type QuasarConf (line 108) | type QuasarConf = BaseQuasarConfiguration &
FILE: app-webpack/types/configuration/context.d.ts
type QuasarMode (line 13) | type QuasarMode =
type QuasarBexTargets (line 22) | type QuasarBexTargets = "chrome" | "firefox";
type BaseQuasarContext (line 23) | interface BaseQuasarContext {
type CapacitorQuasarContext (line 39) | interface CapacitorQuasarContext extends BaseQuasarContext {
type CordovaQuasarContext (line 54) | interface CordovaQuasarContext extends BaseQuasarContext {
type BaseElectronQuasarContext (line 76) | interface BaseElectronQuasarContext extends BaseQuasarContext {
type ElectronBuilderQuasarContext (line 83) | interface ElectronBuilderQuasarContext extends BaseElectronQuasarContext {
type ElectronPackagerQuasarContext (line 114) | interface ElectronPackagerQuasarContext extends BaseElectronQuasarContext {
type ElectronQuasarContext (line 133) | type ElectronQuasarContext =
type SpaQuasarContext (line 137) | interface SpaQuasarContext extends BaseQuasarContext {
type PwaQuasarContext (line 142) | interface PwaQuasarContext extends BaseQuasarContext {
type SsrQuasarContext (line 147) | interface SsrQuasarContext extends BaseQuasarContext {
type BexQuasarContext (line 152) | interface BexQuasarContext extends BaseQuasarContext {
type QuasarContext (line 163) | type QuasarContext =
type CacheProxyModuleKey (line 172) | type CacheProxyModuleKey =
type CacheProxy (line 184) | interface CacheProxy {
type InternalQuasarContext (line 193) | type InternalQuasarContext = QuasarContext & {
FILE: app-webpack/types/configuration/cordova-conf.d.ts
type QuasarCordovaTargets (line 1) | type QuasarCordovaTargets =
type QuasarCordovaConfiguration (line 11) | interface QuasarCordovaConfiguration {
FILE: app-webpack/types/configuration/electron-conf.d.ts
type QuasarElectronBundlersInternal (line 7) | type QuasarElectronBundlersInternal = "builder" | "packager";
type ElectronBuilderConfiguration (line 9) | type ElectronBuilderConfiguration = ElectronBuilder.Configuration;
type ElectronPackagerOptions (line 10) | type ElectronPackagerOptions = ElectronPackager.Options;
type QuasarBaseElectronConfiguration (line 12) | interface QuasarBaseElectronConfiguration {
type QuasarElectronPackagerConfiguration (line 69) | interface QuasarElectronPackagerConfiguration extends QuasarBaseElectron...
type QuasarElectronBuilderConfiguration (line 79) | interface QuasarElectronBuilderConfiguration extends QuasarBaseElectronC...
type QuasarElectronBundlers (line 86) | type QuasarElectronBundlers = QuasarElectronBundlersInternal;
type ElectronBuilderArchs (line 88) | type ElectronBuilderArchs = ElectronBuilderUtil.Arch;
type ElectronBuilderTargets (line 90) | type ElectronBuilderTargets = string;
type ElectronPackagerArchs (line 92) | type ElectronPackagerArchs = LiteralUnion<
type ElectronPackagerTargets (line 95) | type ElectronPackagerTargets = LiteralUnion<
type QuasarElectronConfiguration (line 99) | type QuasarElectronConfiguration =
FILE: app-webpack/types/configuration/eslint.d.ts
type QuasarEslintConfiguration (line 4) | interface QuasarEslintConfiguration {
FILE: app-webpack/types/configuration/framework-conf.d.ts
type AnyFn (line 10) | type AnyFn = (...args: any) => any;
type SerializableConfiguration (line 11) | type SerializableConfiguration<T> = {
type QuasarFrameworkConfiguration (line 17) | interface QuasarFrameworkConfiguration {
FILE: app-webpack/types/configuration/mobile-conf.d.ts
type QuasarMobileConfiguration (line 1) | interface QuasarMobileConfiguration {
FILE: app-webpack/types/configuration/pwa-conf.d.ts
type PwaManifestDirection (line 5) | type PwaManifestDirection = "ltr" | "rtl" | "auto";
type PwaManifestDisplay (line 7) | type PwaManifestDisplay =
type PwaManifestOrientation (line 13) | type PwaManifestOrientation =
type PwaManifestScreenshot (line 23) | interface PwaManifestScreenshot {
type PwaManifestServiceWorker (line 29) | interface PwaManifestServiceWorker {
type PwaManifestRelatedApplications (line 33) | interface PwaManifestRelatedApplications {
type PwaManifestIcon (line 39) | interface PwaManifestIcon {
type PwaManifestOptions (line 46) | interface PwaManifestOptions {
type InjectPwaMetaTagsParams (line 69) | interface InjectPwaMetaTagsParams {
type QuasarPwaConfiguration (line 79) | interface QuasarPwaConfiguration {
FILE: app-webpack/types/configuration/ssr-conf.d.ts
type QuasarSsrConfiguration (line 3) | interface QuasarSsrConfiguration {
FILE: app-webpack/types/globals.d.ts
type GlobalsTypesHolder (line 6) | interface GlobalsTypesHolder {
FILE: app-webpack/types/prefetch.d.ts
type PreFetchOptions (line 5) | interface PreFetchOptions extends HasSsrParam, HasStoreParam {
type PrefetchCallback (line 15) | type PrefetchCallback = (
type ComponentCustomOptions (line 20) | interface ComponentCustomOptions {
FILE: app-webpack/types/route.d.ts
type RouteParams (line 5) | type RouteParams = {} & HasSsrParam & HasStoreParam;
type RouteCallback (line 7) | type RouteCallback = (params: RouteParams) => Router | Promise<Router>;
FILE: app-webpack/types/ssr/context.d.ts
type QSsrContext (line 5) | interface QSsrContext extends HasStoreParam {
FILE: app-webpack/types/ssr/driver.d.ts
type SsrDriver (line 17) | interface SsrDriver extends Record<string, unknown> {}
type SsrDriverTypes (line 22) | interface SsrDriverTypes {
FILE: app-webpack/types/ssr/ssrmiddleware.d.ts
type RenderParams (line 8) | interface RenderParams extends Pick<
type RenderVueParams (line 13) | interface RenderVueParams extends RenderParams, Record<string, any> {}
type RenderError (line 15) | interface RenderError extends Error {
type RenderErrorParams (line 20) | interface RenderErrorParams extends RenderParams {
type SsrMiddlewareResolve (line 24) | interface SsrMiddlewareResolve {
type SsrMiddlewareFolders (line 41) | interface SsrMiddlewareFolders {
type SsrCreateParams (line 46) | interface SsrCreateParams {
type SsrCreateCallback (line 71) | type SsrCreateCallback = (
type SsrServeStaticContentParams (line 75) | interface SsrServeStaticContentParams extends SsrCreateParams {
type SsrServeStaticFnParams (line 79) | interface SsrServeStaticFnParams {
type SsrServeStaticFn (line 101) | type SsrServeStaticFn = (
type SsrServeStaticContentCallback (line 105) | type SsrServeStaticContentCallback = (
type SsrMiddlewareServe (line 109) | interface SsrMiddlewareServe {
type SsrMiddlewareParams (line 124) | interface SsrMiddlewareParams extends SsrServeStaticContentParams {
type SsrMiddlewareCallback (line 134) | type SsrMiddlewareCallback = (
type SsrListenHandlerResult (line 138) | interface SsrListenHandlerResult {
type SsrListenCallback (line 142) | type SsrListenCallback = (
type SsrCloseParams (line 150) | interface SsrCloseParams extends SsrMiddlewareParams {
type SsrCloseCallback (line 154) | type SsrCloseCallback = (params: SsrCloseParams) => void;
type SsrRenderPreloadTagCallbackOptions (line 156) | interface SsrRenderPreloadTagCallbackOptions {
type SsrRenderPreloadTagCallback (line 160) | type SsrRenderPreloadTagCallback = (
type SsrInjectDevMiddlewareParam (line 170) | type SsrInjectDevMiddlewareParam = (
type SsrInjectDevMiddlewareFn (line 175) | type SsrInjectDevMiddlewareFn = (
type SsrInjectDevMiddlewareCallback (line 179) | type SsrInjectDevMiddlewareCallback = (
FILE: app-webpack/types/store.d.ts
type StoreInstance (line 5) | type StoreInstance = Pinia;
type HasStoreParam (line 7) | type HasStoreParam = HasStore<{
type StoreParams (line 14) | type StoreParams = {} & HasSsrParam;
type StoreCallback (line 16) | type StoreCallback = (
FILE: cli/lib/app-paths.js
function getAppInfo (line 13) | function getAppInfo() {
FILE: cli/lib/cmd/info.js
function getSpawnOutput (line 32) | function getSpawnOutput(command) {
FILE: cli/lib/cmd/serve.js
function getAbsolutePath (line 82) | function getAbsolutePath(pathParam) {
FILE: cli/lib/cmd/upgrade.js
function getQuasarVersionPrefix (line 166) | function getQuasarVersionPrefix(version) {
FILE: cli/lib/get-package-json.js
function getPackageJson (line 10) | function getPackageJson(pkgName, folder = appPaths.appDir) {
FILE: cli/lib/get-package-path.js
function getPackagePath (line 9) | function getPackagePath(pkgName, folder = appPaths.appDir) {
FILE: cli/lib/logger.js
function tip (line 47) | function tip(msg) {
function log (line 51) | function log(msg) {
function warn (line 55) | function warn(msg, pill) {
function fatal (line 66) | function fatal(msg, pill) {
function success (line 82) | function success(msg, title = 'SUCCESS') {
function getSuccess (line 87) | function getSuccess(msg, title) {
function info (line 91) | function info(msg, title = 'INFO') {
function getInfo (line 94) | function getInfo(msg, title) {
function error (line 98) | function error(msg, title = 'ERROR') {
function getError (line 103) | function getError(msg, title = 'ERROR') {
function warning (line 107) | function warning(msg, title = 'WARNING') {
function getWarning (line 112) | function getWarning(msg, title = 'WARNING') {
function progress (line 120) | function progress(msg, token) {
FILE: cli/lib/net.js
function getExternalNetworkInterface (line 3) | function getExternalNetworkInterface() {
function getIPs (line 20) | function getIPs() {
FILE: cli/lib/node-packager.js
function getNpmRegistryUrl (line 12) | function getNpmRegistryUrl() {
function getPackageVersionList (line 23) | async function getPackageVersionList(packageName, npmRegistryUrl) {
function run (line 53) | function run({ name, params, cwd, onFail, env = 'development' }) {
function getMajorVersion (line 62) | function getMajorVersion(name) {
class PackageManager (line 76) | class PackageManager {
method getInstallParams (line 83) | getInstallParams(/* env */) {
method getInstallPackageParams (line 87) | getInstallPackageParams(/* names, isDev */) {
method getUninstallPackageParams (line 91) | getUninstallPackageParams(/* names */) {
method isInstalled (line 103) | isInstalled() {
method install (line 114) | install({ cwd, params, displayName, env = 'development' } = {}) {
method installPackage (line 129) | installPackage(
method uninstallPackage (line 145) | uninstallPackage(name, { cwd, displayName = name } = {}) {
method npmRegistryUrl (line 157) | get npmRegistryUrl() {
method npmRegistryUrl (line 164) | set npmRegistryUrl(url) {
method getPackageLatestVersion (line 170) | async getPackageLatestVersion({
class Npm (line 200) | class Npm extends PackageManager {
method getInstallParams (line 204) | getInstallParams(env) {
method getInstallPackageParams (line 214) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 218) | getUninstallPackageParams(names) {
class Yarn (line 223) | class Yarn extends PackageManager {
method getInstallParams (line 227) | getInstallParams(env) {
method getInstallPackageParams (line 237) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 241) | getUninstallPackageParams(names) {
class Pnpm (line 246) | class Pnpm extends PackageManager {
method getInstallParams (line 250) | getInstallParams(env) {
method getInstallPackageParams (line 254) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 258) | getUninstallPackageParams(names) {
class Bun (line 263) | class Bun extends PackageManager {
method getInstallParams (line 267) | getInstallParams(env) {
method getInstallPackageParams (line 271) | getInstallPackageParams(names, isDevDependency) {
method getUninstallPackageParams (line 275) | getUninstallPackageParams(names) {
function getProjectPackageManager (line 285) | function getProjectPackageManager(folder) {
function getNodePackager (line 304) | function getNodePackager(folder = appPaths.appDir) {
FILE: cli/lib/spawn.js
function spawn (line 7) | function spawn(cmd, params, opts, onClose) {
function spawnSync (line 40) | function spawnSync(cmd, params, opts, onFail) {
FILE: create-quasar/index.js
function finalize (line 111) | function finalize() {
FILE: create-quasar/scripts/create-test-project.ts
type ScriptType (line 3) | type ScriptType = "js" | "ts";
type AppEngine (line 4) | type AppEngine = "vite-2" | "webpack-4";
type PackageManager (line 5) | type PackageManager = "yarn" | "npm" | "pnpm";
type CreateProjectOptions (line 7) | type CreateProjectOptions = {
function createProject (line 13) | async function createProject({
FILE: create-quasar/templates/app-extension/ae-js/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app-extension/ae-ts/BASE/app-extension/src/runtime/components/types.ts
type IsKeyRequired (line 3) | type IsKeyRequired<T, Keys extends keyof T> =
type PropOptions (line 14) | type PropOptions<T> = {
FILE: create-quasar/templates/app-extension/ae-ts/BASE/app-extension/src/runtime/index.ts
type GlobalComponents (line 4) | interface GlobalComponents {
FILE: create-quasar/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/src/env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: create-quasar/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/quasar.config.ts
method chainWebpack (line 66) | chainWebpack(chain /* chain, { isClient, isServer } */) {
FILE: create-quasar/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/src/env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: create-quasar/templates/app-extension/ae-ts/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app-extension/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/js-vite-2/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/js-vite-2/pinia/src/stores/example-store.js
method increment (line 13) | increment() {
FILE: create-quasar/templates/app/quasar-v2/js-webpack-4/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/js-webpack-4/pinia/src/stores/example-store.js
method increment (line 11) | increment() {
FILE: create-quasar/templates/app/quasar-v2/js-webpack-4/pinia/src/stores/store-flag.d.ts
type QuasarFeatureFlags (line 10) | interface QuasarFeatureFlags {
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/BASE/src/components/models.ts
type Todo (line 1) | interface Todo {
type Meta (line 6) | interface Meta {
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/BASE/src/env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/i18n/src/boot/i18n.ts
type MessageLanguages (line 6) | type MessageLanguages = keyof typeof messages;
type MessageSchema (line 8) | type MessageSchema = typeof messages['en-US'];
type DefineLocaleMessage (line 14) | interface DefineLocaleMessage extends MessageSchema {}
type DefineDateTimeFormat (line 17) | interface DefineDateTimeFormat {}
type DefineNumberFormat (line 20) | interface DefineNumberFormat {}
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/pinia/src/stores/example-store.ts
method increment (line 13) | increment() {
FILE: create-quasar/templates/app/quasar-v2/ts-vite-2/pinia/src/stores/index.ts
type PiniaCustomProperties (line 11) | interface PiniaCustomProperties {
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/BASE/src/components/models.ts
type Todo (line 1) | interface Todo {
type Meta (line 6) | interface Meta {
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/BASE/src/env.d.ts
type ProcessEnv (line 2) | interface ProcessEnv {
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/i18n/src/boot/i18n.ts
type MessageLanguages (line 6) | type MessageLanguages = keyof typeof messages;
type MessageSchema (line 8) | type MessageSchema = typeof messages["en-US"];
type DefineLocaleMessage (line 14) | interface DefineLocaleMessage extends MessageSchema {}
type DefineDateTimeFormat (line 17) | interface DefineDateTimeFormat {}
type DefineNumberFormat (line 20) | interface DefineNumberFormat {}
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/pinia/src/stores/example-store.ts
method increment (line 11) | increment() {
FILE: create-quasar/templates/app/quasar-v2/ts-webpack-4/pinia/src/stores/index.ts
type PiniaCustomProperties (line 11) | interface PiniaCustomProperties {
FILE: create-quasar/templates/ui-kit/create-quasar-script.js
function createQuasarScript (line 1) | async function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/ui-kit/quasar-v2/BASE/ui/build/script.css.js
function resolve (line 38) | function resolve (_path) {
function generate (line 42) | function generate (src, dest) {
function generateUMD (line 71) | function generateUMD (dest, code, ext = '') {
FILE: create-quasar/templates/ui-kit/quasar-v2/BASE/ui/build/script.javascript.js
function pathResolve (line 93) | function pathResolve (_path) {
function addAssets (line 98) | function addAssets (builds, type, injectName) {
function build (line 129) | function build (builds) {
function genConfig (line 135) | function genConfig (opts) {
function addExtension (line 149) | function addExtension (filename, ext = 'min') {
function buildEntry (line 154) | function buildEntry (config) {
function injectVueRequirement (line 196) | function injectVueRequirement (code) {
FILE: create-quasar/templates/ui-kit/quasar-v2/BASE/ui/build/utils.js
function getSize (line 7) | function getSize (code) {
function report (line 28) | function report (extra) {
FILE: create-quasar/templates/ui-kit/quasar-v2/BASE/ui/dev/quasar.config.js
method chainWebpack (line 49) | chainWebpack (chain) {
FILE: create-quasar/templates/ui-kit/quasar-v2/BASE/ui/dev/src/router/pages.js
function kebabCase (line 5) | function kebabCase (str) {
function slugify (line 16) | function slugify (str) {
FILE: create-quasar/templates/ui-kit/quasar-v2/ae/app-extension/src/index.js
function extendConf (line 8) | function extendConf (conf, api) {
FILE: create-quasar/templates/ui-kit/quasar-v2/create-quasar-script.js
function createQuasarScript (line 1) | function createQuasarScript({ scope, utils }) {
FILE: create-quasar/templates/ui-kit/quasar-v2/ui-component/ui/src/components/Component.js
method setup (line 7) | setup () {
FILE: create-quasar/templates/ui-kit/quasar-v2/ui-directive/ui/src/directives/Directive.js
method mounted (line 4) | mounted (_el) {
FILE: create-quasar/utils/index.js
constant TEMPLATING_FILE_EXTENSIONS (line 19) | const TEMPLATING_FILE_EXTENSIONS = [
function prompts (line 36) | async function prompts(scope, questions, opts) {
function createTargetDir (line 47) | function createTargetDir(scope) {
function convertArrayToObject (line 56) | function convertArrayToObject(arr) {
function getCallerPath (line 74) | function getCallerPath() {
function renderTemplate (line 85) | function renderTemplate(relativePath, scope) {
function isValidPackageName (line 123) | function isValidPackageName(projectName) {
function inferPackageName (line 129) | function inferPackageName(projectFolder) {
function escapeString (line 138) | function escapeString(val) {
function getGitUser (line 142) | function getGitUser() {
function printFinalMessage (line 162) | function printFinalMessage(scope) {
function runCommand (line 197) | function runCommand(cmd, args, options) {
function installDeps (line 215) | function installDeps(scope) {
function lintFolder (line 226) | function lintFolder(scope) {
function formatFolder (line 236) | function formatFolder(scope) {
function hasGit (line 242) | function hasGit() {
function folderHasGit (line 249) | function folderHasGit(cwd) {
function initializeGit (line 256) | function initializeGit(projectFolder) {
function ensureOutsideProject (line 307) | function ensureOutsideProject() {
constant SCRIPT_TYPES (line 324) | const SCRIPT_TYPES = [
function injectAuthor (line 364) | async function injectAuthor(scope) {
FILE: create-quasar/utils/logger.js
function tip (line 46) | function tip(msg) {
function log (line 50) | function log(msg) {
function warn (line 54) | function warn(msg, pill) {
function fatal (line 65) | function fatal(msg, pill) {
function success (line 81) | function success(msg, title = 'SUCCESS') {
function getSuccess (line 84) | function getSuccess(msg, title) {
function info (line 88) | function info(msg, title = 'INFO') {
function getInfo (line 91) | function getInfo(msg, title) {
function error (line 95) | function error(msg, title = 'ERROR') {
function getError (line 98) | function getError(msg, title = 'ERROR') {
function warning (line 102) | function warning(msg, title = 'WARNING') {
function getWarning (line 107) | function getWarning(msg, title = 'WARNING') {
function progress (line 115) | function progress(msg, token) {
FILE: create-quasar/utils/template.js
function throwParseError (line 24) | function throwParseError(message, str, index) {
function escapeRegExp (line 45) | function escapeRegExp(str) {
function trimWS (line 50) | function trimWS(str, wsLeft, wsRight) {
function getAST (line 82) | function getAST(str, opts) {
function compileBody (line 226) | function compileBody(ast, opts) {
function compileTemplateToFile (line 257) | function compileTemplateToFile(str, rawOpts = {}) {
function compileTemplateToFn (line 264) | function compileTemplateToFn(str, rawOpts = {}) {
function renderTemplate (line 271) | function renderTemplate(str, scope, rawOpts) {
FILE: docs/build/chunks.js
method name (line 16) | name(id) {
FILE: docs/build/copy-quasar-api.js
function getSource (line 14) | function getSource() {
FILE: docs/build/examples.js
function devLoad (line 10) | function devLoad(id) {
function prodLoad (line 20) | function prodLoad(id) {
function examplesPlugin (line 42) | function examplesPlugin(isProd) {
FILE: docs/build/md/flat-menu.js
function menuWalk (line 11) | function menuWalk(node, path, parentName) {
function convertToRelated (line 50) | function convertToRelated(entry, id) {
FILE: docs/build/md/index.js
method transform (line 9) | transform(code, id) {
FILE: docs/build/md/md-parse-utils.js
function parseToc (line 4) | function parseToc(toc) {
function getVueComponent (line 35) | function getVueComponent({ frontMatter, mdContent, pageScripts }) {
function parseFrontMatter (line 68) | function parseFrontMatter(content) {
FILE: docs/build/md/md-parse.js
function splitRenderedContent (line 13) | function splitRenderedContent(mdPageContent) {
function mdParse (line 24) | function mdParse(code, id) {
FILE: docs/build/md/md-plugin-blockquote.js
function mdPluginBlockquote (line 5) | function mdPluginBlockquote(md) {
FILE: docs/build/md/md-plugin-codeblock.js
function extractTabs (line 59) | function extractTabs(content) {
function extractCodeLineProps (line 111) | function extractCodeLineProps(lines, attrs) {
function parseCodeLine (line 132) | function parseCodeLine(content, attrs) {
function getHighlightedContent (line 183) | function getHighlightedContent(rawContent, attrs) {
function parseAttrs (line 224) | function parseAttrs(rawAttrs) {
function parseDefinitionLine (line 238) | function parseDefinitionLine(token) {
function mdPluginCodeblock (line 264) | function mdPluginCodeblock(md) {
FILE: docs/build/md/md-plugin-containers.js
function createContainer (line 29) | function createContainer(containerType, defaultTitle) {
function mdPluginContainers (line 55) | function mdPluginContainers(md) {
FILE: docs/build/md/md-plugin-heading.js
function parseContent (line 12) | function parseContent(str) {
function mdPluginHeading (line 21) | function mdPluginHeading(md) {
FILE: docs/build/md/md-plugin-image.js
function mdPluginImage (line 5) | function mdPluginImage(md) {
FILE: docs/build/md/md-plugin-link.js
function mdPluginLink (line 5) | function mdPluginLink(md) {
FILE: docs/build/md/md-plugin-table.js
function mdPluginTable (line 5) | function mdPluginTable(md) {
FILE: docs/build/md/md-plugin-token.js
function mdPluginToken (line 5) | function mdPluginToken(md) {
FILE: docs/build/release-notes/highlight.js
function highlight (line 18) | function highlight(str, lang) {
FILE: docs/build/release-notes/md.mjs
function mdPlugins (line 15) | function mdPlugins(md) {
FILE: docs/build/release-notes/request.js
function releaseNotesRequest (line 9) | async function releaseNotesRequest(packages, versionRE) {
FILE: docs/build/search.js
function getJsonSize (line 33) | function getJsonSize(content) {
function parseRank (line 44) | function parseRank(rank) {
function processPage (line 215) | function processPage(page, entries) {
FILE: docs/build/utils.js
function slugify (line 7) | function slugify(str) {
function capitalize (line 16) | function capitalize(str) {
FILE: docs/quasar.config.js
method extendViteConf (line 38) | extendViteConf(viteConf, { isClient }) {
method extendWorkboxGenerateSWOptions (line 102) | extendWorkboxGenerateSWOptions(cfg) {
FILE: docs/src-pwa/pwa-flag.d.ts
type QuasarFeatureFlags (line 6) | interface QuasarFeatureFlags {
FILE: docs/src-pwa/register-service-worker.js
method updated (line 6) | updated() {
FILE: docs/src-ssr/middlewares/render.js
function renderMiddleware (line 5) | function renderMiddleware({ app, resolve, render, serve }) {
FILE: docs/src-ssr/ssr-flag.d.ts
type QuasarFeatureFlags (line 6) | interface QuasarFeatureFlags {
FILE: docs/src/assets/get-meta.js
function getMeta (line 1) | function getMeta(title, desc) {
FILE: docs/src/assets/page-utils.js
function copyToClipboard (line 4) | function copyToClipboard(text) {
function copyHeading (line 16) | function copyHeading(id) {
FILE: docs/src/boot/gdpr.js
method handler (line 19) | handler() {
method handler (line 27) | handler() {
FILE: docs/src/components/CodePrism.js
method setup (line 13) | setup(props) {
FILE: docs/src/components/DocApiEntry.js
function copyPropName (line 6) | function copyPropName(propName) {
function getEventParams (line 17) | function getEventParams(event) {
function getMethodParams (line 28) | function getMethodParams(method, noRequired) {
function getMethodReturnValue (line 59) | function getMethodReturnValue(method) {
function getStringType (line 68) | function getStringType(type) {
constant NAME_PROP_COLOR (line 72) | const NAME_PROP_COLOR = ['orange-8', 'brand-primary', 'green-5', 'purple...
constant NAME_PROP_COLOR_LEN (line 73) | const NAME_PROP_COLOR_LEN = NAME_PROP_COLOR.length
function getDiv (line 75) | function getDiv(col, propName, propValue, slot) {
function getNameDiv (line 84) | function getNameDiv(prop, label, level, suffix, prefix) {
function getExpandable (line 124) | function getExpandable(openState, desc, isExpandable, key, getDetails) {
function getPropDetails (line 152) | function getPropDetails(openState, masterKey, prop, level) {
function getProp (line 287) | function getProp(openState, masterKey, prop, propName, level, onlyChildr...
function useConfigToggle (line 528) | function useConfigToggle(openState) {
method setup (line 630) | setup(props) {
FILE: docs/src/components/DocPrerender.js
method setup (line 10) | setup(props, { slots }) {
FILE: docs/src/layouts/doc-layout/DocHeaderMenu.js
method setup (line 22) | setup(props) {
FILE: docs/src/layouts/doc-layout/DocPageMenu.js
function getParentProxy (line 18) | function getParentProxy(proxy) {
method setup (line 35) | setup() {
FILE: docs/src/layouts/doc-layout/store/index.js
function useDocStore (line 10) | function useDocStore() {
function provideDocStore (line 14) | function provideDocStore() {
FILE: docs/src/layouts/doc-layout/store/inject-scroll.js
function injectScroll (line 9) | function injectScroll(store) {
FILE: docs/src/layouts/doc-layout/store/inject-toc.js
function updateActiveToc (line 1) | function updateActiveToc(position, state) {
function injectToc (line 35) | function injectToc(store) {
FILE: docs/src/router/index.js
function appRouter (line 16) | function appRouter() {
FILE: extras/animate/animate-list.common.d.ts
type generalAnimations (line 1) | type generalAnimations =
type inAnimations (line 18) | type inAnimations =
type outAnimations (line 62) | type outAnimations =
FILE: extras/animate/animate-list.d.ts
type generalAnimations (line 1) | type generalAnimations =
type inAnimations (line 18) | type inAnimations =
type outAnimations (line 62) | type outAnimations =
FILE: extras/build/animate.js
function extract (line 20) | function extract(file) {
function getList (line 37) | function getList(prefix) {
FILE: extras/build/index.js
function collectFontVersions (line 16) | function collectFontVersions(text) {
function handleChild (line 27) | function handleChild(child) {
function runJob (line 63) | function runJob(queue, scriptFile) {
function generate (line 71) | async function generate() {
FILE: extras/build/material-icons.js
function downloadIcon (line 32) | function downloadIcon(icon) {
function run (line 69) | async function run() {
FILE: extras/build/material-symbols.js
function downloadIcon (line 31) | function downloadIcon(icon) {
function run (line 69) | async function run() {
FILE: extras/build/readme.js
function resolvePackageSpecVersion (line 8) | function resolvePackageSpecVersion(name) {
function resolveFileVersion (line 23) | function resolveFileVersion(path, pattern) {
function resolveVersion (line 34) | function resolveVersion(versionSource, googleVersions) {
function renderTable (line 60) | function renderTable(headers, rows) {
function renderRows (line 73) | function renderRows(rows, googleVersions, type) {
FILE: extras/build/utils/buildExports.js
function readFolders (line 34) | async function readFolders(folderPath, skipSet) {
function generateExports (line 57) | function generateExports(folders) {
function updatePackageJson (line 93) | async function updatePackageJson(exports) {
FILE: extras/build/utils/index.js
method rect (line 127) | rect(el) {
function parseDom (line 177) | function parseDom(name, el, pathsDefinitions) {
function getWidthHeightAsViewbox (line 223) | function getWidthHeightAsViewbox(element) {
function parseSvgContent (line 237) | function parseSvgContent(name, content) {
function getPackageJson (line 283) | function getPackageJson(packageName) {
function getBanner (line 298) | function getBanner(iconSetName, versionOrPackageName) {
function extractSvg (line 316) | function extractSvg(content, name) {
class Queue (line 427) | class Queue {
method constructor (line 434) | constructor(worker, options = {}) {
FILE: extras/build/webfonts.js
function run (line 4) | function run(cwd) {
FILE: extras/index.d.ts
type QuasarFonts (line 7) | type QuasarFonts = "roboto-font" | "roboto-font-latin-ext";
type QuasarGeneralAnimations (line 9) | type QuasarGeneralAnimations = generalAnimations;
type QuasarInAnimations (line 10) | type QuasarInAnimations = inAnimations;
type QuasarOutAnimations (line 11) | type QuasarOutAnimations = outAnimations;
type QuasarAnimations (line 12) | type QuasarAnimations =
type QuasarExtrasIcons (line 17) | type QuasarExtrasIcons =
FILE: icongenie/lib/cmd/generate.js
function runProfiles (line 175) | async function runProfiles(params, profileFiles) {
FILE: icongenie/lib/cmd/verify.js
function runProfiles (line 79) | async function runProfiles(params, profileFiles) {
FILE: icongenie/lib/generators/icns.js
function icns (line 6) | async function icns(file, opts, done) {
FILE: icongenie/lib/generators/ico.js
function ico (line 6) | async function ico(file, opts, done) {
FILE: icongenie/lib/generators/png.js
function png (line 3) | function png(file, opts, done) {
FILE: icongenie/lib/generators/splashscreen.js
function splashscreen (line 3) | async function splashscreen(file, opts, done) {
FILE: icongenie/lib/generators/svg.js
function svg (line 7) | async function svg(file, opts, done) {
FILE: icongenie/lib/modes/quasar-app-v1/capacitor.js
function getAndroidIcons (line 3) | function getAndroidIcons(entries) {
function getAndroidSplashscreen (line 34) | function getAndroidSplashscreen(entries) {
function getIosIcon (line 59) | function getIosIcon(name) {
FILE: icongenie/lib/modes/quasar-app-v1/cordova.js
function getAndroidIcon (line 3) | function getAndroidIcon(entry) {
function getAndroidSplashscreens (line 14) | function getAndroidSplashscreens(entries) {
function getIosIcon (line 40) | function getIosIcon(name) {
function getIosSplashscreen (line 57) | function getIosSplashscreen(entry) {
FILE: icongenie/lib/modes/quasar-app-v1/pwa.js
function getAppleLaunch (line 4) | function getAppleLaunch(def) {
FILE: icongenie/lib/modes/quasar-app-v2/capacitor.js
function getAndroidIcons (line 3) | function getAndroidIcons(entries) {
function getAndroidSplashscreen (line 34) | function getAndroidSplashscreen(entries) {
function getIosIcon (line 59) | function getIosIcon(name) {
FILE: icongenie/lib/modes/quasar-app-v2/cordova.js
function getAndroidIcon (line 3) | function getAndroidIcon(entry) {
function getAndroidSplashscreens (line 14) | function getAndroidSplashscreens(entries) {
function getIosIcon (line 40) | function getIosIcon(name) {
function getIosSplashscreen (line 57) | function getIosSplashscreen(entry) {
FILE: icongenie/lib/modes/quasar-app-v2/pwa.js
function getAppleLaunch (line 4) | function getAppleLaunch(def) {
FILE: icongenie/lib/mount/index.js
function mount (line 4) | function mount(files) {
function verifyMount (line 9) | function verifyMount(file) {
FILE: icongenie/lib/mount/mount-cordova.js
function getNode (line 18) | function getNode(root, tag, selector) {
function hasNode (line 22) | function hasNode(root, tag, selector) {
function isCordovaFile (line 26) | function isCordovaFile(file) {
function getCordovaFiles (line 33) | function getCordovaFiles(files) {
function updateConfigXml (line 45) | function updateConfigXml(cordovaFiles, hasSplashscreen) {
function hasDeepProp (line 116) | function hasDeepProp(target, ...args) {
function installSplashscreenPlugin (line 131) | function installSplashscreenPlugin() {
function mountCordova (line 169) | function mountCordova(files) {
function verifyCordova (line 187) | function verifyCordova(file) {
FILE: icongenie/lib/mount/mount-tag.js
function mountTag (line 3) | function mountTag(files) {
FILE: icongenie/lib/runner/generate.js
function printBanner (line 20) | function printBanner(assetsOf, params) {
function parseAssets (line 39) | function parseAssets(assets, include) {
function getUniqueFiles (line 66) | function getUniqueFiles(files) {
function generateFile (line 80) | function generateFile(file, opts) {
function generateFromProfile (line 96) | async function generateFromProfile(profile) {
function generate (line 123) | function generate(argv) {
FILE: icongenie/lib/runner/profile.js
function getParams (line 10) | function getParams({ include, ...props }) {
function getAssets (line 18) | function getAssets(assets) {
function getTargetFilepath (line 25) | function getTargetFilepath(output) {
function profile (line 37) | function profile({ output, assets, ...params }) {
FILE: icongenie/lib/runner/verify.js
function getFileStatus (line 16) | function getFileStatus(file) {
function printMode (line 36) | function printMode(modeName, files) {
function printBanner (line 48) | function printBanner(assetsOf, params) {
function parseAssets (line 58) | function parseAssets(assets, include) {
function verifyProfile (line 92) | function verifyProfile(profile) {
function verify (line 116) | function verify(argv) {
FILE: icongenie/lib/utils/app-paths.js
function getAppInfo (line 6) | function getAppInfo() {
FILE: icongenie/lib/utils/filter-argv-params.js
function filterArgvParams (line 1) | function filterArgvParams(argv) {
FILE: icongenie/lib/utils/get-assets-files.js
function getAssetsFiles (line 7) | function getAssetsFiles(assets) {
FILE: icongenie/lib/utils/get-compression.js
function getIcoCompression (line 14) | function getIcoCompression(quality) {
function getPngCompression (line 43) | function getPngCompression(quality) {
FILE: icongenie/lib/utils/get-file-size.js
function humanStorageSize (line 5) | function humanStorageSize(bytes) {
function getFileSize (line 16) | function getFileSize(filename) {
FILE: icongenie/lib/utils/get-files-options.js
function getRgbColor (line 5) | function getRgbColor(color) {
function getFilesOptions (line 22) | async function getFilesOptions({
FILE: icongenie/lib/utils/get-png-size.js
function getSize (line 7) | function getSize(buffer) {
function getPngSize (line 17) | function getPngSize(file) {
FILE: icongenie/lib/utils/get-profile-content.js
function getProfileContent (line 7) | function getProfileContent(profileFile) {
FILE: icongenie/lib/utils/get-profile-files.js
function parseFolder (line 7) | function parseFolder(folder) {
function getProfileFiles (line 35) | function getProfileFiles(profileParam) {
FILE: icongenie/lib/utils/get-square-icon.js
function getSquareIcon (line 3) | function getSquareIcon({
FILE: icongenie/lib/utils/logger.js
function log (line 8) | function log(msg) {
function warn (line 12) | function warn(msg) {
function fatal (line 16) | function fatal(msg) {
FILE: icongenie/lib/utils/merge-objects.js
function mergeObjects (line 1) | function mergeObjects(...args) {
FILE: icongenie/lib/utils/parse-argv.js
function die (line 15) | function die(msg) {
function profile (line 21) | function profile(value, argv) {
function mode (line 37) | function mode(value, argv) {
function include (line 57) | function include(value, argv) {
function quality (line 70) | function quality(value, argv) {
function filter (line 88) | function filter(value) {
function padding (line 94) | function padding(value, argv) {
function parseIconPath (line 120) | function parseIconPath(value) {
function icon (line 138) | function icon(value, argv) {
function background (line 166) | function background(value, argv) {
function getColorParser (line 186) | function getColorParser(name, defaultValue) {
function splashscreenIconRatio (line 204) | function splashscreenIconRatio(value, argv) {
function output (line 224) | function output(value) {
function assets (line 230) | function assets(value, argv) {
function parseArgv (line 274) | function parseArgv(argv, list) {
FILE: icongenie/lib/utils/spawn-sync.js
function spawnSync (line 5) | function spawnSync(cmd, params, opts, onFail) {
FILE: icongenie/lib/utils/validate-profile-object.js
function validateProfileObject (line 83) | function validateProfileObject(
FILE: ui/build/build.api.js
function parseAddedIn (line 110) | function parseAddedIn(val) {
function parseObjectWithPascalCaseProps (line 138) | function parseObjectWithPascalCaseProps(obj, objName) {
function parseObjectWithKebabCaseProps (line 156) | function parseObjectWithKebabCaseProps(obj, objName) {
function isClassStyleType (line 572) | function isClassStyleType(type) {
function isSerializable (line 594) | function isSerializable(value) {
function getApiWithMixins (line 599) | function getApiWithMixins(api, mainFile) {
function deCapitalize (line 625) | function deCapitalize(str) {
function encodeDefaultValue (line 632) | function encodeDefaultValue(val, isFunction) {
function extractRuntimeDefinablePropTypes (line 661) | function extractRuntimeDefinablePropTypes(apiTypes) {
function parseRuntimeType (line 671) | function parseRuntimeType(runtimeConstructor) {
function extractRuntimePropAttrs (line 679) | function extractRuntimePropAttrs(runtimeProp) {
function parseObject (line 754) | function parseObject({
function parseAPI (line 1127) | function parseAPI(file, apiType) {
function orderAPI (line 1206) | function orderAPI(api, apiType) {
function fillAPI (line 1218) | function fillAPI(apiType, list, encodeFn) {
function writeTransformAssetUrls (line 1635) | function writeTransformAssetUrls(components, encodeFn) {
function writeApiIndex (line 1669) | function writeApiIndex(list, encodeFn) {
function prepareRuntimeImports (line 1673) | function prepareRuntimeImports() {
function resetRuntimeImports (line 1680) | function resetRuntimeImports() {
function generate (line 1688) | async function generate({ compact = false } = {}) {
FILE: ui/build/build.icon-sets.js
function convertWebfont (line 112) | function convertWebfont(name, originalType) {
function toObject (line 123) | function toObject(arr) {
function splitContent (line 135) | function splitContent(str) {
function generateSvgFile (line 144) | function generateSvgFile(type) {
function generate (line 197) | function generate() {
FILE: ui/build/build.lang.js
function generate (line 10) | async function generate() {
FILE: ui/build/build.transforms.js
function relative (line 16) | function relative(name) {
function getWithoutExtension (line 20) | function getWithoutExtension(filename) {
function lowerCamelCase (line 25) | function lowerCamelCase(name) {
function addComponents (line 29) | function addComponents(map, autoImport) {
function addDirectives (line 46) | function addDirectives(map, autoImport) {
function addPlugins (line 61) | function addPlugins(map) {
function addComposables (line 71) | function addComposables(map) {
function addUtils (line 81) | function addUtils(map) {
function getAutoImportFile (line 91) | function getAutoImportFile(autoImport, encodeFn) {
function generate (line 111) | function generate({ compact = false } = {}) {
FILE: ui/build/build.types.js
constant INDENT_SPACE_COUNT (line 16) | const INDENT_SPACE_COUNT = 2
function formatWithOxfmt (line 18) | async function formatWithOxfmt(filePath, rawCode) {
function writeLine (line 28) | function writeLine(fileContent, line = '', indent = 0) {
function writeLines (line 34) | function writeLines(fileContent, lines = '', indent = 0) {
function write (line 38) | function write(fileContent, text = '') {
function convertTypeVal (line 58) | function convertTypeVal(type, def) {
function getTypeVal (line 101) | function getTypeVal(def) {
function getPropDefinition (line 120) | function getPropDefinition({
function getPropDefinitions (line 190) | function getPropDefinitions({
function getFunctionDefinition (line 207) | function getFunctionDefinition({ definition }) {
function getInjectionDefinition (line 231) | function getInjectionDefinition(propertyName, typeDef, typeName) {
function copyPredefinedTypes (line 248) | function copyPredefinedTypes(dir, parentDir) {
function addToExtraInterfaces (line 274) | function addToExtraInterfaces(def) {
function writeInterface (line 298) | function writeInterface(contents, typeName, props) {
function addQuasarLangCodes (line 305) | function addQuasarLangCodes(contents, quasarLangIndex) {
function transformObject (line 322) | function transformObject(definition, handler) {
function getIndexDts (line 334) | function getIndexDts(apis, quasarLangIndex) {
function ensureTypeScriptValidity (line 829) | function ensureTypeScriptValidity() {
function generate (line 879) | async function generate({ api, quasarLangIndex }) {
FILE: ui/build/build.utils.js
constant BUILD_TARGETS (line 15) | const BUILD_TARGETS = getBuildTargets()
function getBuildTargets (line 17) | function getBuildTargets() {
function plural (line 42) | function plural(num) {
function camelCase (line 48) | function camelCase(str) {
function kebabCase (line 56) | function kebabCase(str) {
function capitalize (line 61) | function capitalize(str) {
function resolveToRoot (line 67) | function resolveToRoot(...pathList) {
function relativeToRoot (line 71) | function relativeToRoot(...pathList) {
function getSize (line 116) | function getSize(code) {
function createFolder (line 120) | function createFolder(folder) {
function getDestinationInfo (line 125) | function getDestinationInfo(dest) {
function enableGzip (line 158) | async function enableGzip() {
function writeFile (line 163) | function writeFile(dest, code, { summary = false, gzip = false } = {}) {
function readFile (line 215) | function readFile(file) {
function readJsonFile (line 219) | function readJsonFile(file) {
function writeFileIfChanged (line 223) | function writeFileIfChanged(dest, newContent, opts) {
function logError (line 235) | function logError(err) {
function clone (line 240) | function clone(data) {
function filterOutPrivateFiles (line 250) | function filterOutPrivateFiles(file) {
FILE: ui/build/build.web-types.js
function resolveType (line 11) | function resolveType({ type, values }) {
function getDescription (line 28) | function getDescription(propApi) {
function generate (line 34) | function generate({ api, compact = false }) {
FILE: ui/build/prepare-diff.js
function prepareDiff (line 14) | function prepareDiff(locationPath) {
FILE: ui/build/script.build.css.js
function moveUseStatementsToTop (line 17) | function moveUseStatementsToTop(code) {
function compileSass (line 27) | function compileSass(src) {
function getConcatenatedContent (line 33) | function getConcatenatedContent(src, noBanner) {
function generateUMD (line 56) | function generateUMD(code, middleName, ext = '') {
function renderAsset (line 75) | function renderAsset(cssCode, middleName = '') {
function generateBase (line 86) | async function generateBase(source) {
function generateAddon (line 102) | async function generateAddon(source) {
function buildCss (line 111) | async function buildCss(withDiff) {
FILE: ui/build/script.build.javascript.js
function compile (line 130) | async function compile({ inputConfig, outputList }) {
function convertExternalImports (line 149) | async function convertExternalImports(content) {
function addUmdAssets (line 182) | async function addUmdAssets(buildList, type, injectName, convertImports) {
function addExtension (line 234) | function addExtension(filename, ext = 'prod') {
method full (line 241) | async full() {
method fast (line 270) | async fast() {
method types (line 295) | async types() {
method api (line 311) | async api() {
method webtypes (line 317) | async webtypes() {
method transforms (line 327) | async transforms() {
function buildJavascript (line 334) | function buildJavascript(subtype) {
FILE: ui/lang/kk.js
function plurals (line 1) | function plurals(n, opts) {
FILE: ui/lang/lt.js
function plurals (line 1) | function plurals(n, opts) {
FILE: ui/lang/ru.js
function plurals (line 1) | function plurals(n, opts) {
FILE: ui/lang/uk.js
function plurals (line 1) | function plurals(n, opts) {
FILE: ui/playground/quasar.config.js
method extendViteConf (line 45) | extendViteConf(viteConf, { isServer }) {
FILE: ui/playground/src/boot/ssr-client.js
function bootSsrClient (line 1) | function bootSsrClient({ router }) {
FILE: ui/playground/src/composables/useLocalStorageConfig.js
function hasDifferentKeys (line 4) | function hasDifferentKeys(a, b) {
function useLocalStorageConfig (line 29) | function useLocalStorageConfig(localStorageKey, definition) {
FILE: ui/playground/src/pages/global/dialog-component-composition-api.js
method setup (line 28) | setup(props) {
FILE: ui/playground/src/pages/global/dialog-component-options-api.js
method data (line 23) | data() {
method show (line 32) | show() {
method hide (line 36) | hide() {
method increment (line 40) | increment() {
method render (line 45) | render() {
FILE: ui/playground/src/router/index.js
function defineRouter (line 10) | function defineRouter(/* { store, ssrContext } */) {
FILE: ui/playground/src/router/routes.js
function load (line 3) | function load(componentName) {
function component (line 7) | function component(path) {
FILE: ui/src/components/ajax-bar/QAjaxBar.js
function translate (line 20) | function translate({ p, pos, active, horiz, reverse, dir }) {
function inc (line 47) | function inc(p, amount) {
function highjackAjax (line 64) | function highjackAjax(stackEntry) {
function restoreAjax (line 100) | function restoreAjax(start) {
method setup (line 133) | setup(props, { emit }) {
FILE: ui/src/components/avatar/QAvatar.js
method setup (line 28) | setup(props, { slots }) {
FILE: ui/src/components/badge/QBadge.js
method setup (line 29) | setup(props, { slots }) {
FILE: ui/src/components/banner/QBanner.js
method setup (line 21) | setup(props, { slots }) {
FILE: ui/src/components/bar/QBar.js
method setup (line 18) | setup(props, { slots }) {
FILE: ui/src/components/breadcrumbs/QBreadcrumbs.js
method setup (line 37) | setup(props, { slots }) {
FILE: ui/src/components/breadcrumbs/QBreadcrumbsEl.js
method setup (line 28) | setup(props, { slots }) {
FILE: ui/src/components/btn-dropdown/QBtnDropdown.js
function passBtnProps (line 18) | function passBtnProps(props) {
method setup (line 77) | setup(props, { slots, emit }) {
FILE: ui/src/components/btn-group/QBtnGroup.js
method setup (line 21) | setup(props, { slots }) {
FILE: ui/src/components/btn-toggle/QBtnToggle.js
method setup (line 76) | setup(props, { slots, emit }) {
FILE: ui/src/components/btn/QBtn.js
method setup (line 48) | setup(props, { slots, emit }) {
FILE: ui/src/components/btn/use-btn.js
function getBtnDesign (line 35) | function getBtnDesign(props, defaultValue) {
function getBtnDesignAttr (line 43) | function getBtnDesignAttr(props) {
function useBtn (line 103) | function useBtn(props) {
FILE: ui/src/components/btn/use-btn.test.js
method setup (line 59) | setup() {
FILE: ui/src/components/card/QCard.js
method setup (line 26) | setup(props, { slots }) {
FILE: ui/src/components/card/QCardActions.js
method setup (line 18) | setup(props, { slots }) {
FILE: ui/src/components/card/QCardSection.js
method setup (line 18) | setup(props, { slots }) {
FILE: ui/src/components/carousel/QCarousel.js
method setup (line 80) | setup(props, { slots }) {
FILE: ui/src/components/carousel/QCarouselControl.js
method setup (line 32) | setup(props, { slots }) {
FILE: ui/src/components/carousel/QCarouselSlide.js
method setup (line 16) | setup(props, { slots }) {
FILE: ui/src/components/chat/QChatMessage.js
method setup (line 25) | setup(props, { slots }) {
FILE: ui/src/components/checkbox/QCheckbox.js
method setup (line 47) | setup(props) {
FILE: ui/src/components/checkbox/use-checkbox.js
function useCheckbox (line 57) | function useCheckbox(type, getInner) {
FILE: ui/src/components/chip/QChip.js
method setup (line 71) | setup(props, { slots, emit }) {
FILE: ui/src/components/circular-progress/QCircularProgress.js
method setup (line 34) | setup(props, { slots }) {
FILE: ui/src/components/color/QColor.js
method setup (line 188) | setup(props, { emit }) {
FILE: ui/src/components/date/QDate.js
function getMonthHash (line 45) | function getMonthHash(date) {
function getShortDate (line 49) | function getShortDate(date) {
method setup (line 121) | setup(props, { slots, emit }) {
FILE: ui/src/components/date/use-datetime.js
function getDayHash (line 37) | function getDayHash(date) {
function useDatetime (line 41) | function useDatetime(props, $q) {
FILE: ui/src/components/dialog/QDialog.js
method setup (line 98) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/dialog/QDialog.test.js
function triggerBackdropClick (line 37) | async function triggerBackdropClick(localWrapper) {
function triggerEscKey (line 44) | async function triggerEscKey(localWrapper) {
function createFocusEl (line 50) | function createFocusEl() {
FILE: ui/src/components/drawer/QDrawer.js
function updateLocal (line 37) | function updateLocal(prop, val) {
method setup (line 95) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/editor/QEditor.js
method setup (line 100) | setup(props, { slots, emit }) {
FILE: ui/src/components/editor/editor-caret.js
function getBlockElement (line 5) | function getBlockElement(el, parent) {
function isChildOf (line 26) | function isChildOf(el, parent, orSame) {
function createRange (line 33) | function createRange(node, chars, range) {
class Caret (line 62) | class Caret {
method constructor (line 63) | constructor(el, eVm) {
method selection (line 69) | get selection() {
method hasSelection (line 85) | get hasSelection() {
method range (line 91) | get range() {
method parent (line 101) | get parent() {
method blockParent (line 113) | get blockParent() {
method save (line 123) | save(range = this.range) {
method restore (line 129) | restore(range = this._range) {
method savePosition (line 144) | savePosition() {
method restorePosition (line 167) | restorePosition(length = 0) {
method hasParent (line 180) | hasParent(name, spanLevel) {
method hasParents (line 188) | hasParents(list, recursive, el = this.parent) {
method is (line 200) | is(cmd, param) {
method getParentAttribute (line 236) | getParentAttribute(attrib) {
method can (line 244) | can(name) {
method apply (line 258) | apply(cmd, param, done = noop) {
method selectWord (line 334) | selectWord(sel) {
FILE: ui/src/components/editor/editor-utils.js
function run (line 14) | function run(e, btn, eVm) {
function getGroup (line 22) | function getGroup(children) {
function getBtn (line 26) | function getBtn(eVm, btn, clickHandler, active = false) {
function getDropdown (line 78) | function getDropdown(eVm, btn) {
function getToolbar (line 203) | function getToolbar(eVm) {
function getFonts (line 231) | function getFonts(
function getLinkEditor (line 265) | function getLinkEditor(eVm) {
FILE: ui/src/components/expansion-item/QExpansionItem.js
constant LINK_PROPS (line 36) | const LINK_PROPS = Object.keys(useRouterLinkProps)
method setup (line 80) | setup(props, { slots, emit }) {
FILE: ui/src/components/fab/QFab.js
method setup (line 53) | setup(props, { slots }) {
FILE: ui/src/components/fab/QFabAction.js
method setup (line 43) | setup(props, { slots, emit }) {
FILE: ui/src/components/fab/use-fab.js
function useFab (line 44) | function useFab(props, showing) {
FILE: ui/src/components/field/QField.js
method setup (line 25) | setup() {
FILE: ui/src/components/file/QFile.js
method setup (line 56) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/footer/QFooter.js
function updateLocal (line 22) | function updateLocal(prop, val) {
method setup (line 48) | setup(props, { slots, emit }) {
FILE: ui/src/components/form/QForm.js
function validateComponent (line 19) | function validateComponent(comp) {
method setup (line 44) | setup(props, { slots, emit }) {
FILE: ui/src/components/form/QFormChildMixin.js
method disable (line 12) | disable(val) {
method validate (line 26) | validate() {}
method resetValidation (line 27) | resetValidation() {}
method mounted (line 30) | mounted() {
method beforeUnmount (line 37) | beforeUnmount() {
FILE: ui/src/components/header/QHeader.js
function updateLocal (line 20) | function updateLocal(prop, val) {
method setup (line 50) | setup(props, { slots, emit }) {
FILE: ui/src/components/icon/QIcon.js
method setup (line 68) | setup(props, { slots }) {
FILE: ui/src/components/img/QImg.js
method setup (line 87) | setup(props, { slots, emit }) {
FILE: ui/src/components/infinite-scroll/QInfiniteScroll.js
method setup (line 56) | setup(props, { slots, emit }) {
FILE: ui/src/components/inner-loading/QInnerLoading.js
method setup (line 33) | setup(props, { slots }) {
FILE: ui/src/components/input/QInput.js
method setup (line 70) | setup(props, { emit, attrs }) {
FILE: ui/src/components/input/use-mask.js
constant NAMED_MASKS (line 6) | const NAMED_MASKS = {
function getTokenMap (line 45) | function getTokenMap(tokens) {
function getTokenRegexMask (line 60) | function getTokenRegexMask(keys) {
constant DEFAULT_TOKEN_REGEX_MASK (line 71) | const DEFAULT_TOKEN_REGEX_MASK = getTokenRegexMask(DEFAULT_TOKEN_MAP_KEYS)
constant MARKER (line 72) | const MARKER = String.fromCodePoint(1)
function useMask (line 82) | function useMask(props, emit, emitValue, inputRef) {
FILE: ui/src/components/intersection/QIntersection.js
method setup (line 39) | setup(props, { slots, emit }) {
FILE: ui/src/components/item/QItem.js
method setup (line 44) | setup(props, { slots, emit }) {
FILE: ui/src/components/item/QItemLabel.js
method setup (line 16) | setup(props, { slots }) {
FILE: ui/src/components/item/QItemSection.js
method setup (line 17) | setup(props, { slots }) {
FILE: ui/src/components/item/QList.js
method setup (line 28) | setup(props, { slots }) {
FILE: ui/src/components/knob/QKnob.js
method setup (line 53) | setup(props, { slots, emit }) {
FILE: ui/src/components/layout/QLayout.js
method setup (line 40) | setup(props, { slots, emit }) {
FILE: ui/src/components/linear-progress/QLinearProgress.js
function width (line 21) | function width(val, reverse, $q) {
method setup (line 59) | setup(props, { slots }) {
FILE: ui/src/components/markup-table/QMarkupTable.js
method setup (line 31) | setup(props, { slots }) {
FILE: ui/src/components/menu/QMenu.js
method setup (line 109) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/no-ssr/QNoSsr.js
method setup (line 20) | setup(props, { slots }) {
FILE: ui/src/components/option-group/QOptionGroup.js
function getPropValueFn (line 22) | function getPropValueFn(userPropName, defaultPropName) {
method setup (line 70) | setup(props, { emit, slots }) {
FILE: ui/src/components/page-scroller/QPageScroller.js
method setup (line 47) | setup(props, { slots, emit }) {
FILE: ui/src/components/page-sticky/QPageSticky.js
method setup (line 9) | setup(_, { slots }) {
FILE: ui/src/components/page-sticky/use-page-sticky.js
function usePageSticky (line 32) | function usePageSticky() {
FILE: ui/src/components/page/QPage.js
method setup (line 19) | setup(props, { slots }) {
FILE: ui/src/components/page/QPageContainer.js
method setup (line 14) | setup(_, { slots }) {
FILE: ui/src/components/pagination/QPagination.js
function getBool (line 15) | function getBool(val, otherwise) {
method setup (line 113) | setup(props, { emit }) {
FILE: ui/src/components/parallax/QParallax.js
method setup (line 33) | setup(props, { slots, emit }) {
FILE: ui/src/components/popup-edit/QPopupEdit.js
method setup (line 54) | setup(props, { slots, emit }) {
FILE: ui/src/components/popup-proxy/QPopupProxy.js
method setup (line 27) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/pull-to-refresh/QPullToRefresh.js
constant PULLER_HEIGHT (line 25) | const PULLER_HEIGHT = 40,
constant OFFSET_TOP (line 25) | const PULLER_HEIGHT = 40,
method setup (line 43) | setup(props, { slots, emit }) {
FILE: ui/src/components/radio/QRadio.js
method setup (line 69) | setup(props, { slots, emit }) {
FILE: ui/src/components/range/QRange.js
method setup (line 48) | setup(props, { emit }) {
FILE: ui/src/components/rating/QRating.js
method setup (line 55) | setup(props, { slots, emit }) {
FILE: ui/src/components/resize-observer/QResizeObserver.js
method setup (line 35) | setup(props, { emit }) {
FILE: ui/src/components/responsive/QResponsive.js
method setup (line 15) | setup(props, { slots }) {
FILE: ui/src/components/scroll-area/QScrollArea.js
method setup (line 90) | setup(props, { slots, emit }) {
FILE: ui/src/components/scroll-area/ScrollAreaControls.js
method setup (line 12) | setup(props) {
FILE: ui/src/components/scroll-observer/QScrollObserver.js
method setup (line 32) | setup(props, { emit }) {
FILE: ui/src/components/select/QSelect.js
function getPropValueFn (line 55) | function getPropValueFn(userPropName, defaultPropName) {
method setup (line 179) | setup(props, { slots, emit }) {
FILE: ui/src/components/separator/QSeparator.js
method setup (line 36) | setup(props) {
FILE: ui/src/components/skeleton/QSkeleton.js
method setup (line 72) | setup(props, { slots }) {
FILE: ui/src/components/slide-item/QSlideItem.js
method setup (line 44) | setup(props, { slots, emit }) {
FILE: ui/src/components/slide-transition/QSlideTransition.js
method setup (line 18) | setup(props, { slots, emit }) {
FILE: ui/src/components/slider/QSlider.js
method setup (line 34) | setup(props, { emit }) {
FILE: ui/src/components/slider/use-slider.js
function useSlider (line 104) | function useSlider({
FILE: ui/src/components/space/QSpace.js
method setup (line 8) | setup() {
FILE: ui/src/components/spinner/QSpinner.js
method setup (line 19) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerAudio.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerBall.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerBars.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerBox.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerClock.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerComment.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerCube.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerDots.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerFacebook.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerGears.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerGrid.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerHearts.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerHourglass.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerInfinity.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerIos.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerOrbit.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerOval.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerPie.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerPuff.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerRadio.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerRings.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/QSpinnerTail.js
method setup (line 14) | setup(props) {
FILE: ui/src/components/spinner/use-spinner.js
function useSpinner (line 12) | function useSpinner(props) {
FILE: ui/src/components/splitter/QSplitter.js
method setup (line 52) | setup(props, { slots, emit }) {
FILE: ui/src/components/stepper/QStep.js
function getStepWrapper (line 16) | function getStepWrapper(slots) {
method setup (line 35) | setup(_, { slots }) {
method setup (line 72) | setup(props, { slots, emit }) {
FILE: ui/src/components/stepper/QStepper.js
function camelizeProps (line 19) | function camelizeProps(props) {
method setup (line 54) | setup(props, { slots }) {
FILE: ui/src/components/stepper/QStepperNavigation.js
method setup (line 9) | setup(_, { slots }) {
FILE: ui/src/components/stepper/StepHeader.js
method setup (line 17) | setup(props, { attrs }) {
FILE: ui/src/components/tab-panels/QTabPanel.js
method setup (line 13) | setup(_, { slots }) {
FILE: ui/src/components/tab-panels/QTabPanels.js
method setup (line 24) | setup(props, { slots }) {
FILE: ui/src/components/table/QTable.js
function getCellValue (line 59) | function getCellValue(col, row) {
method setup (line 161) | setup(props, { slots, emit }) {
FILE: ui/src/components/table/QTd.js
method setup (line 15) | setup(props, { slots }) {
FILE: ui/src/components/table/QTh.js
method setup (line 18) | setup(props, { slots, emit }) {
FILE: ui/src/components/table/QTr.js
method setup (line 14) | setup(props, { slots }) {
FILE: ui/src/components/table/get-table-middle.js
function getTableMiddle (line 3) | function getTableMiddle(props, content) {
FILE: ui/src/components/table/table-column-selection.js
function useTableColumnSelection (line 9) | function useTableColumnSelection(
FILE: ui/src/components/table/table-filter.js
function useTableFilter (line 8) | function useTableFilter(props, setPagination) {
FILE: ui/src/components/table/table-pagination.js
function samePagination (line 3) | function samePagination(oldPag, newPag) {
function fixPagination (line 12) | function fixPagination(p) {
function useTablePaginationState (line 32) | function useTablePaginationState(vm, getCellValue) {
function useTablePagination (line 112) | function useTablePagination(
FILE: ui/src/components/table/table-row-expand.js
function getVal (line 3) | function getVal(val) {
function useTableRowExpand (line 13) | function useTableRowExpand(props, emit) {
FILE: ui/src/components/table/table-row-selection.js
function useTableRowSelection (line 17) | function useTableRowSelection(props, emit, computedRows, getRowKey) {
FILE: ui/src/components/table/table-sort.js
function useTableSort (line 16) | function useTableSort(
FILE: ui/src/components/tabs/QRouteTab.js
method setup (line 20) | setup(props, { slots, emit }) {
FILE: ui/src/components/tabs/QTab.js
method setup (line 12) | setup(props, { slots, emit }) {
FILE: ui/src/components/tabs/QTabs.js
function getIndicatorClass (line 24) | function getIndicatorClass(color, top, vertical) {
function hasQueryIncluded (line 30) | function hasQueryIncluded(targetQuery, matchingQuery) {
method setup (line 85) | setup(props, { slots, emit }) {
FILE: ui/src/components/tabs/use-tab.js
function useTab (line 55) | function useTab(props, slots, emit, routeData) {
FILE: ui/src/components/time/QTime.js
function getViewByModel (line 38) | function getViewByModel(model, withSeconds) {
function getCurrentTime (line 50) | function getCurrentTime() {
function getWheelDist (line 61) | function getWheelDist(a, b, threshold) {
function getValidValues (line 66) | function getValidValues(start, count, testFn) {
method setup (line 119) | setup(props, { slots, emit }) {
FILE: ui/src/components/timeline/QTimeline.js
method setup (line 36) | setup(props, { slots }) {
FILE: ui/src/components/timeline/QTimelineEntry.js
method setup (line 37) | setup(props, { slots }) {
FILE: ui/src/components/toggle/QToggle.js
method setup (line 24) | setup(props) {
FILE: ui/src/components/toolbar/QToolbar.js
method setup (line 13) | setup(props, { slots }) {
FILE: ui/src/components/toolbar/QToolbarTitle.js
method setup (line 13) | setup(props, { slots }) {
FILE: ui/src/components/tooltip/QTooltip.js
method setup (line 103) | setup(props, { slots, emit, attrs }) {
FILE: ui/src/components/tree/QTree.js
method setup (line 95) | setup(props, { slots, emit }) {
FILE: ui/src/components/uploader/QUploaderAddTrigger.js
method setup (line 12) | setup() {
FILE: ui/src/components/uploader/uploader-core.js
function getProgressLabel (line 34) | function getProgressLabel(p) {
function getRenderer (line 71) | function getRenderer(getPlugin, expose) {
FILE: ui/src/components/uploader/xhr-uploader-plugin.js
function getFn (line 3) | function getFn(prop) {
function injectPlugin (line 30) | function injectPlugin({ props, emit, helpers }) {
FILE: ui/src/components/video/QVideo.js
method setup (line 36) | setup(props) {
FILE: ui/src/components/virtual-scroll/QVirtualScroll.js
method setup (line 57) | setup(props, { slots, attrs }) {
FILE: ui/src/components/virtual-scroll/use-virtual-scroll.js
function sumFn (line 62) | function sumFn(acc, item) {
function getScrollDetails (line 66) | function getScrollDetails(
function setScroll (line 162) | function setScroll(parent, scroll, horizontal, rtl) {
function sumSize (line 198) | function sumSize(sizeAgg, size, from, to) {
function useVirtualScroll (line 261) | function useVirtualScroll({
FILE: ui/src/composables/private.use-align/use-align.js
function useAlign (line 22) | function useAlign(props) {
FILE: ui/src/composables/private.use-anchor/use-anchor.js
function useAnchor (line 31) | function useAnchor({
FILE: ui/src/composables/private.use-dark/use-dark.js
function useDark (line 10) | function useDark(props, $q) {
FILE: ui/src/composables/private.use-field/use-field.js
function fieldValueIsFilled (line 33) | function fieldValueIsFilled(val) {
function useFieldState (line 90) | function useFieldState({
function useField (line 144) | function useField(state) {
FILE: ui/src/composables/private.use-file/use-file-dom-props.js
function useFileDomProps (line 3) | function useFileDomProps(props, typeGuard) {
FILE: ui/src/composables/private.use-file/use-file.js
function filterFiles (line 6) | function filterFiles(files, rejectedFiles, failedPropValidation, filterF...
function stopAndPreventDrag (line 20) | function stopAndPreventDrag(e) {
function useFile (line 40) | function useFile({
FILE: ui/src/composables/private.use-fullscreen/use-fullscreen.js
function useFullscreen (line 22) | function useFullscreen() {
FILE: ui/src/composables/private.use-history/use-history.js
function useHistory (line 5) | function useHistory(showing, hide, hideOnRouteChange) {
FILE: ui/src/composables/private.use-history/use-history.test.js
method setup (line 14) | setup() {
method setup (line 36) | setup() {
method setup (line 58) | setup() {
FILE: ui/src/composables/private.use-key-composition/use-key-composition.js
function useKeyComposition (line 10) | function useKeyComposition(onInput) {
FILE: ui/src/composables/private.use-model-toggle/use-model-toggle.js
function useModelToggle (line 18) | function useModelToggle({
FILE: ui/src/composables/private.use-panel/use-panel.js
method setup (line 25) | setup(_, { slots }) {
function isValidPanelName (line 67) | function isValidPanelName(name) {
function usePanel (line 71) | function usePanel() {
FILE: ui/src/composables/private.use-portal/use-portal.js
method setup (line 27) | setup(_, { slots }) {
function isOnGlobalDialog (line 32) | function isOnGlobalDialog(vm) {
function usePortal (line 52) | function usePortal(vm, innerRef, renderPortalContent, type) {
FILE: ui/src/composables/private.use-prevent-scroll/use-prevent-scroll.js
function usePreventScroll (line 3) | function usePreventScroll() {
FILE: ui/src/composables/private.use-ratio/use-ratio.js
function useRatio (line 7) | function useRatio(props, naturalRatio) {
FILE: ui/src/composables/private.use-refocus-target/use-refocus-target.js
function useRefocusTarget (line 3) | function useRefocusTarget(props, rootRef) {
FILE: ui/src/composables/private.use-router-link/use-router-link.js
function getOriginalPath (line 11) | function getOriginalPath(record) {
function isSameRouteRecord (line 15) | function isSameRouteRecord(a, b) {
function includesParams (line 22) | function includesParams(outer, inner) {
function isEquivalentArray (line 41) | function isEquivalentArray(a, b) {
function isSameRouteLocationParamsValue (line 47) | function isSameRouteLocationParamsValue(a, b) {
function isSameRouteLocationParams (line 55) | function isSameRouteLocationParams(a, b) {
function useRouterLink (line 99) | function useRouterLink({
FILE: ui/src/composables/private.use-scroll-target/use-scroll-target.js
function useScrollTarget (line 5) | function useScrollTarget(props, configureScrollTarget) {
FILE: ui/src/composables/private.use-size/use-size.js
function useSize (line 15) | function useSize(props, sizes = useSizeDefaults) {
FILE: ui/src/composables/private.use-transition/use-transition.js
function useTransition (line 20) | function useTransition(
FILE: ui/src/composables/private.use-validate/use-validate.js
function useValidate (line 29) | function useValidate(focused, innerLoading) {
FILE: ui/src/composables/use-dialog-plugin-component/use-dialog-plugin-component.js
function useDialogPluginComponent (line 8) | function useDialogPluginComponent() {
FILE: ui/src/composables/use-form/private.use-form.js
function useFormAttrs (line 7) | function useFormAttrs(props) {
function useFormInject (line 15) | function useFormInject(formAttrs = {}) {
function useFormInputNameAttr (line 26) | function useFormInputNameAttr(props) {
FILE: ui/src/composables/use-form/use-form-child.js
function useFormChild (line 11) | function useFormChild({
FILE: ui/src/composables/use-hydration/use-hydration.js
function useHydration (line 6) | function useHydration() {
FILE: ui/src/composables/use-hydration/use-hydration.test.js
method setup (line 14) | setup() {
FILE: ui/src/composables/use-id/use-id.js
function parseValue (line 7) | function parseValue(val) {
function getId (line 11) | function getId(val, required) {
function useId (line 26) | function useId({ getValue, required = true } = {}) {
FILE: ui/src/composables/use-id/use-id.test.js
method setup (line 60) | setup() {
FILE: ui/src/composables/use-interval/use-interval.js
function useInterval (line 11) | function useInterval() {
FILE: ui/src/composables/use-interval/use-interval.test.js
method setup (line 32) | setup() {
method setup (line 58) | setup() {
method setup (line 84) | setup() {
method setup (line 117) | setup() {
method setup (line 144) | setup() {
FILE: ui/src/composables/use-meta/use-meta.js
function useMeta (line 12) | function useMeta(metaOptions) {
FILE: ui/src/composables/use-quasar/use-quasar.js
function useQuasar (line 9) | function useQuasar() {
FILE: ui/src/composables/use-quasar/use-quasar.test.js
method setup (line 14) | setup() {
FILE: ui/src/composables/use-render-cache/use-render-cache.js
function useRenderCache (line 1) | function useRenderCache() {
FILE: ui/src/composables/use-split-attrs/use-split-attrs.js
function useSplitAttrs (line 5) | function useSplitAttrs() {
FILE: ui/src/composables/use-split-attrs/use-split-attrs.test.js
method setup (line 33) | setup() {
method setup (line 43) | setup() {
FILE: ui/src/composables/use-tick/use-tick.js
function useTick (line 16) | function useTick() {
FILE: ui/src/composables/use-tick/use-tick.test.js
method setup (line 25) | setup() {
method setup (line 45) | setup() {
method setup (line 67) | setup() {
method setup (line 93) | setup() {
FILE: ui/src/composables/use-timeout/use-timeout.js
function useTimeout (line 11) | function useTimeout() {
FILE: ui/src/composables/use-timeout/use-timeout.test.js
method setup (line 32) | setup() {
method setup (line 57) | setup() {
method setup (line 82) | setup() {
method setup (line 114) | setup() {
method setup (line 140) | setup() {
FILE: ui/src/directives/close-popup/ClosePopup.js
function getDepth (line 16) | function getDepth(value) {
method beforeMount (line 30) | beforeMount(el, { value }) {
method updated (line 57) | updated(el, { value, oldValue }) {
method beforeUnmount (line 63) | beforeUnmount(el) {
FILE: ui/src/directives/intersection/Intersection.js
function update (line 11) | function update(el, ctx, value) {
function destroy (line 54) | function destroy(el) {
method mounted (line 69) | mounted(el, { modifiers, value }) {
method updated (line 79) | updated(el, binding) {
FILE: ui/src/directives/morph/Morph.js
function changeClass (line 25) | function changeClass(ctx, action) {
function trigger (line 32) | function trigger(group) {
function updateModifiers (line 74) | function updateModifiers(mod, ctx) {
function insertArgs (line 82) | function insertArgs(arg, ctx) {
function updateArgs (line 94) | function updateArgs(arg, ctx) {
function updateModel (line 111) | function updateModel(name, ctx) {
function updateValue (line 144) | function updateValue(ctx, value) {
method mounted (line 179) | mounted(el, binding) {
method updated (line 193) | updated(el, binding) {
method beforeUnmount (line 197) | beforeUnmount(el) {
FILE: ui/src/directives/mutation/Mutation.js
function update (line 13) | function update(el, ctx, value) {
function destroy (line 29) | function destroy(el) {
method mounted (line 44) | mounted(el, { modifiers: { once, ...mod }, value }) {
method updated (line 55) | updated(el, { oldValue, value }) {
FILE: ui/src/directives/ripple/Ripple.js
function showRipple (line 8) | function showRipple(evt, el, ctx, forceCenter) {
function updateModifiers (line 63) | function updateModifiers(ctx, { modifiers, value, arg }) {
method beforeMount (line 80) | beforeMount(el, binding) {
method updated (line 129) | updated(el, binding) {
method beforeUnmount (line 145) | beforeUnmount(el) {
FILE: ui/src/directives/ripple/Ripple.test.js
method setup (line 57) | setup() {
method setup (line 75) | setup() {
method setup (line 98) | setup() {
method setup (line 116) | setup() {
method setup (line 134) | setup() {
method setup (line 154) | setup() {
method setup (line 172) | setup() {
method setup (line 194) | setup() {
method setup (line 219) | setup() {
FILE: ui/src/directives/scroll-fire/ScrollFire.js
function update (line 10) | function update(ctx, { value, oldValue }) {
method mounted (line 29) | mounted(el, binding) {
method updated (line 60) | updated(el, binding) {
method beforeUnmount (line 66) | beforeUnmount(el) {
FILE: ui/src/directives/scroll/Scroll.js
function update (line 10) | function update(ctx, { value, oldValue }) {
method mounted (line 32) | mounted(el, binding) {
method updated (line 48) | updated(el, binding) {
method beforeUnmount (line 54) | beforeUnmount(el) {
FILE: ui/src/directives/touch-hold/TouchHold.js
function removeBodyNonSelectable (line 15) | function removeBodyNonSelectable() {
method beforeMount (line 25) | beforeMount(el, binding) {
method updated (line 165) | updated(el, binding) {
method beforeUnmount (line 174) | beforeUnmount(el) {
FILE: ui/src/directives/touch-pan/TouchPan.js
function getChanges (line 22) | function getChanges(evt, ctx, isFinal) {
function removeChildrenNoPointerEvents (line 122) | function removeChildrenNoPointerEvents() {
method beforeMount (line 134) | beforeMount(el, { value, modifiers }) {
method updated (line 431) | updated(el, bindings) {
method beforeUnmount (line 444) | beforeUnmount(el) {
FILE: ui/src/directives/touch-repeat/TouchRepeat.js
function shouldEnd (line 29) | function shouldEnd(evt, origin) {
function removeBodyNonSelectable (line 35) | function removeBodyNonSelectable() {
method beforeMount (line 45) | beforeMount(el, { modifiers, value, arg }) {
method updated (line 266) | updated(el, { oldValue, value }) {
method beforeUnmount (line 275) | beforeUnmount(el) {
FILE: ui/src/directives/touch-swipe/TouchSwipe.js
function parseArg (line 20) | function parseArg(arg) {
function removeBodyChildrenNoPointerEvents (line 36) | function removeBodyChildrenNoPointerEvents() {
method beforeMount (line 46) | beforeMount(el, { value, arg, modifiers }) {
method updated (line 268) | updated(el, bindings) {
method beforeUnmount (line 281) | beforeUnmount(el) {
FILE: ui/src/flags.dev.js
function getAttachPoint (line 8) | function getAttachPoint() {
FILE: ui/src/index.ssr.js
method install (line 23) | install(app, opts, ssrContext) {
FILE: ui/src/index.umd.js
method install (line 26) | install(app, opts) {
FILE: ui/src/install-quasar.js
function createChildApp (line 36) | function createChildApp(appCfg, parentApp) {
function installPlugins (line 47) | function installPlugins(pluginOpts, pluginList) {
function prepareApp (line 54) | function prepareApp(app, uiOpts, pluginOpts) {
FILE: ui/src/plugins/addressbar/AddressbarColor.js
function getProp (line 7) | function getProp() {
function getMetaTag (line 11) | function getMetaTag(v) {
function setColor (line 20) | function setColor(hexColor) {
method install (line 61) | install({ $q }) {
FILE: ui/src/plugins/addressbar/AddressbarColor.test.js
function mountPlugin (line 12) | function mountPlugin(addressbarColor) {
FILE: ui/src/plugins/app-fullscreen/AppFullscreen.js
function assignFn (line 6) | function assignFn(fn) {
function getFullscreenElement (line 14) | function getFullscreenElement() {
function updateEl (line 24) | function updateEl() {
function togglePluginState (line 34) | function togglePluginState() {
function promisify (line 40) | function promisify(target, fn) {
method install (line 57) | install({ $q }) {
method request (line 80) | request(target) {
method exit (line 96) | exit() {
method toggle (line 102) | toggle(target) {
FILE: ui/src/plugins/app-fullscreen/test/mock-fullscreen.js
function mockedRequestFullscreen (line 8) | function mockedRequestFullscreen(el = document.documentElement) {
function mockedExitFullscreen (line 13) | function mockedExitFullscreen() {
function mockedToggleFullscreen (line 18) | function mockedToggleFullscreen() {
function createMockedEl (line 22) | function createMockedEl() {
FILE: ui/src/plugins/app-visibility/AppVisibility.js
method install (line 9) | install({ $q }) {
FILE: ui/src/plugins/bottom-sheet/BottomSheet.js
method install (line 5) | install({ $q, parentApp }) {
FILE: ui/src/plugins/bottom-sheet/component/BottomSheetComponent.js
method setup (line 37) | setup(props, { emit }) {
FILE: ui/src/plugins/cookies/Cookies.js
function encode (line 1) | function encode(string) {
function decode (line 5) | function decode(string) {
function stringifyCookieValue (line 9) | function stringifyCookieValue(value) {
function read (line 13) | function read(string) {
function getString (line 42) | function getString(msOffset) {
function parseExpireString (line 48) | function parseExpireString(str) {
function set (line 73) | function set(key, val, opts = {}, ssr) {
function get (line 141) | function get(key, ssr) {
function remove (line 167) | function remove(key, options, ssr) {
function has (line 171) | function has(key, ssr) {
function getObject (line 175) | function getObject(ssr) {
method install (line 186) | install({ $q, ssrContext }) {
FILE: ui/src/plugins/dark/Dark.js
method set (line 11) | set(val) {
method toggle (line 36) | toggle() {
method install (line 40) | install({ $q, ssrContext }) {
FILE: ui/src/plugins/dialog/Dialog.js
method install (line 5) | install({ $q, parentApp }) {
FILE: ui/src/plugins/dialog/component/DialogPluginComponent.js
method setup (line 58) | setup(props, { emit }) {
FILE: ui/src/plugins/icon-set/IconSet.js
method set (line 14) | set(setObject, ssrContext) {
method install (line 33) | install({ $q, iconSet, ssrContext }) {
FILE: ui/src/plugins/lang/Lang.js
function getLocale (line 5) | function getLocale() {
method set (line 38) | set(langObject = defaultLang, ssrContext) {
method install (line 90) | install({ $q, lang, ssrContext }) {
FILE: ui/src/plugins/loading-bar/LoadingBar.js
method install (line 23) | install({ $q, parentApp }) {
FILE: ui/src/plugins/loading/Loading.js
function registerProps (line 38) | function registerProps(opts) {
method show (line 57) | show(opts) {
method hide (line 184) | hide(group) {
method setDefaults (line 217) | setDefaults(opts) {
method install (line 223) | install({ $q, parentApp }) {
FILE: ui/src/plugins/meta/Meta.js
function normalize (line 8) | function normalize(meta) {
function changed (line 38) | function changed(old, def) {
function bodyFilter (line 50) | function bodyFilter(name) {
function htmlFilter (line 54) | function htmlFilter(name) {
function diff (line 58) | function diff(meta, other) {
function apply (line 100) | function apply({ add, remove }) {
function getAttr (line 148) | function getAttr(seed) {
function getHead (line 155) | function getHead(meta) {
function injectServerMeta (line 177) | function injectServerMeta(ssrContext) {
function updateClientMeta (line 229) | function updateClientMeta() {
function planClientUpdate (line 256) | function planClientUpdate() {
method install (line 262) | install(opts) {
FILE: ui/src/plugins/notify/Notify.js
function addNotification (line 69) | function addNotification(config, $q, originalApi) {
function removeNotification (line 356) | function removeNotification(notif) {
function hasContent (line 386) | function hasContent(str) {
function logError (line 390) | function logError(error, config) {
function getComponent (line 395) | function getComponent() {
method setDefaults (line 547) | setDefaults(opts) {
method registerType (line 553) | registerType(typeName, typeOpts) {
method install (line 559) | install({ $q, parentApp }) {
FILE: ui/src/plugins/platform/Platform.js
function getMatch (line 23) | function getMatch(userAgent, platformMatch) {
function getPlatformMatch (line 47) | function getPlatformMatch(userAgent) {
function getPlatform (line 73) | function getPlatform(UA) {
method install (line 340) | install(opts) {
FILE: ui/src/plugins/private.body/Body.js
function getMobilePlatform (line 7) | function getMobilePlatform(is) {
function getBodyClasses (line 12) | function getBodyClasses({ is, has, within }, cfg) {
function applyClientSsrCorrections (line 46) | function applyClientSsrCorrections() {
function setColors (line 86) | function setColors(brand) {
method install (line 93) | install(opts) {
FILE: ui/src/plugins/private.history/History.js
function filterInvalidPath (line 6) | function filterInvalidPath(path) {
function normalizeExitPath (line 12) | function normalizeExitPath(path) {
function getShouldExitFn (line 19) | function getShouldExitFn(cfg) {
method install (line 41) | install({ $q }) {
FILE: ui/src/plugins/screen/Screen.js
constant SIZE_LIST (line 7) | const SIZE_LIST = ['sm', 'md', 'lg', 'xl']
method install (line 46) | install({ $q, onSSRHydrated }) {
FILE: ui/src/plugins/screen/Screen.test.js
function setWidth (line 17) | function setWidth(width) {
function setHeight (line 23) | function setHeight(height) {
FILE: ui/src/plugins/storage/LocalStorage.js
method install (line 10) | install({ $q }) {
FILE: ui/src/plugins/storage/SessionStorage.js
method install (line 10) | install({ $q }) {
FILE: ui/src/plugins/storage/engine/web-storage.js
function encode (line 4) | function encode(value) {
function decode (line 32) | function decode(value) {
function getEmptyStorage (line 77) | function getEmptyStorage() {
function getStorage (line 96) | function getStorage(type) {
FILE: ui/src/utils/EventBus/EventBus.js
class EventBus (line 6) | class EventBus {
method constructor (line 7) | constructor() {
method on (line 11) | on(name, callback, ctx) {
method once (line 20) | once(name, callback, ctx) {
method emit (line 30) | emit(name, ...args) {
method off (line 42) | off(name, callback) {
FILE: ui/src/utils/clone/clone.js
function cloneDeep (line 3) | function cloneDeep(data, hash = new WeakMap()) {
FILE: ui/src/utils/colors/colors.js
function rgbToHex (line 3) | function rgbToHex({ r, g, b, a }) {
function rgbToString (line 23) | function rgbToString({ r, g, b, a }) {
function hexToRgb (line 27) | function hexToRgb(hex) {
function hsvToRgb (line 52) | function hsvToRgb({ h, s, v, a }) {
function rgbToHsv (line 111) | function rgbToHsv({ r, g, b, a }) {
function textToRgb (line 149) | function textToRgb(str) {
function lighten (line 177) | function lighten(color, percent) {
function luminosity (line 205) | function luminosity(color) {
function brightness (line 220) | function brightness(color) {
function blend (line 230) | function blend(fgColor, bgColor) {
function changeAlpha (line 262) | function changeAlpha(color, offset) {
function getPaletteColor (line 282) | function getPaletteColor(colorName) {
FILE: ui/src/utils/copy-to-clipboard/copy-to-clipboard.js
function fallback (line 3) | function fallback(text) {
function copyToClipboard (line 25) | function copyToClipboard(text) {
FILE: ui/src/utils/create-meta-mixin/create-meta-mixin.js
function createMetaMixin (line 3) | function createMetaMixin(metaOptions) {
FILE: ui/src/utils/create-uploader-component/create-uploader-component.js
function createUploaderComponent (line 13) | function createUploaderComponent({
FILE: ui/src/utils/css-var/get-css-var.js
function getCssVar (line 1) | function getCssVar(propName, element = document.body) {
FILE: ui/src/utils/css-var/set-css-var.js
function setCssVar (line 1) | function setCssVar(propName, value, element = document.body) {
FILE: ui/src/utils/date/date.js
constant MILLISECONDS_IN_DAY (line 6) | const MILLISECONDS_IN_DAY = 86_400_000,
constant MILLISECONDS_IN_HOUR (line 6) | const MILLISECONDS_IN_DAY = 86_400_000,
constant MILLISECONDS_IN_MINUTE (line 6) | const MILLISECONDS_IN_DAY = 86_400_000,
function getRegexData (line 16) | function getRegexData(mask, dateLocale) {
function getDateLocale (line 203) | function getDateLocale(paramDateLocale, langProps) {
function formatTimezone (line 211) | function formatTimezone(offset, delimeter = '') {
function applyYearMonthDayChange (line 220) | function applyYearMonthDayChange(date, mod, sign) {
function applyYearMonthDay (line 251) | function applyYearMonthDay(date, mod, middle) {
function getChange (line 274) | function getChange(date, rawMod, sign) {
function normalizeMod (line 290) | function normalizeMod(mod) {
function adjustDate (line 335) | function adjustDate(date, rawMod, utc) {
function extractDate (line 352) | function extractDate(str, mask, dateLocale) {
function __splitDate (line 372) | function __splitDate(str, mask, dateLocale, calendar, defaultModel) {
function isValid (line 506) | function isValid(date) {
function buildDate (line 510) | function buildDate(mod, utc) {
function getDayOfWeek (line 514) | function getDayOfWeek(date) {
function getWeekOfYear (line 519) | function getWeekOfYear(date) {
function getDayIdentifier (line 543) | function getDayIdentifier(date) {
function getDateIdentifier (line 547) | function getDateIdentifier(date, onlyDate /* = false */) {
function isBetweenDates (line 552) | function isBetweenDates(date, from, to, opts = {}) {
function addToDate (line 563) | function addToDate(date, mod) {
function subtractFromDate (line 566) | function subtractFromDate(date, mod) {
function startOfDate (line 570) | function startOfDate(date, unit, utc) {
function endOfDate (line 604) | function endOfDate(date, unit, utc) {
function getMaxDate (line 638) | function getMaxDate(date, ...args) {
function getMinDate (line 647) | function getMinDate(date, ...args) {
function getDiff (line 656) | function getDiff(t, sub, interval) {
function getDateDiff (line 665) | function getDateDiff(date, subtract, unit = 'days') {
function getDayOfYear (line 719) | function getDayOfYear(date) {
function inferDateFormat (line 723) | function inferDateFormat(date) {
function getDateBetween (line 727) | function getDateBetween(date, min, max) {
function isSameDate (line 747) | function isSameDate(date, date2, unit) {
function daysInMonth (line 802) | function daysInMonth(date) {
function getOrdinal (line 806) | function getOrdinal(n) {
method YY (line 826) | YY(date, dateLocale, forcedYear) {
method YYYY (line 833) | YYYY(date, _dateLocale, forcedYear) {
method M (line 841) | M(date) {
method Mo (line 846) | Mo(date) {
method MM (line 851) | MM(date) {
method MMM (line 856) | MMM(date, dateLocale) {
method MMMM (line 861) | MMMM(date, dateLocale) {
method Q (line 866) | Q(date) {
method Qo (line 871) | Qo(date) {
method D (line 876) | D(date) {
method Do (line 881) | Do(date) {
method DD (line 886) | DD(date) {
method DDD (line 891) | DDD(date) {
method DDDo (line 896) | DDDo(date) {
method DDDD (line 901) | DDDD(date) {
method d (line 906) | d(date) {
method do (line 911) | do(date) {
method dd (line 916) | dd(date, dateLocale) {
method ddd (line 921) | ddd(date, dateLocale) {
method dddd (line 926) | dddd(date, dateLocale) {
method E (line 931) | E(date) {
method w (line 936) | w(date) {
method wo (line 941) | wo(date) {
method ww (line 946) | ww(date) {
method H (line 951) | H(date) {
method HH (line 956) | HH(date) {
method h (line 961) | h(date) {
method hh (line 967) | hh(date) {
method m (line 972) | m(date) {
method mm (line 977) | mm(date) {
method s (line 982) | s(date) {
method ss (line 987) | ss(date) {
method S (line 992) | S(date) {
method SS (line 997) | SS(date) {
method SSS (line 1002) | SSS(date) {
method A (line 1007) | A(date) {
method a (line 1012) | a(date) {
method aa (line 1017) | aa(date) {
method Z (line 1022) | Z(date, _dateLocale, _forcedYear, forcedTimezoneOffset) {
method ZZ (line 1032) | ZZ(date, _dateLocale, _forcedYear, forcedTimezoneOffset) {
method X (line 1042) | X(date) {
method x (line 1047) | x(date) {
function formatDate (line 1052) | function formatDate(
function clone (line 1080) | function clone(date) {
FILE: ui/src/utils/date/private.persian.js
function toJalaali (line 14) | function toJalaali(gy, gm, gd) {
function toGregorian (line 26) | function toGregorian(jy, jm, jd) {
function isLeapJalaaliYear (line 33) | function isLeapJalaaliYear(jy) {
function jalaaliMonthLength (line 40) | function jalaaliMonthLength(jy, jm) {
function jalCalLeap (line 54) | function jalCalLeap(jy) {
function jalCal (line 103) | function jalCal(jy, withoutLeap) {
function j2d (line 169) | function j2d(jy, jm, jd) {
function d2j (line 183) | function d2j(jdn) {
function g2d (line 237) | function g2d(gy, gm, gd) {
function d2g (line 258) | function d2g(jdn) {
function div (line 276) | function div(a, b) {
function mod (line 280) | function mod(a, b) {
FILE: ui/src/utils/debounce/debounce.js
function debounce (line 2) | function debounce(fn, wait = 250, immediate) {
FILE: ui/src/utils/dom/dom.js
function offset (line 3) | function offset(el) {
function style (line 11) | function style(el, property) {
function height (line 15) | function height(el) {
function width (line 19) | function width(el) {
function css (line 23) | function css(element, cssObject) {
function cssBatch (line 31) | function cssBatch(elements, elementCssObject) {
function ready (line 35) | function ready(fn) {
function getElement (line 46) | function getElement(el) {
function childHasFocus (line 66) | function childHasFocus(el, focusedEl) {
FILE: ui/src/utils/dom/dom.test.js
function createEl (line 8) | function createEl({ top, left } = {}) {
FILE: ui/src/utils/event/event.js
method get (line 9) | get() {
function noop (line 23) | function noop() {}
function leftClick (line 25) | function leftClick(e) {
function middleClick (line 29) | function middleClick(e) {
function rightClick (line 33) | function rightClick(e) {
function position (line 37) | function position(e) {
function getEventPath (line 52) | function getEventPath(e) {
constant LINE_HEIGHT (line 77) | const LINE_HEIGHT = 40,
constant PAGE_HEIGHT (line 77) | const LINE_HEIGHT = 40,
function getMouseWheelDistance (line 80) | function getMouseWheelDistance(e) {
function stop (line 97) | function stop(e) {
function prevent (line 101) | function prevent(e) {
function stopAndPrevent (line 105) | function stopAndPrevent(e) {
function preventDraggable (line 110) | function preventDraggable(el, status) {
function addEvt (line 137) | function addEvt(ctx, targetName, events) {
function cleanEvt (line 147) | function cleanEvt(ctx, targetName) {
FILE: ui/src/utils/export-file/export-file.js
function clean (line 1) | function clean(link) {
function exportFile (line 30) | function exportFile(fileName, rawData, opts = {}) {
FILE: ui/src/utils/extend/extend.js
function isPlainObject (line 9) | function isPlainObject(obj) {
function extend (line 30) | function extend(...args) {
FILE: ui/src/utils/format/format.js
function humanStorageSize (line 3) | function humanStorageSize(bytes, decimals = 1) {
function capitalize (line 14) | function capitalize(str) {
function between (line 18) | function between(v, min, max) {
function normalizeToInterval (line 22) | function normalizeToInterval(v, min, max) {
function pad (line 37) | function pad(v, length = 2, char = '0') {
FILE: ui/src/utils/frame-debounce/frame-debounce.js
function frameDebounce (line 1) | function frameDebounce(fn) {
FILE: ui/src/utils/is/is.js
function isDeepEqual (line 1) | function isDeepEqual(a, b) {
function isObject (line 124) | function isObject(v) {
function isDate (line 128) | function isDate(v) {
function isRegexp (line 132) | function isRegexp(v) {
function isNumber (line 136) | function isNumber(v) {
FILE: ui/src/utils/morph/morph.js
function defaultCancel (line 6) | function defaultCancel() {
function getAbsolutePosition (line 10) | function getAbsolutePosition(el, resize) {
function getAbsoluteSize (line 40) | function getAbsoluteSize(el) {
function getComputedStyle (line 58) | function getComputedStyle(el, props) {
function getMaxZIndex (line 111) | function getMaxZIndex(elStart) {
function normalizeElements (line 132) | function normalizeElements(opts) {
function normalizeOptions (line 139) | function normalizeOptions(options) {
function getElement (line 188) | function getElement(element) {
function isValidElement (line 198) | function isValidElement(element) {
function morph (line 204) | function morph(_options) {
FILE: ui/src/utils/open-url/open-url.js
function parseFeatures (line 6) | function parseFeatures(winFeatures) {
function openWindow (line 20) | function openWindow(url, reject, windowFeatures) {
function openUrl (line 51) | function openUrl(url, reject, windowFeatures) {
FILE: ui/src/utils/private.click-outside/click-outside.js
function globalHandler (line 9) | function globalHandler(evt) {
function addClickOutside (line 67) | function addClickOutside(clickOutsideProps) {
function removeClickOutside (line 76) | function removeClickOutside(clickOutsideProps) {
FILE: ui/src/utils/private.config/instance-config.js
function freezeGlobalConfig (line 6) | function freezeGlobalConfig() {
FILE: ui/src/utils/private.config/instance-config.test.js
function mountWithConfig (line 16) | function mountWithConfig(mountConfig) {
FILE: ui/src/utils/private.config/nodes.js
function createGlobalNode (line 9) | function createGlobalNode(id, portalType) {
function removeGlobalNode (line 29) | function removeGlobalNode(el) {
function changeGlobalNodesTarget (line 38) | function changeGlobalNodesTarget(newTarget) {
FILE: ui/src/utils/private.create/create.js
function createComponent (line 4) | function createComponent(raw) {
function createDirective (line 7) | function createDirective(raw) {
FILE: ui/src/utils/private.dialog/create-dialog.js
function merge (line 14) | function merge(target, source) {
function createDialog (line 27) | function createDialog(
FILE: ui/src/utils/private.focus/focus-manager.js
function clearFlag (line 4) | function clearFlag(flag) {
function addFocusWaitFlag (line 8) | function addFocusWaitFlag(flag) {
function removeFocusWaitFlag (line 13) | function removeFocusWaitFlag(flag) {
function addFocusFn (line 23) | function addFocusFn(fn) {
function removeFocusFn (line 31) | function removeFocusFn(fn) {
FILE: ui/src/utils/private.focus/focus-manager.test.js
function createTestFn (line 26) | function createTestFn() {
function createTestWaitFlag (line 32) | function createTestWaitFlag() {
FILE: ui/src/utils/private.focus/focusout.js
function trigger (line 5) | function trigger(e) {
function addFocusout (line 9) | function addFocusout(fn) {
function removeFocusout (line 19) | function removeFocusout(fn) {
Copy disabled (too large)
Download .json
Condensed preview — 4052 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (82,743K chars).
[
{
"path": ".editorconfig",
"chars": 173,
"preview": "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_size = 2\nindent_style = space\nend_of_line = lf\ninsert_"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/CODE_OF_CONDUCT.md",
"chars": 1423,
"preview": "# Contributor Code of Conduct\n\nAs contributors and maintainers of this project, we pledge to respect all people who cont"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 224,
"preview": "# Quasar Contributing Guide\n\nHi! We are really excited that you are interested in contributing to Quasar 👏.\nPlease visit"
},
{
"path": ".github/FUNDING.yml",
"chars": 346,
"preview": "# These are supported funding model platforms\n\ngithub: rstoenescu\npatreon: # quasarframework\nopen_collective: # Replace "
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report--quasar-v2.yml",
"chars": 6157,
"preview": "name: Bug report (Quasar v2)\ndescription: Create a bug report to help us improve\nlabels: ['kind/bug 🐞', 'Qv2 🔝']\n\n# Note"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 1101,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Check Discussions\n url: https://github.com/quasarframework/quasa"
},
{
"path": ".github/ISSUE_TEMPLATE/docs-report--quasar-v2.yml",
"chars": 3348,
"preview": "name: Docs report (Quasar v2)\ndescription: Create a docs report to help us improve\nlabels: ['kind/docs 📄', 'Qv2 🔝']\n\n# N"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1580,
"preview": "<!--\n Please make sure to read the Pull Request Guidelines:\n https://github.com/quasarframework/quasar/blob/dev/CONTRI"
},
{
"path": ".github/RELEASE-TEMPLATE.md",
"chars": 557,
"preview": "# Quasar v2.x.x\n\n## What's Changed\n\n**Features:**\n\n**Fixes:**\n\n## Documentation\n\nThe documentation can be found at [quas"
},
{
"path": ".github/workflows/build-types.yml",
"chars": 2103,
"preview": "name: Build types\n\non:\n workflow_dispatch:\n push:\n branches:\n - dev\n paths:\n - '.github/workflows/buil"
},
{
"path": ".github/workflows/comment-build-results.yml",
"chars": 5911,
"preview": "name: Comment build results\n\n# We are not using using a single workflow on `pull_request_target`, and have two workflows"
},
{
"path": ".github/workflows/process-created-issue.yml",
"chars": 6586,
"preview": "name: Process Created Issue\non:\n issues:\n types:\n - opened\n\njobs:\n issue-automation:\n permissions:\n co"
},
{
"path": ".github/workflows/project-creation-tests.yml",
"chars": 5617,
"preview": "name: Project creation tests\n\non:\n workflow_dispatch:\n release:\n types:\n - released # A release was published,"
},
{
"path": ".github/workflows/release-notes.yml",
"chars": 6582,
"preview": "name: Generate and Publish Release Notes JSON\n\non:\n workflow_dispatch:\n\n release:\n types:\n - released # A rele"
},
{
"path": ".github/workflows/tests-on-pr-report.yml",
"chars": 2703,
"preview": "name: Test results\n\non:\n workflow_run:\n workflows:\n - UI tests\n types:\n - completed\n\njobs:\n test-resul"
},
{
"path": ".github/workflows/tests-on-pr.yml",
"chars": 2965,
"preview": "name: UI tests\n\non:\n pull_request:\n types: [opened, synchronize]\n branches:\n - 'dev'\n paths:\n - '.gi"
},
{
"path": ".gitignore",
"chars": 138,
"preview": ".DS_Store\n.Thumbs.db\nnpm-debug.log\ndebug.log\ndist/\nnode_modules/\n.quasar/\nquasar.config.*.temporary.compiled*\nsrc-capaci"
},
{
"path": ".husky/pre-commit",
"chars": 22,
"preview": "pnpm exec lint-staged\n"
},
{
"path": ".npmrc",
"chars": 124,
"preview": "# pnpm-related options\nshamefully-hoist=true\nstrict-peer-dependencies=false\nlink-workspace-packages=true\npublish-branch="
},
{
"path": ".oxfmtrc.json",
"chars": 984,
"preview": "{\n \"ignorePatterns\": [\n \"**/node_modules/\",\n \"**/dist/\",\n \"**/templates/\",\n \"**/quasar.config.*.temporary.c"
},
{
"path": ".oxlintrc.json",
"chars": 6109,
"preview": "{\n \"ignorePatterns\": [\n \"**/node_modules/\",\n \"**/dist/\",\n \"**/quasar.config.*.temporary.compiled*\",\n \"**/.q"
},
{
"path": ".sasslintrc",
"chars": 675,
"preview": "{\n \"rules\": {\n \"extends-before-mixins\": 2,\n \"extends-before-declarations\": 2,\n \"placeholder-in-extend\": 2,\n "
},
{
"path": ".vscode/extensions.json",
"chars": 288,
"preview": "{\n \"recommendations\": [\n \"oxc.oxc-vscode\",\n \"editorconfig.editorconfig\",\n \"vue.volar\",\n \"wayou.vscode-todo-"
},
{
"path": ".vscode/settings.json",
"chars": 779,
"preview": "{\n \"editor.bracketPairColorization.enabled\": true,\n \"editor.guides.bracketPairs\": true,\n\n \"editor.defaultFormatter\": "
},
{
"path": "CONTRIBUTING.md",
"chars": 224,
"preview": "# Quasar Contributing Guide\n\nHi! We are really excited that you are interested in contributing to Quasar 👏.\nPlease visit"
},
{
"path": "LICENSE",
"chars": 1091,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-present Razvan Stoenescu\n\nPermission is hereby granted, free of charge, to any"
},
{
"path": "README.md",
"chars": 7472,
"preview": "\n\n# Quasar Framework\n\n> Build high-performance VueJS "
},
{
"path": "ROADMAP.md",
"chars": 9055,
"preview": "## Quasar Framework Roadmap\n\nWhere will Quasar be in one year, five years or ten years? It's up to you, the developers u"
},
{
"path": "SECURITY.md",
"chars": 1158,
"preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n| ------- | ------------------ |\n| 2.x.x | "
},
{
"path": "app-vite/.gitignore",
"chars": 15,
"preview": "ssl-server.pem\n"
},
{
"path": "app-vite/LICENSE",
"chars": 1091,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015-present Razvan Stoenescu\n\nPermission is hereby granted, free of charge, to any"
},
{
"path": "app-vite/README.md",
"chars": 2346,
"preview": "\n\n# Quasar Framework App CLI with Vite (Local)\n\n> Bui"
},
{
"path": "app-vite/assets/logo.art",
"chars": 313,
"preview": "\n .d88888b.\nd88P\" \"Y88b\n888 888\n888 888 888 888 8888b. .d8888b 8888b. 888d888\n888 888 888 888 \"88"
},
{
"path": "app-vite/bin/quasar.js",
"chars": 1875,
"preview": "#!/usr/bin/env node\n\n// oxlint-disable-next-line import/no-unassigned-import\nimport '../lib/node-version-check.js'\n\nif ("
},
{
"path": "app-vite/exports/bex/background.js",
"chars": 4061,
"preview": "import { BexBridge } from './private/bex-bridge.js'\n\nfunction interceptRequests(devServerPort) {\n /**\n * We intercept"
},
{
"path": "app-vite/exports/bex/content.js",
"chars": 1860,
"preview": "import { BexBridge } from './private/bex-bridge.js'\n\n/**\n * Only run these in development mode and in Chrome.\n * Only Ch"
},
{
"path": "app-vite/exports/bex/private/bex-bridge.js",
"chars": 19034,
"preview": "const portNameRE = /^background$|^app$|^content@/\nconst { runtime } =\n import.meta.env.QUASAR_TARGET === 'firefox' ? br"
},
{
"path": "app-vite/exports/eslint/eslint.cjs",
"chars": 344,
"preview": "const ignoreList = [\n 'dist/*',\n 'src-capacitor/*',\n 'src-cordova/*',\n '.quasar/*',\n 'quasar.config.*.temporary.com"
},
{
"path": "app-vite/exports/eslint/eslint.js",
"chars": 342,
"preview": "const ignoreList = [\n 'dist/*',\n 'src-capacitor/*',\n 'src-cordova/*',\n '.quasar/*',\n 'quasar.config.*.temporary.com"
},
{
"path": "app-vite/exports/testing/testing.js",
"chars": 764,
"preview": "/**\n * This endpoint is used exclusively by @quasar/testing AEs\n */\n\nimport { getCtx } from '../../lib/utils/get-ctx.js'"
},
{
"path": "app-vite/exports/wrappers.js",
"chars": 736,
"preview": "// Functions in this file are no-op,\n// they just take a callback function and return it\n// They're used to apply typin"
},
{
"path": "app-vite/lib/app-builder.js",
"chars": 2252,
"preview": "import fse from 'fs-extra'\nimport { basename, dirname, isAbsolute, join } from 'node:path'\n\nimport { AppTool } from './a"
},
{
"path": "app-vite/lib/app-devserver.js",
"chars": 4442,
"preview": "import { AppTool } from './app-tool.js'\nimport { printDevRunningBanner } from './utils/banner.js'\nimport { encodeForDiff"
},
{
"path": "app-vite/lib/app-extension/AppExtensionInstance.js",
"chars": 12136,
"preview": "import { relative, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport fse from 'fs-extra'\nimport"
},
{
"path": "app-vite/lib/app-extension/api-classes/BaseAPI.js",
"chars": 1112,
"preview": "import { cliPkg } from '../../utils/cli-runtime.js'\nimport { getPackagePath } from '../../utils/get-package-path.js'\n\nex"
},
{
"path": "app-vite/lib/app-extension/api-classes/IndexAPI.js",
"chars": 7992,
"preview": "import semver from 'semver'\nimport { merge } from 'webpack-merge'\n\nimport { fatal } from '../../utils/logger.js'\nimport "
},
{
"path": "app-vite/lib/app-extension/api-classes/InstallAPI.js",
"chars": 9801,
"preview": "import fs from 'fs-extra'\nimport path from 'node:path'\nimport { merge } from 'webpack-merge'\nimport semver from 'semver'"
},
{
"path": "app-vite/lib/app-extension/api-classes/PromptsAPI.js",
"chars": 2513,
"preview": "import semver from 'semver'\n\nimport { fatal } from '../../utils/logger.js'\nimport { getPackageJson } from '../../utils/g"
},
{
"path": "app-vite/lib/app-extension/api-classes/UninstallAPI.js",
"chars": 2630,
"preview": "import fse from 'fs-extra'\nimport semver from 'semver'\n\nimport { getPackageJson } from '../../utils/get-package-json.js'"
},
{
"path": "app-vite/lib/app-extension/create-app-ext.js",
"chars": 2753,
"preview": "import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { merge } from 'webpack-merge'\nimport { parseJS"
},
{
"path": "app-vite/lib/app-tool.js",
"chars": 2320,
"preview": "import { join } from 'node:path'\nimport fse from 'fs-extra'\n\nimport { build as viteBuild } from 'vite'\nimport { rolldown"
},
{
"path": "app-vite/lib/cache/create-cache-proxy.js",
"chars": 1016,
"preview": "/**\n * @param {import('../../types/configuration/context').InternalQuasarContext} ctx\n *\n * @returns {import('../../type"
},
{
"path": "app-vite/lib/cache/module.animations.js",
"chars": 330,
"preview": "import { getPackage } from '../utils/get-package.js'\n\nexport async function createInstance({ appPaths }) {\n const { gen"
},
{
"path": "app-vite/lib/cache/module.capCli.js",
"chars": 369,
"preview": "import { getPackagePath } from '../utils/get-package-path.js'\nimport { getPackageMajorVersion } from '../utils/get-packa"
},
{
"path": "app-vite/lib/cache/module.cssVariables.js",
"chars": 425,
"preview": "import fs from 'node:fs'\n\nexport function createInstance({ appPaths }) {\n const cssVariables = {\n quasarSrcExt: 'css"
},
{
"path": "app-vite/lib/cache/module.electron.js",
"chars": 2042,
"preview": "import { getPackage } from '../utils/get-package.js'\nimport { fatal } from '../utils/logger.js'\n\nconst bundlerMap = {\n "
},
{
"path": "app-vite/lib/cache/module.hasTypescript.js",
"chars": 146,
"preview": "import { existsSync } from 'node:fs'\n\nexport function createInstance({ appPaths }) {\n return existsSync(appPaths.resolv"
},
{
"path": "app-vite/lib/cache/module.nodePackager.js",
"chars": 5708,
"preview": "import fs from 'node:fs'\nimport { join, normalize, sep } from 'node:path'\nimport { sync as crossSpawnSync } from 'cross-"
},
{
"path": "app-vite/lib/cache/module.storeProvider.js",
"chars": 602,
"preview": "import { getPackagePath } from '../utils/get-package-path.js'\n\n// Structured this way to be able to support other store "
},
{
"path": "app-vite/lib/cache/module.workboxBuild.js",
"chars": 169,
"preview": "import { getPackage } from '../utils/get-package.js'\n\nexport async function createInstance({ appPaths }) {\n return awai"
},
{
"path": "app-vite/lib/cmd/build.js",
"chars": 7408,
"preview": "if (process.env.NODE_ENV === void 0) {\n process.env.NODE_ENV = 'production'\n}\n\nimport parseArgs from 'minimist'\n\nconst "
},
{
"path": "app-vite/lib/cmd/clean.js",
"chars": 1935,
"preview": "import parseArgs from 'minimist'\n\nimport { log } from '../utils/logger.js'\n\nconst argv = parseArgs(process.argv.slice(2)"
},
{
"path": "app-vite/lib/cmd/describe.js",
"chars": 14606,
"preview": "import parseArgs from 'minimist'\nimport { green, italic, red, underline } from 'kolorist'\n\nimport { dot, fatal } from '."
},
{
"path": "app-vite/lib/cmd/dev.js",
"chars": 5387,
"preview": "if (process.env.NODE_ENV === void 0) {\n process.env.NODE_ENV = 'development'\n}\n\nimport parseArgs from 'minimist'\n\nimpor"
},
{
"path": "app-vite/lib/cmd/ext.js",
"chars": 2150,
"preview": "import parseArgs from 'minimist'\n\nconst argv = parseArgs(process.argv.slice(2), {\n alias: {\n h: 'help'\n },\n boolea"
},
{
"path": "app-vite/lib/cmd/help.js",
"chars": 1759,
"preview": "import { readFileSync } from 'node:fs'\n\nconsole.log(\n readFileSync(new URL('../../assets/logo.art', import.meta.url), '"
},
{
"path": "app-vite/lib/cmd/info.js",
"chars": 3202,
"preview": "import parseArgs from 'minimist'\nimport { gray, green } from 'kolorist'\n\nimport { getPackageJson } from '../utils/get-pa"
},
{
"path": "app-vite/lib/cmd/inspect.js",
"chars": 3234,
"preview": "import parseArgs from 'minimist'\n\nconst argv = parseArgs(process.argv.slice(2), {\n alias: {\n c: 'cmd',\n m: 'mode'"
},
{
"path": "app-vite/lib/cmd/mode.js",
"chars": 3195,
"preview": "import parseArgs from 'minimist'\n\nimport { fatal, log, warn } from '../utils/logger.js'\n\nconst argv = parseArgs(process."
},
{
"path": "app-vite/lib/cmd/new.js",
"chars": 5513,
"preview": "import parseArgs from 'minimist'\n\nimport { dirname, join, relative } from 'node:path'\nimport fs from 'node:fs'\nimport fs"
},
{
"path": "app-vite/lib/cmd/prepare.js",
"chars": 1609,
"preview": "import parseArgs from 'minimist'\n\nimport { log } from '../utils/logger.js'\n\nconst argv = parseArgs(process.argv.slice(2)"
},
{
"path": "app-vite/lib/cmd/run.js",
"chars": 1926,
"preview": "import parseArgs from 'minimist'\n\nconst argv = parseArgs(process.argv.slice(2), {\n alias: {\n h: 'help'\n },\n boolea"
},
{
"path": "app-vite/lib/config-tools.js",
"chars": 10624,
"preview": "import { join } from 'node:path'\nimport { quasar as quasarVitePlugin } from '@quasar/vite-plugin'\nimport vueVitePlugin f"
},
{
"path": "app-vite/lib/entry-files-generator.js",
"chars": 1478,
"preview": "import { readFileSync } from 'node:fs'\nimport fse from 'fs-extra'\n\nimport { compileTemplateToFn } from './utils/template"
},
{
"path": "app-vite/lib/modes/bex/bex-builder.js",
"chars": 3462,
"preview": "import { join, relative, sep } from 'node:path'\nimport fse from 'fs-extra'\nimport { Zip, ZipDeflate } from 'fflate'\n\nimp"
},
{
"path": "app-vite/lib/modes/bex/bex-config.js",
"chars": 2780,
"preview": "import { join } from 'node:path'\n\nimport { mergeConfig as mergeViteConfig } from 'vite'\n\nimport {\n createBrowserRolldow"
},
{
"path": "app-vite/lib/modes/bex/bex-devserver.js",
"chars": 6647,
"preview": "import { join } from 'node:path'\nimport fse from 'fs-extra'\nimport { watch as chokidarWatch } from 'chokidar'\nimport { c"
},
{
"path": "app-vite/lib/modes/bex/bex-installation.js",
"chars": 1314,
"preview": "import fse from 'fs-extra'\n\nimport { log, warn } from '../../utils/logger.js'\nimport { isModeInstalled } from '../modes-"
},
{
"path": "app-vite/lib/modes/bex/bex-utils.js",
"chars": 5895,
"preview": "import fse from 'fs-extra'\nimport { join } from 'node:path'\nimport { merge } from 'webpack-merge'\n\nimport { warn } from "
},
{
"path": "app-vite/lib/modes/capacitor/capacitor-builder.js",
"chars": 3592,
"preview": "import { join } from 'node:path'\nimport fse from 'fs-extra'\n\nimport { AppBuilder } from '../../app-builder.js'\nimport { "
},
{
"path": "app-vite/lib/modes/capacitor/capacitor-config.js",
"chars": 739,
"preview": "import { createViteConfig, extendViteConfig } from '../../config-tools.js'\n\n/**\n * Warning!\n *\n * Remember to update thi"
},
{
"path": "app-vite/lib/modes/capacitor/capacitor-consistency.js",
"chars": 768,
"preview": "import { existsSync } from 'node:fs'\nimport fse from 'fs-extra'\n\nexport function ensureWWW({ appPaths, forced }) {\n con"
},
{
"path": "app-vite/lib/modes/capacitor/capacitor-devserver.js",
"chars": 2475,
"preview": "import { createServer } from 'vite'\n\nimport { AppDevserver } from '../../app-devserver.js'\nimport { CapacitorConfigFile "
},
{
"path": "app-vite/lib/modes/capacitor/capacitor-installation.js",
"chars": 3748,
"preview": "import fse from 'fs-extra'\nimport inquirer from 'inquirer'\nimport { globSync } from 'tinyglobby'\n\nimport { log, warn } f"
},
{
"path": "app-vite/lib/modes/capacitor/config-file.js",
"chars": 3616,
"preview": "import fs from 'node:fs'\nimport { parseJSON, stringifyJSON } from 'confbox'\n\nimport { log } from '../../utils/logger.js'"
},
{
"path": "app-vite/lib/modes/cordova/android-cleartext.js",
"chars": 942,
"preview": "import fs from 'node:fs'\n\nexport function fixAndroidCleartext(appPaths, action) {\n const androidManifestPath = appPaths"
},
{
"path": "app-vite/lib/modes/cordova/config-file.js",
"chars": 6084,
"preview": "// oxlint-disable new-cap\n\nimport fs from 'node:fs'\nimport et from 'elementtree'\n\nimport { log, warn } from '../../utils"
},
{
"path": "app-vite/lib/modes/cordova/cordova-builder.js",
"chars": 4707,
"preview": "import fse from 'fs-extra'\nimport { join } from 'node:path'\n\nimport { AppBuilder } from '../../app-builder.js'\nimport { "
},
{
"path": "app-vite/lib/modes/cordova/cordova-config.js",
"chars": 859,
"preview": "import { createViteConfig, extendViteConfig } from '../../config-tools.js'\nimport { quasarVitePluginDevCordovaPlatformIn"
},
{
"path": "app-vite/lib/modes/cordova/cordova-consistency.js",
"chars": 891,
"preview": "import { existsSync } from 'node:fs'\nimport fse from 'fs-extra'\n\nimport { spawnSync } from '../../utils/spawn.js'\nimport"
},
{
"path": "app-vite/lib/modes/cordova/cordova-devserver.js",
"chars": 2972,
"preview": "import { createServer } from 'vite'\n\nimport { AppDevserver } from '../../app-devserver.js'\nimport { CordovaConfigFile } "
},
{
"path": "app-vite/lib/modes/cordova/cordova-installation.js",
"chars": 3278,
"preview": "import fse from 'fs-extra'\nimport inquirer from 'inquirer'\n\nimport { fatal, log, warn } from '../../utils/logger.js'\nimp"
},
{
"path": "app-vite/lib/modes/cordova/vite-plugin.dev.cordova-platform-inject.js",
"chars": 727,
"preview": "import serveStatic from 'serve-static'\n\nimport { entryPointMarkup } from '../../utils/html-template.js'\n\n/**\n * It is ap"
},
{
"path": "app-vite/lib/modes/electron/electron-builder.js",
"chars": 4374,
"preview": "import { join } from 'node:path'\nimport { merge } from 'webpack-merge'\n\nimport { log, progress, warn } from '../../utils"
},
{
"path": "app-vite/lib/modes/electron/electron-config.js",
"chars": 4356,
"preview": "import { basename, join } from 'node:path'\n\nimport {\n createNodeRolldownConfig,\n createViteConfig,\n extendRolldownCon"
},
{
"path": "app-vite/lib/modes/electron/electron-consistency.js",
"chars": 482,
"preview": "import { existsSync } from 'node:fs'\n\nexport async function ensureDeps({ appPaths, cacheProxy }) {\n if (existsSync(appP"
},
{
"path": "app-vite/lib/modes/electron/electron-devserver.js",
"chars": 3820,
"preview": "import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { createServer } from 'vite'\n\nim"
},
{
"path": "app-vite/lib/modes/electron/electron-installation.js",
"chars": 1870,
"preview": "import fse from 'fs-extra'\n\nimport { log, warn } from '../../utils/logger.js'\nimport { getPackageJson } from '../../util"
},
{
"path": "app-vite/lib/modes/modes-utils.js",
"chars": 366,
"preview": "import fse from 'fs-extra'\n\n/**\n * @param {import('../../types/app-paths').QuasarAppPaths} appPaths\n * @param {import('."
},
{
"path": "app-vite/lib/modes/pwa/pwa-builder.js",
"chars": 1339,
"preview": "import { writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { AppBuilder } from '../../app-builder."
},
{
"path": "app-vite/lib/modes/pwa/pwa-config.js",
"chars": 5201,
"preview": "import { join } from 'node:path'\n\nimport { escapeRegexString } from '../../utils/escape-regex-string.js'\nimport {\n crea"
},
{
"path": "app-vite/lib/modes/pwa/pwa-devserver.js",
"chars": 4607,
"preview": "import { createServer } from 'vite'\nimport { watch as chokidarWatch } from 'chokidar'\n\nimport { AppDevserver } from '../"
},
{
"path": "app-vite/lib/modes/pwa/pwa-installation.js",
"chars": 2437,
"preview": "import fse from 'fs-extra'\n\nimport { log, warn } from '../../utils/logger.js'\nimport { isModeInstalled } from '../modes-"
},
{
"path": "app-vite/lib/modes/pwa/utils.js",
"chars": 3078,
"preview": "import { readFileSync } from 'node:fs'\n\nimport { progress } from '../../utils/logger.js'\n\nconst workboxMethodMap = {\n G"
},
{
"path": "app-vite/lib/modes/pwa/vite-plugin.pwa-resources.js",
"chars": 1273,
"preview": "import serveStatic from 'serve-static'\n\nimport { createHeadTags } from './utils.js'\n\nexport function quasarVitePluginPwa"
},
{
"path": "app-vite/lib/modes/spa/spa-builder.js",
"chars": 355,
"preview": "import { AppBuilder } from '../../app-builder.js'\nimport { quasarSpaConfig } from './spa-config.js'\n\nexport class Quasar"
},
{
"path": "app-vite/lib/modes/spa/spa-config.js",
"chars": 511,
"preview": "import { createViteConfig, extendViteConfig } from '../../config-tools.js'\n\n/**\n * Warning!\n *\n * Remember to update thi"
},
{
"path": "app-vite/lib/modes/spa/spa-devserver.js",
"chars": 1089,
"preview": "import { createServer } from 'vite'\n\nimport { AppDevserver } from '../../app-devserver.js'\nimport { openBrowser } from '"
},
{
"path": "app-vite/lib/modes/spa/spa-installation.js",
"chars": 103,
"preview": "// Nothing to do... installed by default\n\nexport function addMode() {}\nexport function removeMode() {}\n"
},
{
"path": "app-vite/lib/modes/ssr/ssr-builder.js",
"chars": 6102,
"preview": "import { join } from 'node:path'\nimport { writeFileSync } from 'node:fs'\nimport { stringifyJSON } from 'confbox'\n\nimport"
},
{
"path": "app-vite/lib/modes/ssr/ssr-config.js",
"chars": 4746,
"preview": "import { join } from 'node:path'\nimport { mergeConfig as mergeViteConfig } from 'vite'\n\nimport {\n createNodeRolldownCon"
},
{
"path": "app-vite/lib/modes/ssr/ssr-consistency.js",
"chars": 467,
"preview": "import { existsSync } from 'node:fs'\n\nexport async function ensureDeps({ appPaths, cacheProxy }) {\n if (existsSync(appP"
},
{
"path": "app-vite/lib/modes/ssr/ssr-devserver.js",
"chars": 13183,
"preview": "import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport "
},
{
"path": "app-vite/lib/modes/ssr/ssr-installation.js",
"chars": 1857,
"preview": "import fse from 'fs-extra'\nimport inquirer from 'inquirer'\n\nimport { ensureConsistency } from './ssr-consistency.js'\nimp"
},
{
"path": "app-vite/lib/node-version-check.js",
"chars": 967,
"preview": "// version-check\n\nconst version = process.version.split('.')\nconst major = Number.parseInt(version[0].replaceAll(/\\D/g, "
},
{
"path": "app-vite/lib/plugins/rolldown.inject-replacements.js",
"chars": 1119,
"preview": "import path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport MagicString from 'magic-string'\n\nconst dirn"
},
{
"path": "app-vite/lib/plugins/rolldown.vue-shim.js",
"chars": 356,
"preview": "/**\n * There are some use-cases where user imports a Vue file\n * even if this is a UI file requested in a Node context.\n"
},
{
"path": "app-vite/lib/plugins/vite.index-html-transform.js",
"chars": 309,
"preview": "import { transformHtml } from '../utils/html-template.js'\n\nexport function quasarViteIndexHtmlTransformPlugin(quasarConf"
},
{
"path": "app-vite/lib/plugins/vite.strip-filename-hashes.js",
"chars": 1520,
"preview": "/**\n * Build production assets with or without the hash part in filenames.\n * Example: \"454d87bd\" in \"assets/index.454d8"
},
{
"path": "app-vite/lib/quasar-config-file.js",
"chars": 40007,
"preview": "import { basename, dirname, isAbsolute, join, relative } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimpor"
},
{
"path": "app-vite/lib/types-generator.js",
"chars": 8898,
"preview": "import { isAbsolute, join, relative } from 'node:path'\nimport { statSync } from 'node:fs'\nimport fse from 'fs-extra'\n\nim"
},
{
"path": "app-vite/lib/utils/app-files-validations.js",
"chars": 735,
"preview": "import fs from 'node:fs'\n\nimport { warn } from './logger.js'\nimport { attachMarkup, entryPointMarkup } from '../utils/ht"
},
{
"path": "app-vite/lib/utils/banner.js",
"chars": 6462,
"preview": "import { dim, gray, green, underline } from 'kolorist'\nimport { join } from 'node:path'\n\nimport { cliPkg } from '../util"
},
{
"path": "app-vite/lib/utils/build-targets.js",
"chars": 251,
"preview": "/* Should match Vite's own hard-coded values */\nexport const BASELINE_WIDELY_AVAILABLE_TARGET_STRING =\n 'baseline-widel"
},
{
"path": "app-vite/lib/utils/cli-runtime.js",
"chars": 274,
"preview": "import { join, normalize } from 'node:path'\n\nimport cliPkg from '../../package.json' with { type: 'json' }\n\nconst cliDir"
},
{
"path": "app-vite/lib/utils/encode-for-diff.js",
"chars": 260,
"preview": "export function encodeForDiff(obj) {\n return JSON.stringify(obj, (_, value) =>\n typeof value === 'function'\n ? "
},
{
"path": "app-vite/lib/utils/ensure-argv.js",
"chars": 2937,
"preview": "import { fatal } from './logger.js'\n\nexport function ensureArgv(argv, cmd) {\n if (argv.mode) {\n if (argv.mode === 'i"
},
{
"path": "app-vite/lib/utils/env.js",
"chars": 8245,
"preview": "import { existsSync, readFileSync } from 'node:fs'\nimport { isAbsolute, join, relative } from 'node:path'\nimport { parse"
},
{
"path": "app-vite/lib/utils/escape-regex-string.js",
"chars": 307,
"preview": "const escRE = /[|\\\\{}()[\\]^$+*?.]/g\nconst escReplace = String.raw`\\$&`\nconst dashRE = /-/g\nconst dashReplace = String.ra"
},
{
"path": "app-vite/lib/utils/get-api.js",
"chars": 1650,
"preview": "import fs from 'node:fs'\nimport path from 'node:path'\nimport { createRequire } from 'node:module'\n\nimport { fatal } from"
},
{
"path": "app-vite/lib/utils/get-app-paths.js",
"chars": 2822,
"preview": "import { existsSync } from 'node:fs'\nimport { join, normalize, resolve, sep } from 'node:path'\n\nimport { fatal } from '."
},
{
"path": "app-vite/lib/utils/get-caller-path.js",
"chars": 538,
"preview": "import { dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport function getCallerPath() {\n const "
},
{
"path": "app-vite/lib/utils/get-ctx.js",
"chars": 1470,
"preview": "import { getAppPaths } from './get-app-paths.js'\nimport { getPkg } from './get-pkg.js'\nimport { createCacheProxy } from "
},
{
"path": "app-vite/lib/utils/get-external-ip.js",
"chars": 754,
"preview": "import inquirer from 'inquirer'\n\nimport { fatal, warn } from './logger.js'\nimport { getExternalNetworkInterface } from '"
},
{
"path": "app-vite/lib/utils/get-fixed-deps.js",
"chars": 766,
"preview": "import { getPackageJson } from './get-package-json.js'\n\nconst urlRangePattern = /^[a-zA-Z]/\n\n/**\n * @param {{ [key: stri"
},
{
"path": "app-vite/lib/utils/get-package-json.js",
"chars": 521,
"preview": "import { readFileSync } from 'node:fs'\n\nimport { getPackagePath } from './get-package-path.js'\n\n/**\n * Get package.json "
},
{
"path": "app-vite/lib/utils/get-package-major-version.js",
"chars": 505,
"preview": "import { getPackageJson } from './get-package-json.js'\n\nfunction getMajorVersion(version) {\n const matches = version.ma"
},
{
"path": "app-vite/lib/utils/get-package-path.js",
"chars": 1176,
"preview": "import { createRequire } from 'node:module'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport"
},
{
"path": "app-vite/lib/utils/get-package.js",
"chars": 567,
"preview": "import { readFileSync } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\n\nimport { getPackagePath } from './get-p"
},
{
"path": "app-vite/lib/utils/get-pkg.js",
"chars": 2078,
"preview": "import { existsSync, readFileSync, statSync } from 'node:fs'\nimport { parseJSON } from 'confbox'\n\nimport { warning } fro"
},
{
"path": "app-vite/lib/utils/html-template.js",
"chars": 5473,
"preview": "import { minify } from 'html-minifier-terser'\nimport {\n compileTemplateToFile,\n compileTemplateToFn,\n renderTemplate\n"
},
{
"path": "app-vite/lib/utils/is-terminal.js",
"chars": 192,
"preview": "import ci from 'ci-info'\n\nexport const isCI = ci.isCI\nexport const isTerminal = ci.isCI || !process.stdout.isTTY\nexport "
},
{
"path": "app-vite/lib/utils/logger.js",
"chars": 3143,
"preview": "import {\n bgGreen,\n bgRed,\n bgYellow,\n black,\n green,\n inverse,\n red,\n underline,\n white,\n yellow\n} from 'kolo"
},
{
"path": "app-vite/lib/utils/net.js",
"chars": 1959,
"preview": "import os from 'node:os'\nimport net from 'node:net'\n\nexport const localHostList = ['0.0.0.0', 'localhost', '127.0.0.1', "
},
{
"path": "app-vite/lib/utils/on-shutdown.js",
"chars": 355,
"preview": "import { log } from './logger.js'\n\nexport function onShutdown(fn, msg) {\n const cleanup = () => {\n try {\n if (m"
},
{
"path": "app-vite/lib/utils/open-browser.js",
"chars": 665,
"preview": "import open from 'open'\n\nimport { log, warn } from './logger.js'\n\nexport function openBrowser({ url, opts, wait = true }"
},
{
"path": "app-vite/lib/utils/open-ide.js",
"chars": 5445,
"preview": "import fs from 'node:fs'\nimport path from 'node:path'\nimport { execSync } from 'node:child_process'\nimport open from 'op"
},
{
"path": "app-vite/lib/utils/print-build-summary.js",
"chars": 5944,
"preview": "import { readFileSync, statSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport { gzipSync }"
},
{
"path": "app-vite/lib/utils/rate-limit.js",
"chars": 811,
"preview": "// oxlint-disable-next-line default-param-last\nexport function debounce(fn, wait = 250, immediate) {\n let timer = null\n"
},
{
"path": "app-vite/lib/utils/resolve-extension.js",
"chars": 276,
"preview": "import { existsSync } from 'node:fs'\n\nconst extensions = ['', '.js', '.ts', '.jsx', '.tsx']\n\nexport function resolveExte"
},
{
"path": "app-vite/lib/utils/signals.js",
"chars": 96,
"preview": "export const SIGNALS = {\n BUILD_EXTERNAL_TOOL_SPAWNED: 'SIGNAL__BUILD_EXTERNAL_TOOL_SPAWNED'\n}\n"
},
{
"path": "app-vite/lib/utils/spawn.js",
"chars": 1345,
"preview": "import crossSpawn from 'cross-spawn'\n\nimport { fatal, log, warn } from './logger.js'\n\n/*\n Returns pid, takes onClose\n */"
},
{
"path": "app-vite/lib/utils/template.js",
"chars": 7675,
"preview": "/**\n * Heavily inspired by Eta v4.5.1\n */\n\nconst fnAccumulator = '__qstr__'\nconst defaultParseOptions = {\n varName: 'sc"
},
{
"path": "app-vite/package.json",
"chars": 4427,
"preview": "{\n \"name\": \"@quasar/app-vite\",\n \"version\": \"3.0.0-alpha.0\",\n \"description\": \"Quasar Framework App CLI with Vite\",\n \""
},
{
"path": "app-vite/playground-js/index.html",
"chars": 595,
"preview": "<!doctype html>\n<html>\n <head>\n <title>[%QUASAR_MODE%] <%= productName %></title>\n\n <meta charset=\"utf-8\" />\n "
},
{
"path": "app-vite/playground-js/jsconfig.json",
"chars": 43,
"preview": "{\n \"extends\": \"./.quasar/tsconfig.json\"\n}\n"
},
{
"path": "app-vite/playground-js/package.json",
"chars": 647,
"preview": "{\n \"name\": \"app-vite-playground-js\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"description\": \"A Quasar Project\",\n \"a"
},
{
"path": "app-vite/playground-js/public/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-js/quasar.config.js",
"chars": 6164,
"preview": "// Configuration for your app\n// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file\n\nimport { defineConfig } from "
},
{
"path": "app-vite/playground-js/src/App.vue",
"chars": 70,
"preview": "<template>\n <router-view />\n</template>\n\n<script setup>\n//\n</script>\n"
},
{
"path": "app-vite/playground-js/src/assets/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-js/src/boot/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-js/src/components/EssentialLink.vue",
"chars": 626,
"preview": "<template>\n <q-item clickable tag=\"a\" target=\"_blank\" :href=\"props.link\">\n <q-item-section v-if=\"props.icon\" avatar>"
},
{
"path": "app-vite/playground-js/src/css/app.scss",
"chars": 31,
"preview": "// app global css in SCSS form\n"
},
{
"path": "app-vite/playground-js/src/css/quasar.variables.scss",
"chars": 746,
"preview": "// Quasar SCSS (& Sass) Variables\n// --------------------------------------------------\n// To customize the look and fee"
},
{
"path": "app-vite/playground-js/src/layouts/MainLayout.vue",
"chars": 1914,
"preview": "<template>\n <q-layout view=\"lHh Lpr lFf\">\n <q-header elevated>\n <q-toolbar>\n <q-btn\n flat\n "
},
{
"path": "app-vite/playground-js/src/pages/ErrorNotFound.vue",
"chars": 467,
"preview": "<template>\n <div\n class=\"fullscreen bg-blue text-white text-center q-pa-md flex flex-center\"\n >\n <div>\n <di"
},
{
"path": "app-vite/playground-js/src/pages/IndexPage.vue",
"chars": 247,
"preview": "<template>\n <q-page class=\"flex flex-center\">\n <img\n alt=\"Quasar logo\"\n src=\"https://cdn.quasar.dev/logo-v"
},
{
"path": "app-vite/playground-js/src/router/index.js",
"chars": 1012,
"preview": "import { defineRouter } from '#q-app'\nimport {\n createMemoryHistory,\n createRouter,\n createWebHashHistory,\n createWe"
},
{
"path": "app-vite/playground-js/src/router/routes.js",
"chars": 359,
"preview": "const routes = [\n {\n path: '/',\n component: () => import('layouts/MainLayout.vue'),\n children: [{ path: '', co"
},
{
"path": "app-vite/playground-ts/index.html",
"chars": 595,
"preview": "<!doctype html>\n<html>\n <head>\n <title>[%QUASAR_MODE%] <%= productName %></title>\n\n <meta charset=\"utf-8\" />\n "
},
{
"path": "app-vite/playground-ts/package.json",
"chars": 707,
"preview": "{\n \"name\": \"app-vite-playground-ts\",\n \"version\": \"0.0.1\",\n \"private\": true,\n \"description\": \"A Quasar Project\",\n \"a"
},
{
"path": "app-vite/playground-ts/public/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-ts/quasar.config.ts",
"chars": 6270,
"preview": "// Configuration for your app\n// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file\n\nimport { defineConfig } from "
},
{
"path": "app-vite/playground-ts/src/App.vue",
"chars": 80,
"preview": "<template>\n <router-view />\n</template>\n\n<script setup lang=\"ts\">\n//\n</script>\n"
},
{
"path": "app-vite/playground-ts/src/assets/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-ts/src/boot/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "app-vite/playground-ts/src/components/EssentialLink.vue",
"chars": 569,
"preview": "<template>\n <q-item clickable tag=\"a\" target=\"_blank\" :href=\"link\">\n <q-item-section v-if=\"icon\" avatar>\n <q-ic"
},
{
"path": "app-vite/playground-ts/src/components/ExampleComponent.vue",
"chars": 783,
"preview": "<template>\n <div>\n <p>{{ title }}</p>\n <ul>\n <li v-for=\"todo in todos\" :key=\"todo.id\" @click=\"increment\">\n "
},
{
"path": "app-vite/playground-ts/src/components/models.ts",
"chars": 108,
"preview": "export interface Todo {\n id: number;\n content: string;\n}\n\nexport interface Meta {\n totalCount: number;\n}\n"
},
{
"path": "app-vite/playground-ts/src/css/app.scss",
"chars": 31,
"preview": "// app global css in SCSS form\n"
},
{
"path": "app-vite/playground-ts/src/css/quasar.variables.scss",
"chars": 746,
"preview": "// Quasar SCSS (& Sass) Variables\n// --------------------------------------------------\n// To customize the look and fee"
},
{
"path": "app-vite/playground-ts/src/env.d.ts",
"chars": 116,
"preview": "/// <reference types=\"vite/client\" />\n/// <reference types=\"@quasar/app-vite/client\" />\n\ninterface ImportMetaEnv {}\n"
},
{
"path": "app-vite/playground-ts/src/layouts/MainLayout.vue",
"chars": 1977,
"preview": "<template>\n <q-layout view=\"lHh Lpr lFf\">\n <q-header elevated>\n <q-toolbar>\n <q-btn\n flat\n "
},
{
"path": "app-vite/playground-ts/src/pages/ErrorNotFound.vue",
"chars": 477,
"preview": "<template>\n <div\n class=\"fullscreen bg-blue text-white text-center q-pa-md flex flex-center\"\n >\n <div>\n <di"
},
{
"path": "app-vite/playground-ts/src/pages/IndexPage.vue",
"chars": 671,
"preview": "<template>\n <q-page class=\"row items-center justify-evenly\">\n <example-component\n title=\"Example component\"\n "
},
{
"path": "app-vite/playground-ts/src/router/index.ts",
"chars": 1019,
"preview": "import { defineRouter } from \"#q-app\";\nimport {\n createMemoryHistory,\n createRouter,\n createWebHashHistory,\n createW"
},
{
"path": "app-vite/playground-ts/src/router/routes.ts",
"chars": 430,
"preview": "import type { RouteRecordRaw } from \"vue-router\";\n\nconst routes: RouteRecordRaw[] = [\n {\n path: \"/\",\n component: "
},
{
"path": "app-vite/playground-ts/tsconfig.json",
"chars": 43,
"preview": "{\n \"extends\": \"./.quasar/tsconfig.json\"\n}\n"
},
{
"path": "app-vite/templates/app/js/boot.js",
"chars": 224,
"preview": "import { defineBoot } from '#q-app'\n\n// \"async\" is optional;\n// more info on params: https://v2.quasar.dev/quasar-cli-vi"
},
{
"path": "app-vite/templates/app/js/component.vue",
"chars": 78,
"preview": "<template>\n <div>My component</div>\n</template>\n\n<script setup>\n//\n</script>\n"
},
{
"path": "app-vite/templates/app/js/layout.vue",
"chars": 1995,
"preview": "<template>\n <q-layout view=\"hHh Lpr fFf\"> <!-- Be sure to play with the Layout demo on docs -->\n\n <!-- (Optional) Th"
},
{
"path": "app-vite/templates/app/js/page.vue",
"chars": 104,
"preview": "<template>\n <q-page padding>\n <!-- content -->\n </q-page>\n</template>\n\n<script setup>\n//\n</script>\n"
},
{
"path": "app-vite/templates/app/js/ssrmiddleware.js",
"chars": 306,
"preview": "import { defineSsrMiddleware } from '#q-app'\n\n// \"async\" is optional;\n// more info on params: https://v2.quasar.dev/quas"
},
{
"path": "app-vite/templates/app/js/store.js",
"chars": 255,
"preview": "import { defineStore, acceptHMRUpdate } from 'pinia'\n\nexport const useMyStore = defineStore('myStore', {\n state: () => "
},
{
"path": "app-vite/templates/app/ts/boot.ts",
"chars": 224,
"preview": "import { defineBoot } from '#q-app'\n\n// \"async\" is optional;\n// more info on params: https://v2.quasar.dev/quasar-cli-vi"
},
{
"path": "app-vite/templates/app/ts/component.vue",
"chars": 88,
"preview": "<template>\n <div>My component</div>\n</template>\n\n<script setup lang=\"ts\">\n//\n</script>\n"
},
{
"path": "app-vite/templates/app/ts/layout.vue",
"chars": 1941,
"preview": "<template>\n <q-layout view=\"hHh Lpr fFf\"> <!-- Be sure to play with the Layout demo on docs -->\n\n <!-- (Optional) Th"
},
{
"path": "app-vite/templates/app/ts/page.vue",
"chars": 114,
"preview": "<template>\n <q-page padding>\n <!-- content -->\n </q-page>\n</template>\n\n<script setup lang=\"ts\">\n//\n</script>\n"
}
]
// ... and 3852 more files (download for full content)
About this extraction
This page contains the full source code of the rstoenescu/quasar-framework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4052 files (77.1 MB), approximately 20.4M tokens, and a symbol index with 2769 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.