ui-design-workbench-cli 0.6.3__tar.gz → 0.6.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/PKG-INFO +5 -5
  2. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/README.md +4 -4
  3. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/SKILL.md +4 -2
  4. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/pyproject.toml +3 -1
  5. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/fidelity.md +3 -3
  6. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/native-rendering.md +2 -2
  7. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/fidelity_adapters.py +9 -4
  8. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/fidelity_platform_adapters.py +408 -26
  9. ui_design_workbench_cli-0.6.7/scripts/layout_model.py +489 -0
  10. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/render_preview.py +99 -16
  11. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/scan_ui.py +256 -11
  12. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/scoped_context.py +11 -2
  13. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/smoke_preview.js +6 -2
  14. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/PKG-INFO +5 -5
  15. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/SOURCES.txt +1 -0
  16. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/top_level.txt +1 -0
  17. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/uidw.py +206 -33
  18. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/uidw_mcp.py +20 -3
  19. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/adapter-api.md +0 -0
  20. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/agent-integrations.md +0 -0
  21. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/cache-protocol.md +0 -0
  22. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/component-catalog.json +0 -0
  23. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/component-catalog.md +0 -0
  24. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/component-inventory.json +0 -0
  25. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/design-modes.md +0 -0
  26. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/ir-schema.md +0 -0
  27. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/platform-profiles.json +0 -0
  28. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/platform-standards.md +0 -0
  29. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/platforms.md +0 -0
  30. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/quality-automation.md +0 -0
  31. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/review-workflow.md +0 -0
  32. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/ui-guidance-mode.md +0 -0
  33. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/ui-policy-schema.md +0 -0
  34. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/ui-reviewer.md +0 -0
  35. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/validation.md +0 -0
  36. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/references/workbench-ui.md +0 -0
  37. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/native-render-state.schema.json +0 -0
  38. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/ui-agent-job.schema.json +0 -0
  39. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/ui-graph.schema.json +0 -0
  40. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/ui-ir.patch.schema.json +0 -0
  41. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/ui-ir.schema.json +0 -0
  42. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/schemas/uidw-config.schema.json +0 -0
  43. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/android_resource_resolver.py +0 -0
  44. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/android_xml_support.py +0 -0
  45. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/apple_resource_resolver.py +0 -0
  46. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/coverage_report.py +0 -0
  47. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/fidelity_adapter_api.py +0 -0
  48. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/fidelity_core.py +0 -0
  49. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/generate_interaction_matrix.py +0 -0
  50. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ir_contracts.py +0 -0
  51. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/merge_review_state.py +0 -0
  52. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/native_render_android.py +0 -0
  53. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/native_render_apple.py +0 -0
  54. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/native_render_contracts.py +0 -0
  55. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/native_render_registry.py +0 -0
  56. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/platform_component_catalog.py +0 -0
  57. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/quality_common.py +0 -0
  58. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/dependency_links.txt +0 -0
  59. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/entry_points.txt +0 -0
  60. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/ui_design_workbench_cli.egg-info/requires.txt +0 -0
  61. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/validate_platform_profiles.py +0 -0
  62. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/scripts/visual_regression.py +0 -0
  63. {ui_design_workbench_cli-0.6.3 → ui_design_workbench_cli-0.6.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ui-design-workbench-cli
3
- Version: 0.6.3
3
+ Version: 0.6.7
4
4
  Summary: Repository UI indexing, graph, preview, and deterministic review CLI
5
5
  Author: Elgreed
6
6
  Project-URL: Homepage, https://github.com/Elgreed/ui-design-workbench
@@ -82,7 +82,7 @@ uidw --repo <repo> review --output-dir <review-dir> --level full
82
82
  - Incremental scans that reprocess only changed UI files.
83
83
  - Property-level evidence and explicit unsupported gaps instead of guessed UI.
84
84
  - Sparse review patches and a separate, authorized source-apply step.
85
- - Structural Android and Apple resource projection, plus discovery of available native capture paths.
85
+ - Runtime-free Android, Apple, and Flutter source projection with deterministic geometry for the supported subset; native evidence is required only before claiming visual or pixel parity and is never launched automatically.
86
86
 
87
87
  Supported source families include Web, React, Vue, Svelte, Jetpack Compose, Android Views XML, SwiftUI, Storyboard/XIB, WinUI/WPF, and Flutter.
88
88
 
@@ -105,8 +105,8 @@ Run `uidw help overview`, `uidw help advanced`, or `uidw <command> --help` for d
105
105
 
106
106
  ## Accuracy and safety
107
107
 
108
- - HTML is a static source projection, not proof of runtime or pixel parity.
109
- - Android and Apple translation remains structural until a source-matched native capture exists.
108
+ - HTML is a deterministic runtime-free source projection for the supported shared layout subset, not proof of runtime or pixel parity.
109
+ - Android, Apple, and Flutter translation uses deterministic projection geometry for the supported shared layout subset; without separate native evidence it remains a structural projection, not proof of runtime or pixel parity.
110
110
  - Unsupported bindings, custom drawing, runtime data, and platform behavior remain explicit gaps.
111
111
  - Preview and review keep application source read-only; applying a proposal is a separate step.
112
112
  - Derived cache and review state live outside the target repository by default.
@@ -131,4 +131,4 @@ A Windows `.exe` is not published yet. PyPI + `pipx` is the primary cross-platfo
131
131
  - [IR schema](references/ir-schema.md)
132
132
  - [Review workflow](references/review-workflow.md)
133
133
 
134
- Current CLI version: `0.6.3`.
134
+ Current CLI version: `0.6.7`.
@@ -63,7 +63,7 @@ uidw --repo <repo> review --output-dir <review-dir> --level full
63
63
  - Incremental scans that reprocess only changed UI files.
64
64
  - Property-level evidence and explicit unsupported gaps instead of guessed UI.
65
65
  - Sparse review patches and a separate, authorized source-apply step.
66
- - Structural Android and Apple resource projection, plus discovery of available native capture paths.
66
+ - Runtime-free Android, Apple, and Flutter source projection with deterministic geometry for the supported subset; native evidence is required only before claiming visual or pixel parity and is never launched automatically.
67
67
 
68
68
  Supported source families include Web, React, Vue, Svelte, Jetpack Compose, Android Views XML, SwiftUI, Storyboard/XIB, WinUI/WPF, and Flutter.
69
69
 
@@ -86,8 +86,8 @@ Run `uidw help overview`, `uidw help advanced`, or `uidw <command> --help` for d
86
86
 
87
87
  ## Accuracy and safety
88
88
 
89
- - HTML is a static source projection, not proof of runtime or pixel parity.
90
- - Android and Apple translation remains structural until a source-matched native capture exists.
89
+ - HTML is a deterministic runtime-free source projection for the supported shared layout subset, not proof of runtime or pixel parity.
90
+ - Android, Apple, and Flutter translation uses deterministic projection geometry for the supported shared layout subset; without separate native evidence it remains a structural projection, not proof of runtime or pixel parity.
91
91
  - Unsupported bindings, custom drawing, runtime data, and platform behavior remain explicit gaps.
92
92
  - Preview and review keep application source read-only; applying a proposal is a separate step.
93
93
  - Derived cache and review state live outside the target repository by default.
@@ -112,4 +112,4 @@ A Windows `.exe` is not published yet. PyPI + `pipx` is the primary cross-platfo
112
112
  - [IR schema](references/ir-schema.md)
113
113
  - [Review workflow](references/review-workflow.md)
114
114
 
115
- Current CLI version: `0.6.3`.
115
+ Current CLI version: `0.6.7`.
@@ -26,12 +26,14 @@ If first-use context says `setupRequired`, ask only for `low`, `medium`, or `hig
26
26
 
27
27
  ## 2. Route the request
28
28
 
29
- - Reconstruct/generate/redesign: read [references/design-modes.md](references/design-modes.md), then only the matching platform section from [references/platform-standards.md](references/platform-standards.md). Use cached evidence and `uidw workbench`; validate transfer fidelity, not product UX. For Android or Apple visual accuracy also read [references/native-rendering.md](references/native-rendering.md) and call MCP `ui_native_status` (or `uidw native status`).
29
+ - Reconstruct/generate/redesign: read [references/design-modes.md](references/design-modes.md), then only the matching platform section from [references/platform-standards.md](references/platform-standards.md). Use cached evidence and `uidw workbench`; validate transfer fidelity, not product UX. Layout fidelity comes from the runtime-free deterministic projection; do not build or launch the source application.
30
30
  - Explicit review/audit/critique: read [references/ui-reviewer.md](references/ui-reviewer.md) and [references/review-workflow.md](references/review-workflow.md). Review immutable Before only and work in bounded screen batches.
31
31
  - Workbench chrome behavior: read [references/workbench-ui.md](references/workbench-ui.md).
32
32
  - Ordinary UI source task with `uiMode.enabled=true`: read [references/ui-guidance-mode.md](references/ui-guidance-mode.md). Do not create a preview or review unless requested.
33
33
  - Cache/install/agent integration question: read only [references/cache-protocol.md](references/cache-protocol.md) or [references/agent-integrations.md](references/agent-integrations.md), respectively.
34
34
 
35
+ Legacy provider discovery remains available through read-only MCP `ui_native_status` (or `uidw native status`). It is optional compatibility diagnostics and must not be called as part of reconstruction, deterministic layout, rendering, or fidelity gating.
36
+
35
37
  ## 3. Return sparse changes
36
38
 
37
39
  Review/proposal agents write `ui-ir.patch.json`, never a replacement full IR:
@@ -49,6 +51,6 @@ Allowed operations are `upsert-findings`, `upsert-versions`, `merge-annotations`
49
51
  - Do not run the target app, emulator, simulator, build, or dev server unless separately requested. Headless checks may open only generated local HTML.
50
52
  - Preserve discovered screens, routes, project components, platform idioms, tokens, themes, states, provenance, and unsupported gaps. Do not invent polish or browser-default replacements.
51
53
  - HTML is a projection. Base IR is immutable Before; proposal versions are sparse overrides.
52
- - Android/Apple source translation is structural-only until a source-matched native capture exists. Never call HTML a native render.
54
+ - Android, Apple, Windows, and Flutter source translation uses deterministic projection geometry where the shared layout subset is known. Never call HTML a native render or claim runtime/pixel parity without matching native evidence.
53
55
  - Applying a proposal to real source requires a separate explicit `Apply to project` or direct-fix authorization, bounded source targets, incremental sync, and targeted verification. Never repeat the full AI review automatically.
54
56
  - Keep cache and review artifacts outside source control unless the user explicitly requests otherwise.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ui-design-workbench-cli"
7
- version = "0.6.3"
7
+ version = "0.6.7"
8
8
  description = "Repository UI indexing, graph, preview, and deterministic review CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -39,6 +39,7 @@ py-modules = [
39
39
  "android_xml_support",
40
40
  "scan_ui",
41
41
  "ir_contracts",
42
+ "layout_model",
42
43
  "fidelity_core",
43
44
  "fidelity_adapter_api",
44
45
  "fidelity_adapters",
@@ -71,6 +72,7 @@ py-modules = [
71
72
  "scripts/fidelity_platform_adapters.py",
72
73
  "scripts/generate_interaction_matrix.py",
73
74
  "scripts/ir_contracts.py",
75
+ "scripts/layout_model.py",
74
76
  "scripts/merge_review_state.py",
75
77
  "scripts/native_render_android.py",
76
78
  "scripts/native_render_apple.py",
@@ -1,12 +1,12 @@
1
1
  # Source-fidelity contract
2
2
 
3
- ## Fidelity Core v0.3 with native evidence levels
3
+ ## Fidelity Core v0.3 with deterministic projection
4
4
 
5
5
  The scanner uses the provider-neutral adapter registry described in [adapter-api.md](adapter-api.md). Built-in Web, React/Vue/Svelte, Compose, Android XML, SwiftUI, Storyboard/XIB, XAML, Flutter, and React Native adapters translate only deterministic supported subsets and record the rest in `fidelity.unsupported`. A strict artifact declares `fidelity.schemaVersion: "0.3"`.
6
6
 
7
7
  Each translated property carries stable property-level provenance. Token aliases are resolved for rendering while their original references and source records remain in IR. The baseline is sealed with `review.baselineHash`; proposal versions remain sparse `nodeOverrides`. Editing baseline screens, nodes, tokens, themes, or fixtures without an explicit rescan invalidates the strict gate.
8
8
 
9
- Use `uidw fidelity capabilities` for the installed support matrix, `uidw fidelity report` for the compact gate, and `uidw fidelity explain` for one node or evidence ID. Capabilities distinguish `structuralTier`, `visualTier`, and `nativeEvidenceRequired`; Android and Apple source adapters must never claim native visual fidelity. Per-adapter fixtures prevent silent translation drift.
9
+ Use `uidw fidelity capabilities` for the installed support matrix, `uidw fidelity report` for the compact gate, and `uidw fidelity explain` for one node or evidence ID. Capabilities distinguish `structuralTier` and `visualTier`; source adapters report `deterministic-projection`, require native evidence for native-platform visual verification, and never start that evidence collection automatically. Per-adapter fixtures prevent silent translation drift.
10
10
 
11
11
  The HTML projection resolves recognized controls through the official-doc-first [platform component catalog](component-catalog.md). Catalog geometry is a render-only fallback: explicit source layout, theme, token, and style evidence always wins, and the source IR is not mutated.
12
12
 
@@ -52,4 +52,4 @@ Preserve `discoveredNavigationTargets`. Each target must map to a screen's `frag
52
52
 
53
53
  The renderer enforces the minimum gate. `--allow-draft` is diagnostic and must not be used to solicit design approval.
54
54
 
55
- For Android and Apple, also follow [native-rendering.md](native-rendering.md). The HTML workbench must display `structural` and “native capture not verified” until a matching native capture exists. Provider installation alone is not evidence.
55
+ For Android, Apple, Windows, and Flutter, the HTML workbench uses the same runtime-free layout model as every other source adapter. A partial context remains an explicit projection gap; it must not trigger a build, emulator, simulator, or native-capture calibration step.
@@ -1,8 +1,8 @@
1
1
  # Native rendering contract
2
2
 
3
- Source analysis and native rendering are separate stages. The base UI IR remains deterministic and portable; native screenshots, geometry, and semantic trees live in `native-render-state.json` in the UIDW cache.
3
+ Source analysis and deterministic HTML projection are the default Workbench reconstruction path. They remain buildless and runtime-free. Native-render discovery is optional and read-only during reconstruction, but matching native evidence is required before visual or pixel parity can be claimed. External screenshots, geometry, or semantic trees remain isolated in `native-render-state.json` and never modify the base UI IR.
4
4
 
5
- The default Android projection may resolve source resources and deterministic layout semantics before native verification. This improves ordinary mockups but does not change the fidelity level from `structural`: resource resolution is evidence about inputs, not proof of the platform's final layout pass.
5
+ The default projection resolves source resources and supported layout semantics through the shared deterministic solver. Adapter capability `deterministic-projection` describes source-to-HTML transfer; the workbench reports native targets as `structural-projection` until matching native evidence exists.
6
6
 
7
7
  ## Fidelity levels
8
8
 
@@ -277,9 +277,10 @@ def _compose_length(value: str, tokens: dict[str, Any], group: str = "spacing")
277
277
  dimension = re.fullmatch(r"(-?\d+(?:\.\d+)?)\.(?:dp|sp)", clean)
278
278
  if dimension:
279
279
  return f"{dimension.group(1)}px"
280
- number = re.fullmatch(r"-?\d+(?:\.\d+)?", clean)
280
+ number = re.fullmatch(r"-?\d+(?:\.\d+)?[fF]?", clean)
281
281
  if number:
282
- return float(clean) if "." in clean else int(clean)
282
+ normalized = clean.rstrip("fF")
283
+ return float(normalized) if "." in normalized else int(normalized)
283
284
  token_name = _slug(clean).replace("-", "_")
284
285
  if token_name in tokens.get(group, {}):
285
286
  return f"${group}.{token_name}"
@@ -320,9 +321,9 @@ class ComposeAdapter:
320
321
  extensions = (".kt", ".kts")
321
322
  maturity = "structural"
322
323
  structural_tier = "translated"
323
- visual_tier = "none"
324
+ visual_tier = "deterministic-projection"
324
325
  native_evidence_required = True
325
- native_providers = ("android-compose-screenshot", "paparazzi", "roborazzi", "android-emulator")
326
+ native_providers = ("paparazzi", "roborazzi", "android-emulator")
326
327
  resource_resolution = ("R.string", "R.drawable", "R.mipmap", "common Material Icons")
327
328
  layout_features = ("size/fill/weight/aspectRatio", "directional padding", "Row/Column arrangement", "Box alignment", "basic typography")
328
329
  limitations = ("supported Compose primitives and modifiers only", "custom composables remain explicit unsupported entries")
@@ -420,11 +421,15 @@ class ComposeAdapter:
420
421
  arrangement = _compose_named_value(args, "verticalArrangement")
421
422
  if alignment in alignments: _set_compose(node, "layout.align", alignments[alignment], context, line, f"horizontalAlignment = {alignment}", self.id)
422
423
  if arrangement in arrangements: _set_compose(node, "layout.justify", arrangements[arrangement], context, line, f"verticalArrangement = {arrangement}", self.id)
424
+ spaced = re.fullmatch(r"Arrangement\.spacedBy\s*\(\s*([^,)]+)\s*\)", arrangement or "")
425
+ if spaced: _set_compose(node, "layout.gap", _compose_length(spaced.group(1), result.tokens), context, line, f"verticalArrangement = {arrangement}", self.id)
423
426
  if widget in {"Row", "LazyRow"}:
424
427
  alignment = _compose_named_value(args, "verticalAlignment")
425
428
  arrangement = _compose_named_value(args, "horizontalArrangement")
426
429
  if alignment in alignments: _set_compose(node, "layout.align", alignments[alignment], context, line, f"verticalAlignment = {alignment}", self.id)
427
430
  if arrangement in arrangements: _set_compose(node, "layout.justify", arrangements[arrangement], context, line, f"horizontalArrangement = {arrangement}", self.id)
431
+ spaced = re.fullmatch(r"Arrangement\.spacedBy\s*\(\s*([^,)]+)\s*\)", arrangement or "")
432
+ if spaced: _set_compose(node, "layout.gap", _compose_length(spaced.group(1), result.tokens), context, line, f"horizontalArrangement = {arrangement}", self.id)
428
433
  if widget == "Box":
429
434
  content_alignment = _compose_named_value(args, "contentAlignment")
430
435
  if content_alignment and "Center" in content_alignment: