diff --git a/.env.example b/.env.example index 1558509..7d3cb97 100644 --- a/.env.example +++ b/.env.example @@ -4,5 +4,5 @@ TRAEFIK_NETWORK=internal TRAEFIK_CERT_RESOLVER=netcup # Keep these two values paired when deploying a newer published toolbox release. -TOOLBOX_RELEASE_VERSION=0.4.1 -TOOLBOX_RELEASE_SHA256=7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124 +TOOLBOX_RELEASE_VERSION=0.4.2 +TOOLBOX_RELEASE_SHA256=20c1eacbcf03a9c8f0beeb53d2326a963e54dd9ca93e4f0118f95f10aec45389 diff --git a/Containerfile.release b/Containerfile.release index cf8c830..7c1a1c3 100644 --- a/Containerfile.release +++ b/Containerfile.release @@ -2,8 +2,8 @@ ARG NGINX_IMAGE=nginxinc/nginx-unprivileged:1.31.3-alpine@sha256:18d67281256ded3 FROM ${NGINX_IMAGE} AS release -ARG TOOLBOX_RELEASE_VERSION=0.4.1 -ARG TOOLBOX_RELEASE_SHA256=7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124 +ARG TOOLBOX_RELEASE_VERSION=0.4.2 +ARG TOOLBOX_RELEASE_SHA256=20c1eacbcf03a9c8f0beeb53d2326a963e54dd9ca93e4f0118f95f10aec45389 ARG TOOLBOX_RELEASE_BASE_URL=https://git.add-ideas.de/zemion/toolbox-portal/releases/download RUN set -eu; \ diff --git a/README.md b/README.md index 59d934d..97d57f3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # add·ideas Toolbox Portal `toolbox-portal` is the static launcher and release assembler for the add·ideas -browser toolbox. Version `0.2.1` reads one same-origin catalogue, shows each app +browser toolbox. Version `0.2.2` reads one same-origin catalogue, shows each app as a full-page launch tile, and keeps personal pins, drag-and-drop ordering, visibility, and appearance in the current browser. Pinned tools have their own section; search, category, and clickable tag filters stay close to the tool @@ -30,7 +30,7 @@ npm run build npm run dev ``` -The package lock resolves the `^0.2.1` SDK ranges to the published `0.2.1` +The package lock resolves the `^0.2.2` SDK ranges to the published `0.2.2` packages. A sibling SDK checkout is only needed when intentionally developing the SDK and portal together. @@ -68,7 +68,7 @@ privacy and executable-code warning. Light, dark, and system modes are supported ## Production deployment behind Traefik The committed `compose.yaml` is the shortest production path. Its release -container downloads the immutable Toolbox 0.4.1 ZIP during the image build, +container downloads the immutable Toolbox 0.4.2 ZIP during the image build, verifies SHA-256 before extracting it, and then copies only the verified static files into the pinned unprivileged nginx image. Node.js and a local portal assembly are not required on the deployment host. @@ -119,8 +119,8 @@ The app release should also publish a matching `.sha256` sidecar. The manifest must declare the pinned reverse-DNS id and version. Application and portal versions are independent. -`release/toolbox.lock.json` is the reviewed v0.4.1 lock. Its URLs and checksums -pin the published PDF Tools 0.4.1, XSLT Tools 0.4.1, and OneNote Tools 0.3.1 +`release/toolbox.lock.json` is the reviewed v0.4.2 lock. Its URLs and checksums +pin the published PDF Tools 0.4.2, XSLT Tools 0.4.2, and OneNote Tools 0.3.2 release bytes. Use `release/toolbox.lock.example.json` as the template for a future release and verify every downloaded asset before committing updated values. Artifacts may be: @@ -142,7 +142,7 @@ npm run assemble -- \ --lock release/toolbox.lock.json \ --portal-dist dist \ --output build/toolbox \ - --archive build/add-ideas-toolbox-0.4.1.zip + --archive build/add-ideas-toolbox-0.4.2.zip ``` Existing output is refused. Pass `--force` only when replacing those exact @@ -162,8 +162,8 @@ build/toolbox/ ├── xslt/ └── onenote/ -build/add-ideas-toolbox-0.4.1.zip -build/add-ideas-toolbox-0.4.1.zip.sha256 +build/add-ideas-toolbox-0.4.2.zip +build/add-ideas-toolbox-0.4.2.zip.sha256 ``` The assembler verifies SHA-256 before opening an artifact, validates every app @@ -184,7 +184,7 @@ directory separately: ```sh npm run package:static -- \ --input build/toolbox \ - --output artifacts/add-ideas-toolbox-0.4.1.zip + --output artifacts/add-ideas-toolbox-0.4.2.zip ``` This also emits a `.sha256` sidecar. @@ -201,9 +201,9 @@ normal local XML/XSLT transformations do not require that permission. ```sh podman build -f Containerfile \ - -t git.add-ideas.de/zemion/toolbox:0.4.1 . + -t git.add-ideas.de/zemion/toolbox:0.4.2 . podman run --rm -p 8080:8080 \ - git.add-ideas.de/zemion/toolbox:0.4.1 + git.add-ideas.de/zemion/toolbox:0.4.2 ``` For a direct-port local deployment after assembly, use the separate example: @@ -220,7 +220,7 @@ docker login git.add-ideas.de docker buildx build \ --platform linux/amd64,linux/arm64 \ --file Containerfile.release \ - --tag git.add-ideas.de/zemion/toolbox:0.4.1 \ + --tag git.add-ideas.de/zemion/toolbox:0.4.2 \ --tag git.add-ideas.de/zemion/toolbox:0.4 \ --push . ``` @@ -246,8 +246,8 @@ permission to push code, releases, and container packages. all three apps, switch between them, and confirm the encoded `toolbox` context. 5. Verify the distribution with - `(cd build && sha256sum -c add-ideas-toolbox-0.4.1.zip.sha256)`. -6. Commit the reviewed lock, tag the toolbox release (for example `v0.4.1`), and + `(cd build && sha256sum -c add-ideas-toolbox-0.4.2.zip.sha256)`. +6. Commit the reviewed lock, tag the toolbox release (for example `v0.4.2`), and push the branch and tag to Gitea. 7. In Gitea, open **Releases → New release**, select the tag, and upload the static ZIP plus its `.sha256` file. Do not use a mutable “latest” URL in a diff --git a/compose.example.yaml b/compose.example.yaml index e9560d2..95d140a 100644 --- a/compose.example.yaml +++ b/compose.example.yaml @@ -3,7 +3,7 @@ services: build: context: . dockerfile: Containerfile - image: git.add-ideas.de/zemion/toolbox:0.4.1 + image: git.add-ideas.de/zemion/toolbox:0.4.2 restart: unless-stopped read_only: true ports: diff --git a/compose.yaml b/compose.yaml index 14157a5..b5220f6 100644 --- a/compose.yaml +++ b/compose.yaml @@ -6,9 +6,9 @@ services: context: . dockerfile: Containerfile.release args: - TOOLBOX_RELEASE_VERSION: "${TOOLBOX_RELEASE_VERSION:-0.4.1}" - TOOLBOX_RELEASE_SHA256: "${TOOLBOX_RELEASE_SHA256:-7d8907990a8b91c2bfda48d007fd8136e95222858db8f51780cd10f4165e9124}" - image: "git.add-ideas.de/zemion/toolbox:${TOOLBOX_RELEASE_VERSION:-0.4.1}" + TOOLBOX_RELEASE_VERSION: "${TOOLBOX_RELEASE_VERSION:-0.4.2}" + TOOLBOX_RELEASE_SHA256: "${TOOLBOX_RELEASE_SHA256:-20c1eacbcf03a9c8f0beeb53d2326a963e54dd9ca93e4f0118f95f10aec45389}" + image: "git.add-ideas.de/zemion/toolbox:${TOOLBOX_RELEASE_VERSION:-0.4.2}" restart: unless-stopped read_only: true tmpfs: diff --git a/package-lock.json b/package-lock.json index 8744af5..323f611 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@add-ideas/toolbox-portal", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@add-ideas/toolbox-portal", - "version": "0.2.1", + "version": "0.2.2", "license": "AGPL-3.0-only", "dependencies": { - "@add-ideas/toolbox-contract": "^0.2.1", - "@add-ideas/toolbox-shell-react": "^0.2.1", + "@add-ideas/toolbox-contract": "^0.2.2", + "@add-ideas/toolbox-shell-react": "^0.2.2", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", @@ -44,18 +44,18 @@ } }, "node_modules/@add-ideas/toolbox-contract": { - "version": "0.2.1", - "resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.1/toolbox-contract-0.2.1.tgz", - "integrity": "sha512-NmwV41+ZS0qBWUnI9vflm0PcsiqITmxpSQQ5vMVaToFZuSSIJupgM43tuV9G4OJ1En0eTdYNxbsd3nsYhju2kw==", + "version": "0.2.2", + "resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.2/toolbox-contract-0.2.2.tgz", + "integrity": "sha512-VcZ8j4O2PgFaIYgxs6r9u0uPxA+hHKwhCW+omfeVCtbjAAYhH2KhRlBGm0ERVVYcK5kchyzZLXrC4LKWRotVzg==", "license": "Apache-2.0" }, "node_modules/@add-ideas/toolbox-shell-react": { - "version": "0.2.1", - "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", - "integrity": "sha512-slpz9ODVbk27b+uvG3WeCmNa71Q6guabyVHT+jyGLT6ENLSbwmoEFZ0mKNJDxemltpt9KY8I7z47uNBsQ7yKYg==", + "version": "0.2.2", + "resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-shell-react/-/0.2.2/toolbox-shell-react-0.2.2.tgz", + "integrity": "sha512-w/xbLCd50a2Jq7vQ9Z9ygUOuqlOCRkIYlk4vSJx0mf4REJNeMYi3PE2MbaLUC4DkQWyrmatsa5HNT89o0l91BA==", "license": "Apache-2.0", "dependencies": { - "@add-ideas/toolbox-contract": "0.2.1" + "@add-ideas/toolbox-contract": "0.2.2" }, "peerDependencies": { "react": ">=18 <20", diff --git a/package.json b/package.json index 437e49a..340bfb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@add-ideas/toolbox-portal", - "version": "0.2.1", + "version": "0.2.2", "license": "AGPL-3.0-only", "private": true, "type": "module", @@ -21,8 +21,8 @@ "package:static": "node scripts/package-static.mjs" }, "dependencies": { - "@add-ideas/toolbox-contract": "^0.2.1", - "@add-ideas/toolbox-shell-react": "^0.2.1", + "@add-ideas/toolbox-contract": "^0.2.2", + "@add-ideas/toolbox-shell-react": "^0.2.2", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", diff --git a/public/SOURCE.md b/public/SOURCE.md index 9806cdb..0be31ae 100644 --- a/public/SOURCE.md +++ b/public/SOURCE.md @@ -1,8 +1,8 @@ # Corresponding source -The source code corresponding to add·ideas Toolbox Portal 0.2.1 is available at: +The source code corresponding to add·ideas Toolbox Portal 0.2.2 is available at: -https://git.add-ideas.de/zemion/toolbox-portal/src/tag/v0.4.1 +https://git.add-ideas.de/zemion/toolbox-portal/src/tag/v0.4.2 Each bundled application contains its own `SOURCE.md`, license, and third-party license materials. The application sources are also linked from the portal. diff --git a/release/toolbox.lock.example.json b/release/toolbox.lock.example.json index fc2bfb7..f136486 100644 --- a/release/toolbox.lock.example.json +++ b/release/toolbox.lock.example.json @@ -1,8 +1,8 @@ { "$schema": "./toolbox-release-lock.schema.json", "schemaVersion": 1, - "releaseVersion": "0.4.1", - "portalVersion": "0.2.1", + "releaseVersion": "0.4.2", + "portalVersion": "0.2.2", "catalogue": { "id": "de.add-ideas.toolbox", "name": "add·ideas Toolbox", @@ -15,23 +15,23 @@ "apps": [ { "id": "de.add-ideas.pdf-tools", - "version": "0.4.1", - "artifact": "https://git.add-ideas.de/zemion/pdf-tools/releases/download/v0.4.1/pdf-tools-0.4.1.zip", - "sha256": "a7313e1fc709ec1fd3c09d46f7de84e07c299bd98f36fcba839ca0d6c8afc467", + "version": "0.4.2", + "artifact": "https://git.add-ideas.de/zemion/pdf-tools/releases/download/v0.4.2/pdf-tools-0.4.2.zip", + "sha256": "ebb6711e149a59abf51eddc0927debba9118205bde91faf7dded132478bc23d0", "target": "pdf" }, { "id": "de.add-ideas.xslt-tools", - "version": "0.4.1", - "artifact": "https://git.add-ideas.de/zemion/xslt-tools/releases/download/v0.4.1/xslt-tools-0.4.1.zip", - "sha256": "0f24480b8a3f007d8e330592e598babf5982306e1e9566325c9ca60441deb2fb", + "version": "0.4.2", + "artifact": "https://git.add-ideas.de/zemion/xslt-tools/releases/download/v0.4.2/xslt-tools-0.4.2.zip", + "sha256": "daaa821c10c6c6285f97128ba3d923e48efa24449f1fb0a21bf478abaf27499f", "target": "xslt" }, { "id": "de.add-ideas.onenote-tools", - "version": "0.3.1", - "artifact": "https://git.add-ideas.de/zemion/onenote-tools/releases/download/v0.3.1/onenote-tools-0.3.1.zip", - "sha256": "52d0443698ae875438f01bb6b7735722d511bc99d4b9ca5060727ebb41276665", + "version": "0.3.2", + "artifact": "https://git.add-ideas.de/zemion/onenote-tools/releases/download/v0.3.2/onenote-tools-0.3.2.zip", + "sha256": "c07e6909ae57bd7681f26ec29c7a4e927b6919123ef9e28aa2d8c55b842b65d2", "target": "onenote" } ] diff --git a/release/toolbox.lock.json b/release/toolbox.lock.json index fc2bfb7..f136486 100644 --- a/release/toolbox.lock.json +++ b/release/toolbox.lock.json @@ -1,8 +1,8 @@ { "$schema": "./toolbox-release-lock.schema.json", "schemaVersion": 1, - "releaseVersion": "0.4.1", - "portalVersion": "0.2.1", + "releaseVersion": "0.4.2", + "portalVersion": "0.2.2", "catalogue": { "id": "de.add-ideas.toolbox", "name": "add·ideas Toolbox", @@ -15,23 +15,23 @@ "apps": [ { "id": "de.add-ideas.pdf-tools", - "version": "0.4.1", - "artifact": "https://git.add-ideas.de/zemion/pdf-tools/releases/download/v0.4.1/pdf-tools-0.4.1.zip", - "sha256": "a7313e1fc709ec1fd3c09d46f7de84e07c299bd98f36fcba839ca0d6c8afc467", + "version": "0.4.2", + "artifact": "https://git.add-ideas.de/zemion/pdf-tools/releases/download/v0.4.2/pdf-tools-0.4.2.zip", + "sha256": "ebb6711e149a59abf51eddc0927debba9118205bde91faf7dded132478bc23d0", "target": "pdf" }, { "id": "de.add-ideas.xslt-tools", - "version": "0.4.1", - "artifact": "https://git.add-ideas.de/zemion/xslt-tools/releases/download/v0.4.1/xslt-tools-0.4.1.zip", - "sha256": "0f24480b8a3f007d8e330592e598babf5982306e1e9566325c9ca60441deb2fb", + "version": "0.4.2", + "artifact": "https://git.add-ideas.de/zemion/xslt-tools/releases/download/v0.4.2/xslt-tools-0.4.2.zip", + "sha256": "daaa821c10c6c6285f97128ba3d923e48efa24449f1fb0a21bf478abaf27499f", "target": "xslt" }, { "id": "de.add-ideas.onenote-tools", - "version": "0.3.1", - "artifact": "https://git.add-ideas.de/zemion/onenote-tools/releases/download/v0.3.1/onenote-tools-0.3.1.zip", - "sha256": "52d0443698ae875438f01bb6b7735722d511bc99d4b9ca5060727ebb41276665", + "version": "0.3.2", + "artifact": "https://git.add-ideas.de/zemion/onenote-tools/releases/download/v0.3.2/onenote-tools-0.3.2.zip", + "sha256": "c07e6909ae57bd7681f26ec29c7a4e927b6919123ef9e28aa2d8c55b842b65d2", "target": "onenote" } ] diff --git a/scripts/assembler.test.ts b/scripts/assembler.test.ts index 258c083..1e7d7e8 100644 --- a/scripts/assembler.test.ts +++ b/scripts/assembler.test.ts @@ -83,7 +83,7 @@ function makeLock(artifact: string, sha256: string) { return { schemaVersion: 1, releaseVersion: '0.1.0', - portalVersion: '0.2.1', + portalVersion: '0.2.2', catalogue: { id: 'de.add-ideas.toolbox', name: 'Test Toolbox', diff --git a/src/App.test.tsx b/src/App.test.tsx index 9d02e7c..d0c689d 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -39,7 +39,7 @@ describe('portal UI', () => { ).toHaveAttribute('rel', 'noopener noreferrer'); expect( sourceLinks.find((link) => - link.getAttribute('href')?.endsWith('/toolbox-portal/src/tag/v0.4.1') + link.getAttribute('href')?.endsWith('/toolbox-portal/src/tag/v0.4.2') ) ).toBeDefined(); expect( @@ -229,16 +229,33 @@ describe('portal UI', () => { const brand = within(header).getByRole('link', { name: 'add·ideas Toolbox', }); + const controls = within(header).getByRole('group', { + name: 'Toolbox controls', + }); expect( - personalize.compareDocumentPosition(apps) & - Node.DOCUMENT_POSITION_FOLLOWING - ).toBeTruthy(); + Array.from(controls.children, (element) => + element.getAttribute('aria-label') + ) + ).toEqual(['Help', 'Toolbox source on Gitea', 'Apps', 'Personalize']); + expect(help.compareDocumentPosition(source)).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ); + expect(source.compareDocumentPosition(apps)).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ); + expect(apps.compareDocumentPosition(personalize)).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ); expect( - apps.compareDocumentPosition(source) & Node.DOCUMENT_POSITION_FOLLOWING - ).toBeTruthy(); - expect( - source.compareDocumentPosition(help) & Node.DOCUMENT_POSITION_FOLLOWING - ).toBeTruthy(); + Array.from( + header.querySelector('.toolbox-shell__bar')?.children ?? [], + (element) => element.className + ) + ).toEqual([ + 'toolbox-shell__brand', + 'toolbox-shell__identity', + 'toolbox-shell__controls', + ]); expect(brand.querySelector('img')).toHaveAttribute('src', './favicon.svg'); }); @@ -412,6 +429,13 @@ describe('portal UI', () => { }); const popover = screen.getByRole('dialog', { name: 'Personalize Toolbox' }); expect(popover).toContainElement(heading); + expect(popover).toContainElement(screen.getByText('On this device')); + expect( + within(popover).getByRole('group', { name: 'Appearance' }) + ).toBeInTheDocument(); + expect( + popover.querySelector('.toolbox-shell__preferences-content') + ).toBeInTheDocument(); expect(popover).not.toHaveAttribute('aria-modal'); expect(container.querySelector('.site-shell')).not.toHaveAttribute('inert'); expect(screen.getByText(/does not transmit them/i)).toHaveTextContent( diff --git a/src/App.tsx b/src/App.tsx index 12a976f..d2342e5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -473,9 +473,9 @@ export default function App() {
- Portal v0.2.1 ·{' '} + Portal v0.2.2 ·{' '} diff --git a/src/components/PreferencesPanel.tsx b/src/components/PreferencesPanel.tsx index a8ce36a..ebe07a6 100644 --- a/src/components/PreferencesPanel.tsx +++ b/src/components/PreferencesPanel.tsx @@ -1,10 +1,10 @@ import { useRef, useState, type ChangeEvent } from 'react'; +import { ToolboxPersonalizePanel } from '@add-ideas/toolbox-shell-react'; import { defaultPreferences, parsePreferences, type Preferences, } from '../preferences'; -import type { ThemeMode } from '../types'; interface PreferencesPanelProps { preferences: Preferences; @@ -20,10 +20,6 @@ export function PreferencesPanel({ const fileInput = useRefOn this device
-- Browser storage is unavailable. Changes will last only until this page - closes. -
- )} - - -{message}
- + ); } diff --git a/src/styles.css b/src/styles.css index 278f378..fb0df20 100644 --- a/src/styles.css +++ b/src/styles.css @@ -690,38 +690,6 @@ main { margin-bottom: 0.5rem; } -.portal-header .toolbox-shell__personalize-popover { - width: min(26rem, calc(100vw - 1.5rem)); - max-height: calc(100vh - 5.5rem); - overflow: auto; -} - -.preferences-content { - padding: 0.35rem; - color: var(--toolbox-text, var(--text)); -} - -.preferences-heading { - margin-bottom: 0.9rem; -} - -.preferences-content h2 { - margin: 0; - font-family: Inter, Avenir, 'Segoe UI', sans-serif; - font-size: 1rem; - letter-spacing: -0.025em; -} - -.portal-header .preferences-kicker { - margin: 0 0 0.3rem; - padding: 0; - color: var(--toolbox-accent, var(--brand)); - font-size: 0.68rem; - font-weight: 750; - letter-spacing: 0.1em; - text-transform: uppercase; -} - .help-steps { display: grid; gap: 0.85rem; @@ -750,44 +718,6 @@ main { font-size: 1.3rem; } -.theme-choice { - margin: 1rem 0; - padding: 0; - border: 0; -} - -.theme-choice legend { - margin-bottom: 0.6rem; - color: var(--muted); - font-size: 0.78rem; - font-weight: 700; - text-transform: uppercase; -} - -.theme-choice > div { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 0.45rem; - padding: 0.35rem; - border-radius: 0.75rem; - background: var(--surface-soft); -} - -.theme-choice button { - padding: 0.62rem; - border: 0; - border-radius: 0.5rem; - background: transparent; - cursor: pointer; -} - -.theme-choice button.is-selected { - background: var(--surface); - color: var(--brand); - box-shadow: 0 2px 8px rgba(20, 30, 60, 0.09); - font-weight: 700; -} - .preference-summary { display: grid; grid-template-columns: repeat(3, 1fr); @@ -846,15 +776,6 @@ main { font-size: 0.78rem; } -.portal-header .inline-warning { - margin: 0 0 0.75rem; - padding: 0.7rem 0.8rem; - border-radius: 0.6rem; - background: color-mix(in srgb, var(--danger) 8%, var(--surface)); - color: var(--danger); - font-size: 0.82rem; -} - .visually-hidden { position: absolute !important; width: 1px !important; diff --git a/src/test/fixtures.ts b/src/test/fixtures.ts index 1749151..b5dba95 100644 --- a/src/test/fixtures.ts +++ b/src/test/fixtures.ts @@ -7,7 +7,7 @@ export const pdfManifest: ToolboxAppManifest = { schemaVersion: 1, id: 'de.add-ideas.pdf-tools', name: 'PDF Workbench', - version: '0.4.1', + version: '0.4.2', description: 'Page-level PDF operations performed locally in the browser.', entry: './', icon: './favicon.svg', @@ -39,7 +39,7 @@ export const xsltManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.xslt-tools', name: 'XSLT Workbench', - version: '0.4.1', + version: '0.4.2', description: 'Transform XML locally with XSLT in the browser.', icon: './xslt.svg', categories: ['documents', 'developer'], @@ -54,7 +54,7 @@ export const onenoteManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.onenote-tools', name: 'OneNote Reader', - version: '0.3.1', + version: '0.3.2', description: 'Inspect OneNote packages locally in the browser.', icon: './onenote.svg', categories: ['documents', 'notes'],