diff --git a/examples/vue-quasar/.browserslistrc b/examples/vue-quasar/.browserslistrc new file mode 100644 index 00000000..dc3bc09a --- /dev/null +++ b/examples/vue-quasar/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/examples/vue-quasar/.editorconfig b/examples/vue-quasar/.editorconfig new file mode 100644 index 00000000..ecea360f --- /dev/null +++ b/examples/vue-quasar/.editorconfig @@ -0,0 +1,6 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/examples/vue-quasar/.gitignore b/examples/vue-quasar/.gitignore new file mode 100644 index 00000000..11f5d714 --- /dev/null +++ b/examples/vue-quasar/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/vue-quasar/README.md b/examples/vue-quasar/README.md new file mode 100644 index 00000000..a2129faf --- /dev/null +++ b/examples/vue-quasar/README.md @@ -0,0 +1,118 @@ +
+ + EmbedPDF logo + + +

EmbedPDF

+ + + +License +Join the community on GitHub + +
+ +# Vue Quasar PDF Viewer Example + +This example shows how to build a fully‑featured PDF viewer with **EmbedPDF**, **Vue 3** and **Quasar 2**. It demonstrates how to combine EmbedPDF’s plugin system with Quasar components to create a polished reading experience that feels right at home in any Vue + Quasar project. + +- **Live demo:** _(coming soon)_ +- **Docs:** [https://www.embedpdf.com](https://www.embedpdf.com) + +--- + +## Key features on display + +| Feature | Plugin(s) | +| ---------------------------------------------------------- | --------------------------------------------------------------------------------- | +| Virtualised scrolling with smooth page rendering | `@embedpdf/plugin-scroll` + `@embedpdf/plugin-render` + `@embedpdf/plugin-tiling` | +| Zoom controls (fit page, fit width, marquee zoom, presets) | `@embedpdf/plugin-zoom` | +| Pan/hand tool | `@embedpdf/plugin-pan` | +| Rotate pages | `@embedpdf/plugin-rotate` | +| Single and spread layouts | `@embedpdf/plugin-spread` | +| In‑document text search | `@embedpdf/plugin-search` | +| Thumbnail sidebar navigation | `@embedpdf/plugin-thumbnail` | +| Annotation tools (text, shapes, stamp) | `@embedpdf/plugin-annotation` | +| Redaction tools (text selection, marquee) | `@embedpdf/plugin-redaction` | +| File picker, download & print | `@embedpdf/plugin-loader`, `@embedpdf/plugin-export`, `@embedpdf/plugin-print` | +| Fullscreen support | `@embedpdf/plugin-fullscreen` | + +The UI around these plugins is built with Quasar’s `QHeader`, `QDrawer`, `QMenu`, `QBtn`, and companion components. On mobile, the side drawers collapse into a bottom-sheet style `QDialog` for a more native feel. + +--- + +## Quick start + +> **Prerequisites** +> +> - Node 18 or newer +> - **pnpm** 10 (recommended) or a recent pnpm 8/9 + +1. **Clone the repo** (or your fork) and install dependencies: + + ```bash + git clone https://github.com/embedpdf/embed-pdf-viewer.git + cd embed-pdf-viewer + pnpm install + ``` + +2. **Build the core packages** once so that the example can import them: + + ```bash + pnpm run build --filter "./packages/*" + # or keep them rebuilt automatically while you work: + pnpm watch build --filter "./packages/*" + ``` + +3. **Run the example dev server**: + + ```bash + pnpm --filter @embedpdf/example-vue-quasar run dev + ``` + + Vite will start on [http://localhost:3000](http://localhost:3000) and open the browser automatically. + +--- + +## Building a production bundle + +To create an optimized build (under `examples/vue-quasar/dist`): + +```bash +pnpm --filter @embedpdf/example-vue-quasar run build +``` + +The output is a static site you can deploy to any CDN or static host. + +--- + +## Folder layout + +``` +examples/vue-quasar +├── public/ # Static assets (favicon) +└── src/ + ├── components/ # Quasar‑based UI parts (Toolbar, Search, …) + │ └── drawer-system/ # Reusable logic for side drawers/bottom sheets + ├── plugins/ # Quasar plugin setup + ├── App.vue # Root Vue component + ├── Application.vue # Main viewer shell and plugin wiring + └── main.ts # Vue entry + theming +``` + +The PDFium WebAssembly bundle is loaded automatically by the `usePdfiumEngine` hook in `src/Application.vue`, which passes it to EmbedPDF’s **WebWorkerEngine**. + +--- + +## Customisation tips + +- **Swap icons or colours:** The UI uses standard Quasar components and props, so styling tweaks are straightforward. +- **Add or remove plugins:** Open `src/Application.vue` and edit the `plugins` array. + +For deep dives, check the [EmbedPDF documentation](https://www.embedpdf.com) and the source of this example. + +--- + +## License + +Example code is released under the MIT license, the same as EmbedPDF itself. diff --git a/examples/vue-quasar/components.d.ts b/examples/vue-quasar/components.d.ts new file mode 100644 index 00000000..0d251be4 --- /dev/null +++ b/examples/vue-quasar/components.d.ts @@ -0,0 +1,26 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {}; + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AnnotationSelectionMenu: typeof import('./src/components/AnnotationSelectionMenu.vue')['default'] + AnnotationToolbar: typeof import('./src/components/AnnotationToolbar.vue')['default'] + Application: typeof import('./src/components/Application.vue')['default'] + Drawer: typeof import('./src/components/drawer-system/Drawer.vue')['default'] + DrawerProvider: typeof import('./src/components/drawer-system/DrawerProvider.vue')['default'] + DrawerToggleButton: typeof import('./src/components/drawer-system/DrawerToggleButton.vue')['default'] + PageControls: typeof import('./src/components/PageControls.vue')['default'] + PrintDialog: typeof import('./src/components/PrintDialog.vue')['default'] + RedactionSelectionMenu: typeof import('./src/components/RedactionSelectionMenu.vue')['default'] + RedactToolbar: typeof import('./src/components/RedactToolbar.vue')['default'] + Search: typeof import('./src/components/Search.vue')['default'] + Sidebar: typeof import('./src/components/Sidebar.vue')['default'] + Toolbar: typeof import('./src/components/Toolbar.vue')['default'] + ZoomControls: typeof import('./src/components/ZoomControls.vue')['default'] + } +} diff --git a/examples/vue-quasar/env.d.ts b/examples/vue-quasar/env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/examples/vue-quasar/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/vue-quasar/index.html b/examples/vue-quasar/index.html new file mode 100644 index 00000000..c25b2c0c --- /dev/null +++ b/examples/vue-quasar/index.html @@ -0,0 +1,13 @@ + + + + + + + EmbedPDF + Vue + Quasar + + +
+ + + diff --git a/examples/vue-quasar/package.json b/examples/vue-quasar/package.json new file mode 100644 index 00000000..7209b1cf --- /dev/null +++ b/examples/vue-quasar/package.json @@ -0,0 +1,53 @@ +{ + "name": "@embedpdf/example-vue-quasar", + "private": true, + "type": "module", + "license": "MIT", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build --force" + }, + "dependencies": { + "@embedpdf/core": "workspace:*", + "@embedpdf/engines": "workspace:*", + "@embedpdf/models": "workspace:*", + "@embedpdf/plugin-loader": "workspace:*", + "@embedpdf/plugin-viewport": "workspace:*", + "@embedpdf/plugin-scroll": "workspace:*", + "@embedpdf/plugin-render": "workspace:*", + "@embedpdf/plugin-tiling": "workspace:*", + "@embedpdf/plugin-interaction-manager": "workspace:*", + "@embedpdf/plugin-selection": "workspace:*", + "@embedpdf/plugin-rotate": "workspace:*", + "@embedpdf/plugin-fullscreen": "workspace:*", + "@embedpdf/plugin-zoom": "workspace:*", + "@embedpdf/plugin-pan": "workspace:*", + "@embedpdf/plugin-export": "workspace:*", + "@embedpdf/plugin-spread": "workspace:*", + "@embedpdf/plugin-print": "workspace:*", + "@embedpdf/plugin-search": "workspace:*", + "@embedpdf/plugin-annotation": "workspace:*", + "@embedpdf/plugin-redaction": "workspace:*", + "@embedpdf/plugin-thumbnail": "workspace:*", + "@embedpdf/utils": "workspace:*", + "@quasar/extras": "^1.17.0", + "quasar": "^2.16.0", + "vue": "^3.5.0" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/node": "^22.9.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "@quasar/vite-plugin": "^1.10.0", + "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", + "typescript": "^5.7.3", + "vite": "^6.3.5", + "vue-tsc": "^3.0.1" + } +} diff --git a/examples/vue-quasar/public/favicon.ico b/examples/vue-quasar/public/favicon.ico new file mode 100644 index 00000000..5ed37164 Binary files /dev/null and b/examples/vue-quasar/public/favicon.ico differ diff --git a/examples/vue-quasar/src/App.vue b/examples/vue-quasar/src/App.vue new file mode 100644 index 00000000..1f26297c --- /dev/null +++ b/examples/vue-quasar/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/examples/vue-quasar/src/components/AnnotationSelectionMenu.vue b/examples/vue-quasar/src/components/AnnotationSelectionMenu.vue new file mode 100644 index 00000000..de602de8 --- /dev/null +++ b/examples/vue-quasar/src/components/AnnotationSelectionMenu.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/examples/vue-quasar/src/components/AnnotationToolbar.vue b/examples/vue-quasar/src/components/AnnotationToolbar.vue new file mode 100644 index 00000000..17f5cca0 --- /dev/null +++ b/examples/vue-quasar/src/components/AnnotationToolbar.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/examples/vue-quasar/src/components/Application.vue b/examples/vue-quasar/src/components/Application.vue new file mode 100644 index 00000000..cf151787 --- /dev/null +++ b/examples/vue-quasar/src/components/Application.vue @@ -0,0 +1,386 @@ + + + + + diff --git a/examples/vue-quasar/src/components/PageControls.vue b/examples/vue-quasar/src/components/PageControls.vue new file mode 100644 index 00000000..ca2eca20 --- /dev/null +++ b/examples/vue-quasar/src/components/PageControls.vue @@ -0,0 +1,171 @@ + + + + diff --git a/examples/vue-quasar/src/components/PrintDialog.vue b/examples/vue-quasar/src/components/PrintDialog.vue new file mode 100644 index 00000000..9bcb2c0c --- /dev/null +++ b/examples/vue-quasar/src/components/PrintDialog.vue @@ -0,0 +1,141 @@ + + diff --git a/examples/vue-quasar/src/components/RedactToolbar.vue b/examples/vue-quasar/src/components/RedactToolbar.vue new file mode 100644 index 00000000..948cff15 --- /dev/null +++ b/examples/vue-quasar/src/components/RedactToolbar.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/examples/vue-quasar/src/components/RedactionSelectionMenu.vue b/examples/vue-quasar/src/components/RedactionSelectionMenu.vue new file mode 100644 index 00000000..1092d15a --- /dev/null +++ b/examples/vue-quasar/src/components/RedactionSelectionMenu.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/examples/vue-quasar/src/components/Search.vue b/examples/vue-quasar/src/components/Search.vue new file mode 100644 index 00000000..5f02b158 --- /dev/null +++ b/examples/vue-quasar/src/components/Search.vue @@ -0,0 +1,219 @@ + + + + diff --git a/examples/vue-quasar/src/components/Sidebar.vue b/examples/vue-quasar/src/components/Sidebar.vue new file mode 100644 index 00000000..d64d5ac8 --- /dev/null +++ b/examples/vue-quasar/src/components/Sidebar.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/examples/vue-quasar/src/components/Toolbar.vue b/examples/vue-quasar/src/components/Toolbar.vue new file mode 100644 index 00000000..35526b6c --- /dev/null +++ b/examples/vue-quasar/src/components/Toolbar.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/examples/vue-quasar/src/components/ZoomControls.vue b/examples/vue-quasar/src/components/ZoomControls.vue new file mode 100644 index 00000000..eb8e819c --- /dev/null +++ b/examples/vue-quasar/src/components/ZoomControls.vue @@ -0,0 +1,176 @@ + + + + diff --git a/examples/vue-quasar/src/components/drawer-system/Drawer.vue b/examples/vue-quasar/src/components/drawer-system/Drawer.vue new file mode 100644 index 00000000..79dcaf87 --- /dev/null +++ b/examples/vue-quasar/src/components/drawer-system/Drawer.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/examples/vue-quasar/src/components/drawer-system/DrawerProvider.vue b/examples/vue-quasar/src/components/drawer-system/DrawerProvider.vue new file mode 100644 index 00000000..3dd62871 --- /dev/null +++ b/examples/vue-quasar/src/components/drawer-system/DrawerProvider.vue @@ -0,0 +1,59 @@ + + + diff --git a/examples/vue-quasar/src/components/drawer-system/DrawerToggleButton.vue b/examples/vue-quasar/src/components/drawer-system/DrawerToggleButton.vue new file mode 100644 index 00000000..77a63edc --- /dev/null +++ b/examples/vue-quasar/src/components/drawer-system/DrawerToggleButton.vue @@ -0,0 +1,53 @@ + + + diff --git a/examples/vue-quasar/src/components/drawer-system/types.ts b/examples/vue-quasar/src/components/drawer-system/types.ts new file mode 100644 index 00000000..d4f8c926 --- /dev/null +++ b/examples/vue-quasar/src/components/drawer-system/types.ts @@ -0,0 +1,15 @@ +export type DrawerPosition = 'left' | 'right'; + +export interface DrawerComponent { + id: string; + component: any; // Vue component + icon: string; // Material Design Icon name + label: string; + position: DrawerPosition; + props?: Record; +} + +export interface DrawerState { + isOpen: boolean; + activeComponentId: string | null; +} diff --git a/examples/vue-quasar/src/main.ts b/examples/vue-quasar/src/main.ts new file mode 100644 index 00000000..ddd108b0 --- /dev/null +++ b/examples/vue-quasar/src/main.ts @@ -0,0 +1,20 @@ +/** + * main.ts + * + * Bootstraps Quasar and other plugins then mounts the App. + */ + +// Plugins +import { registerPlugins } from '@/plugins'; + +// Components +import App from './App.vue'; + +// Composables +import { createApp } from 'vue'; + +const app = createApp(App); + +registerPlugins(app); + +app.mount('#app'); diff --git a/examples/vue-quasar/src/plugins/README.md b/examples/vue-quasar/src/plugins/README.md new file mode 100644 index 00000000..62201c7c --- /dev/null +++ b/examples/vue-quasar/src/plugins/README.md @@ -0,0 +1,3 @@ +# Plugins + +Plugins are a way to extend the functionality of your Vue application. Use this folder for registering plugins that you want to use globally. diff --git a/examples/vue-quasar/src/plugins/index.ts b/examples/vue-quasar/src/plugins/index.ts new file mode 100644 index 00000000..cd1f5a2f --- /dev/null +++ b/examples/vue-quasar/src/plugins/index.ts @@ -0,0 +1,17 @@ +/** + * plugins/index.ts + * + * Automatically included in `./src/main.ts` + */ + +// Plugins +import quasar from './quasar'; + +// Types +import type { App } from 'vue'; + +export function registerPlugins(app: App) { + app.use(quasar, { + config: {}, + }); +} diff --git a/examples/vue-quasar/src/plugins/quasar.ts b/examples/vue-quasar/src/plugins/quasar.ts new file mode 100644 index 00000000..ac69a55a --- /dev/null +++ b/examples/vue-quasar/src/plugins/quasar.ts @@ -0,0 +1,15 @@ +/** + * plugins/quasar.ts + * + * Framework documentation: https://quasar.dev + */ + +import { Quasar } from 'quasar'; + +// Base styles + icon sets +import 'quasar/src/css/index.sass'; +import '@quasar/extras/roboto-font/roboto-font.css'; +import '@quasar/extras/mdi-v7/mdi-v7.css'; +import '@quasar/extras/material-icons/material-icons.css'; + +export default Quasar; diff --git a/examples/vue-quasar/tsconfig.app.json b/examples/vue-quasar/tsconfig.app.json new file mode 100644 index 00000000..e14c754d --- /dev/null +++ b/examples/vue-quasar/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/examples/vue-quasar/tsconfig.json b/examples/vue-quasar/tsconfig.json new file mode 100644 index 00000000..66b5e570 --- /dev/null +++ b/examples/vue-quasar/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/examples/vue-quasar/tsconfig.node.json b/examples/vue-quasar/tsconfig.node.json new file mode 100644 index 00000000..5a0c6a54 --- /dev/null +++ b/examples/vue-quasar/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/examples/vue-quasar/vite.config.mts b/examples/vue-quasar/vite.config.mts new file mode 100644 index 00000000..375d6382 --- /dev/null +++ b/examples/vue-quasar/vite.config.mts @@ -0,0 +1,45 @@ +// Plugins +import Vue from '@vitejs/plugin-vue' +import { quasar, transformAssetUrls } from '@quasar/vite-plugin' + +// Utilities +import { defineConfig } from 'vite' +import { fileURLToPath, URL } from 'node:url' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + Vue({ + template: { transformAssetUrls }, + }), + quasar(), + ], + define: { 'process.env': {} }, + resolve: { + alias: { + '@': fileURLToPath(new URL('src', import.meta.url)), + }, + extensions: [ + '.js', + '.json', + '.jsx', + '.mjs', + '.ts', + '.tsx', + '.vue', + ], + }, + server: { + port: 3000, + }, + css: { + preprocessorOptions: { + sass: { + api: 'modern-compiler', + }, + scss: { + api: 'modern-compiler', + }, + }, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08b1016f..df271e68 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -304,6 +304,115 @@ importers: specifier: ^6.3.5 version: 6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0) + examples/vue-quasar: + dependencies: + '@embedpdf/core': + specifier: workspace:* + version: link:../../packages/core + '@embedpdf/engines': + specifier: workspace:* + version: link:../../packages/engines + '@embedpdf/models': + specifier: workspace:* + version: link:../../packages/models + '@embedpdf/plugin-annotation': + specifier: workspace:* + version: link:../../packages/plugin-annotation + '@embedpdf/plugin-export': + specifier: workspace:* + version: link:../../packages/plugin-export + '@embedpdf/plugin-fullscreen': + specifier: workspace:* + version: link:../../packages/plugin-fullscreen + '@embedpdf/plugin-interaction-manager': + specifier: workspace:* + version: link:../../packages/plugin-interaction-manager + '@embedpdf/plugin-loader': + specifier: workspace:* + version: link:../../packages/plugin-loader + '@embedpdf/plugin-pan': + specifier: workspace:* + version: link:../../packages/plugin-pan + '@embedpdf/plugin-print': + specifier: workspace:* + version: link:../../packages/plugin-print + '@embedpdf/plugin-redaction': + specifier: workspace:* + version: link:../../packages/plugin-redaction + '@embedpdf/plugin-render': + specifier: workspace:* + version: link:../../packages/plugin-render + '@embedpdf/plugin-rotate': + specifier: workspace:* + version: link:../../packages/plugin-rotate + '@embedpdf/plugin-scroll': + specifier: workspace:* + version: link:../../packages/plugin-scroll + '@embedpdf/plugin-search': + specifier: workspace:* + version: link:../../packages/plugin-search + '@embedpdf/plugin-selection': + specifier: workspace:* + version: link:../../packages/plugin-selection + '@embedpdf/plugin-spread': + specifier: workspace:* + version: link:../../packages/plugin-spread + '@embedpdf/plugin-thumbnail': + specifier: workspace:* + version: link:../../packages/plugin-thumbnail + '@embedpdf/plugin-tiling': + specifier: workspace:* + version: link:../../packages/plugin-tiling + '@embedpdf/plugin-viewport': + specifier: workspace:* + version: link:../../packages/plugin-viewport + '@embedpdf/plugin-zoom': + specifier: workspace:* + version: link:../../packages/plugin-zoom + '@embedpdf/utils': + specifier: workspace:* + version: link:../../packages/utils + '@quasar/extras': + specifier: ^1.17.0 + version: 1.17.0 + quasar: + specifier: ^2.16.0 + version: 2.18.5 + vue: + specifier: ^3.5.0 + version: 3.5.17(typescript@5.9.3) + devDependencies: + '@quasar/vite-plugin': + specifier: ^1.10.0 + version: 1.10.0(@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3)))(quasar@2.18.5)(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3)) + '@tsconfig/node22': + specifier: ^22.0.0 + version: 22.0.2 + '@types/node': + specifier: ^22.0.0 + version: 22.16.4 + '@vitejs/plugin-vue': + specifier: ^5.2.3 + version: 5.2.4(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3)) + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.9.3)(vue@3.5.17(typescript@5.9.3)) + npm-run-all2: + specifier: ^7.0.2 + version: 7.0.2 + sass-embedded: + specifier: ^1.89.2 + version: 1.91.0 + typescript: + specifier: ^5.7.3 + version: 5.9.3 + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0) + vue-tsc: + specifier: ^3.0.1 + version: 3.0.6(typescript@5.9.3) + examples/vue-tailwind: dependencies: '@embedpdf/core': @@ -3790,6 +3899,18 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@quasar/extras@1.17.0': + resolution: {integrity: sha512-KqAHdSJfIDauiR1nJ8rqHWT0diqD0QradZKoVIZJAilHAvgwyPIY7MbyR2z4RIMkUIMUSqBZcbshMpEw+9A30w==} + + '@quasar/vite-plugin@1.10.0': + resolution: {integrity: sha512-4PJoTclz4ZjAfyqe0+hlkKcFJt0e2NX3Ac3hy8ILqUPdtZ24nCo5/xEHvTxZGBQMKRPwwePbO8CVs4n9EKJEug==} + engines: {node: '>=20'} + peerDependencies: + '@vitejs/plugin-vue': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + quasar: ^2.16.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.0.0 + '@react-aria/focus@3.19.1': resolution: {integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==} peerDependencies: @@ -9000,6 +9121,10 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quasar@2.18.5: + resolution: {integrity: sha512-5ItDSsNjqBVRrC7SqcdvT1F5mghVyJ/KmaWNwnaT5mM91a7gWpT/d7wTCIFxxDbWLZdkHKI+cpdudEqnfcSw9A==} + engines: {node: '>= 10.18.1', npm: '>= 6.13.4', yarn: '>= 1.21.1'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -12947,6 +13072,15 @@ snapshots: '@popperjs/core@2.11.8': {} + '@quasar/extras@1.17.0': {} + + '@quasar/vite-plugin@1.10.0(@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3)))(quasar@2.18.5)(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3))': + dependencies: + '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.9.3)) + quasar: 2.18.5 + vite: 6.3.5(@types/node@22.16.4)(jiti@2.4.2)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.39.0)(yaml@2.8.0) + vue: 3.5.17(typescript@5.9.3) + '@react-aria/focus@3.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/interactions': 3.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -14222,6 +14356,11 @@ snapshots: typescript: 5.9.2 vue: 3.5.17(typescript@5.9.2) + '@vue/tsconfig@0.7.0(typescript@5.9.3)(vue@3.5.17(typescript@5.9.3))': + optionalDependencies: + typescript: 5.9.3 + vue: 3.5.17(typescript@5.9.3) + '@vuetify/loader-shared@2.1.1(vue@3.5.17(typescript@5.9.2))(vuetify@3.9.5)': dependencies: upath: 2.0.1 @@ -19441,6 +19580,8 @@ snapshots: quansync@0.2.10: {} + quasar@2.18.5: {} + queue-microtask@1.2.3: {} railroad-diagrams@1.0.0: {} @@ -21262,6 +21403,12 @@ snapshots: '@vue/language-core': 3.0.6(typescript@5.9.2) typescript: 5.9.2 + vue-tsc@3.0.6(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.0.6(typescript@5.9.3) + typescript: 5.9.3 + vue@3.5.17(typescript@5.7.3): dependencies: '@vue/compiler-dom': 3.5.17