3 Commits

17 changed files with 133 additions and 55 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

@@ -1,5 +1,31 @@
# Changelog # Changelog
## 0.3.4 - 2026-07-27
- Move the canonical source, manifest schema links, and package registry from
the personal `zemion` namespace to the `lotobo` (LocalToolBox) Gitea
organization.
- Upgrade the Toolbox contract, React shell, and validation testkit to 0.2.3,
republished from the organization-owned registry without functional shell
changes.
## 0.3.3 - 2026-07-23
- Let the OneNote application use the full width supplied by the shared
Toolbox shell, matching the shell bar's `min(100%, 90rem)` content span
instead of retaining the former 76rem application cap.
## 0.3.2 - 2026-07-23
- Upgrade the Toolbox contract, React shell, and validation testkit to 0.2.2,
pinned to SDK revision `53c40a61ba1581246f65773fcbb1c1cfd31ac98e`.
- Move the Toolbox icon and `add·ideas Toolbox` label to the fixed far-left
block and place Help, the OneNote-specific Gitea source link, Apps, and
Personalize in that order in the fixed far-right cluster while retaining the
centered app title and tagline.
- Use the shared portal-style Personalize appearance panel; catalogue counts
and preference import/export remain portal-only controls.
## 0.3.1 - 2026-07-23 ## 0.3.1 - 2026-07-23
- Upgrade the Toolbox contract, React shell, and validation testkit to 0.2.1. - Upgrade the Toolbox contract, React shell, and validation testkit to 0.2.1.

View File

@@ -9,12 +9,14 @@ It is also an independent application in the add·ideas Toolbox contract. The
source uses the Toolbox SDK shell and manifest, builds with Vite `base: './'`, source uses the Toolbox SDK shell and manifest, builds with Vite `base: './'`,
and is delivered to Toolbox Portal as a checksummed static ZIP. and is delivered to Toolbox Portal as a checksummed static ZIP.
Version 0.3.1 uses the stable shared top bar, with Personalize, Apps, the Version 0.3.4 uses the stable shared top bar, with the Toolbox icon and
OneNote source link, and Help in a fixed left cluster; the app title and one `add·ideas Toolbox` label in a fixed far-left block; the app title and one
tagline centered; and the Toolbox icon with the `add·ideas Toolbox` label in a tagline centered; and Help, the OneNote source link, Apps, and Personalize in a
fixed far-right block. fixed far-right cluster. Personalize uses the shared portal-style appearance
panel while catalogue counts and preference import/export stay in the portal.
The application content uses the same `min(100%, 90rem)` span as the shell bar.
## What version 0.3.1 supports ## What version 0.3.4 supports
- Desktop revision-store and unfragmented FSSHTTPB package-store `.one` - Desktop revision-store and unfragmented FSSHTTPB package-store `.one`
sections from the tested producer families. sections from the tested producer families.
@@ -85,7 +87,7 @@ supplied through the SDK's `?toolbox=` context mechanism. The app uses the SDK
```sh ```sh
npm run release:artifact npm run release:artifact
(cd release && sha256sum -c onenote-tools-0.3.1.sha256) (cd release && sha256sum -c onenote-tools-0.3.4.sha256)
``` ```
The ZIP root contains the built static app and manifest plus the changelog, The ZIP root contains the built static app and manifest plus the changelog,

View File

@@ -1,8 +1,8 @@
# Corresponding source # Corresponding source
The corresponding source for OneNote Tools 0.3.1 is the `v0.3.1` tag: The corresponding source for OneNote Tools 0.3.4 is the `v0.3.4` tag:
https://git.add-ideas.de/zemion/onenote-tools/src/tag/v0.3.1 https://git.add-ideas.de/lotobo/onenote-tools/src/tag/v0.3.4
Build the release from that tag with Node.js 22 or newer: Build the release from that tag with Node.js 22 or newer:

View File

@@ -2,8 +2,8 @@
The production application uses: The production application uses:
- `@add-ideas/toolbox-contract` 0.2.1, Apache-2.0; - `@add-ideas/toolbox-contract` 0.2.3, Apache-2.0;
- `@add-ideas/toolbox-shell-react` 0.2.1, Apache-2.0; - `@add-ideas/toolbox-shell-react` 0.2.3, Apache-2.0;
- fflate 0.8.3, MIT; - fflate 0.8.3, MIT;
- React, React DOM, and Scheduler, MIT. - React, React DOM, and Scheduler, MIT.

View File

@@ -1,6 +1,6 @@
# Format support # Format support
## Version 0.3.1 support matrix ## Version 0.3.4 support matrix
| Input or feature | Status | Tested evidence and boundary | | Input or feature | Status | Tested evidence and boundary |
| -------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------- | | -------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------- |

View File

@@ -1,17 +1,17 @@
# Specifications and pinned references # Specifications and pinned references
Version 0.3.1 records these immutable implementation revisions: Version 0.3.4 records these immutable implementation revisions:
| Repository | Exact revision | Use | | Repository | Exact revision | Use |
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------- | | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------- |
| [`toolbox-sdk`](https://git.add-ideas.de/zemion/toolbox-sdk/src/commit/c296281f899608d5df7fae1d83d442675d1104a2) | `c296281f899608d5df7fae1d83d442675d1104a2` | App contract, React shell, manifest schema/testkit, and nested-path behavior | | [`toolbox-sdk`](https://git.add-ideas.de/lotobo/toolbox-sdk/src/commit/ef2dab4b46c61812c9a877d8a19fe497b4a4630a) | `ef2dab4b46c61812c9a877d8a19fe497b4a4630a` | App contract, React shell, manifest schema/testkit, package registry, and nested-path behavior |
| [`toolbox-portal`](https://git.add-ideas.de/zemion/toolbox-portal/src/commit/d46f1b61fb85a18299b6b8af2148dcd991ef6b05) | `d46f1b61fb85a18299b6b8af2148dcd991ef6b05` | Reviewed ZIP shape, exact checksum lock, independent-app assembly, and nginx deployment model | | [`toolbox-portal`](https://git.add-ideas.de/lotobo/toolbox-portal/src/commit/d46f1b61fb85a18299b6b8af2148dcd991ef6b05) | `d46f1b61fb85a18299b6b8af2148dcd991ef6b05` | Reviewed ZIP shape, exact checksum lock, independent-app assembly, and nginx deployment model |
| [`onenote.rs`](https://github.com/msiemens/onenote.rs/tree/5138a39a3f4e72b840932f9872fecde52fa9da60) | `5138a39a3f4e72b840932f9872fecde52fa9da60` | Selected desktop/FSSHTTPB OneStore and MS-ONE structures adapted into TypeScript | | [`onenote.rs`](https://github.com/msiemens/onenote.rs/tree/5138a39a3f4e72b840932f9872fecde52fa9da60) | `5138a39a3f4e72b840932f9872fecde52fa9da60` | Selected desktop/FSSHTTPB OneStore and MS-ONE structures adapted into TypeScript |
| [`rust-cab`](https://github.com/mdsteele/rust-cab/tree/c5839f5fdfa4c4e7cc9b22f570c79c96af0560e2) | `c5839f5fdfa4c4e7cc9b22f570c79c96af0560e2` | CAB structures, checksum, enumeration/extraction, MSZIP history, and unit fixtures | | [`rust-cab`](https://github.com/mdsteele/rust-cab/tree/c5839f5fdfa4c4e7cc9b22f570c79c96af0560e2) | `c5839f5fdfa4c4e7cc9b22f570c79c96af0560e2` | CAB structures, checksum, enumeration/extraction, MSZIP history, and unit fixtures |
| [`compcol`](https://github.com/KarpelesLab/compcol/tree/04a6db2aa7bd487a89c559631d79d1b384139f50) | `04a6db2aa7bd487a89c559631d79d1b384139f50` | Quantum bit reader, arithmetic models, LZ window, CAB sentinel behavior, and tests | | [`compcol`](https://github.com/KarpelesLab/compcol/tree/04a6db2aa7bd487a89c559631d79d1b384139f50) | `04a6db2aa7bd487a89c559631d79d1b384139f50` | Quantum bit reader, arithmetic models, LZ window, CAB sentinel behavior, and tests |
| [`lzxd` 0.2.5](https://github.com/Lonami/lzxd/tree/4748e43594e3e30cff2ace3a6ad7a376c9816fdd) | `4748e43594e3e30cff2ace3a6ad7a376c9816fdd` | LZX bitstream, Huffman, block/window, match, and E8 logic adapted into TypeScript | | [`lzxd` 0.2.5](https://github.com/Lonami/lzxd/tree/4748e43594e3e30cff2ace3a6ad7a376c9816fdd) | `4748e43594e3e30cff2ace3a6ad7a376c9816fdd` | LZX bitstream, Huffman, block/window, match, and E8 logic adapted into TypeScript |
| [`libmspack`](https://github.com/kyz/libmspack/tree/55d501976171397ccd5d5a7a1ca7da065b1d9a06) | `55d501976171397ccd5d5a7a1ca7da065b1d9a06` | Multi-cabinet chain, split CFDATA, spanning-file semantics, and licensed fixtures | | [`libmspack`](https://github.com/kyz/libmspack/tree/55d501976171397ccd5d5a7a1ca7da065b1d9a06) | `55d501976171397ccd5d5a7a1ca7da065b1d9a06` | Multi-cabinet chain, split CFDATA, spanning-file semantics, and licensed fixtures |
| [`one2html`](https://github.com/msiemens/one2html/tree/59930ad309004030f812790c6749efe4265bb6bd) | `59930ad309004030f812790c6749efe4265bb6bd` | Behavioral reference for rich text, tables, images, attachments, ink, and HTML rendering | | [`one2html`](https://github.com/msiemens/one2html/tree/59930ad309004030f812790c6749efe4265bb6bd) | `59930ad309004030f812790c6749efe4265bb6bd` | Behavioral reference for rich text, tables, images, attachments, ink, and HTML rendering |
The SDK and Portal revisions were inspected from the local repositories. Every The SDK and Portal revisions were inspected from the local repositories. Every
parser/renderer reference was cloned and reviewed at the hash above; a branch parser/renderer reference was cloned and reviewed at the hash above; a branch

32
package-lock.json generated
View File

@@ -1,22 +1,22 @@
{ {
"name": "onenote-tools", "name": "onenote-tools",
"version": "0.3.1", "version": "0.3.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "onenote-tools", "name": "onenote-tools",
"version": "0.3.1", "version": "0.3.4",
"license": "MPL-2.0 AND LGPL-2.1-only", "license": "MPL-2.0 AND LGPL-2.1-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",
"react": "^19.2.6", "react": "^19.2.6",
"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/jest-dom": "^6.9.1", "@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
@@ -42,18 +42,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",
@@ -61,13 +61,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": "onenote-tools", "name": "onenote-tools",
"version": "0.3.1", "version": "0.3.4",
"description": "A local-first browser reader and exporter for OneNote files.", "description": "A local-first browser reader and exporter for OneNote files.",
"license": "MPL-2.0 AND LGPL-2.1-only", "license": "MPL-2.0 AND LGPL-2.1-only",
"private": true, "private": true,
@@ -27,14 +27,14 @@
"check": "npm run manifest:check && npm run typecheck && npm run lint && npm run format:check && npm run test && npm run build && npm run toolbox:check" "check": "npm run manifest:check && npm run typecheck && npm run lint && npm run format:check && npm run test && npm run build && npm run toolbox:check"
}, },
"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",
"react": "^19.2.6", "react": "^19.2.6",
"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/jest-dom": "^6.9.1", "@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",

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.onenote-tools", "id": "de.add-ideas.onenote-tools",
"name": "OneNote Tools", "name": "OneNote Tools",
@@ -37,8 +37,8 @@
"label": "Local only · no uploads · no storage · no telemetry" "label": "Local only · no uploads · no storage · no telemetry"
}, },
"source": { "source": {
"repository": "https://git.add-ideas.de/zemion/onenote-tools", "repository": "https://git.add-ideas.de/lotobo/onenote-tools",
"license": "MPL-2.0 AND LGPL-2.1-only" "license": "MPL-2.0 AND LGPL-2.1-only"
}, },
"version": "0.3.1" "version": "0.3.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

@@ -20,7 +20,28 @@ describe('Toolbox application shell', () => {
screen.getByRole('link', { screen.getByRole('link', {
name: 'Source for OneNote Tools on Gitea', name: 'Source for OneNote Tools on Gitea',
}) })
).toHaveAttribute('href', 'https://git.add-ideas.de/zemion/onenote-tools'); ).toHaveAttribute('href', 'https://git.add-ideas.de/lotobo/onenote-tools');
expect(
Array.from(
screen.getByRole('group', { name: 'Toolbox controls' }).children,
(element) => element.getAttribute('aria-label')
)
).toEqual([
'Help',
'Source for OneNote Tools on Gitea',
'Apps',
'Personalize',
]);
expect(
Array.from(
document.querySelector('.toolbox-shell__bar')?.children ?? [],
(element) => element.className
)
).toEqual([
'toolbox-shell__brand',
'toolbox-shell__identity',
'toolbox-shell__controls',
]);
await user.click(screen.getByRole('button', { name: 'Help' })); await user.click(screen.getByRole('button', { name: 'Help' }));
expect( expect(
@@ -32,7 +53,16 @@ describe('Toolbox application shell', () => {
const user = userEvent.setup(); const user = userEvent.setup();
const { container } = render(<App />); const { container } = render(<App />);
await user.click(screen.getByText('Personalize')); await user.click(screen.getByRole('button', { name: 'Personalize' }));
expect(
screen.getByRole('heading', { name: 'Personalize your toolbox' })
).toBeInTheDocument();
expect(
screen.getByRole('group', { name: 'Appearance' })
).toBeInTheDocument();
expect(
screen.queryByRole('button', { name: 'Export JSON' })
).not.toBeInTheDocument();
await user.click(screen.getByRole('button', { name: 'Dark' })); await user.click(screen.getByRole('button', { name: 'Dark' }));
expect(container.querySelector('.toolbox-shell')).toHaveAttribute( expect(container.querySelector('.toolbox-shell')).toHaveAttribute(

View File

@@ -0,0 +1,21 @@
import { readFile } from 'node:fs/promises';
import path from 'node:path';
import { describe, expect, it } from 'vitest';
describe('application width', () => {
it('uses the complete width supplied by the shared Toolbox shell', async () => {
const stylesheet = await readFile(
path.join(process.cwd(), 'src', 'styles.css'),
'utf8'
);
const applicationRules = Array.from(
stylesheet.matchAll(/\.application\s*\{([^}]*)\}/g),
(match) => match[1] ?? ''
);
expect(applicationRules).not.toHaveLength(0);
expect(applicationRules.join('\n')).toMatch(/\bwidth:\s*100%;/);
expect(applicationRules.join('\n')).not.toMatch(/\bwidth:\s*min\(/);
});
});

View File

@@ -106,7 +106,7 @@ body {
.application { .application {
display: grid; display: grid;
gap: 1.25rem; gap: 1.25rem;
width: min(76rem, calc(100% - 2rem)); width: 100%;
margin: 2rem auto; margin: 2rem auto;
} }
@@ -801,7 +801,6 @@ body {
@media (max-width: 760px) { @media (max-width: 760px) {
.application { .application {
width: min(100% - 1rem, 76rem);
margin: 0.75rem auto; margin: 0.75rem auto;
} }

View File

@@ -35,7 +35,7 @@
"label": "Local only · no uploads · no storage · no telemetry" "label": "Local only · no uploads · no storage · no telemetry"
}, },
"source": { "source": {
"repository": "https://git.add-ideas.de/zemion/onenote-tools", "repository": "https://git.add-ideas.de/lotobo/onenote-tools",
"license": "MPL-2.0 AND LGPL-2.1-only" "license": "MPL-2.0 AND LGPL-2.1-only"
} }
} }

View File

@@ -1 +1 @@
export const APP_VERSION = '0.3.1'; export const APP_VERSION = '0.3.4';

View File

@@ -53,8 +53,8 @@ describe('release archive', () => {
'react', 'react',
]); ]);
const text = bundle.toString('utf8'); const text = bundle.toString('utf8');
expect(text).toContain('@add-ideas/toolbox-contract@0.2.1'); expect(text).toContain('@add-ideas/toolbox-contract@0.2.3');
expect(text).toContain('@add-ideas/toolbox-shell-react@0.2.1'); expect(text).toContain('@add-ideas/toolbox-shell-react@0.2.3');
expect(text).toContain('react@'); expect(text).toContain('react@');
expect(createHash('sha256').update(bundle).digest('hex')).toMatch( expect(createHash('sha256').update(bundle).digest('hex')).toMatch(
/^[a-f0-9]{64}$/ /^[a-f0-9]{64}$/