Skip to content
Draft
Show file tree
Hide file tree
Changes from 100 commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
0096206
docs(angular): add PRD, ADRs, and CONTEXT for Angular integration v1.0
the-ult May 8, 2026
c3a8027
Initial plan
Copilot May 8, 2026
3d4c9c2
feat: add angular defineLibrary mode
Copilot May 8, 2026
7caae4f
chore: clean up angular scratch tsconfig
Copilot May 8, 2026
c504cea
refactor: move angular scratch package into viewers
Copilot May 8, 2026
9b3fe2e
refactor(angular): address PR #25 review feedback
the-ult May 8, 2026
f177f98
Merge pull request #25 from the-ult/copilot/add-angular-mode-to-defin…
the-ult May 8, 2026
466085a
feat(angular): real Angular PDF viewer component
the-ult May 8, 2026
642f3a4
test(angular): add vitest smoke tests, README, changeset
the-ult May 8, 2026
ae4fde4
docs(angular): expand v1.0 to 17 plugins, drop Playwright for Vitest,…
the-ult May 8, 2026
e0dbf2e
Merge pull request #26 from the-ult/feature/angular-viewer
the-ult May 8, 2026
79d8de6
feat(build,test): A0 pre-flight — fix #27 dts emission and wire vites…
the-ult May 9, 2026
b908629
fix(test): address PR #33 review comments
the-ult May 9, 2026
4411181
fix(angular): Use render hooks in PDFViewer
the-ult May 9, 2026
9bb98ed
refactor(test): align with Turborepo Vitest guide
the-ult May 9, 2026
36be290
fix(test): test task dependsOn ^build (not ^test)
the-ult May 9, 2026
e7128cb
Merge pull request #33 from the-ult/feature/angular-a0-vitest-pipeline
the-ult May 9, 2026
1477046
ref(angular-viewer): Mount into host element
the-ult May 9, 2026
33f30a3
feat(examples): Add angular-pdf-viewer zoneless demo
the-ult May 9, 2026
759ac93
test(e2e): Add Playwright suite via Turbo
the-ult May 9, 2026
93b7429
feat(example/angular): Add runtime config panel with theme and catego…
the-ult May 9, 2026
9d2d788
feat(angular): Add provider-based viewer defaults
the-ult May 9, 2026
5087207
docs(angular): lock A2/A3 design from grilling session and add ADR 0003
the-ult May 9, 2026
293c9c0
meta(gitignore): Ignore generated local artifacts
the-ult May 9, 2026
40ac7eb
feat(angular-example): Add viewer demo and e2e coverage
the-ult May 9, 2026
b671f8c
Merge remote-tracking branch 'origin/feature/angular' into the-ult/fi…
the-ult May 9, 2026
eae8d2f
docs(angular): Remove duplicated README sections
the-ult May 9, 2026
a0aa65c
test(angular): Replace Promise.withResolvers with portable resolver
the-ult May 9, 2026
a3509fc
chore(example/angular): Drop duplicated @angular/compiler devDep
the-ult May 9, 2026
c20844a
ref(example/angular): Apply Angular 21 conventions to demo App
the-ult May 9, 2026
e28924d
docs(angular): re-cut PRD — v1.0 = drop-in wrapper; headless defers t…
the-ult May 9, 2026
eee7a99
refactor(angular): apply PRD-conformance fixes for v1.0 (#21)
the-ult May 9, 2026
76a4e2a
docs(angular): Use viewChild() in Reactive State Signals example
the-ult May 10, 2026
bcce0e6
refactor(angular): Rename EmbedpdfThemeChangeEvent for casing consist…
the-ult May 10, 2026
c3db6de
chore(example/angular): Serve PDF locally from public/
the-ult May 10, 2026
2e487c8
test(example/angular): Drop brittle workspace snapshot
the-ult May 10, 2026
c6d0412
Merge pull request #34 from the-ult/the-ult/fix/angular-viewer-lifecy…
the-ult May 10, 2026
e2a2d39
Initial plan
Copilot May 10, 2026
ba11bf3
Add Angular to homepage framework touchpoints
Copilot May 10, 2026
20340de
Polish Angular snippet formatting
Copilot May 10, 2026
522a2ef
Tidy Angular tab metadata
Copilot May 10, 2026
ff10178
fix(angular): restore viewer docs, demo, and e2e
the-ult May 10, 2026
785f8ce
feat(angular): Add provider defaults and viewer docs
the-ult May 10, 2026
b1efebd
docs(angular): Clarify provider and config usage
the-ult May 10, 2026
79b7ba2
Merge branch 'feature/angular' into copilot/add-angular-to-homepage
the-ult May 10, 2026
fa4ccd5
style(angular): apply prettier to angular viewer and example sources
the-ult May 10, 2026
db05c84
feat(angular): Re-export viewer types from package entrypoint
the-ult May 11, 2026
d0094a7
docs(website): Register Angular as a top-level docs section
the-ult May 11, 2026
c3e38fe
refactor(angular): Freeze EMPTY_CONFIG fallback object
the-ult May 11, 2026
b5c2eb7
refactor(website): Make framework-link switches exhaustive
the-ult May 11, 2026
fab0952
style(docs/angular): Add trailing newlines to MDX files
the-ult May 11, 2026
be915d9
refactor(angular): Replace IIFE-wrapped function in smoke spec with s…
the-ult May 11, 2026
3b56b19
test(angular): Cover provideEmbedPdfViewerDefaults injection
the-ult May 11, 2026
77b838a
fix(angular): Re-export ScrollStrategy and ZoomMode enum values
the-ult May 11, 2026
775ee99
docs(angular): Drop unresolvable @link to internal helper
the-ult May 11, 2026
7e9475c
refactor(angular): Drop Component suffix from class names
the-ult May 11, 2026
ba390c9
build(gitignore): ignore claude.md file
the-ult May 11, 2026
c53a950
docs(website): Add Angular to snippet framework cards
the-ult May 11, 2026
9e4bbd5
Merge pull request #43 from the-ult/copilot/add-angular-to-homepage
the-ult May 11, 2026
a1bc178
Initial plan
Copilot May 10, 2026
23467a5
docs: add angular viewer plugin pages
Copilot May 10, 2026
f5c58c0
docs: polish angular plugin snippets
Copilot May 10, 2026
debc579
docs: fix angular pan snippet formatting
Copilot May 10, 2026
049c97c
docs(angular): Address Copilot review feedback on plugin pages
May 11, 2026
c7563c9
Merge pull request #45 from the-ult/copilot/translate-vue-to-angular-…
the-ult May 11, 2026
f0423a7
Initial plan
Copilot May 10, 2026
fcd39fa
feat: add angular docs example workspace
Copilot May 10, 2026
87d98e7
fix: stabilize angular demo selectors
Copilot May 10, 2026
5042c83
refactor: cache angular runtime loading
Copilot May 10, 2026
b036ca7
fix(angular): Address critical issues in useAngularMount + add missin…
the-ult May 10, 2026
09bf4e2
fix(angular): Address Copilot review feedback
May 11, 2026
451898c
chore: Regenerate pnpm-lock.yaml after rebase
May 11, 2026
882a277
feat(angular): Add viewer plugin demos to docs
the-ult May 11, 2026
0b220a9
docs(angular): Clarify example workspace roles
the-ult May 11, 2026
2baa3c9
feat(angular): Add wrapper plugin signal helpers
the-ult May 11, 2026
199d38d
feat(examples): Expand Angular Tailwind viewer demos
the-ult May 11, 2026
332c16d
fix(angular): Tighten plugin signal helper typing
the-ult May 11, 2026
d64ccc1
test(angular): Add Tailwind demo Playwright coverage
the-ult May 11, 2026
dd2f9cd
refactor(angular): Apply library review feedback and adopt signal hel…
the-ult May 11, 2026
376e280
test(angular): Sharpen test intent across unit, smoke, e2e, and docs-…
the-ult May 12, 2026
c3ce709
ci: Build workspace prereqs before Angular browser tests
the-ult May 12, 2026
61c9f25
Merge pull request #44 from the-ult/copilot/create-angular-tailwind-w…
the-ult May 12, 2026
34f2945
feat(website): Add Angular to homepage headless paths and chips
the-ult May 12, 2026
4f52c94
fix(website): update homepage headless copy for angular
Copilot May 12, 2026
739c489
Merge pull request #46 from the-ult/feat/homepage-angular-headless
the-ult May 12, 2026
047ca80
feat(website): add /angular-pdf-viewer landing page (#37)
the-ult May 12, 2026
3b480f8
fix(website): Move Angular docs-lint test out of content/ tree
the-ult May 12, 2026
0acc476
fix(website): Address Copilot review on /angular-pdf-viewer landing
the-ult May 12, 2026
f69d3d0
fix(website): Address code-review findings on /angular-pdf-viewer lan…
the-ult May 12, 2026
6669ef2
fix(website): Move letterSpacing under extend to restore Tailwind def…
the-ult May 12, 2026
64c5273
Merge pull request #47 from the-ult/feat/angular-pdf-viewer-landing
the-ult May 12, 2026
c62bc63
chore(website): Drop hardcoded v1.0/v1.1 strings from /angular-pdf-vi…
the-ult May 12, 2026
ebaad45
fix(angular): Apply v1.0 polish — guards, type tests, build warning s…
the-ult May 12, 2026
f457540
docs(angular): Draft upstream PR description
the-ult May 12, 2026
d71ff1f
chore(website): Rename HeadlessV11Callout → HeadlessComingSoonCallout
the-ult May 12, 2026
fe54c28
chore(website): Grammar fix in headless-callout comment
the-ult May 12, 2026
aec5dde
test(angular): Strengthen prototype-pollution assertions in config me…
the-ult May 12, 2026
f480927
Merge pull request #48 from the-ult/feat/angular-landing-version-copy
the-ult May 12, 2026
22e4abf
Merge pull request #49 from the-ult/feat/angular-v1-polish
the-ult May 12, 2026
c246b64
chore: Strip fork-internal scaffolding before upstream PR
the-ult May 12, 2026
9fa3c25
fix(website): Add exhaustiveness guard to framework links
the-ult May 14, 2026
5bc8e0a
ci(angular): Add scoped Angular quality checks
the-ult May 14, 2026
ecd44b3
build(angular): Publish viewer with ng-packagr
the-ult May 15, 2026
62223ba
ci: clarify Angular E2E browser install and FRAMEWORK_PREFIXES sync rule
the-ult May 15, 2026
24630be
ci(angular): Fix packed viewer smoke test scaffolding
the-ult May 15, 2026
fcc5766
ci(angular): Build viewers before example e2e
the-ult May 17, 2026
0041125
ci(angular): Build viewers in example e2e job
the-ult May 17, 2026
7657486
test(angular): Guard example snapshots by baseline
the-ult May 17, 2026
b6cd8a3
fix: address review feedback and angular e2e CI dependency build step
Copilot Jun 2, 2026
c6dad3d
test(angular): Add Linux screenshot baselines
the-ult Jun 23, 2026
1717063
test(angular): Stabilize config-panel screenshots
the-ult Jun 23, 2026
8dca895
ci(angular): Upload e2e failure outputs
the-ult Jun 23, 2026
84ef70a
test(angular): Refresh Linux default panel snapshot
the-ult Jun 23, 2026
9993e18
test(angular): Refresh Linux toggled panel snapshot
the-ult Jun 23, 2026
cbef014
build(angular): Upgrade to Angular 22 and harden wrapper API
the-ult Jun 23, 2026
57bb4b4
Merge remote-tracking branch 'origin/feature/angular' into pr/50/agen…
the-ult Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/angular-pdf-viewer-initial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@embedpdf/angular-pdf-viewer': minor
---

Initial release of `@embedpdf/angular-pdf-viewer`. Provides an Angular 21+ standalone `PDFViewer` component (selector `<embedpdf-viewer>`) that wraps `@embedpdf/snippet`, mirroring the contract of the existing Vue/React/Svelte wrapper viewers:

- Signal-based `config` input
- Signal-based outputs: `(init)`, `(ready)`, `(themeChange)` (forwards the snippet's `themechange` custom event)
- Reactive state signals: `container: Signal<EmbedPdfContainer | null>`, `registry: Signal<PluginRegistry | null>`
- `OnPush` change detection, SSR-safe `afterNextRender` mounting, `DestroyRef` cleanup
- `provideEmbedPdfViewerConfig({ ... })` + `EMBEDPDF_VIEWER_DEFAULT_CONFIG` token for app/route/component-scoped default config that merges with per-instance `[config]` (via `mergeViewerConfigs` deep-merge rules)

Built via `@analogjs/vite-plugin-angular` for AOT-compiled FESM2022 output following Analog's library-build guidance.
2 changes: 2 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
"@embedpdf/example-vue-tailwind",
"@embedpdf/example-vue-vuetify",
"@embedpdf/example-svelte-tailwind",
"@embedpdf/example-angular-pdf-viewer",
"@embedpdf/example-angular-tailwind",
"@embedpdf/example-engines-node",
"@embedpdf/example-pdfium-node",
"@embedpdf/ai",
Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Test

on:
pull_request:
branches: [main, feature/angular]
push:
branches: [main, feature/angular]

concurrency:
group: test-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
test-node:
name: Node-mode tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Run Node-mode + jsdom tests
run: pnpm test

detect-angular-changes:
name: Detect Angular touchpoints
runs-on: ubuntu-latest
outputs:
changed: ${{ steps.filter.outputs.angular }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
angular:
- 'packages/*/src/angular/**'
- 'viewers/angular/**'
- 'examples/angular-custom/**'
- 'packages/build/src/vite/**'

test-browser:
name: Browser-mode tests (Angular)
runs-on: ubuntu-latest
needs: detect-angular-changes
if: needs.detect-angular-changes.outputs.changed == 'true'
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Cache Playwright browsers
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install Playwright Chromium
run: pnpm --filter @embedpdf/angular-pdf-viewer exec playwright install --with-deps chromium
- name: Run browser-mode tests
run: pnpm test:browser
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,31 @@ node_modules
**/node_modules/
**/dist
**/.turbo
**/coverage
**/.vercel
**/playwright-report
**/test-results
**/blob-report
**/vitest-results
**/storybook-static
**/public/_pagefind/
.env
.env*.local
config/tsup.config.bundled*
config/tsup.frameworks.config.bundled*
.next
.cursor
.DS_Store
.env
.gcs_entries
.gclient*
.cipd
.idea
publish-summary.json
**/.svelte-kit
**/*/*.tgz
.env
.env.*
**/playwright-report
**/test-results
CLAUDE.md
2 changes: 2 additions & 0 deletions examples/angular-pdf-viewer/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
playwright-report/
test-results/
44 changes: 44 additions & 0 deletions examples/angular-pdf-viewer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Angular PDF Viewer Demo

This example is a **modern Angular 21.2 zoneless** demo app for `@embedpdf/angular-pdf-viewer`.

It serves two purposes:

- Manual verification of the drop-in viewer UX with config-driven customization
- End-to-end validation that Angular config and runtime registry hooks reach the snippet correctly
- Reference usage of the lightweight capability-signal helpers exported by `@embedpdf/angular-pdf-viewer`

## What this example demonstrates

- `disabledCategories: ['annotation']` to remove annotation tools from the UI
- `theme.preference: 'light'` for deterministic color mode
- A custom Angular-red accent via `theme.light.accent`
- A runtime toolbar customization via `(ready)`, `createPluginCapabilitySignal(...)`, `commands.registerCommand()`, and `ui.mergeSchema()`
- An Angular-owned config panel, toggled by a runtime-injected `Config` button, that can animate open/closed, live-toggle theme mode, and expose up to four checkbox-based view options for annotations, search, sidebar, and zoom controls

## Related Angular example workspace

If you are looking for the **live examples embedded in the website docs**, see [`examples/angular-tailwind`](../angular-tailwind/).

That workspace has a different job:

- **`angular-pdf-viewer`** — the consumer-style demo app for validating the drop-in package in a realistic Angular app
- **`angular-tailwind`** — the docs-example workspace that exports multiple focused Angular demos for `website/`

Start here when you want the clearest reference for integrating `@embedpdf/angular-pdf-viewer` into an application. Jump to `angular-tailwind` when you want to work on the docs demos themselves.

## Scripts

- `pnpm dev` — run the demo app locally on `http://127.0.0.1:4300`
- `pnpm build` — production build
- `pnpm e2e` — run Playwright end-to-end tests

## Turbo usage

Run this suite through Turbo:

- `pnpm e2e:angular-pdf-viewer`

Or run all e2e tasks in the monorepo:

- `pnpm e2e`
109 changes: 109 additions & 0 deletions examples/angular-pdf-viewer/e2e/viewer.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { expect, test } from '@playwright/test';

const stableScreenshotOptions = {
animations: 'disabled',
caret: 'hide',
scale: 'css',
} as const;

test('applies Angular config-driven theme and category customization', async ({ page }) => {
await page.goto('/');

await expect(page.getByRole('heading', { name: 'EmbedPDF Angular Viewer Demo' })).toBeVisible();
await expect(
page.getByText(
'Light theme, Angular red accent, annotation tools disabled, custom config panel added at runtime',
),
).toBeVisible();
await expect(page.locator('embedpdf-viewer')).toBeVisible();

await expect(page.getByTestId('viewer-status')).toHaveText('ready', {
timeout: 30_000,
});

const container = page.locator('embedpdf-viewer embedpdf-container');
await expect(container).toHaveCount(1);
await expect(container).toHaveAttribute('data-color-scheme', 'light');

const themeState = await container.evaluate((node) => {
const viewer = node as HTMLElement & {
themePreference?: string;
};

return {
themePreference: viewer.themePreference ?? null,
accentPrimary: getComputedStyle(viewer).getPropertyValue('--ep-accent-primary').trim(),
};
});

expect(themeState).toEqual({
themePreference: 'light',
accentPrimary: '#dd0031',
});

await expect(page.getByRole('button', { name: 'View' })).toBeVisible();
await expect(page.getByRole('button', { name: 'Config', exact: true })).toBeVisible();
await expect(page.getByRole('button', { name: 'Annotate' })).toHaveCount(0);
await expect(page.getByRole('button', { name: 'Highlight' })).toHaveCount(0);

await page.getByRole('button', { name: 'Config', exact: true }).click();
const configPanel = page.getByTestId('angular-config-panel');
const configPanelShell = page.getByTestId('angular-config-panel-shell');
await expect(configPanel).toBeVisible();

const viewerBounds = await page.locator('embedpdf-viewer').boundingBox();
expect(viewerBounds).not.toBeNull();
expect(viewerBounds!.width).toBeGreaterThanOrEqual(320);
expect(viewerBounds!.height).toBeGreaterThanOrEqual(320);

await expect(page.getByTestId('theme-mode')).toHaveText('light');
await expect(page.getByTestId('disabled-categories')).toHaveText('Annotations');
await expect(page.getByTestId('view-option-sidebar')).toBeChecked();
await expect(page.getByTestId('view-option-search')).toBeChecked();
await expect(page.getByTestId('view-option-zoom')).toBeChecked();
await expect(page.getByTestId('view-option-annotations')).not.toBeChecked();

await expect(configPanelShell).toHaveScreenshot(
'angular-config-panel-default.png',
stableScreenshotOptions,
);

await page.getByTestId('toggle-theme').click();

const darkThemeState = await container.evaluate((node) => ({
colorScheme: node.getAttribute('data-color-scheme'),
accentPrimary: getComputedStyle(node).getPropertyValue('--ep-accent-primary').trim(),
}));

expect(darkThemeState).toEqual({
colorScheme: 'dark',
accentPrimary: '#ff5c7c',
});
await expect(page.getByTestId('theme-mode')).toHaveText('dark');

await page.getByTestId('view-option-annotations').check();
await page.getByTestId('view-option-search').uncheck();
await expect(page.getByTestId('disabled-categories')).toHaveText('Search');
await expect(page.getByRole('button', { name: 'Annotate' })).toBeVisible();
await expect(page.getByRole('button', { name: 'Search' })).toHaveCount(0);

await expect(configPanelShell).toHaveScreenshot(
'angular-config-panel-toggled.png',
stableScreenshotOptions,
);

await page.getByTestId('header-config-toggle').click();
await expect(configPanel).not.toBeVisible();
await expect(page.getByRole('button', { name: 'Config', exact: true })).toBeVisible();
await expect(page.getByTestId('header-config-toggle')).toHaveText('Show config');

await page.getByTestId('header-config-toggle').click();
await expect(configPanel).toBeVisible();
await expect(page.getByTestId('header-config-toggle')).toHaveText('Collapse config');

await page.getByTestId('reset-demo').click();
await expect(page.getByTestId('theme-mode')).toHaveText('light');
await expect(page.getByTestId('disabled-categories')).toHaveText('Annotations');
await expect(page.getByRole('button', { name: 'Annotate' })).toHaveCount(0);
await expect(page.getByRole('button', { name: 'Search' })).toBeVisible();
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions examples/angular-pdf-viewer/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>EmbedPDF Angular Viewer Demo</title>
</head>
<body>
<app-root></app-root>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
29 changes: 29 additions & 0 deletions examples/angular-pdf-viewer/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "@embedpdf/example-angular-pdf-viewer",
"private": true,
"version": "0.0.0",
"type": "module",
"license": "MIT",
"scripts": {
"dev": "vite --host 127.0.0.1 --port 4300",
"build": "vite build",
"preview": "vite preview --host 127.0.0.1 --port 4300",
"e2e": "playwright test"
},
"dependencies": {
"@embedpdf/angular-pdf-viewer": "workspace:*",
"@angular/compiler": "^21.2.12",
"@angular/core": "^21.2.12",
"@angular/platform-browser": "^21.2.12",
"rxjs": "^7.8.2",
"tslib": "^2.8.1"
},
"devDependencies": {
"@analogjs/vite-plugin-angular": "^2.5.0",
"@angular/build": "^21.2.10",
"@angular/compiler-cli": "^21.2.12",
"@playwright/test": "^1.54.2",
"typescript": "^5.9.3",
"vite": "^6.4.1"
}
}
38 changes: 38 additions & 0 deletions examples/angular-pdf-viewer/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { defineConfig, devices } from '@playwright/test';

const stableViewport = {
width: 1440,
height: 1200,
} as const;

export default defineConfig({
testDir: './e2e',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI
? [['github'], ['html', { open: 'never' }]]
: [['list'], ['html', { open: 'never' }]],
use: {
baseURL: 'http://127.0.0.1:4300',
trace: 'on-first-retry',
},
webServer: {
command: 'pnpm dev',
url: 'http://127.0.0.1:4300',
reuseExistingServer: !process.env.CI,
timeout: 120_000,
},
projects: [
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
viewport: stableViewport,
deviceScaleFactor: 1,
colorScheme: 'light',
locale: 'en-US',
},
},
],
});
Binary file added examples/angular-pdf-viewer/public/ebook.pdf
Binary file not shown.
Loading
Loading