mosaic-headless 1.26.0 → 1.26.1

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.
package/SKILL.md CHANGED
@@ -4,7 +4,7 @@ description: |
4
4
  Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface with `mo.py`, which joins every source table to the live sweeps so a lookup leads with the measured verdict rather than the declaration (126 node types, 191 properties, 98 style properties with 20 structured value shapes pinned down, 53 style states, 156 variants, 74 dynamic variables, 15 interaction triggers, 115 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, the design-token and element-class layers verified against compiled CSS, the @VAR() dynamic language verified against rendered output, nine designed pages built through the tables themselves, and the delivered pages re-read in Chromium at three viewports so a rule that is present, correct and still wrong cannot pass. Drives Mosaic's own theme export/import and its plugin data upgrade from outside the editor and holds the copy against the source tree for tree. Measured on Mosaic Pro 1.0.9: the modal (`<dialog>`), OpenStreetMap, the exit-intent and scroll-depth triggers, run rules and the memory actions all built on a live page and read back, and the 1.0.7 -> 1.0.8 -> 1.0.9 migrations driven from outside wp-admin.
5
5
  license: "MIT"
6
6
  author: "moksa (https://moksaweb.com)"
7
- version: "1.26.0"
7
+ version: "1.26.1"
8
8
  ---
9
9
 
10
10
  # Headless Mosaic
@@ -530,7 +530,7 @@ so the pattern is in the data, not just in this paragraph.
530
530
  | `data/conversion-batch.csv` | 19 | **converted, built and checked live, one page after another** - every Elementor page of a production site through the converter, with per-page element and content counts |
531
531
  | `data/token-benchmark.csv` | 6 | **measured with tiktoken** - the same six lookups priced three ways: reading the plugin source, loading every table, querying `mo.py`. 71-99.5% fewer tokens than the source and 99.6%+ fewer than the tables, which total 259,539 - never load them, query them |
532
532
  | `data/slider-verification.csv` | 30 | **driven live** - two sliders, one autoplaying and one a carousel: advance, arrows, bullets, keyboard, reduced motion |
533
- | `data/navigation-verification.csv` | 24 | **fetched and opened live** - every menu item is a real `<a href>`, every page of the nineteen answers 200, and no page scrolls sideways at 390 / 768 / 1280 |
533
+ | `data/navigation-verification.csv` | 33 | **fetched and opened live** - every menu item is a real `<a href>`, every page of the nineteen answers 200, and no page scrolls sideways at 390 / 768 / 1280 |
534
534
  | `data/page-modal-verification.csv` | 19 | **read live** - one modal per page, and what each one's trigger, run rule, memory scope and dismissal policy actually came out as |
535
535
  | `data/dialog-verification.csv` | 19 | **driven live** - the 1.0.9 modal, its triggers, its run rules and the memory actions, each exercised in a real browser |
536
536
  | `data/dialog-form-verification.csv` | 49 | **driven live** - the same three nodes made into five FORMS (sheet, drawer, corner, takeover, gate), each re-opened at 390px and 768px; also where `pickOne` on a click turned out to be a latch rather than a lottery |
@@ -809,7 +809,7 @@ post — `build_all.py` resets first for that reason.
809
809
  | `theme_zip_compare.php` | hold an imported copy against its source, tree for tree - every scoped table, the (parentType, type) shape, which ids survive, and orphans named rather than counted |
810
810
  | `theme_delete.php` | remove a theme completely through the plugin's own routine; refuses the live one |
811
811
  | `verify_slider.py` | the slider in a real browser: does it advance, do the arrows and bullets drive it, does the keyboard, does it stop when motion is not wanted - `--label`/`--append` put several sliders in one table, which is where a carousel and a plain slider can be held against each other |
812
- | `verify_navigation.py` | a multi-page site: is every menu item a real `<a href>`, does every page answer 200 (a template that was never bound answers 406 with an empty body, which only a logged-out visitor sees), and with `--viewports` does any page scroll SIDEWAYS - the one question no per-page checker asks |
812
+ | `verify_navigation.py` | a multi-page site: is every menu item a real `<a href>`, does every page answer 200 (a template that was never bound answers 406 with an empty body, which only a logged-out visitor sees), and with `--viewports` does any page scroll SIDEWAYS - the one question no per-page checker asks - and whether every in-page `#fragment` resolves ON THE PAGE THAT CARRIES IT, which an HTTP check cannot see: a bare `#services` in a SHARED header fetches the current page, answers 200 everywhere, and does nothing on every page but the one that has that section |
813
813
  | `verify_dialog.py` | the 1.0.9 modal in a real browser: does it open, close, answer Esc, remember, cap - and does an OpenStreetMap carry the coordinates it was given |
814
814
  | `verify_dialog_lab.py` | the question after "does the modal work": can three nodes be made into a bottom sheet, a side drawer, a corner notice, a full takeover and a gate with no way out - and does each one still fit at phone width, which the page's own width check cannot see |
815
815
  | `verify_tokens.py` | the design tokens as the BROWSER resolved them: every `:root` property declared once (a changed value does not retire the old one), non-empty, and actually pointed at by something - a wrong `skinsData` shape still emits the declaration and serves white |
@@ -20,7 +20,7 @@
20
20
  "description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
21
21
  "license": "MIT",
22
22
  "author": "moksa (https://moksaweb.com)",
23
- "version": "1.26.0"
23
+ "version": "1.26.1"
24
24
  },
25
25
  "loaderBehaviour": "Upload via Settings -> Skills -> Upload. Claude.ai parses SKILL.md frontmatter and surfaces the skill in your library. The extraction tool (extract-block-schema.php) needs a live WP-CLI connection and won't run in the sandbox; use it from a local terminal against your own site instead.",
26
26
  "uploadSteps": [
@@ -20,7 +20,7 @@
20
20
  "description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
21
21
  "license": "MIT",
22
22
  "author": "moksa (https://moksaweb.com)",
23
- "version": "1.26.0"
23
+ "version": "1.26.1"
24
24
  },
25
25
  "loaderBehaviour": "Auto-loads on session start when SKILL.md frontmatter parses successfully.",
26
26
  "verified": true,
@@ -20,7 +20,7 @@
20
20
  "description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
21
21
  "license": "MIT",
22
22
  "author": "moksa (https://moksaweb.com)",
23
- "version": "1.26.0"
23
+ "version": "1.26.1"
24
24
  },
25
25
  "loaderBehaviour": "Confirmed (2026-07-11): Codex CLI natively supports the SKILL.md spec. Place SKILL.md under .codex/skills/<name>/ (project) or ~/.codex/skills/<name>/ (personal) and Codex loads the name+description at session start, then the full body on demand. A parallel, broader convention .agents/skills/ (searched from cwd up to repo root, then ~/.agents/skills/) also exists across multiple tools - if your Codex CLI version prioritizes that path instead, mirror the same SKILL.md there.",
26
26
  "verified": true,
@@ -20,7 +20,7 @@
20
20
  "description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
21
21
  "license": "MIT",
22
22
  "author": "moksa (https://moksaweb.com)",
23
- "version": "1.26.0"
23
+ "version": "1.26.1"
24
24
  },
25
25
  "loaderBehaviour": "CHANGED as of 2026-07-11: GitHub Copilot added a proper '.github/skills/' Agent Skills directory (December 2025), alongside the older single-file .github/copilot-instructions.md convention. This config targets the new skills-directory form. If your Copilot version predates this (pre Dec 2025), use the instructions-append fallback instead (see fallback below).",
26
26
  "fallback": {
@@ -20,7 +20,7 @@
20
20
  "description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
21
21
  "license": "MIT",
22
22
  "author": "moksa (https://moksaweb.com)",
23
- "version": "1.26.0"
23
+ "version": "1.26.1"
24
24
  },
25
25
  "loaderBehaviour": "CHANGED as of 2026-07-11: Gemini CLI now natively supports the same SKILL.md standard as Claude Code and Codex CLI - the same directory-based skill works unmodified. Gemini CLI discovers skills in this precedence order: built-in, extension skills, ~/.gemini/skills/ (personal), .gemini/skills/ (project, shared via version control). At session start Gemini injects each discovered skill's name+description into the system prompt and calls activate_skill when a task matches.",
26
26
  "verified": true,
@@ -1,19 +1,28 @@
1
1
  check,result,detail
2
- FRONT_PAGE,PASS,"HTTP 200, 239473 bytes"
2
+ FRONT_PAGE,PASS,"HTTP 200, 239472 bytes"
3
3
  MENU_IS_LINKS,PASS,4 real <a href> in #mk-nav
4
- NAV 服務,PASS,"#services -> HTTP 200, 239567 bytes"
5
- NAV 作品,PASS,"#works -> HTTP 200, 239567 bytes"
6
- NAV 產品,PASS,"#products -> HTTP 200, 239567 bytes"
7
- NAV 聯絡,PASS,"#contact -> HTTP 200, 239567 bytes"
4
+ NAV 服務,PASS,"/#services -> HTTP 200, 239568 bytes"
5
+ NAV 作品,PASS,"/#works -> HTTP 200, 239568 bytes"
6
+ NAV 產品,PASS,"/#products -> HTTP 200, 239568 bytes"
7
+ NAV 聯絡,PASS,"/#contact -> HTTP 200, 239568 bytes"
8
8
  PAGE moksa,PASS,"HTTP 200, 239471 bytes"
9
- PAGE my-account,PASS,"HTTP 200, 99679 bytes"
10
- PAGE intro,PASS,"HTTP 200, 133385 bytes"
11
- PAGE components,PASS,"HTTP 200, 114167 bytes"
12
- PAGE conversion,PASS,"HTTP 200, 101845 bytes"
13
- PAGE dynamic,PASS,"HTTP 200, 111265 bytes"
14
- PAGE tokens,PASS,"HTTP 200, 124436 bytes"
15
- PAGE sliders,PASS,"HTTP 200, 150452 bytes"
16
- PAGE dialogs,PASS,"HTTP 200, 205989 bytes"
9
+ PAGE my-account,PASS,"HTTP 200, 99676 bytes"
10
+ PAGE intro,PASS,"HTTP 200, 133386 bytes"
11
+ PAGE components,PASS,"HTTP 200, 114165 bytes"
12
+ PAGE conversion,PASS,"HTTP 200, 101843 bytes"
13
+ PAGE dynamic,PASS,"HTTP 200, 111263 bytes"
14
+ PAGE tokens,PASS,"HTTP 200, 124433 bytes"
15
+ PAGE sliders,PASS,"HTTP 200, 150450 bytes"
16
+ PAGE dialogs,PASS,"HTTP 200, 205987 bytes"
17
+ ANCHORS moksa,PASS,every in-page link resolves
18
+ ANCHORS my-account,PASS,every in-page link resolves
19
+ ANCHORS intro,PASS,every in-page link resolves
20
+ ANCHORS components,PASS,every in-page link resolves
21
+ ANCHORS conversion,PASS,every in-page link resolves
22
+ ANCHORS dynamic,PASS,every in-page link resolves
23
+ ANCHORS tokens,PASS,every in-page link resolves
24
+ ANCHORS sliders,PASS,every in-page link resolves
25
+ ANCHORS dialogs,PASS,every in-page link resolves
17
26
  WIDTH moksa,PASS,"no sideways scroll at 390,768,1280"
18
27
  WIDTH my-account,PASS,"no sideways scroll at 390,768,1280"
19
28
  WIDTH intro,PASS,"no sideways scroll at 390,768,1280"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mosaic-headless",
3
- "version": "1.26.0",
3
+ "version": "1.26.1",
4
4
  "description": "AI-agent skill: build Mosaic Pro (Nextend) WordPress sites by writing the underlying data model directly - 23 custom tables, no visual editor, no DOM. Every node type, style property and node property swept against a live install and asserted on the delivered HTML and compiled CSS. Installs into Claude Code, Cursor, Codex CLI, Gemini CLI, Copilot, Continue, Windsurf and Claude.ai.",
5
5
  "keywords": [
6
6
  "wordpress",
@@ -344,3 +344,31 @@ Two rules come out of it:
344
344
  that lesson: for anything with a visible and an invisible state, a suite that
345
345
  only exercises the visible one is testing half a component, and the half it
346
346
  skips is the one the visitor sees most of the time.
347
+
348
+ ## A fragment link in a SHARED header is dead on every page but one
349
+
350
+ `#services` points at an id in the CURRENT document. Put it in a header that every
351
+ page shares, and on the one page that has that section it works, while on the other
352
+ seven the browser looks for the id, does not find it, and does nothing — no
353
+ navigation, no error, no feedback of any kind. The visitor clicks and the page sits
354
+ there. It is worse than a 404 for exactly that reason.
355
+
356
+ This shipped. The nav verifier had a check for it and the check could not see it:
357
+ it fetched every menu href and asserted HTTP 200, and `#services` resolves to the
358
+ *current* URL, so it returned 200 on all eight pages while being dead on seven.
359
+ "Every link answers 200" and "every link does something" are different claims.
360
+
361
+ Two things come out of it:
362
+
363
+ - **Write shared-shell links absolutely** — `/#services`, not `#services`. A link
364
+ in a component that appears on more than one page has to mean the same thing
365
+ from all of them.
366
+ - **Assert the fragment resolves on the page that carries it.**
367
+ `verify_navigation.py` now opens every page and fails on any `[href^="#"]`
368
+ whose target id is absent from that document. It found the four in the header
369
+ immediately — and then a fifth and sixth in the masthead, which `/intro/` shares
370
+ with the homepage and which I had not thought to look at.
371
+
372
+ The general form: a check that confirms a resource EXISTS is not a check that the
373
+ control WORKS, and anything living in a shared layout needs verifying on every
374
+ page that includes it, not on the page it was designed for.
@@ -103,7 +103,7 @@ const counts = {
103
103
  "data/token-verification.csv": 15,
104
104
  "data/mobile-audit.csv": 58,
105
105
  "data/component-wall-verification.csv": 11,
106
- "data/navigation-verification.csv": 24,
106
+ "data/navigation-verification.csv": 33,
107
107
  "data/page-modal-verification.csv": 19,
108
108
  "data/interaction-rules-verification.csv": 17,
109
109
  "data/dialog-form-verification.csv": 49,
package/sites/_moksa.py CHANGED
@@ -281,8 +281,12 @@ def mask_line(attr, text, tag="h1", **st):
281
281
  # studio's own site; everything that demonstrates what Mosaic can DO is one
282
282
  # labelled group, which is also the only honest shape - those five pages are a
283
283
  # set, not five more sections of the homepage.
284
- NAV = [("服務", "#services"), ("作品", "#works"),
285
- ("產品", "#products"), ("聯絡", "#contact")]
284
+ # These are sections of the HOMEPAGE, and the header is shared by every page. A
285
+ # bare `#services` is therefore a dead link on all seven of the others: the
286
+ # browser looks for that id in the current document, does not find it, and does
287
+ # nothing at all. Absolute, so they mean the same thing from anywhere.
288
+ NAV = [("服務", "/#services"), ("作品", "/#works"),
289
+ ("產品", "/#products"), ("聯絡", "/#contact")]
286
290
 
287
291
  # Read from the shipped tables rather than typed, so the menu cannot claim a
288
292
  # number the evidence no longer supports.
@@ -1460,7 +1464,7 @@ HEADER = box("mk-shell-top", {}, [
1460
1464
  "children": [
1461
1465
  # the wordmark is the only route back to the top on a one-pager, so
1462
1466
  # it has to be a link. `menu-link` with a url renders a real <a>.
1463
- {"type": "menu-link", "data": {"attrID": "mk-logo", "url": "#mk-home"},
1467
+ {"type": "menu-link", "data": {"attrID": "mk-logo", "url": "/"},
1464
1468
  "style": {"&": {"_": {"display": "flex", "alignItems": "baseline",
1465
1469
  "columnGap": "9px", "cursor": "pointer"}}},
1466
1470
  "children":
@@ -1514,7 +1518,7 @@ HEADER = box("mk-shell-top", {}, [
1514
1518
  ] + [capability_dropdown()]},
1515
1519
  # not a pill: a bracketed link, the way a document cross-references
1516
1520
  {"type": "button", "data": {"attrID": "mk-header-cta",
1517
- "url": "#contact"},
1521
+ "url": "/#contact"},
1518
1522
  "style": {"&": {"_m": {"display": "none"},
1519
1523
  "_t": {"fontSize": "12px"},
1520
1524
  # 13px of the bright orange on the glass header is
@@ -1696,8 +1700,8 @@ MASTHEAD = section("mk-mast", [wrap("mk-mast-in", [
1696
1700
  if n == 1
1697
1701
  else {"color": {"token": "--mk-accent"}})}},
1698
1702
  "text": text}
1699
- for n, (text, href) in enumerate([("服務項目 →", "#services"),
1700
- ("精選作品 →", "#works")], start=1)
1703
+ for n, (text, href) in enumerate([("服務項目 →", "/#services"),
1704
+ ("精選作品 →", "/#works")], start=1)
1701
1705
  ]},
1702
1706
  ]),
1703
1707
  # the right-hand column: what a spec sheet puts in its header block
package/sites/moksa.json CHANGED
@@ -317,7 +317,7 @@
317
317
  "type": "menu-link",
318
318
  "data": {
319
319
  "attrID": "mk-logo",
320
- "url": "#mk-home"
320
+ "url": "/"
321
321
  },
322
322
  "style": {
323
323
  "&": {
@@ -498,7 +498,7 @@
498
498
  "type": "menu-link",
499
499
  "data": {
500
500
  "attrID": "mk-nav-0",
501
- "url": "#services"
501
+ "url": "/#services"
502
502
  },
503
503
  "style": {
504
504
  "&": {
@@ -538,7 +538,7 @@
538
538
  "type": "menu-link",
539
539
  "data": {
540
540
  "attrID": "mk-nav-1",
541
- "url": "#works"
541
+ "url": "/#works"
542
542
  },
543
543
  "style": {
544
544
  "&": {
@@ -578,7 +578,7 @@
578
578
  "type": "menu-link",
579
579
  "data": {
580
580
  "attrID": "mk-nav-2",
581
- "url": "#products"
581
+ "url": "/#products"
582
582
  },
583
583
  "style": {
584
584
  "&": {
@@ -618,7 +618,7 @@
618
618
  "type": "menu-link",
619
619
  "data": {
620
620
  "attrID": "mk-nav-3",
621
- "url": "#contact"
621
+ "url": "/#contact"
622
622
  },
623
623
  "style": {
624
624
  "&": {
@@ -1217,7 +1217,7 @@
1217
1217
  "type": "button",
1218
1218
  "data": {
1219
1219
  "attrID": "mk-header-cta",
1220
- "url": "#contact"
1220
+ "url": "/#contact"
1221
1221
  },
1222
1222
  "style": {
1223
1223
  "&": {
@@ -3601,7 +3601,7 @@
3601
3601
  "type": "button",
3602
3602
  "data": {
3603
3603
  "attrID": "mk-cta-1",
3604
- "url": "#services"
3604
+ "url": "/#services"
3605
3605
  },
3606
3606
  "style": {
3607
3607
  "&": {
@@ -3645,7 +3645,7 @@
3645
3645
  "type": "button",
3646
3646
  "data": {
3647
3647
  "attrID": "mk-cta-2",
3648
- "url": "#works"
3648
+ "url": "/#works"
3649
3649
  },
3650
3650
  "style": {
3651
3651
  "&": {
@@ -18121,7 +18121,7 @@
18121
18121
  "settings": {
18122
18122
  "target": {
18123
18123
  "type": "element",
18124
- "uuid": "b88e1f50-94a8-40ca-88b8-2ccc28d9689b"
18124
+ "uuid": "bc2eef2d-20aa-42aa-bc5a-78a52bb4840a"
18125
18125
  }
18126
18126
  }
18127
18127
  }
@@ -18177,7 +18177,7 @@
18177
18177
  ]
18178
18178
  }
18179
18179
  ],
18180
- "nodeID": "b88e1f50-94a8-40ca-88b8-2ccc28d9689b"
18180
+ "nodeID": "bc2eef2d-20aa-42aa-bc5a-78a52bb4840a"
18181
18181
  }
18182
18182
  ]
18183
18183
  }
@@ -20503,7 +20503,7 @@
20503
20503
  "type": "button",
20504
20504
  "data": {
20505
20505
  "attrID": "mk-cta-1",
20506
- "url": "#services"
20506
+ "url": "/#services"
20507
20507
  },
20508
20508
  "style": {
20509
20509
  "&": {
@@ -20547,7 +20547,7 @@
20547
20547
  "type": "button",
20548
20548
  "data": {
20549
20549
  "attrID": "mk-cta-2",
20550
- "url": "#works"
20550
+ "url": "/#works"
20551
20551
  },
20552
20552
  "style": {
20553
20553
  "&": {
@@ -44008,20 +44008,20 @@
44008
44008
  "interactions": [
44009
44009
  {
44010
44010
  "type": "click",
44011
- "uuid": "22293cf8-31f2-437c-9d95-64c44d27e916",
44011
+ "uuid": "1cf7d84f-e895-48aa-87ec-c3effe7cf805",
44012
44012
  "clickOptions": {
44013
44013
  "name": "dl-open-centre",
44014
- "ID": "f57753b2-537e-4031-8862-336c7fc55588",
44014
+ "ID": "09120bc1-3748-43fa-b5fa-39b9785223c4",
44015
44015
  "actionSlots": {
44016
44016
  "click": {
44017
44017
  "actions": [
44018
44018
  {
44019
44019
  "type": "modalOpen",
44020
- "uuid": "d385c87c-0075-4c8b-9dab-2141ca3fab60",
44020
+ "uuid": "e3403362-9855-4157-8cec-f1ed27ac0c9f",
44021
44021
  "settings": {
44022
44022
  "target": {
44023
44023
  "type": "element",
44024
- "uuid": "8573930f-8e6b-4d3d-808f-7708826d1654"
44024
+ "uuid": "2b132d70-af72-4553-bb89-77e525196adc"
44025
44025
  }
44026
44026
  }
44027
44027
  }
@@ -44560,20 +44560,20 @@
44560
44560
  "interactions": [
44561
44561
  {
44562
44562
  "type": "click",
44563
- "uuid": "413b587c-0128-4e66-8627-093a1c1f3f02",
44563
+ "uuid": "05f4df27-b51b-4368-854c-6a39db9b51b1",
44564
44564
  "clickOptions": {
44565
44565
  "name": "dl-open-sheet",
44566
- "ID": "baa85a65-92c1-4812-af1e-31b2bd0b7924",
44566
+ "ID": "99d5de43-46d6-4a4b-9b64-12b2e4d5c0d8",
44567
44567
  "actionSlots": {
44568
44568
  "click": {
44569
44569
  "actions": [
44570
44570
  {
44571
44571
  "type": "modalOpen",
44572
- "uuid": "41e35704-fc39-4fb6-aabc-5baf37eef603",
44572
+ "uuid": "ed9429ea-4ef9-4f34-b924-f996a79ca550",
44573
44573
  "settings": {
44574
44574
  "target": {
44575
44575
  "type": "element",
44576
- "uuid": "b1091fb3-9c1d-4e08-a904-fde8240c4304"
44576
+ "uuid": "884ae9cb-d8b3-4a6b-ae36-5cdf1e559553"
44577
44577
  }
44578
44578
  }
44579
44579
  }
@@ -45112,20 +45112,20 @@
45112
45112
  "interactions": [
45113
45113
  {
45114
45114
  "type": "click",
45115
- "uuid": "016afe3c-7d98-4949-a8a1-85007609c74d",
45115
+ "uuid": "5abc18cb-ce91-4273-90c2-90f0184ee9cd",
45116
45116
  "clickOptions": {
45117
45117
  "name": "dl-open-drawer",
45118
- "ID": "8a30c72e-cc31-4455-a05e-e38f19b0620a",
45118
+ "ID": "290cb859-8a9d-4f9d-8c8c-00fbe0065032",
45119
45119
  "actionSlots": {
45120
45120
  "click": {
45121
45121
  "actions": [
45122
45122
  {
45123
45123
  "type": "modalOpen",
45124
- "uuid": "e314569c-fadb-4a1e-9022-145d22d92f19",
45124
+ "uuid": "2b412973-c54c-486e-bf2e-fff0f50f7e65",
45125
45125
  "settings": {
45126
45126
  "target": {
45127
45127
  "type": "element",
45128
- "uuid": "d4714f06-e71f-4ebb-a781-4b1cbfa17334"
45128
+ "uuid": "c3555622-0b8a-431a-8c04-30c82f622b49"
45129
45129
  }
45130
45130
  }
45131
45131
  }
@@ -46161,20 +46161,20 @@
46161
46161
  "interactions": [
46162
46162
  {
46163
46163
  "type": "click",
46164
- "uuid": "0dff97f8-327f-4ef9-9818-3b5795df3662",
46164
+ "uuid": "dffb19a8-6f16-4bf9-8351-c33805d402f9",
46165
46165
  "clickOptions": {
46166
46166
  "name": "dl-open-takeover",
46167
- "ID": "e746839c-35ed-401c-a24d-dac655ab1e3f",
46167
+ "ID": "d4957864-9161-4b88-a57f-320959cce386",
46168
46168
  "actionSlots": {
46169
46169
  "click": {
46170
46170
  "actions": [
46171
46171
  {
46172
46172
  "type": "modalOpen",
46173
- "uuid": "43121108-f3a0-45e4-a855-5d5254bc4c9b",
46173
+ "uuid": "91492ead-914e-4def-bea7-9271f08a9f72",
46174
46174
  "settings": {
46175
46175
  "target": {
46176
46176
  "type": "element",
46177
- "uuid": "20195d24-c5a2-4694-8b65-e2f0a3d65cdb"
46177
+ "uuid": "4430b903-b332-4b29-83f8-73e8053bb595"
46178
46178
  }
46179
46179
  }
46180
46180
  }
@@ -46713,20 +46713,20 @@
46713
46713
  "interactions": [
46714
46714
  {
46715
46715
  "type": "click",
46716
- "uuid": "55de764b-aefc-46bb-be52-e4560867b914",
46716
+ "uuid": "f0c40075-04f1-458c-b08c-ee260563bdae",
46717
46717
  "clickOptions": {
46718
46718
  "name": "dl-open-gate",
46719
- "ID": "60dcc315-e87f-4806-891a-a61bc5946264",
46719
+ "ID": "2cbb066e-3e82-48ae-b2f9-b07c913c1218",
46720
46720
  "actionSlots": {
46721
46721
  "click": {
46722
46722
  "actions": [
46723
46723
  {
46724
46724
  "type": "modalOpen",
46725
- "uuid": "ec557e06-460f-429c-b08d-49f578d29f63",
46725
+ "uuid": "ed55f6de-1886-4c8b-afb4-6c7f92a92ebb",
46726
46726
  "settings": {
46727
46727
  "target": {
46728
46728
  "type": "element",
46729
- "uuid": "ca84d6c4-cb1b-464f-8bc3-5cfcbb2a17dd"
46729
+ "uuid": "b74ba725-87fc-437c-94bc-436b90765093"
46730
46730
  }
46731
46731
  }
46732
46732
  }
@@ -47288,20 +47288,20 @@
47288
47288
  "interactions": [
47289
47289
  {
47290
47290
  "type": "click",
47291
- "uuid": "553ca5a7-bf94-4304-bae5-ff2aad602bab",
47291
+ "uuid": "08dbfd0f-6f0d-4496-8f0a-26555c360916",
47292
47292
  "clickOptions": {
47293
47293
  "name": "dl-open-exit",
47294
- "ID": "69f6e254-4176-4dae-983c-a6c713642bcf",
47294
+ "ID": "ac0fb51b-e49c-4b08-9f37-4c13611d3132",
47295
47295
  "actionSlots": {
47296
47296
  "click": {
47297
47297
  "actions": [
47298
47298
  {
47299
47299
  "type": "modalOpen",
47300
- "uuid": "41e92dc4-9229-4526-b68e-e6df7e9ce8df",
47300
+ "uuid": "1a31998f-1f1e-484e-af6c-da5e9a62974e",
47301
47301
  "settings": {
47302
47302
  "target": {
47303
47303
  "type": "element",
47304
- "uuid": "489a7131-a499-4735-88a2-6ec7da4f7e5c"
47304
+ "uuid": "7bc69b03-4229-499e-9572-09c9df21e554"
47305
47305
  }
47306
47306
  }
47307
47307
  }
@@ -48328,14 +48328,14 @@
48328
48328
  "interactions": [
48329
48329
  {
48330
48330
  "type": "click",
48331
- "uuid": "b379f2a5-f933-4ce9-bcab-2f3b3a3de313",
48331
+ "uuid": "362e28ba-abbd-49ec-ae1d-ec1baf695cae",
48332
48332
  "clickOptions": {
48333
48333
  "name": "dl-ab-aba",
48334
- "ID": "5482bb3c-bd17-47d9-acfa-e35022952f96",
48334
+ "ID": "861cf3f7-cd2d-48aa-8abd-de096d5ecbd8",
48335
48335
  "runs": {
48336
48336
  "rules": [
48337
48337
  {
48338
- "uuid": "247d7689-c8bb-4079-9644-ca7d3420ef7c",
48338
+ "uuid": "756f7b92-d751-4a02-b8fb-db6d4676c185",
48339
48339
  "type": "pickOne",
48340
48340
  "pickOneOptions": {
48341
48341
  "remember": "page",
@@ -48349,11 +48349,11 @@
48349
48349
  "actions": [
48350
48350
  {
48351
48351
  "type": "modalOpen",
48352
- "uuid": "fe5d5378-23d5-4345-84e9-454762f8b6c9",
48352
+ "uuid": "b3a9811e-8b5b-45b7-bebe-3e1c6acf158c",
48353
48353
  "settings": {
48354
48354
  "target": {
48355
48355
  "type": "element",
48356
- "uuid": "08af96af-9ac4-45e1-851a-f25d0161c639"
48356
+ "uuid": "a83cc78c-2c57-4ea2-9325-22b69aba3ab9"
48357
48357
  }
48358
48358
  }
48359
48359
  }
@@ -48416,14 +48416,14 @@
48416
48416
  "interactions": [
48417
48417
  {
48418
48418
  "type": "click",
48419
- "uuid": "6f6d2808-e1d9-4a64-893c-2108a3a74403",
48419
+ "uuid": "e9fe170f-18c5-422f-ae51-28b484644555",
48420
48420
  "clickOptions": {
48421
48421
  "name": "dl-ab-abb",
48422
- "ID": "070f7fd2-0b99-4985-800a-549cf3396c17",
48422
+ "ID": "0132e744-0c6a-45a4-b3a4-6388f0ae9477",
48423
48423
  "runs": {
48424
48424
  "rules": [
48425
48425
  {
48426
- "uuid": "bf45c4fc-4c88-4a38-9a93-fe8a3ee7aff5",
48426
+ "uuid": "62fd663e-9ea3-48e9-b031-21b0aedc91e5",
48427
48427
  "type": "pickOne",
48428
48428
  "pickOneOptions": {
48429
48429
  "remember": "page",
@@ -48437,11 +48437,11 @@
48437
48437
  "actions": [
48438
48438
  {
48439
48439
  "type": "modalOpen",
48440
- "uuid": "c6671d9a-fa8b-4a81-900d-f86d6e1b9215",
48440
+ "uuid": "c0a24fdd-f076-4c98-aeca-70246346d806",
48441
48441
  "settings": {
48442
48442
  "target": {
48443
48443
  "type": "element",
48444
- "uuid": "fda19d9c-016d-4ed9-b6b5-d5d440cf7b00"
48444
+ "uuid": "212ea537-3594-4199-90d3-7c8f0fc60645"
48445
48445
  }
48446
48446
  }
48447
48447
  }
@@ -48711,14 +48711,14 @@
48711
48711
  "translateXOptions": {
48712
48712
  "value": "-50%"
48713
48713
  },
48714
- "uuid": "5e912c05-36d9-4b1c-b45e-070bf4210846"
48714
+ "uuid": "e04d130b-3008-4162-b34d-197f1ca1b78d"
48715
48715
  },
48716
48716
  {
48717
48717
  "type": "translateY",
48718
48718
  "translateYOptions": {
48719
48719
  "value": "-50%"
48720
48720
  },
48721
- "uuid": "07da3b9b-82b1-4af9-8e22-3447de066192"
48721
+ "uuid": "e424a339-6743-4d17-956e-48a69c201d8e"
48722
48722
  }
48723
48723
  ],
48724
48724
  "width": "100%",
@@ -49428,20 +49428,20 @@
49428
49428
  "interactions": [
49429
49429
  {
49430
49430
  "type": "click",
49431
- "uuid": "ca0f7ad8-9f16-4f7d-8d70-c7ae9f7210a1",
49431
+ "uuid": "dd8e4b77-724a-427a-b9f7-f8f6ded9626b",
49432
49432
  "clickOptions": {
49433
49433
  "name": "dl-close-centre",
49434
- "ID": "bb64a7ee-f2ee-4c2b-97b2-a9c7001b0c3d",
49434
+ "ID": "bc8cb100-3f2c-4984-a8d7-76fff56282d8",
49435
49435
  "actionSlots": {
49436
49436
  "click": {
49437
49437
  "actions": [
49438
49438
  {
49439
49439
  "type": "modalClose",
49440
- "uuid": "1a78691a-0aa8-4947-9532-2cf906feb39a",
49440
+ "uuid": "3880fd4d-8242-4ff8-81d1-10ba8213d718",
49441
49441
  "settings": {
49442
49442
  "target": {
49443
49443
  "type": "element",
49444
- "uuid": "8573930f-8e6b-4d3d-808f-7708826d1654"
49444
+ "uuid": "2b132d70-af72-4553-bb89-77e525196adc"
49445
49445
  }
49446
49446
  }
49447
49447
  }
@@ -49502,7 +49502,7 @@
49502
49502
  ]
49503
49503
  }
49504
49504
  ],
49505
- "nodeID": "8573930f-8e6b-4d3d-808f-7708826d1654"
49505
+ "nodeID": "2b132d70-af72-4553-bb89-77e525196adc"
49506
49506
  },
49507
49507
  {
49508
49508
  "type": "modal",
@@ -50267,20 +50267,20 @@
50267
50267
  "interactions": [
50268
50268
  {
50269
50269
  "type": "click",
50270
- "uuid": "00ccab47-52b7-4751-93f3-a57103ff9895",
50270
+ "uuid": "198314d9-e5b6-4b13-8461-786511fccef1",
50271
50271
  "clickOptions": {
50272
50272
  "name": "dl-close-sheet",
50273
- "ID": "1f989af0-ef12-46be-a9f9-d52bc37d53b5",
50273
+ "ID": "ae5776a0-1c40-4ac3-a2ba-7a361806170f",
50274
50274
  "actionSlots": {
50275
50275
  "click": {
50276
50276
  "actions": [
50277
50277
  {
50278
50278
  "type": "modalClose",
50279
- "uuid": "7b0d4f63-a0ec-4a3c-a79b-0d976d24e9b4",
50279
+ "uuid": "5729afbd-25f1-4d7b-a09e-ef76043a16bf",
50280
50280
  "settings": {
50281
50281
  "target": {
50282
50282
  "type": "element",
50283
- "uuid": "b1091fb3-9c1d-4e08-a904-fde8240c4304"
50283
+ "uuid": "884ae9cb-d8b3-4a6b-ae36-5cdf1e559553"
50284
50284
  }
50285
50285
  }
50286
50286
  }
@@ -50341,7 +50341,7 @@
50341
50341
  ]
50342
50342
  }
50343
50343
  ],
50344
- "nodeID": "b1091fb3-9c1d-4e08-a904-fde8240c4304"
50344
+ "nodeID": "884ae9cb-d8b3-4a6b-ae36-5cdf1e559553"
50345
50345
  },
50346
50346
  {
50347
50347
  "type": "modal",
@@ -51105,20 +51105,20 @@
51105
51105
  "interactions": [
51106
51106
  {
51107
51107
  "type": "click",
51108
- "uuid": "fcf1a2b1-5270-43cd-83ae-ce07ab06cbc3",
51108
+ "uuid": "03f45dfe-9920-4f4f-8c3c-0ce44bd8a88e",
51109
51109
  "clickOptions": {
51110
51110
  "name": "dl-close-drawer",
51111
- "ID": "1ee03770-b7f9-42f9-9f42-2a46200eea78",
51111
+ "ID": "702d39a8-8c89-45ae-997d-72c9a7c31b73",
51112
51112
  "actionSlots": {
51113
51113
  "click": {
51114
51114
  "actions": [
51115
51115
  {
51116
51116
  "type": "modalClose",
51117
- "uuid": "74745bc7-9e2a-4551-a633-bf948f13916a",
51117
+ "uuid": "798d5e23-2a65-4e4a-a5ef-55ba7da7d782",
51118
51118
  "settings": {
51119
51119
  "target": {
51120
51120
  "type": "element",
51121
- "uuid": "d4714f06-e71f-4ebb-a781-4b1cbfa17334"
51121
+ "uuid": "c3555622-0b8a-431a-8c04-30c82f622b49"
51122
51122
  }
51123
51123
  }
51124
51124
  }
@@ -51179,7 +51179,7 @@
51179
51179
  ]
51180
51180
  }
51181
51181
  ],
51182
- "nodeID": "d4714f06-e71f-4ebb-a781-4b1cbfa17334"
51182
+ "nodeID": "c3555622-0b8a-431a-8c04-30c82f622b49"
51183
51183
  },
51184
51184
  {
51185
51185
  "type": "modal",
@@ -51193,7 +51193,7 @@
51193
51193
  "runs": {
51194
51194
  "rules": [
51195
51195
  {
51196
- "uuid": "f75511fe-c7b3-4d8b-8efa-885471c313ae",
51196
+ "uuid": "2b063096-d89a-498c-9546-faa9810d75a8",
51197
51197
  "type": "cap",
51198
51198
  "capOptions": {
51199
51199
  "max": "1",
@@ -51960,20 +51960,20 @@
51960
51960
  "interactions": [
51961
51961
  {
51962
51962
  "type": "click",
51963
- "uuid": "231d2605-a169-4590-aded-a05ef016db8a",
51963
+ "uuid": "a02a0f6d-a4c6-4d98-bd38-bc4ae9eeeab0",
51964
51964
  "clickOptions": {
51965
51965
  "name": "dl-close-toast",
51966
- "ID": "1cd4a12f-89b7-45ce-a62c-1d326840a10c",
51966
+ "ID": "2a539882-05be-474a-b5aa-f36f8e0ec3f3",
51967
51967
  "actionSlots": {
51968
51968
  "click": {
51969
51969
  "actions": [
51970
51970
  {
51971
51971
  "type": "modalClose",
51972
- "uuid": "07adbbdf-ecb7-4f04-9426-7afd4f726b99",
51972
+ "uuid": "aa4992c3-32b3-41fc-ac36-888d4b523a72",
51973
51973
  "settings": {
51974
51974
  "target": {
51975
51975
  "type": "element",
51976
- "uuid": "ea79aaa7-ef47-4b13-9750-087f9d1ee047"
51976
+ "uuid": "d4984a42-3290-4bb1-88c8-29ee11ac686f"
51977
51977
  }
51978
51978
  }
51979
51979
  }
@@ -52034,7 +52034,7 @@
52034
52034
  ]
52035
52035
  }
52036
52036
  ],
52037
- "nodeID": "ea79aaa7-ef47-4b13-9750-087f9d1ee047"
52037
+ "nodeID": "d4984a42-3290-4bb1-88c8-29ee11ac686f"
52038
52038
  },
52039
52039
  {
52040
52040
  "type": "modal",
@@ -52804,20 +52804,20 @@
52804
52804
  "interactions": [
52805
52805
  {
52806
52806
  "type": "click",
52807
- "uuid": "6ff896bc-964c-458d-8c3c-107256ef0d09",
52807
+ "uuid": "ac076cd0-da37-4a0a-8263-5995ddeaa42e",
52808
52808
  "clickOptions": {
52809
52809
  "name": "dl-close-takeover",
52810
- "ID": "6635bab8-b1e9-4de8-a00f-7c4ab65a5880",
52810
+ "ID": "c8ce15c1-1b4d-4dd5-8309-98e22d12ebcd",
52811
52811
  "actionSlots": {
52812
52812
  "click": {
52813
52813
  "actions": [
52814
52814
  {
52815
52815
  "type": "modalClose",
52816
- "uuid": "0d4be86b-2397-4107-a9ab-fbca972018e2",
52816
+ "uuid": "f1791ff8-eb0e-4162-be24-cfabcbc3ef12",
52817
52817
  "settings": {
52818
52818
  "target": {
52819
52819
  "type": "element",
52820
- "uuid": "20195d24-c5a2-4694-8b65-e2f0a3d65cdb"
52820
+ "uuid": "4430b903-b332-4b29-83f8-73e8053bb595"
52821
52821
  }
52822
52822
  }
52823
52823
  }
@@ -52878,7 +52878,7 @@
52878
52878
  ]
52879
52879
  }
52880
52880
  ],
52881
- "nodeID": "20195d24-c5a2-4694-8b65-e2f0a3d65cdb"
52881
+ "nodeID": "4430b903-b332-4b29-83f8-73e8053bb595"
52882
52882
  },
52883
52883
  {
52884
52884
  "type": "modal",
@@ -52940,14 +52940,14 @@
52940
52940
  "translateXOptions": {
52941
52941
  "value": "-50%"
52942
52942
  },
52943
- "uuid": "8101e304-79a3-48c3-86df-b488a641804b"
52943
+ "uuid": "16ebd57a-baf6-488a-a015-ecc8b6267df5"
52944
52944
  },
52945
52945
  {
52946
52946
  "type": "translateY",
52947
52947
  "translateYOptions": {
52948
52948
  "value": "-50%"
52949
52949
  },
52950
- "uuid": "ad983be0-f0d6-4937-8450-02b127b4298d"
52950
+ "uuid": "4c7c2270-bad2-4f05-9ed1-4c6102a290d3"
52951
52951
  }
52952
52952
  ],
52953
52953
  "width": "100%",
@@ -53657,20 +53657,20 @@
53657
53657
  "interactions": [
53658
53658
  {
53659
53659
  "type": "click",
53660
- "uuid": "2bf72388-ef27-482b-910e-939c74b4977e",
53660
+ "uuid": "20833170-1210-4ff0-b7d3-7c9d1a0a6d86",
53661
53661
  "clickOptions": {
53662
53662
  "name": "dl-close-gate",
53663
- "ID": "e4d3fa6c-b8e7-439d-a8f5-68483dfa01d9",
53663
+ "ID": "c7dd6f07-0d77-4acf-aa98-cdf6091498e8",
53664
53664
  "actionSlots": {
53665
53665
  "click": {
53666
53666
  "actions": [
53667
53667
  {
53668
53668
  "type": "modalClose",
53669
- "uuid": "f2e57522-4d90-4d4c-b577-44ac24c3302d",
53669
+ "uuid": "d842c187-b7a5-462f-a0d7-d76909d29c8a",
53670
53670
  "settings": {
53671
53671
  "target": {
53672
53672
  "type": "element",
53673
- "uuid": "ca84d6c4-cb1b-464f-8bc3-5cfcbb2a17dd"
53673
+ "uuid": "b74ba725-87fc-437c-94bc-436b90765093"
53674
53674
  }
53675
53675
  }
53676
53676
  }
@@ -53731,7 +53731,7 @@
53731
53731
  ]
53732
53732
  }
53733
53733
  ],
53734
- "nodeID": "ca84d6c4-cb1b-464f-8bc3-5cfcbb2a17dd"
53734
+ "nodeID": "b74ba725-87fc-437c-94bc-436b90765093"
53735
53735
  },
53736
53736
  {
53737
53737
  "type": "modal",
@@ -53748,7 +53748,7 @@
53748
53748
  "runs": {
53749
53749
  "rules": [
53750
53750
  {
53751
- "uuid": "9a554412-725e-454f-9fd6-60d541715d19",
53751
+ "uuid": "124e0615-b74d-46e1-8460-2af4eacb0faf",
53752
53752
  "type": "cap",
53753
53753
  "capOptions": {
53754
53754
  "max": "1",
@@ -53814,14 +53814,14 @@
53814
53814
  "translateXOptions": {
53815
53815
  "value": "-50%"
53816
53816
  },
53817
- "uuid": "c70c3921-2986-4d98-891b-d9fa99dd8a80"
53817
+ "uuid": "ba9f0ada-b6e0-4fb1-aef6-5e76e2df9016"
53818
53818
  },
53819
53819
  {
53820
53820
  "type": "translateY",
53821
53821
  "translateYOptions": {
53822
53822
  "value": "-50%"
53823
53823
  },
53824
- "uuid": "3f85c329-543c-4017-90c6-596c11403faf"
53824
+ "uuid": "108cbdbb-3b79-4ec1-ac1d-adcd79491847"
53825
53825
  }
53826
53826
  ],
53827
53827
  "width": "100%",
@@ -54531,20 +54531,20 @@
54531
54531
  "interactions": [
54532
54532
  {
54533
54533
  "type": "click",
54534
- "uuid": "6d40f329-b67d-42f3-aeb4-54f0fc459b29",
54534
+ "uuid": "97acd0d3-8692-4517-b505-892717489538",
54535
54535
  "clickOptions": {
54536
54536
  "name": "dl-close-exit",
54537
- "ID": "3dafeb72-f389-4909-a979-795b160d4716",
54537
+ "ID": "db5aeeb6-7eef-4e5b-a93c-174737094334",
54538
54538
  "actionSlots": {
54539
54539
  "click": {
54540
54540
  "actions": [
54541
54541
  {
54542
54542
  "type": "modalClose",
54543
- "uuid": "939256cc-cdc8-4d2e-b11e-71df48f8fffa",
54543
+ "uuid": "b412a07b-3bc8-4d8a-a10e-458769db2355",
54544
54544
  "settings": {
54545
54545
  "target": {
54546
54546
  "type": "element",
54547
- "uuid": "489a7131-a499-4735-88a2-6ec7da4f7e5c"
54547
+ "uuid": "7bc69b03-4229-499e-9572-09c9df21e554"
54548
54548
  }
54549
54549
  }
54550
54550
  }
@@ -54605,7 +54605,7 @@
54605
54605
  ]
54606
54606
  }
54607
54607
  ],
54608
- "nodeID": "489a7131-a499-4735-88a2-6ec7da4f7e5c"
54608
+ "nodeID": "7bc69b03-4229-499e-9572-09c9df21e554"
54609
54609
  },
54610
54610
  {
54611
54611
  "type": "modal",
@@ -54622,7 +54622,7 @@
54622
54622
  "runs": {
54623
54623
  "rules": [
54624
54624
  {
54625
- "uuid": "afc3b877-b2e5-4adf-a6e6-638558801f72",
54625
+ "uuid": "ffadabbc-0c74-4ea3-a7e9-edbb31bad8b0",
54626
54626
  "type": "cooldown",
54627
54627
  "cooldownOptions": {
54628
54628
  "duration": "1",
@@ -55390,20 +55390,20 @@
55390
55390
  "interactions": [
55391
55391
  {
55392
55392
  "type": "click",
55393
- "uuid": "4373ae1d-6849-41bd-b665-eb4bbb6da1b7",
55393
+ "uuid": "2a766563-8980-4143-99ee-d44409cf71c7",
55394
55394
  "clickOptions": {
55395
55395
  "name": "dl-close-depth",
55396
- "ID": "8dc639d9-b9b4-47d6-af76-191c6a54aa57",
55396
+ "ID": "b6ae68d3-68da-4d92-913b-181acf7d1d2c",
55397
55397
  "actionSlots": {
55398
55398
  "click": {
55399
55399
  "actions": [
55400
55400
  {
55401
55401
  "type": "modalClose",
55402
- "uuid": "e15dc3ee-7b10-4c00-ae20-3d9dc61aae4b",
55402
+ "uuid": "98858b22-2e8d-47e8-a5e0-89bc5f2a89e1",
55403
55403
  "settings": {
55404
55404
  "target": {
55405
55405
  "type": "element",
55406
- "uuid": "0cc73bd8-e4f5-4da4-bc4f-cf4451d9668d"
55406
+ "uuid": "e9874bbf-75d5-46d8-945f-fbee897eca00"
55407
55407
  }
55408
55408
  }
55409
55409
  }
@@ -55464,7 +55464,7 @@
55464
55464
  ]
55465
55465
  }
55466
55466
  ],
55467
- "nodeID": "0cc73bd8-e4f5-4da4-bc4f-cf4451d9668d"
55467
+ "nodeID": "e9874bbf-75d5-46d8-945f-fbee897eca00"
55468
55468
  },
55469
55469
  {
55470
55470
  "type": "modal",
@@ -55526,14 +55526,14 @@
55526
55526
  "translateXOptions": {
55527
55527
  "value": "-50%"
55528
55528
  },
55529
- "uuid": "5ed0c141-4ab9-4a7a-8299-0010dd5b04bf"
55529
+ "uuid": "178d9304-c76e-4ae1-ae97-1094e941344c"
55530
55530
  },
55531
55531
  {
55532
55532
  "type": "translateY",
55533
55533
  "translateYOptions": {
55534
55534
  "value": "-50%"
55535
55535
  },
55536
- "uuid": "6d717478-57a5-4448-8aac-9c813835b781"
55536
+ "uuid": "4fc7bc2d-976b-490b-bc36-22cff1dc9f10"
55537
55537
  }
55538
55538
  ],
55539
55539
  "width": "100%",
@@ -56243,20 +56243,20 @@
56243
56243
  "interactions": [
56244
56244
  {
56245
56245
  "type": "click",
56246
- "uuid": "98b963cb-7b5f-46b2-9290-8801c52d1506",
56246
+ "uuid": "3c88782b-3efc-4b1a-9496-2725707021c3",
56247
56247
  "clickOptions": {
56248
56248
  "name": "dl-close-aba",
56249
- "ID": "67382b5f-aac6-456c-b510-287216c30323",
56249
+ "ID": "b643867c-e926-437f-8bb5-ac3a54f29aa1",
56250
56250
  "actionSlots": {
56251
56251
  "click": {
56252
56252
  "actions": [
56253
56253
  {
56254
56254
  "type": "modalClose",
56255
- "uuid": "394ef50d-2b58-4f37-9d4d-d3f51794845a",
56255
+ "uuid": "890fecd2-5967-4285-a27c-925e3a151f2d",
56256
56256
  "settings": {
56257
56257
  "target": {
56258
56258
  "type": "element",
56259
- "uuid": "08af96af-9ac4-45e1-851a-f25d0161c639"
56259
+ "uuid": "a83cc78c-2c57-4ea2-9325-22b69aba3ab9"
56260
56260
  }
56261
56261
  }
56262
56262
  }
@@ -56317,7 +56317,7 @@
56317
56317
  ]
56318
56318
  }
56319
56319
  ],
56320
- "nodeID": "08af96af-9ac4-45e1-851a-f25d0161c639"
56320
+ "nodeID": "a83cc78c-2c57-4ea2-9325-22b69aba3ab9"
56321
56321
  },
56322
56322
  {
56323
56323
  "type": "modal",
@@ -56379,14 +56379,14 @@
56379
56379
  "translateXOptions": {
56380
56380
  "value": "-50%"
56381
56381
  },
56382
- "uuid": "cb5e5cee-b507-41d5-93e2-4506a7bbc31b"
56382
+ "uuid": "aaa190b3-7067-45ee-b18c-6451c9e8990c"
56383
56383
  },
56384
56384
  {
56385
56385
  "type": "translateY",
56386
56386
  "translateYOptions": {
56387
56387
  "value": "-50%"
56388
56388
  },
56389
- "uuid": "e55db500-2bbb-451b-96f1-d6b6fd727ca1"
56389
+ "uuid": "c10e5836-ff10-4187-ad46-0576efa29096"
56390
56390
  }
56391
56391
  ],
56392
56392
  "width": "100%",
@@ -57096,20 +57096,20 @@
57096
57096
  "interactions": [
57097
57097
  {
57098
57098
  "type": "click",
57099
- "uuid": "d08947ac-b93f-41b7-a5cb-9337cf14a07f",
57099
+ "uuid": "a29bf390-af41-49ec-b4e1-d8c254b8af13",
57100
57100
  "clickOptions": {
57101
57101
  "name": "dl-close-abb",
57102
- "ID": "406fdaa2-2a6b-4e21-90ab-42f50f7dc980",
57102
+ "ID": "48ef7001-2de6-4d86-8529-583d978bb772",
57103
57103
  "actionSlots": {
57104
57104
  "click": {
57105
57105
  "actions": [
57106
57106
  {
57107
57107
  "type": "modalClose",
57108
- "uuid": "b2c63920-2ba4-4102-9c95-4239ab05b619",
57108
+ "uuid": "2922767e-ad1e-40ea-9511-7991dcc2ccc1",
57109
57109
  "settings": {
57110
57110
  "target": {
57111
57111
  "type": "element",
57112
- "uuid": "fda19d9c-016d-4ed9-b6b5-d5d440cf7b00"
57112
+ "uuid": "212ea537-3594-4199-90d3-7c8f0fc60645"
57113
57113
  }
57114
57114
  }
57115
57115
  }
@@ -57170,7 +57170,7 @@
57170
57170
  ]
57171
57171
  }
57172
57172
  ],
57173
- "nodeID": "fda19d9c-016d-4ed9-b6b5-d5d440cf7b00"
57173
+ "nodeID": "212ea537-3594-4199-90d3-7c8f0fc60645"
57174
57174
  }
57175
57175
  ]
57176
57176
  }
@@ -133,6 +133,39 @@ def main():
133
133
  ok = st == 200 and len(body) > 2000
134
134
  check("PAGE %s" % slug[:21], ok, "HTTP %d, %d bytes" % (st, len(body)))
135
135
 
136
+ # ── a fragment link only works on the page that HAS that id ─────────────
137
+ #
138
+ # The check above fetches each menu href and is satisfied by HTTP 200 - and a
139
+ # bare `#services` fetches the CURRENT page, so it passes everywhere while
140
+ # doing nothing on seven pages out of eight. The header is shared; the
141
+ # sections it points at are the homepage's. A fragment that resolves to
142
+ # nothing is a link the visitor clicks and watches not work, which is worse
143
+ # than a 404 because there is no feedback at all.
144
+ if a.viewports or True:
145
+ from playwright.sync_api import sync_playwright as _sp
146
+ DEAD = """() => [...document.querySelectorAll('[href^=\"#\"]')]
147
+ .map(e => ({id: e.id || String(e.className).slice(0, 20),
148
+ href: e.getAttribute('href')}))
149
+ .filter(x => x.href.length > 1 &&
150
+ !document.getElementById(x.href.slice(1)))"""
151
+ with _sp() as pw:
152
+ br = pw.chromium.launch()
153
+ for page in spec["pages"]:
154
+ slug = page["slug"]
155
+ url = base + ("/" if slug == a.home_slug else "/%s/" % slug)
156
+ pg = br.new_page(viewport={"width": 1280, "height": 880})
157
+ pg.goto("%s?_f=%d" % (url, int(time.time() * 1000)),
158
+ wait_until="load")
159
+ pg.wait_for_timeout(900)
160
+ dead = pg.evaluate(DEAD)
161
+ pg.close()
162
+ check("ANCHORS %s" % slug[:19], not dead,
163
+ "every in-page link resolves" if not dead
164
+ else "dead fragments: %s"
165
+ % ", ".join("%s%s" % (d["href"], "@" + d["id"] if d["id"] else "")
166
+ for d in dead[:5]))
167
+ br.close()
168
+
136
169
  # ── does any page scroll sideways ───────────────────────────────────────
137
170
  if a.viewports:
138
171
  widths = [int(w) for w in a.viewports.split(",") if w.strip()]