From 5bc182ad1cb49aa479c1f0a0f3ed4b5ad8a9b4b9 Mon Sep 17 00:00:00 2001
From: Clifford <33897029+cray-com@users.noreply.github.com>
Date: Tue, 1 Sep 2026 09:40:13 +0200
Subject: [PATCH] chore: prepare Foundation Devtools v1.0.0 (#18)
---
.github/workflows/validate.yml | 2 ++
PROJECT.md | 21 ++++++++++----------
README.md | 36 +++++++++++++++++++++++++++-------
package-lock.json | 4 ++--
package.json | 2 +-
5 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index ef05db8..14f3ed8 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -23,3 +23,5 @@ jobs:
- run: npm run check
- run: npm test
- run: npm run build
+ - run: npm pack --dry-run
+ - run: git diff --check
diff --git a/PROJECT.md b/PROJECT.md
index ee9fd2d..3ac352a 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -36,9 +36,9 @@ serialisierbare Website-Konfiguration
Der Astro-Adapter montiert ein browserseitiges Custom Element. Das Panel verwendet Shadow DOM, damit Website-CSS und Tool-CSS einander nicht beeinflussen.
-## V1.1
+## V1
-V1.1 liefert:
+V1 liefert:
- Range-, Select- und Toggle-Controls; optionale Target/Page-Map-Zuordnung (`global`/`section`) und Token-/Local-Klassifikation; labeled Select-Optionen;
- stabile Changes-/JSON-/Agent-Brief-Exporte gegenüber `initialState` (reiner Design-State, ohne Panel-UI-State);
@@ -46,10 +46,13 @@ V1.1 liefert:
- URL-persistierten State und kopierbare Permalinks;
- Reset, JSON-/TypeScript-Rezept, Copy und Download;
- Fixture-, Tenant-, Locale-, Route- und Revisionsmetadaten;
-- eingeklappten, geöffneten und vollständig versteckten Zustand;
-- Wiederherstellung über `Cmd/Ctrl + Shift + D`;
+- offenen Erststart sowie eingeklappten und vollständig versteckten Zustand;
+- Inspect, Compose und Changes mit freiem DOM-Picker, Page Map, Breadcrumb und read-only Layout-Fakten;
+- explizite Component-/Scope-Registrierungen und Compose-Allowlist für vorhandene Website-Recipes;
+- bis zu acht begrenzte Annotationen, Intent und changes-only Agent-Handoff;
+- Drag mit Edge-/Corner-Snap, Freeze Motion, Undo/Redo und Wiederherstellung über `Cmd/Ctrl + Shift + D`;
- Reduced Motion, Tastaturbedienung und dichte responsive Darstellung;
-- Unit-Tests und einen Astro-Browser-Smoke-Test;
+- Unit-Tests und Astro-Browser-Smoke-Tests in Chromium und Firefox;
- Nachweis, dass ein Produktions-Build keine Devtools-Oberfläche enthält.
Erster realer Adapter ist das Project-Listing in `astro-foundation` mit Controls für Layoutgrid und Project Card. Clifford Ray folgt als zweiter Adapter, ohne dessen visuelle Implementierung zu teilen.
@@ -63,13 +66,9 @@ Erster realer Adapter ist das Project-Listing in `astro-foundation` mit Controls
- visuelle Website-Komponenten oder Design Tokens;
- ein eigenes UI-Framework.
-## V1 DOM-Inspector und Layouting
-
-Das Tool bietet drei getrennte Ansichten (`Inspect`, `Compose`, `Changes`). Inspect erlaubt einen freien, sicheren DOM-Picker mit Breadcrumb-/Parent-/Child-Navigation, registriertem Component-/Scope-Kontext und read-only Layout-Fakten. Compose verwendet ausschließlich explizit registrierte Website-Recipes. Changes exportiert nur Design-Diffs und begrenzte Annotationen/Intent als Agent-Brief. Auswahl- und Panel-Zustand bleiben aus Design-State und Recipes ausgeschlossen. Picker, Annotationen, Freeze Motion, Undo/Redo und Handoff schreiben keine Quelldateien.
-
## Aktueller Fokus
-1. Das öffentliche Paket und seine kleine Konfigurationsschnittstelle liefern.
-2. Das Bento-Experiment aus Astro #40 als ersten echten Adapter integrieren.
+1. V1 nach grünem Foundation-Base-Adapter-Proof als GitHub Release liefern.
+2. Das Bento-Experiment aus Astro #40 mit dem veröffentlichten v1-Paket stabilisieren.
3. Die Tailwind-`@layer`-basierte Foundation-Base-Arbeitsweise dokumentieren.
4. Danach die zweite Adapterintegration im Portfolio nachweisen.
diff --git a/README.md b/README.md
index f040dcf..526f0e2 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
## Installation
```bash
-npm install --save-dev https://github.com/cray-com/foundation-devtools/releases/download/v0.2.1/cray-com-foundation-devtools-0.2.1.tgz
+npm install --save-dev https://github.com/cray-com/foundation-devtools/releases/download/v1.0.0/cray-com-foundation-devtools-1.0.0.tgz
```
## Astro
@@ -19,13 +19,19 @@ import { defineDevtoolsConfig } from '@cray-com/foundation-devtools'
const config = defineDevtoolsConfig({
project: 'astro-foundation',
metadata: { fixture: 'listing', route: '/projects', locale: 'en' },
+ targets: [{ key: 'project-list', label: 'Project list', kind: 'section' }],
+ registrations: [
+ { key: 'project-grid', label: 'Project grid', scope: 'grid', target: 'project-list' },
+ { key: 'project-card', label: 'Project card', scope: 'card', target: 'project-list' },
+ ],
families: [{
- key: 'card', label: 'Card',
+ key: 'card-layout', label: 'Card layout', target: 'project-list',
effect: { scope: 'card', attribute: 'card-variant' },
variants: [{ name: 'default' }, { name: 'compact' }],
}],
controls: [{ type: 'range', key: 'grid-gap', label: 'Grid gap', min: 8, max: 48, default: 16,
- effect: { scope: 'grid', variable: '--fd-grid-gap' } }]
+ target: 'project-list', effect: { scope: 'grid', variable: '--fd-grid-gap' } }],
+ compose: { families: ['card-layout'], controls: ['grid-gap'] }
})
---
@@ -36,7 +42,9 @@ const config = defineDevtoolsConfig({
Website-Markup deklariert Scopes mit `data-fd-scope`. Effects setzen ausschließlich CSS Custom Properties oder Datenattribute:
```html
-
+
```
Ohne eigenen Effect werden Familien als `data-fd-variant-card="default"` auf dem gleichnamigen Scope markiert.
@@ -55,7 +63,9 @@ const config = defineDevtoolsConfig({ project: 'site', targets: [
}] });
```
-`changes(config, state)` und `changesJson` liefern ausschließlich geänderte Werte gegenüber `initialState`; `agentBrief` erzeugt eine knappe Markdown-Zusammenfassung. Panel-Auswahl und Vergleichsmodus sind UI-State und werden nicht exportiert. Ein Family-Effect kann stattdessen ein vorhandenes Website-Attribut wie `data-card-variant` setzen. Ein Control-Effect mit `attribute: 'card-density'` setzt entsprechend `data-card-density`.
+`registrations` geben ausgewählten DOM-Elementen einen expliziten Component-/Scope-Kontext. Die Registrierung leitet nichts aus CSS-Klassen ab. `compose` ist eine Allowlist: Nur dort aufgeführte vorhandene Families, Controls und Recipes erscheinen in Compose. Ungültige oder unbekannte Keys lassen die Konfiguration fehlschlagen.
+
+`changes(config, state)` und `changesJson` liefern ausschließlich geänderte Werte gegenüber `initialState`; `agentBrief` erzeugt eine knappe Markdown-Zusammenfassung. `handoff` ergänzt begrenzte Auswahl-, Annotation- und Intent-Daten. Panel, Picker, Auswahl, Annotationen und Vergleichsmodus bleiben UI-State und werden nicht als Designänderungen exportiert. Ein Family-Effect kann stattdessen ein vorhandenes Website-Attribut wie `data-card-variant` setzen. Ein Control-Effect mit `attribute: 'card-density'` setzt entsprechend `data-card-density`.
Website-CSS kann Tailwind über semantische Layer verwenden. Dynamische Reglerwerte bleiben CSS Custom Properties:
@@ -78,13 +88,25 @@ Website-CSS kann Tailwind über semantische Layer verwenden. Dynamische Reglerwe
## Öffentliche Schnittstelle
-`DevtoolsConfig`, `Metadata`, `Target`, `Family`, `Variant`, `Range`, `Select`, `SelectOption`, `Toggle`, `DevtoolsState` sowie `defineDevtoolsConfig`, `validateConfig`, `initialState`, `validateState`, `encodeState`, `decodeState`, `stateUrl`, `applyEffects`, `changes`, `changesJson`, `agentBrief`, `resetBaseline`, `recipe` und `typescriptRecipe` sind serialisierbar bzw. strict typisiert. Nicht-kanonische Alias-Exporte werden nicht angeboten. Ungültige URL-Werte werden verworfen (fail-closed).
+Die Konfigurationstypen `DevtoolsConfig`, `Metadata`, `Target`, `DomRegistration`, `ComposeRegistration`, `Recipe`, `Family`, `Variant`, `Range`, `Select`, `SelectOption`, `Toggle` und `DevtoolsState` sind serialisierbar und strict typisiert.
+
+Der Design-State verwendet `defineDevtoolsConfig`, `validateConfig`, `initialState`, `validateState`, `encodeState`, `decodeState`, `stateUrl`, `applyEffects`, `changes`, `changesJson`, `agentBrief`, `resetBaseline`, `recipe`, `recipeRegistry` und `typescriptRecipe`. Der Inspector stellt `LayoutFacts`, `Annotation`, `domPath`, `resolvePath`, `layoutFacts`, `annotationFor`, `safeRoute` und `handoff` bereit. Nicht-kanonische Alias-Exporte werden nicht angeboten. Ungültige Config-, URL- und Handoff-Werte werden fail-closed verworfen oder begrenzt.
Das Panel startet beim ersten Aufruf geöffnet und merkt sich danach Position, aktive Ansicht und den eingeklappten Zustand. Es bietet Reset, Permalink-, JSON- und TypeScript-Copy sowie JSON-Download. Es ist vollständig ausblendbar und per Cmd/Ctrl+Shift+D wiederherstellbar beziehungsweise umschaltbar. Tastaturfokus und Reduced Motion werden berücksichtigt. URL-State verwendet nur den Parameter `fd` und erhält vorhandene Parameter.
## DOM-Inspector (V1)
-Im Development-Modus stehen `Inspect`, `Compose` und `Changes` zur Verfügung. `Pick DOM` wählt beliebige Elemente; registrierte Scopes/Targets liefern Kontext, während Layout-Fakten (Bounding Box, Display, Grid, Gap, Position und Overflow) read-only bleiben. Bis zu acht begrenzte Annotationen und ein optionaler Intent werden zusammen mit dem changes-only Diff als `Copy agent brief` exportiert. `Freeze motion`, Undo/Redo, Tastaturkürzel und Drag/Snap unterstützen die Arbeit auf der echten Seite. Beim Auftauen kann eine laufende CSS-Transition browserbedingt nicht an ihrer exakten Zwischenposition fortgesetzt werden; fremde Inline-Styles werden dabei nicht verändert. Es gibt keine Source-Writes, keine Agent-Bridge und keinen visuellen Recipe-Generator.
+Im Development-Modus stehen `Inspect`, `Compose` und `Changes` zur Verfügung. `Pick DOM` wählt beliebige Elemente einschließlich offener Shadow Roots. Breadcrumb, Parent-/Child-Navigation, Page Map und registrierte Scopes/Targets liefern Kontext. Bounding Box, Display, Grid, Gap, Position und Overflow bleiben read-only. Selector, DOM-Pfad und begrenzter Kontext lassen sich separat kopieren.
+
+Bis zu acht begrenzte Annotationen und ein optionaler Intent werden zusammen mit dem changes-only Diff als `Copy agent brief` exportiert. Routen verlieren Credentials, Query und Fragment; Formwerte und vollständiges HTML werden nicht exportiert. `Freeze motion`, gruppiertes Undo/Redo sowie Edge-/Corner-Snap unterstützen die Arbeit auf der echten Seite. Beim Auftauen kann eine laufende CSS-Transition browserbedingt nicht an ihrer exakten Zwischenposition fortgesetzt werden; das Tool entfernt aber ausschließlich eigene Freeze-Styles und verändert keine fremden Inline-Styles. Es gibt keine Source-Writes, keine Agent-Bridge und keinen visuellen Recipe-Generator.
+
+### Zustand und Tastatur
+
+- URL: ausschließlich validierter Design-Preview-State im Parameter `fd`; fremde Query-Parameter bleiben erhalten.
+- `localStorage`: Panelposition, aktive Ansicht und Open-/Collapsed-Zustand.
+- `sessionStorage`: Auswahl, Annotationen und Intent. Hide überlebt keinen Reload.
+- Global: `Cmd/Ctrl + Shift + D` zeigt, versteckt oder stellt das Panel wieder her.
+- Bei Tool-Fokus oder aktivem Picker: `I` Picker, `V` Website-Modus, `1`/`2`/`3` Ansichten, `[`/`]` Parent/Child, `A` Annotation, `Shift + 2` Auswahl fokussieren, gehaltenes `Space` Picker aussetzen, `Cmd/Ctrl + Z` Undo, `Cmd/Ctrl + Shift + Z` Redo, `Cmd/Ctrl + Enter` Agent Brief und `Escape` zurück.
## Entwicklung
diff --git a/package-lock.json b/package-lock.json
index a70d1ae..e4cc779 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@cray-com/foundation-devtools",
- "version": "0.2.1",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@cray-com/foundation-devtools",
- "version": "0.2.1",
+ "version": "1.0.0",
"license": "MIT",
"devDependencies": {
"@playwright/test": "^1.61.1",
diff --git a/package.json b/package.json
index cd71f9d..b7aac05 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@cray-com/foundation-devtools",
- "version": "0.2.1",
+ "version": "1.0.0",
"description": "Dense, design-neutral development tooling for website variants",
"type": "module",
"sideEffects": false,