import type { ToolboxAppManifest, ToolboxCatalog, } from '@add-ideas/toolbox-contract'; export const pdfManifest: ToolboxAppManifest = { schemaVersion: 1, id: 'de.add-ideas.pdf-tools', name: 'PDF Workbench', version: '0.4.3', description: 'Page-level PDF operations performed locally in the browser.', entry: './', icon: './favicon.svg', categories: ['documents', 'pdf'], tags: ['merge', 'split'], integration: { contextVersion: 1, launchModes: ['navigate', 'new-tab'], embedding: 'unsupported', }, requirements: { secureContext: true, workers: true, indexedDb: true, crossOriginIsolated: false, }, privacy: { processing: 'local', fileUploads: false, telemetry: false, }, source: { repository: 'https://git.add-ideas.de/lotobo/pdf-tools', license: 'AGPL-3.0-only', }, }; export const xsltManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.xslt-tools', name: 'XSLT Workbench', version: '0.4.2', description: 'Transform XML locally with XSLT in the browser.', icon: './xslt.svg', categories: ['documents', 'developer'], tags: ['transform', 'xml'], source: { repository: 'https://git.add-ideas.de/lotobo/xslt-tools', license: 'AGPL-3.0-only', }, }; export const onenoteManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.onenote-tools', name: 'OneNote Reader', version: '0.3.3', description: 'Inspect OneNote packages locally in the browser.', icon: './onenote.svg', categories: ['documents', 'notes'], tags: ['onepkg', 'import'], source: { repository: 'https://git.add-ideas.de/lotobo/onenote-tools', license: 'AGPL-3.0-only', }, }; export const regexManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.regex-tools', name: 'Regex Tools', version: '0.4.1', description: 'Develop, explain, test and apply regular expressions locally in the browser.', icon: './regex.svg', categories: ['developer', 'text', 'regex'], tags: ['regular-expression', 'match', 'replace', 'explain', 'test'], requirements: { secureContext: false, workers: true, indexedDb: true, crossOriginIsolated: false, }, source: { repository: 'https://git.add-ideas.de/lotobo/regex-tools', license: 'GPL-3.0-or-later', }, }; export const svgManifest: ToolboxAppManifest = { ...pdfManifest, id: 'de.add-ideas.svg-tools', name: 'SVG Tools', version: '0.1.0', description: 'Inspect, edit, optimize and transform SVG documents locally in the browser.', icon: './favicon.svg', categories: ['graphics', 'design', 'developer'], tags: [ 'svg', 'vector', 'path', 'xml', 'transform', 'optimize', 'accessibility', ], requirements: { secureContext: false, workers: true, indexedDb: false, crossOriginIsolated: false, topLevelContext: false, }, source: { repository: 'https://git.add-ideas.de/lotobo/svg-tools', license: 'GPL-3.0-or-later', }, assets: ['./canvas-frame-controller.js'], }; export const catalogue: ToolboxCatalog = { schemaVersion: 1, id: 'de.add-ideas.toolbox', name: 'add·ideas Toolbox', home: './', theme: { mode: 'system', brand: 'add·ideas' }, apps: [ { manifest: './apps/pdf/toolbox-app.json', enabled: true }, { manifest: './apps/xslt/toolbox-app.json', enabled: true }, { manifest: './apps/onenote/toolbox-app.json', enabled: true }, { manifest: './apps/svg/toolbox-app.json', enabled: true }, ], }; export function catalogueFetch(overrides: Record = {}) { return async (input: string | URL | Request): Promise => { const url = new URL( input instanceof Request ? input.url : String(input), document.baseURI ); const custom = overrides[url.pathname]; if (custom) return custom.clone(); if (url.pathname.endsWith('/toolbox.catalog.json')) return Response.json(catalogue); if (url.pathname.endsWith('/apps/pdf/toolbox-app.json')) return Response.json(pdfManifest); if (url.pathname.endsWith('/apps/xslt/toolbox-app.json')) return Response.json(xsltManifest); if (url.pathname.endsWith('/apps/onenote/toolbox-app.json')) return Response.json(onenoteManifest); if (url.pathname.endsWith('/apps/regex/toolbox-app.json')) return Response.json(regexManifest); if (url.pathname.endsWith('/apps/svg/toolbox-app.json')) return Response.json(svgManifest); return new Response('Not found', { status: 404 }); }; }