3 Commits

13 changed files with 80 additions and 36 deletions

2
.npmrc
View File

@@ -1 +1 @@
@add-ideas:registry=https://git.add-ideas.de/api/packages/zemion/npm/ @add-ideas:registry=https://git.add-ideas.de/api/packages/lotobo/npm/

View File

@@ -4,6 +4,29 @@ All notable changes to `pdf-tools` are documented here.
The project follows a pragmatic versioning scheme while the app is still below `1.0.0`: minor versions mark coherent user-facing milestones; patch versions mark fixes and small improvements. The project follows a pragmatic versioning scheme while the app is still below `1.0.0`: minor versions mark coherent user-facing milestones; patch versions mark fixes and small improvements.
## 0.4.4 — LocalToolBox organization migration
### Changed
- Moved canonical repository, Toolbox schema, corresponding-source, and package-registry URLs from the personal `zemion` namespace to the `lotobo` LocalToolBox organization.
- Upgraded the Toolbox contract, React shell, and validation testkit to `0.2.3` from the organization-owned registry.
- Bumped the app/package version to `0.4.4`.
## 0.4.3 — Aligned Toolbox content width
### Changed
- Expanded the PDF workspace's maximum content width from `900px` to `90rem` so it aligns with the shared Toolbox shell bar and central catalogue.
- Bumped the app/package version to `0.4.3`.
## 0.4.2 — Corrected Toolbox header orientation
### Changed
- Upgraded the Toolbox contract, React shell, and validation testkit to `0.2.2`.
- Moved the Toolbox icon and `add·ideas Toolbox` label to the fixed far-left block, kept the app title and one tagline centered, and moved the fixed control cluster to the far right in the reverse order: Help, the PDF-specific Gitea source link, Apps, and Personalize.
- Bumped the app/package version to `0.4.2`.
## 0.4.1 — Stable Toolbox header layout ## 0.4.1 — Stable Toolbox header layout
### Changed ### Changed

View File

@@ -4,7 +4,7 @@
Current hosted version: <https://pdftools.add-ideas.de> Current hosted version: <https://pdftools.add-ideas.de>
Current development release: **v0.4.1stable Toolbox header layout**. See [`CHANGELOG.md`](CHANGELOG.md) for milestone history. Current development release: **v0.4.4LocalToolBox organization migration**. See [`CHANGELOG.md`](CHANGELOG.md) for milestone history.
Active work is tracked in Gitea issues. Durable project context is mirrored into the Gitea wiki from repository docs, including [`ROADMAP.md`](ROADMAP.md). Active work is tracked in Gitea issues. Durable project context is mirrored into the Gitea wiki from repository docs, including [`ROADMAP.md`](ROADMAP.md).
@@ -122,9 +122,9 @@ browser <-- HTTPS --> static web server / reverse proxy --> built app assets
There is no application server to operate. Administrators only need to host the built files from `dist/`. There is no application server to operate. Administrators only need to host the built files from `dist/`.
The production build is relocatable and can also be assembled into an The production build is relocatable and can also be assembled into an
[Add Ideas Toolbox](https://git.add-ideas.de/zemion/toolbox-portal) deployment. [Add Ideas Toolbox](https://git.add-ideas.de/lotobo/toolbox-portal) deployment.
`toolbox-app.json` describes this app through the framework-independent `toolbox-app.json` describes this app through the framework-independent
[Toolbox App Contract](https://git.add-ideas.de/zemion/toolbox-sdk). The same [Toolbox App Contract](https://git.add-ideas.de/lotobo/toolbox-sdk). The same
artifact remains fully usable on its own. artifact remains fully usable on its own.
The shared first-party shell always provides help, source, and appearance The shared first-party shell always provides help, source, and appearance
@@ -257,10 +257,10 @@ The application version shown in the header is defined in `src/version.ts`. The
The current development baseline is: The current development baseline is:
```text ```text
v0.4.1stable Toolbox header and light/dark/system themes v0.4.4LocalToolBox organization migration
``` ```
This branch preserves the browser-only workspace baseline and PDF.js compatibility setup while moving the app to Toolbox SDK `0.2.1`. The displayed app/package version is `0.4.1`; the shared header keeps Personalize, Apps, the PDF source link, and Help in a fixed left cluster, the app title and one tagline centered, and the Toolbox icon with the `add·ideas Toolbox` label in a fixed far-right block. Workspace state, thumbnail handling, generated download URLs, page-grid components, tests, type-checking, linting, and formatting remain separated enough to support additional feature work without turning `App.tsx` back into a monolith. This branch preserves the browser-only workspace baseline and PDF.js compatibility setup while using Toolbox SDK `0.2.3` from the `lotobo` package registry. The displayed app/package version is `0.4.4`; canonical source, schema, and release links use the LocalToolBox organization. The shared header keeps the Toolbox icon and `add·ideas Toolbox` label in a fixed far-left block, the app title and one tagline centered, and Help, the PDF source link, Apps, and Personalize in a fixed far-right cluster. The PDF workspace shares the shell bar's `90rem` maximum width. Workspace state, thumbnail handling, generated download URLs, page-grid components, tests, type-checking, linting, and formatting remain separated enough to support additional feature work without turning `App.tsx` back into a monolith.
## Project structure ## Project structure

32
package-lock.json generated
View File

@@ -1,16 +1,16 @@
{ {
"name": "pdf-tools", "name": "pdf-tools",
"version": "0.4.1", "version": "0.4.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pdf-tools", "name": "pdf-tools",
"version": "0.4.1", "version": "0.4.4",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
"@add-ideas/toolbox-contract": "^0.2.1", "@add-ideas/toolbox-contract": "^0.2.3",
"@add-ideas/toolbox-shell-react": "^0.2.1", "@add-ideas/toolbox-shell-react": "^0.2.3",
"fflate": "^0.8.3", "fflate": "^0.8.3",
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.7.284", "pdfjs-dist": "^5.7.284",
@@ -18,7 +18,7 @@
"react-dom": "^19.2.6" "react-dom": "^19.2.6"
}, },
"devDependencies": { "devDependencies": {
"@add-ideas/toolbox-testkit": "^0.2.1", "@add-ideas/toolbox-testkit": "^0.2.3",
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1", "@testing-library/user-event": "^14.6.1",
@@ -40,18 +40,18 @@
} }
}, },
"node_modules/@add-ideas/toolbox-contract": { "node_modules/@add-ideas/toolbox-contract": {
"version": "0.2.1", "version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.1/toolbox-contract-0.2.1.tgz", "resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.3/toolbox-contract-0.2.3.tgz",
"integrity": "sha512-NmwV41+ZS0qBWUnI9vflm0PcsiqITmxpSQQ5vMVaToFZuSSIJupgM43tuV9G4OJ1En0eTdYNxbsd3nsYhju2kw==", "integrity": "sha512-T0PVSuMT40GjTDfQJhEEY3ZawQq8zz1/ry95JdKI6W39CdLacaRXdGnEpDCMHt+jUbf1Jz7Nat/M5dFCgKVM9A==",
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/@add-ideas/toolbox-shell-react": { "node_modules/@add-ideas/toolbox-shell-react": {
"version": "0.2.1", "version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-shell-react/-/0.2.1/toolbox-shell-react-0.2.1.tgz", "resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-shell-react/-/0.2.3/toolbox-shell-react-0.2.3.tgz",
"integrity": "sha512-slpz9ODVbk27b+uvG3WeCmNa71Q6guabyVHT+jyGLT6ENLSbwmoEFZ0mKNJDxemltpt9KY8I7z47uNBsQ7yKYg==", "integrity": "sha512-DT5lQDH48BFkFcmFLZnQh7+Cm73JzBPcmp5WzUXypfkUXpEyDYHzaXgmW4kZ0edSwh4RK4sPmx+JPtK0X4aKCQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@add-ideas/toolbox-contract": "0.2.1" "@add-ideas/toolbox-contract": "0.2.3"
}, },
"peerDependencies": { "peerDependencies": {
"react": ">=18 <20", "react": ">=18 <20",
@@ -59,13 +59,13 @@
} }
}, },
"node_modules/@add-ideas/toolbox-testkit": { "node_modules/@add-ideas/toolbox-testkit": {
"version": "0.2.1", "version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-testkit/-/0.2.1/toolbox-testkit-0.2.1.tgz", "resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-testkit/-/0.2.3/toolbox-testkit-0.2.3.tgz",
"integrity": "sha512-0Nfs92r2M5I6hvP8TM776XG08StCBNS40sWt+t4wiMroRMS0aWk/hYqU6+I/VK1lzTLbtxSi0k33trJat3io6Q==", "integrity": "sha512-sq1MwhKWfFKen+N+124hl74qQimRSvmQ9sOU7jdcI+2qCKZ67+2B8rWyezeV80uTFu4Jv6deHksfYQ/tKNV6XQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@add-ideas/toolbox-contract": "0.2.1" "@add-ideas/toolbox-contract": "0.2.3"
}, },
"bin": { "bin": {
"toolbox-check": "dist/cli.js" "toolbox-check": "dist/cli.js"

View File

@@ -1,6 +1,6 @@
{ {
"name": "pdf-tools", "name": "pdf-tools",
"version": "0.4.1", "version": "0.4.4",
"private": true, "private": true,
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"type": "module", "type": "module",
@@ -23,8 +23,8 @@
"check": "npm run manifest:check && npm run typecheck && npm run lint && npm run test && npm run build && npm run test:toolbox" "check": "npm run manifest:check && npm run typecheck && npm run lint && npm run test && npm run build && npm run test:toolbox"
}, },
"dependencies": { "dependencies": {
"@add-ideas/toolbox-contract": "^0.2.1", "@add-ideas/toolbox-contract": "^0.2.3",
"@add-ideas/toolbox-shell-react": "^0.2.1", "@add-ideas/toolbox-shell-react": "^0.2.3",
"fflate": "^0.8.3", "fflate": "^0.8.3",
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.7.284", "pdfjs-dist": "^5.7.284",
@@ -32,7 +32,7 @@
"react-dom": "^19.2.6" "react-dom": "^19.2.6"
}, },
"devDependencies": { "devDependencies": {
"@add-ideas/toolbox-testkit": "^0.2.1", "@add-ideas/toolbox-testkit": "^0.2.3",
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1", "@testing-library/user-event": "^14.6.1",
@@ -52,5 +52,13 @@
"vite": "^8.0.13", "vite": "^8.0.13",
"vitest": "^4.1.6" "vitest": "^4.1.6"
}, },
"description": "Browser-only, self-hostable PDF workbench for page-level PDF operations." "description": "Browser-only, self-hostable PDF workbench for page-level PDF operations.",
"repository": {
"type": "git",
"url": "git+https://git.add-ideas.de/lotobo/pdf-tools.git"
},
"homepage": "https://git.add-ideas.de/lotobo/pdf-tools",
"bugs": {
"url": "https://git.add-ideas.de/lotobo/pdf-tools/issues"
}
} }

View File

@@ -1,5 +1,5 @@
{ {
"$schema": "https://git.add-ideas.de/zemion/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json", "$schema": "https://git.add-ideas.de/lotobo/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json",
"schemaVersion": 1, "schemaVersion": 1,
"id": "de.add-ideas.pdf-tools", "id": "de.add-ideas.pdf-tools",
"name": "PDF Workbench", "name": "PDF Workbench",
@@ -25,8 +25,8 @@
"telemetry": false "telemetry": false
}, },
"source": { "source": {
"repository": "https://git.add-ideas.de/zemion/pdf-tools", "repository": "https://git.add-ideas.de/lotobo/pdf-tools",
"license": "AGPL-3.0-only" "license": "AGPL-3.0-only"
}, },
"version": "0.4.1" "version": "0.4.4"
} }

View File

@@ -40,7 +40,7 @@ if (sourceVersion !== packageJson.version) {
const manifest = { const manifest = {
$schema: $schema:
'https://git.add-ideas.de/zemion/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json', 'https://git.add-ideas.de/lotobo/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json',
schemaVersion: 1, schemaVersion: 1,
...definition, ...definition,
version: packageJson.version, version: packageJson.version,

View File

@@ -45,7 +45,7 @@ files['SOURCE.md'] = Buffer.from(
'', '',
`The source code corresponding to PDF Tools ${packageJson.version} is available at:`, `The source code corresponding to PDF Tools ${packageJson.version} is available at:`,
'', '',
`https://git.add-ideas.de/zemion/pdf-tools/src/tag/v${packageJson.version}`, `https://git.add-ideas.de/lotobo/pdf-tools/src/tag/v${packageJson.version}`,
'', '',
'Third-party components remain available under the separate terms reproduced in LICENSES/.', 'Third-party components remain available under the separate terms reproduced in LICENSES/.',
'', '',

View File

@@ -168,7 +168,7 @@ body {
.pdf-toolbox-shell .toolbox-shell__main { .pdf-toolbox-shell .toolbox-shell__main {
padding: 0.75rem; padding: 0.75rem;
max-width: 900px; max-width: 90rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.75rem; gap: 0.75rem;

View File

@@ -23,7 +23,7 @@
"telemetry": false "telemetry": false
}, },
"source": { "source": {
"repository": "https://git.add-ideas.de/zemion/pdf-tools", "repository": "https://git.add-ideas.de/lotobo/pdf-tools",
"license": "AGPL-3.0-only" "license": "AGPL-3.0-only"
} }
} }

View File

@@ -10,7 +10,7 @@ describe('toolbox app definition', () => {
it('uses repository metadata for the shared source control', () => { it('uses repository metadata for the shared source control', () => {
expect(toolboxApp.source?.repository).toBe( expect(toolboxApp.source?.repository).toBe(
'https://git.add-ideas.de/zemion/pdf-tools' 'https://git.add-ideas.de/lotobo/pdf-tools'
); );
expect(toolboxApp.actions).toBeUndefined(); expect(toolboxApp.actions).toBeUndefined();
}); });

View File

@@ -1 +1 @@
export const APP_VERSION = '0.4.1'; export const APP_VERSION = '0.4.4';

View File

@@ -0,0 +1,13 @@
import { readFile } from 'node:fs/promises';
import { describe, expect, it } from 'vitest';
describe('Toolbox layout styles', () => {
it('keeps the PDF workspace aligned to the 90rem shell width', async () => {
const stylesheet = await readFile('src/styles.css', 'utf8');
const mainRule = stylesheet.match(
/\.pdf-toolbox-shell \.toolbox-shell__main\s*\{(?<body>[^}]*)\}/u
);
expect(mainRule?.groups?.body).toMatch(/\bmax-width:\s*90rem\s*;/u);
});
});