diff --git a/.npmrc b/.npmrc index 56724c0..7e977af 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +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/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bbe912..69ec282 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ ## Unreleased +## 0.4.2 — 2026-07-27 + +- Move canonical source and package identity from the `zemion` account to the + `lotobo` organization and consume Toolbox SDK 0.2.3 from its new namespace. +- Remove the outer application frame and align the workbench with the shared + `min(100%, 90rem)` Toolbox content width. +- Replace the favicon with a file-style Regex mark derived from the MIT-licensed + OOjs regular-expression icon, retaining its licence and attribution. +- Rebuild the Go WebAssembly engine so its embedded module path uses the new + canonical repository identity. + ## 0.4.1 — 2026-07-27 - Keep the last completed syntax and execution frame visible while edited diff --git a/LICENSES/OOjs-UI-icon-MIT.txt b/LICENSES/OOjs-UI-icon-MIT.txt new file mode 100644 index 0000000..8f9090e --- /dev/null +++ b/LICENSES/OOjs-UI-icon-MIT.txt @@ -0,0 +1,28 @@ +OOjs UI regular-expression-progressive icon + +Source: +https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_regular-expression-progressive.svg + +The icon path is adapted into public/favicon.svg and recoloured. The +surrounding rounded square, document shape, gradient and shadow are original +Regex Tools artwork and are not part of the upstream icon. + +Copyright © 2011–2017 OOjs UI Team and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index b7e20cd..414671d 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ Patterns, replacement templates, test text and project files stay in the browser. There is no account, backend, upload, remote execution, telemetry, runtime CDN, remote font, or cloud-save service. -## Current release — 0.4.1 +## Current release — 0.4.2 -The v0.4.1 release contains twelve selectable, executable profiles: +The v0.4.2 release contains twelve selectable, executable profiles: - **JavaScript (ECMAScript)** — the current browser's native `RegExp`, with ECMAScript 2025 syntax supplied by regexpp 4.12.2; @@ -356,7 +356,7 @@ The normal build performs no network download. `vite.config.ts` uses ## Toolbox SDK and Portal -The application uses Toolbox SDK 0.2.2 `AppShell`. Its canonical typed/static +The application uses Toolbox SDK 0.2.3 `AppShell`. Its canonical typed/static manifest source is `src/toolbox/manifest.source.json`; generation fails if its version or source identity drifts. diff --git a/SOURCE.md b/SOURCE.md index 7d3dece..7da5867 100644 --- a/SOURCE.md +++ b/SOURCE.md @@ -1,10 +1,10 @@ # Source identity - Project: Regex Tools -- Release version: `0.4.1` -- Release tag: `v0.4.1` -- Repository: -- Previous release tag: `v0.4.0` +- Release version: `0.4.2` +- Release tag: `v0.4.2` +- Repository: +- Previous release tag: `v0.4.1` - Licence: GPL-3.0-or-later - Copyright: © 2026 Albrecht Degering @@ -82,7 +82,7 @@ metadata, closed file sets, checksums and exact licence/notice material are installed under `public/engines/` and included in the application source and build. -The v0.4.1 release includes native browser ECMAScript, standalone PCRE2 10.47, +The v0.4.2 release includes native browser ECMAScript, standalone PCRE2 10.47, PHP 8.5.8 `preg` with PCRE2 10.44, legacy Perl 5.28.1 via WebPerl 0.09-beta, CPython 3.14.2 `re`, CRuby 4.0.0 `Regexp`, TeaVM 0.15.0 `java.util.regex`, Emscripten 6.0.4 libc++ `std::wregex`, Go 1.26.5 `regexp`, Rust `regex` 1.13.1, @@ -91,4 +91,4 @@ TeaVM-backed Scala/JVM compatibility profile. Earlier releases remain available under their historical tags and artifact coordinates. A future public artifact must bump package, manifest, tag and -source identity together; it must not reuse `v0.4.1`. +source identity together; it must not reuse `v0.4.2`. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index ea22fb1..fffc83a 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -6,8 +6,8 @@ Exact dependency resolution is recorded in `package-lock.json`. | Component | Version | Licence | Shipped | Role and source | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `@add-ideas/toolbox-contract` | 0.2.2 | Apache-2.0 | Runtime | Manifest contract; | -| `@add-ideas/toolbox-shell-react` | 0.2.2 | Apache-2.0 | Runtime | Shared shell; same source | +| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 | Runtime | Manifest contract; | +| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 | Runtime | Shared shell; same source | | `@eslint-community/regexpp` | 4.12.2 | MIT | Syntax worker | ECMAScript parser; | | CodeMirror packages | state 6.7.1; view 6.43.6; language 6.12.4; commands 6.10.4; search 6.7.1 | MIT | Runtime | Editors; | | `@lezer/highlight` | 1.2.3 | MIT | Runtime | Editor highlighting support; | @@ -46,7 +46,12 @@ Exact dependency resolution is recorded in `package-lock.json`. | Vite | 8.1.5 | MIT | Generated helpers | Production build; | | Rolldown | 1.1.5 | MIT | Generated helpers | Production bundling; | -`@add-ideas/toolbox-testkit` 0.2.2 and the other test/build dependencies are +The application icon adapts and recolours the MIT-licensed +[OOjs UI regular-expression-progressive icon](https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_regular-expression-progressive.svg) +inside original Regex Tools file artwork. Its copyright notice, source and +licence are preserved in `LICENSES/OOjs-UI-icon-MIT.txt`. + +`@add-ideas/toolbox-testkit` 0.2.3 and the other test/build dependencies are development-only and are not part of the static runtime bundle. The PHP pack's `native-components.json` is scoped to the exact diff --git a/docs/EXTRACTION_MODEL.md b/docs/EXTRACTION_MODEL.md index fbe6e9a..fdfeb1e 100644 --- a/docs/EXTRACTION_MODEL.md +++ b/docs/EXTRACTION_MODEL.md @@ -18,7 +18,7 @@ budget. Consumers must inspect the preview status rather than treating a preview as complete. In particular, list export is disabled if its template would consume an incomplete value. -Repeated captures expose only the final retained value in all twelve v0.4.1 +Repeated captures expose only the final retained value in all twelve v0.4.2 profiles. This includes .NET even though its native API can retain capture history: the current adapter deliberately normalizes only the final record and reports `captureHistory: false`. The UI labels the limitation and does not diff --git a/docs/FLAVOUR_SUPPORT.md b/docs/FLAVOUR_SUPPORT.md index f482af9..70aae60 100644 --- a/docs/FLAVOUR_SUPPORT.md +++ b/docs/FLAVOUR_SUPPORT.md @@ -1,6 +1,6 @@ # Flavour support -Version 0.4.1 exposes twelve executable profiles. “Partial lexical provider” +Version 0.4.2 exposes twelve executable profiles. “Partial lexical provider” means that Regex Tools recognizes common structure and replacement tokens for explanation only; the named runtime compiler and replacement operation remain authoritative. diff --git a/docs/MINIMIZATION.md b/docs/MINIMIZATION.md index 313d335..f9ef5ff 100644 --- a/docs/MINIMIZATION.md +++ b/docs/MINIMIZATION.md @@ -11,7 +11,7 @@ selected real ECMAScript or PCRE2 worker. It can preserve: authoritative, untruncated output. PHP, Perl, Python, Ruby, Java, C++, Go, Rust, .NET and Scala compatibility are -not supported minimization targets in v0.4.1. The workspace disables reduction +not supported minimization targets in v0.4.2. The workspace disables reduction for those active profiles; it does not substitute ECMAScript, PCRE2 or a lexical provider as an execution oracle. diff --git a/docs/PORTAL_REQUIREMENTS.md b/docs/PORTAL_REQUIREMENTS.md index 070e747..bb665fb 100644 --- a/docs/PORTAL_REQUIREMENTS.md +++ b/docs/PORTAL_REQUIREMENTS.md @@ -38,9 +38,9 @@ should test both a direct root mount and a nested mount such as `/apps/regex/`, including cold loading of all twelve profiles. The Portal must consume the immutable release ZIP, verify its SHA-256, verify -manifest ID `de.add-ideas.regex-tools` and version `0.4.1`, and mount it at a +manifest ID `de.add-ideas.regex-tools` and version `0.4.2`, and mount it at a relative target such as `apps/regex/`. -The package, manifest, tag, artifact URL and checksum must all use the v0.4.1 +The package, manifest, tag, artifact URL and checksum must all use the v0.4.2 identity. Historical artifact coordinates remain immutable and must not be overwritten or reused. diff --git a/docs/REFERENCE_IMPLEMENTATIONS.md b/docs/REFERENCE_IMPLEMENTATIONS.md index 0dffa40..db01b5c 100644 --- a/docs/REFERENCE_IMPLEMENTATIONS.md +++ b/docs/REFERENCE_IMPLEMENTATIONS.md @@ -4,9 +4,9 @@ Inspection date: 2026-07-27. | Reference | Exact revision/version | Licence | Use and copying status | | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | -| Regex Tools | Release identity `v0.4.1` | GPL-3.0-or-later | Application source written for this project. | -| Toolbox SDK | `53c40a61ba1581246f65773fcbb1c1cfd31ac98e` / 0.2.2 | Apache-2.0 | Contract, shell and release conventions; package APIs used, no source adapted. | -| Toolbox Portal | `9347554324299c8ec9dfaec2c9730907736f62c3` / aggregate v0.8.0 / package 0.2.7 | AGPL-3.0-only | Assembly/lock conventions inspected; no source copied into the app. | +| Regex Tools | Release identity `v0.4.2` | GPL-3.0-or-later | Application source written for this project. | +| Toolbox SDK | `ef2dab4b46c61812c9a877d8a19fe497b4a4630a` / 0.2.3 | Apache-2.0 | Contract, shell and release conventions; package APIs used, no source adapted. | +| Toolbox Portal | `43670a58249a920d37b7465cfda6724f644a92f7` / aggregate v0.9.1 / package 0.2.9 | AGPL-3.0-only | Assembly/lock conventions inspected; no source copied into the app. | | regexpp | 4.12.2; pinned npm integrity in `package-lock.json` | MIT | ECMAScript 2025 syntax provider; normalized in the syntax worker. | | PCRE2 | Signed tag 10.47; commit `f454e231fe5006dd7ff8f4693fd2b8eb94333429` | BSD-3-Clause WITH PCRE2-exception | Standalone pinned offline build; verified 8-bit WebAssembly pack shipped, source not vendored. | | PHP | Executable identity 8.5.8; embedded PCRE2 identity 10.44 | PHP License version 4 (BSD-3-Clause), elected through the earlier licence's later-version option | Actual PHP `preg_*` compiler, matcher and replacement runtime; PHP source not vendored. | @@ -30,6 +30,6 @@ Inspection date: 2026-07-27. | RegexLib | Website inspected | Redistribution licence not established | No fixture copied. | | RGXP.RU | Website inspected | Redistribution licence not established | No fixture copied. | -All v0.1.0 through v0.4.1 conformance cases are project-authored. See +All v0.1.0 through v0.4.2 conformance cases are project-authored. See `tests/fixtures/README.md`. Runtime pack metadata and adjacent licence/notice files are authoritative for the exact binary distribution. diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 34816e1..522e842 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -18,8 +18,8 @@ on publication failure, replaces an existing exact version only with `--force`, and produces: ```text -release/regex-tools-0.4.1.zip -release/regex-tools-0.4.1.zip.sha256 +release/regex-tools-0.4.2.zip +release/regex-tools-0.4.2.zip.sha256 ``` The release scan checks ASCII/UTF-8, UTF-16LE and UTF-16BE content in text, @@ -43,5 +43,5 @@ anchored base-runtime legal files. The C++ gate requires its exact traced component/source manifest and six independently pinned legal files. The release packager names every one of those files explicitly. -The existing v0.1.0 through v0.4.0 ZIPs and matching sidecars are historical -immutable artifacts. Creating v0.4.1 must not replace, rename or remove them. +The existing v0.1.0 through v0.4.1 ZIPs and matching sidecars are historical +immutable artifacts. Creating v0.4.2 must not replace, rename or remove them. diff --git a/engines/go/go.mod b/engines/go/go.mod index be07a11..9cc0c9f 100644 --- a/engines/go/go.mod +++ b/engines/go/go.mod @@ -1,4 +1,4 @@ -module git.add-ideas.de/zemion/regex-tools/engines/go +module git.add-ideas.de/lotobo/regex-tools/engines/go go 1.26.0 diff --git a/package-lock.json b/package-lock.json index f595226..0f54c28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "regex-tools", - "version": "0.4.1", + "version": "0.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "regex-tools", - "version": "0.4.1", + "version": "0.4.2", "license": "GPL-3.0-or-later", "dependencies": { - "@add-ideas/toolbox-contract": "0.2.2", - "@add-ideas/toolbox-shell-react": "0.2.2", + "@add-ideas/toolbox-contract": "0.2.3", + "@add-ideas/toolbox-shell-react": "0.2.3", "@codemirror/commands": "6.10.4", "@codemirror/language": "6.12.4", "@codemirror/search": "6.7.1", @@ -23,7 +23,7 @@ "react-dom": "19.2.7" }, "devDependencies": { - "@add-ideas/toolbox-testkit": "0.2.2", + "@add-ideas/toolbox-testkit": "0.2.3", "@bjorn3/browser_wasi_shim": "0.4.2", "@eslint/js": "10.0.1", "@php-wasm/universal": "3.1.46", @@ -55,18 +55,18 @@ } }, "node_modules/@add-ideas/toolbox-contract": { - "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==", + "version": "0.2.3", + "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-T0PVSuMT40GjTDfQJhEEY3ZawQq8zz1/ry95JdKI6W39CdLacaRXdGnEpDCMHt+jUbf1Jz7Nat/M5dFCgKVM9A==", "license": "Apache-2.0" }, "node_modules/@add-ideas/toolbox-shell-react": { - "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==", + "version": "0.2.3", + "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-DT5lQDH48BFkFcmFLZnQh7+Cm73JzBPcmp5WzUXypfkUXpEyDYHzaXgmW4kZ0edSwh4RK4sPmx+JPtK0X4aKCQ==", "license": "Apache-2.0", "dependencies": { - "@add-ideas/toolbox-contract": "0.2.2" + "@add-ideas/toolbox-contract": "0.2.3" }, "peerDependencies": { "react": ">=18 <20", @@ -74,13 +74,13 @@ } }, "node_modules/@add-ideas/toolbox-testkit": { - "version": "0.2.2", - "resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-testkit/-/0.2.2/toolbox-testkit-0.2.2.tgz", - "integrity": "sha512-ZxrRYiJI/j5aXwcd3mQItgDl1iOJ6N26+MpIG18qVZNwKKFCTCfSTzgzRooPt8rRc1MQYTPo4c+l/QpOWuTXxA==", + "version": "0.2.3", + "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-sq1MwhKWfFKen+N+124hl74qQimRSvmQ9sOU7jdcI+2qCKZ67+2B8rWyezeV80uTFu4Jv6deHksfYQ/tKNV6XQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@add-ideas/toolbox-contract": "0.2.2" + "@add-ideas/toolbox-contract": "0.2.3" }, "bin": { "toolbox-check": "dist/cli.js" diff --git a/package.json b/package.json index b4c270e..a02695a 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { "name": "regex-tools", - "version": "0.4.1", + "version": "0.4.2", "description": "Develop, explain, test and apply regular expressions locally in the browser.", "license": "GPL-3.0-or-later", "author": "Albrecht Degering", "repository": { "type": "git", - "url": "git+https://git.add-ideas.de/zemion/regex-tools.git" + "url": "git+https://git.add-ideas.de/lotobo/regex-tools.git" }, - "homepage": "https://git.add-ideas.de/zemion/regex-tools", + "homepage": "https://git.add-ideas.de/lotobo/regex-tools", "bugs": { - "url": "https://git.add-ideas.de/zemion/regex-tools/issues" + "url": "https://git.add-ideas.de/lotobo/regex-tools/issues" }, "private": true, "type": "module", @@ -72,8 +72,8 @@ "release:artifact": "npm run check && npm run test:browser && npm run package:release" }, "dependencies": { - "@add-ideas/toolbox-contract": "0.2.2", - "@add-ideas/toolbox-shell-react": "0.2.2", + "@add-ideas/toolbox-contract": "0.2.3", + "@add-ideas/toolbox-shell-react": "0.2.3", "@codemirror/commands": "6.10.4", "@codemirror/language": "6.12.4", "@codemirror/search": "6.7.1", @@ -86,7 +86,7 @@ "react-dom": "19.2.7" }, "devDependencies": { - "@add-ideas/toolbox-testkit": "0.2.2", + "@add-ideas/toolbox-testkit": "0.2.3", "@bjorn3/browser_wasi_shim": "0.4.2", "@eslint/js": "10.0.1", "@php-wasm/universal": "3.1.46", diff --git a/public/engines/go/SHA256SUMS b/public/engines/go/SHA256SUMS index 6321927..4f03bfe 100644 --- a/public/engines/go/SHA256SUMS +++ b/public/engines/go/SHA256SUMS @@ -1,4 +1,4 @@ 911f8f5782931320f5b8d1160a76365b83aea6447ee6c04fa6d5591467db9dad LICENSE-Go.txt -208034ac6bb2a1867fa082c51edd5e77098f16ff55e7907f9c9a51b59e6390ff engine-metadata.json -ddafd6401e0674c048ee066677157db0b03480f716262845ea30639daffb3ae5 go-regex.wasm +38a8e5518e670ca40efce95753d6836ed4686c5d25bb049df2c97e418ec76636 engine-metadata.json +d2faa632cc35d4d63040f9a8d7ad15e1bd5866a4d69c72a7bbefadf7fadcb676 go-regex.wasm 0c949f4996f9a89698e4b5c586de32249c3b69b7baadb64d220073cc04acba14 wasm_exec.mjs diff --git a/public/engines/go/engine-metadata.json b/public/engines/go/engine-metadata.json index 6abed6f..85c60c6 100644 --- a/public/engines/go/engine-metadata.json +++ b/public/engines/go/engine-metadata.json @@ -35,7 +35,7 @@ }, { "path": "engines/go/go.mod", - "sha256": "b2744a26c11ce6be55fabd2109b89f34b0db413abab8b40c9f7e8ea83e8b7bff", + "sha256": "1d84837beaa0d734f26a7e87ed83f5a8ffbc4e9d049260636ef127ec163c5f58", "bytes": 85 }, { @@ -70,7 +70,7 @@ }, { "path": "go-regex.wasm", - "sha256": "ddafd6401e0674c048ee066677157db0b03480f716262845ea30639daffb3ae5", + "sha256": "d2faa632cc35d4d63040f9a8d7ad15e1bd5866a4d69c72a7bbefadf7fadcb676", "bytes": 3904895 }, { diff --git a/public/engines/go/go-regex.wasm b/public/engines/go/go-regex.wasm index 58d3fd4..aeec2d5 100644 Binary files a/public/engines/go/go-regex.wasm and b/public/engines/go/go-regex.wasm differ diff --git a/public/favicon.svg b/public/favicon.svg index d16e598..eed19cb 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,7 +1,26 @@ Regex Tools - - - + + The regular-expression symbol is adapted from the OOjs UI + regular-expression-progressive icon, Copyright 2011–2017 OOjs UI Team and + other contributors, MIT licensed. The surrounding application icon is + Copyright 2026 Albrecht Degering, GPL-3.0-or-later. + + + + + + + + + + + + + + + + + + - diff --git a/public/toolbox-app.json b/public/toolbox-app.json index 774feef..4967730 100644 --- a/public/toolbox-app.json +++ b/public/toolbox-app.json @@ -1,9 +1,9 @@ { - "$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, "id": "de.add-ideas.regex-tools", "name": "Regex Tools", - "version": "0.4.1", + "version": "0.4.2", "description": "Develop, explain, test and apply regular expressions locally in the browser.", "entry": "./", "icon": "./favicon.svg", @@ -27,14 +27,14 @@ "telemetry": false }, "source": { - "repository": "https://git.add-ideas.de/zemion/regex-tools", + "repository": "https://git.add-ideas.de/lotobo/regex-tools", "license": "GPL-3.0-or-later" }, "actions": [ { "id": "source", "label": "Source", - "url": "https://git.add-ideas.de/zemion/regex-tools" + "url": "https://git.add-ideas.de/lotobo/regex-tools" } ], "assets": [ diff --git a/scripts/generate-toolbox-manifest.mjs b/scripts/generate-toolbox-manifest.mjs index 5803acf..bc40236 100644 --- a/scripts/generate-toolbox-manifest.mjs +++ b/scripts/generate-toolbox-manifest.mjs @@ -29,7 +29,7 @@ if ( } if ( - source.source?.repository !== "https://git.add-ideas.de/zemion/regex-tools" || + source.source?.repository !== "https://git.add-ideas.de/lotobo/regex-tools" || source.source?.license !== "GPL-3.0-or-later" ) { throw new Error("Manifest source identity is incomplete or inconsistent"); diff --git a/scripts/package-release.mjs b/scripts/package-release.mjs index 65f5b01..d8627ac 100644 --- a/scripts/package-release.mjs +++ b/scripts/package-release.mjs @@ -19,7 +19,7 @@ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const zipEpoch = new Date(1980, 0, 1, 0, 0, 0); const gplVersion3TextSha256 = "fb981668c18a279e285fc4d83fba1e836cc84dd4daa73c9697d3cfd2d8aca6e0"; -const expectedApplicationVersion = "0.4.1"; +const expectedApplicationVersion = "0.4.2"; const requiredRootFiles = [ "LICENSE", "README.md", @@ -341,7 +341,7 @@ async function collectReleaseEntries() { packageJson.version !== expectedApplicationVersion || packageJson.license !== "GPL-3.0-or-later" || packageJson.repository?.url !== - "git+https://git.add-ideas.de/zemion/regex-tools.git" + "git+https://git.add-ideas.de/lotobo/regex-tools.git" ) { throw new Error("Package version, licence or source identity drifted."); } @@ -354,7 +354,7 @@ async function collectReleaseEntries() { `- Release tag: \`v${expectedApplicationVersion}\``, ) || !sourceIdentity.includes( - "- Repository: ", + "- Repository: ", ) ) { throw new Error("SOURCE.md release identity drifted."); @@ -565,7 +565,7 @@ async function collectReleaseEntries() { manifest.id !== "de.add-ideas.regex-tools" || manifest.version !== packageJson.version || manifest.source?.repository !== - "https://git.add-ideas.de/zemion/regex-tools" || + "https://git.add-ideas.de/lotobo/regex-tools" || manifest.source?.license !== "GPL-3.0-or-later" ) { throw new Error("Packaged manifest identity is inconsistent."); diff --git a/src/components/HelpDialog.tsx b/src/components/HelpDialog.tsx index c8de339..4d14d4d 100644 --- a/src/components/HelpDialog.tsx +++ b/src/components/HelpDialog.tsx @@ -6,7 +6,7 @@ import { } from "../regex/generation/generation-limits"; import { manifest } from "../toolbox/manifest"; -const releaseSourceUrl = `https://git.add-ideas.de/zemion/regex-tools/src/tag/v${manifest.version}`; +const releaseSourceUrl = `https://git.add-ideas.de/lotobo/regex-tools/src/tag/v${manifest.version}`; export function HelpDialog({ open, diff --git a/src/styles.css b/src/styles.css index 334dffe..7ad7a56 100644 --- a/src/styles.css +++ b/src/styles.css @@ -48,6 +48,18 @@ box-sizing: border-box; } +html { + min-width: 320px; + min-height: 100%; + background: var(--toolbox-background); +} + +body { + min-width: 320px; + min-height: 100vh; + margin: 0; +} + button, input, select, @@ -74,7 +86,7 @@ textarea:focus-visible, position: relative; width: min(100%, 90rem); margin-inline: auto; - padding: 1rem clamp(0.75rem, 2.5vw, 2rem) 3rem; + padding: 1rem 0 3rem; color: var(--toolbox-text); } @@ -2025,10 +2037,6 @@ tbody tr.is-selected { } @media (max-width: 40rem) { - .regex-application { - padding-inline: 0.5rem; - } - .command-bar > label:not(.check-control) { flex: 1 1 10rem; min-width: 0; diff --git a/src/toolbox/manifest.source.json b/src/toolbox/manifest.source.json index 774feef..4967730 100644 --- a/src/toolbox/manifest.source.json +++ b/src/toolbox/manifest.source.json @@ -1,9 +1,9 @@ { - "$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, "id": "de.add-ideas.regex-tools", "name": "Regex Tools", - "version": "0.4.1", + "version": "0.4.2", "description": "Develop, explain, test and apply regular expressions locally in the browser.", "entry": "./", "icon": "./favicon.svg", @@ -27,14 +27,14 @@ "telemetry": false }, "source": { - "repository": "https://git.add-ideas.de/zemion/regex-tools", + "repository": "https://git.add-ideas.de/lotobo/regex-tools", "license": "GPL-3.0-or-later" }, "actions": [ { "id": "source", "label": "Source", - "url": "https://git.add-ideas.de/zemion/regex-tools" + "url": "https://git.add-ideas.de/lotobo/regex-tools" } ], "assets": [ diff --git a/src/version.ts b/src/version.ts index de845a1..923019e 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,3 +1,3 @@ -export const APPLICATION_VERSION = "0.4.1"; +export const APPLICATION_VERSION = "0.4.2"; export const SYNTAX_PROFILE = "community"; export const REGEXPP_VERSION = "4.12.2"; diff --git a/tests/browser/workbench.spec.ts b/tests/browser/workbench.spec.ts index 66bb7cf..003ae45 100644 --- a/tests/browser/workbench.spec.ts +++ b/tests/browser/workbench.spec.ts @@ -15,6 +15,49 @@ async function waitForReady(page: Page) { }); } +async function attemptRunWhileDisabled(page: Page) { + return page.evaluate(() => { + const button = document.querySelector(".run-button"); + if (!button) throw new Error("Run button missing"); + if (!button.disabled) return false; + button.click(); + return true; + }); +} + +test("uses the shared 90rem content width without a browser body frame", async ({ + page, +}) => { + await page.setViewportSize({ width: 1800, height: 900 }); + await page.goto("./"); + await expect(page.locator(".regex-application")).toBeVisible(); + + const layout = await page.evaluate(() => { + const shellMain = document.querySelector( + ".toolbox-shell__main", + ); + const application = + document.querySelector(".regex-application"); + if (!shellMain || !application) + throw new Error("Application shell missing"); + + const shellMainStyle = getComputedStyle(shellMain); + return { + bodyMargin: getComputedStyle(document.body).margin, + shellMainWidth: shellMain.getBoundingClientRect().width, + shellMainContentWidth: + shellMain.clientWidth - + Number.parseFloat(shellMainStyle.paddingLeft) - + Number.parseFloat(shellMainStyle.paddingRight), + applicationWidth: application.getBoundingClientRect().width, + }; + }); + + expect(layout.bodyMargin).toBe("0px"); + expect(layout.shellMainWidth).toBe(1440); + expect(layout.applicationWidth).toBe(layout.shellMainContentWidth); +}); + test("standalone ECMAScript workbench parses, explains and extracts", async ({ page, }) => { @@ -451,18 +494,20 @@ test("rapid pattern and replacement edits cannot run with stale syntax", async ( await setEditor(page, "editor-regular-expression-pattern", "(?\\w+)"); await setEditor(page, "editor-replacement-template", "$"); + await setEditor(page, "editor-replacement-template", "[$]"); + await setEditor(page, "editor-test-text", "A B"); await setEditor( page, "editor-regular-expression-pattern", "(?[A-Z])", ); - await setEditor(page, "editor-replacement-template", "[$]"); - await setEditor(page, "editor-test-text", "A B"); const runButton = page.getByRole("button", { name: "Run", exact: true }); - await expect(runButton).toBeDisabled(); - await runButton.evaluate((button: HTMLButtonElement) => button.click()); - await expect(page.locator(".run-status")).not.toHaveClass(/status-running/u); + expect(await attemptRunWhileDisabled(page)).toBe(true); + await expect(page.locator(".run-status")).toHaveClass(/status-idle/u); + await expect(page.locator(".run-status")).toContainText( + "last completed result remains visible", + ); await expect(page.locator(".extraction-row")).toHaveCount( initialExtractionCount, ); @@ -476,9 +521,8 @@ test("rapid pattern and replacement edits cannot run with stale syntax", async ( await expect(currentNamedToken.locator("small")).toHaveText("named capture"); await page.getByRole("checkbox", { name: "Ignore case (i)" }).check(); - await expect(runButton).toBeDisabled(); - await runButton.evaluate((button: HTMLButtonElement) => button.click()); - await expect(page.locator(".run-status")).not.toHaveClass(/status-running/u); + expect(await attemptRunWhileDisabled(page)).toBe(true); + await expect(page.locator(".run-status")).toHaveClass(/status-idle/u); await expect(runButton).toBeEnabled(); await runButton.click();