@taprootio/espalier 2.9.0 → 2.11.0

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.
@@ -6186,6 +6186,147 @@
6186
6186
  }
6187
6187
  ]
6188
6188
  },
6189
+ {
6190
+ "kind": "javascript-module",
6191
+ "path": "dist/burger/esp-burger.js",
6192
+ "declarations": [
6193
+ {
6194
+ "kind": "class",
6195
+ "description": "Animated burger button for showing and hiding navigation\ncomponents.\n\n```html\n<esp-burger></esp-burger>\n```",
6196
+ "name": "EspalierBurger",
6197
+ "cssProperties": [
6198
+ {
6199
+ "description": "The color of the burger lines when closed.",
6200
+ "name": "--esp-color-burger"
6201
+ },
6202
+ {
6203
+ "description": "The hover color of the burger lines when closed.",
6204
+ "name": "--esp-color-burger-hover"
6205
+ },
6206
+ {
6207
+ "description": "The color of the burger lines when open.",
6208
+ "name": "--esp-color-burger-opened"
6209
+ },
6210
+ {
6211
+ "description": "The hover color of the burger lines when open.",
6212
+ "name": "--esp-color-burger-opened-hover"
6213
+ },
6214
+ {
6215
+ "description": "The stroke width of the burger lines.",
6216
+ "name": "--esp-size-burger-stroke"
6217
+ }
6218
+ ],
6219
+ "members": [
6220
+ {
6221
+ "kind": "field",
6222
+ "name": "menuOpen",
6223
+ "type": {
6224
+ "text": "boolean"
6225
+ },
6226
+ "privacy": "public",
6227
+ "default": "false",
6228
+ "description": "Whether or not the burger indicates an open state.",
6229
+ "attribute": "menu-open"
6230
+ },
6231
+ {
6232
+ "kind": "field",
6233
+ "name": "presentationOnly",
6234
+ "type": {
6235
+ "text": "boolean"
6236
+ },
6237
+ "privacy": "public",
6238
+ "default": "false",
6239
+ "description": "Render only the animated burger graphic. Use this when an\nouter control owns activation, labeling, and expanded state.",
6240
+ "attribute": "presentation-only"
6241
+ },
6242
+ {
6243
+ "kind": "method",
6244
+ "name": "toggleMenu"
6245
+ }
6246
+ ],
6247
+ "events": [
6248
+ {
6249
+ "name": "opened",
6250
+ "type": {
6251
+ "text": "CustomEvent"
6252
+ },
6253
+ "description": "Emitted when the button is clicked and the image changes from a burger to an X."
6254
+ },
6255
+ {
6256
+ "name": "closed",
6257
+ "type": {
6258
+ "text": "CustomEvent"
6259
+ },
6260
+ "description": "Emitted when the button is clicked and the image changes from an X to a burger. ```html <esp-burger></esp-burger> <script> const theBurger = findByTagName(\"esp-burger\")[0]; theBurger.addEventListener(\"opened\", () => { showToast({ message: \"It would be a good time to show the menu. This message will self-destruct in 4 seconds...\", icon: \"info-i\", duration: 4 }); }); theBurger.addEventListener(\"closed\", () => { showToast({ message: \"It would be a good time to hide the menu. This message will self-destruct in 4 seconds...\", icon: \"info-i\", duration: 4 }); }); </script> ```"
6261
+ }
6262
+ ],
6263
+ "attributes": [
6264
+ {
6265
+ "name": "menu-open",
6266
+ "type": {
6267
+ "text": "boolean"
6268
+ },
6269
+ "default": "false",
6270
+ "description": "Whether or not the burger indicates an open state.",
6271
+ "fieldName": "menuOpen"
6272
+ },
6273
+ {
6274
+ "name": "presentation-only",
6275
+ "type": {
6276
+ "text": "boolean"
6277
+ },
6278
+ "default": "false",
6279
+ "description": "Render only the animated burger graphic. Use this when an\nouter control owns activation, labeling, and expanded state.",
6280
+ "fieldName": "presentationOnly"
6281
+ }
6282
+ ],
6283
+ "superclass": {
6284
+ "name": "LitElement",
6285
+ "package": "lit"
6286
+ },
6287
+ "docPageTitle": {
6288
+ "name": "Burger",
6289
+ "description": ""
6290
+ },
6291
+ "docUrl": {
6292
+ "name": "/components/burger",
6293
+ "description": ""
6294
+ },
6295
+ "menuGroup": {
6296
+ "name": "Interaction",
6297
+ "description": ""
6298
+ },
6299
+ "menuLabel": {
6300
+ "name": "Burger",
6301
+ "description": ""
6302
+ },
6303
+ "menuIcon": {
6304
+ "name": "burger",
6305
+ "description": ""
6306
+ },
6307
+ "tagName": "esp-burger",
6308
+ "customElement": true
6309
+ }
6310
+ ],
6311
+ "exports": [
6312
+ {
6313
+ "kind": "js",
6314
+ "name": "EspalierBurger",
6315
+ "declaration": {
6316
+ "name": "EspalierBurger",
6317
+ "module": "dist/burger/esp-burger.js"
6318
+ }
6319
+ },
6320
+ {
6321
+ "kind": "custom-element-definition",
6322
+ "name": "esp-burger",
6323
+ "declaration": {
6324
+ "name": "EspalierBurger",
6325
+ "module": "dist/burger/esp-burger.js"
6326
+ }
6327
+ }
6328
+ ]
6329
+ },
6189
6330
  {
6190
6331
  "kind": "javascript-module",
6191
6332
  "path": "dist/breadcrumbs/esp-breadcrumb.js",
@@ -7001,147 +7142,6 @@
7001
7142
  }
7002
7143
  ]
7003
7144
  },
7004
- {
7005
- "kind": "javascript-module",
7006
- "path": "dist/burger/esp-burger.js",
7007
- "declarations": [
7008
- {
7009
- "kind": "class",
7010
- "description": "Animated burger button for showing and hiding navigation\ncomponents.\n\n```html\n<esp-burger></esp-burger>\n```",
7011
- "name": "EspalierBurger",
7012
- "cssProperties": [
7013
- {
7014
- "description": "The color of the burger lines when closed.",
7015
- "name": "--esp-color-burger"
7016
- },
7017
- {
7018
- "description": "The hover color of the burger lines when closed.",
7019
- "name": "--esp-color-burger-hover"
7020
- },
7021
- {
7022
- "description": "The color of the burger lines when open.",
7023
- "name": "--esp-color-burger-opened"
7024
- },
7025
- {
7026
- "description": "The hover color of the burger lines when open.",
7027
- "name": "--esp-color-burger-opened-hover"
7028
- },
7029
- {
7030
- "description": "The stroke width of the burger lines.",
7031
- "name": "--esp-size-burger-stroke"
7032
- }
7033
- ],
7034
- "members": [
7035
- {
7036
- "kind": "field",
7037
- "name": "menuOpen",
7038
- "type": {
7039
- "text": "boolean"
7040
- },
7041
- "privacy": "public",
7042
- "default": "false",
7043
- "description": "Whether or not the burger indicates an open state.",
7044
- "attribute": "menu-open"
7045
- },
7046
- {
7047
- "kind": "field",
7048
- "name": "presentationOnly",
7049
- "type": {
7050
- "text": "boolean"
7051
- },
7052
- "privacy": "public",
7053
- "default": "false",
7054
- "description": "Render only the animated burger graphic. Use this when an\nouter control owns activation, labeling, and expanded state.",
7055
- "attribute": "presentation-only"
7056
- },
7057
- {
7058
- "kind": "method",
7059
- "name": "toggleMenu"
7060
- }
7061
- ],
7062
- "events": [
7063
- {
7064
- "name": "opened",
7065
- "type": {
7066
- "text": "CustomEvent"
7067
- },
7068
- "description": "Emitted when the button is clicked and the image changes from a burger to an X."
7069
- },
7070
- {
7071
- "name": "closed",
7072
- "type": {
7073
- "text": "CustomEvent"
7074
- },
7075
- "description": "Emitted when the button is clicked and the image changes from an X to a burger. ```html <esp-burger></esp-burger> <script> const theBurger = findByTagName(\"esp-burger\")[0]; theBurger.addEventListener(\"opened\", () => { showToast({ message: \"It would be a good time to show the menu. This message will self-destruct in 4 seconds...\", icon: \"info-i\", duration: 4 }); }); theBurger.addEventListener(\"closed\", () => { showToast({ message: \"It would be a good time to hide the menu. This message will self-destruct in 4 seconds...\", icon: \"info-i\", duration: 4 }); }); </script> ```"
7076
- }
7077
- ],
7078
- "attributes": [
7079
- {
7080
- "name": "menu-open",
7081
- "type": {
7082
- "text": "boolean"
7083
- },
7084
- "default": "false",
7085
- "description": "Whether or not the burger indicates an open state.",
7086
- "fieldName": "menuOpen"
7087
- },
7088
- {
7089
- "name": "presentation-only",
7090
- "type": {
7091
- "text": "boolean"
7092
- },
7093
- "default": "false",
7094
- "description": "Render only the animated burger graphic. Use this when an\nouter control owns activation, labeling, and expanded state.",
7095
- "fieldName": "presentationOnly"
7096
- }
7097
- ],
7098
- "superclass": {
7099
- "name": "LitElement",
7100
- "package": "lit"
7101
- },
7102
- "docPageTitle": {
7103
- "name": "Burger",
7104
- "description": ""
7105
- },
7106
- "docUrl": {
7107
- "name": "/components/burger",
7108
- "description": ""
7109
- },
7110
- "menuGroup": {
7111
- "name": "Interaction",
7112
- "description": ""
7113
- },
7114
- "menuLabel": {
7115
- "name": "Burger",
7116
- "description": ""
7117
- },
7118
- "menuIcon": {
7119
- "name": "burger",
7120
- "description": ""
7121
- },
7122
- "tagName": "esp-burger",
7123
- "customElement": true
7124
- }
7125
- ],
7126
- "exports": [
7127
- {
7128
- "kind": "js",
7129
- "name": "EspalierBurger",
7130
- "declaration": {
7131
- "name": "EspalierBurger",
7132
- "module": "dist/burger/esp-burger.js"
7133
- }
7134
- },
7135
- {
7136
- "kind": "custom-element-definition",
7137
- "name": "esp-burger",
7138
- "declaration": {
7139
- "name": "EspalierBurger",
7140
- "module": "dist/burger/esp-burger.js"
7141
- }
7142
- }
7143
- ]
7144
- },
7145
7145
  {
7146
7146
  "kind": "javascript-module",
7147
7147
  "path": "dist/checkbox/esp-checkbox-group.js",
@@ -16276,7 +16276,7 @@
16276
16276
  "declarations": [
16277
16277
  {
16278
16278
  "kind": "class",
16279
- "description": "A transient panel for help, more-info, and preview content that\nclaims designed spare width before ever covering the page.\n\nPlace one `esp-flyout` in an `esp-page`'s `flyout` slot. The panel\nlives on the canvas, outside the content surface. The page decides\nwhere it goes, from widest viewport to narrowest:\n\n1. **Gutter** — the panel occupies the right canvas gutter. When the\n gutter already has room, it claims existing spare canvas and the\n main content does not move at all, on any alignment.\n2. **Shift** — when the gutter is not quite wide enough, the surface\n slides toward `start` by exactly the shortfall (no more) to free\n the difference.\n3. **Docked sidebar** — once the gutter is gone, the panel competes\n for width with the main well; content narrows but is never\n covered.\n4. **Overlay drawer** — below the mobile threshold (`50em`, the\n same one the `esp-menu` drawer uses) the panel becomes a fixed\n drawer over a vellum backdrop. Set `mode=\"overlay\"` to get this\n presentation at every width.\n\nThe panel is styled as a tear-off piece: a dotted perforation on\nits leading edge, rounded trailing corners, and no shadow — all\noverridable through the `--esp-flyout-*` tokens below.\n\nA11y follows the presentation. In the in-grid modes (1–3) the\nflyout is a non-modal `complementary` landmark named by its\n`heading`, and opening it never steals focus. In the overlay-drawer\nmode (4) it is a true modal: `role=\"dialog\"` + `aria-modal`, the\nbackground goes inert, scroll is locked, focus moves into the drawer\nand is trapped, and focus is restored on close. `Escape` closes it\nin every mode.\n\n```html\n<style>\nesp-page.flyout-demo {\n --esp-page-max-width: 420px;\n --esp-page-canvas-background: var(--esp-color-layer-1);\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-demo\" align=\"center\">\n <esp-flyout slot=\"flyout\" heading=\"More info\" id=\"demo-flyout\" standalone>\n <p>Spare width claimed; the well shifted only enough to make room.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"toggle-flyout\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const flyout = findById(\"demo-flyout\");\n findById(\"toggle-flyout\").addEventListener(\"clicked\", () => flyout.toggle());\n</script>\n```\n\nBy default the panel is a tear-off — a dotted perforation on its\nleading edge, rounded trailing corners, no shadow. Add\n`match-surface` to lift the trailing edge with the page's surface\nedge shadow, so the flyout reads as a raised peer of the content it\nflies out from while staying attached at the leading perforation:\n\n```html\n<style>\nesp-page.flyout-match-demo {\n --esp-page-max-width: 420px;\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-match-demo\" align=\"center\">\n <esp-flyout slot=\"flyout\" heading=\"More info\" id=\"match-flyout\" match-surface standalone>\n <p>Attached at the perforation, trailing edge raised like the surface.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"toggle-match\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const matchFlyout = findById(\"match-flyout\");\n findById(\"toggle-match\").addEventListener(\"clicked\", () => matchFlyout.toggle());\n</script>\n```\n\nWhen the page has no spare width to claim — a `kind=\"full\"` page,\nor a capped page on a viewport at the cap — the open flyout docks\nas a right sidebar and the content makes room:\n\n```html\n<style>\nesp-page.flyout-docked-demo {\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-docked-demo\" kind=\"full\">\n <esp-flyout slot=\"flyout\" heading=\"Docked\" id=\"docked-flyout\" standalone>\n <p>No gutter to claim, so the content narrows instead.</p>\n </esp-flyout>\n <div>\n <p>A <code>kind=\"full\"</code> page has no canvas gutters at any\n width — the flyout squeezes the main well and never covers it.</p>\n <esp-button id=\"toggle-docked\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const dockedFlyout = findById(\"docked-flyout\");\n findById(\"toggle-docked\").addEventListener(\"clicked\", () => dockedFlyout.toggle());\n</script>\n```\n\nBelow the `50em` viewport threshold every flyout becomes a fixed\noverlay drawer over a vellum — there is no room for a side-by-side\nsplit on a phone. `mode=\"overlay\"` forces that presentation at any\nwidth (try it here; `Escape` or the vellum closes it):\n\n```html\n<style>\nesp-page.flyout-overlay-demo {\n &::part(wrapper) {\n min-height: 160px;\n height: 160px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-overlay-demo\">\n <esp-flyout slot=\"flyout\" heading=\"Overlay drawer\" mode=\"overlay\" id=\"overlay-flyout\" standalone>\n <p>A fixed drawer over a vellum — what every flyout becomes on\n small viewports.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"open-overlay\" label=\"Open overlay flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const overlayFlyout = findById(\"overlay-flyout\");\n findById(\"open-overlay\").addEventListener(\"clicked\", () => overlayFlyout.toggle());\n</script>\n```\n\nComponents that cannot know where the flyout lives can request it\nover the bus with `showFlyout()` — the same pattern `showToast()`\nuses. A second request swaps the content in place; it never\nstacks. Content passed as a string renders as plain text; pass a\n`Node` for rich content. Pass the triggering element as `anchor` to\nalign the in-grid panel with that control and keep both in the same\nscroll flow. If the panel would cross the visible viewport's bottom,\nit shifts up only far enough to fit and returns to its natural trigger\nalignment as the page scrolls. Content taller than the viewport\nscrolls inside the panel. Pass `fullHeight: true` (or set the\n`full-height` attribute) when a reading surface should fill the visible\nblock-size even when its content is short. Overlay drawers stay\nviewport-fixed.\n\nBus requests anchored inside nested pages are presented by the\noutermost containing page's flyout by default. This keeps previews,\nembedded tools, and nested layouts from trapping application-level\nhelp or detail panels. Set `scope=\"nearest\"` on a nested flyout when\nthat page should explicitly own requests originating inside it.\nThe demos above are each driven by their own toggle button, so they\nare marked `standalone` to opt out of the bus entirely.\n\n```html\n<style>\nesp-page.flyout-bus-demo {\n --esp-page-max-width: 420px;\n &::part(wrapper) {\n min-height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n .flyout-demo-copy {\n max-inline-size: 42ch;\n }\n}\n</style>\n<esp-page class=\"flyout-bus-demo\">\n <esp-flyout slot=\"flyout\"></esp-flyout>\n <div>\n <esp-button id=\"show-apples\" label=\"Apples\" collapsed></esp-button>\n <div class=\"flyout-demo-copy\">\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua.</p>\n <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi\n ut aliquip ex ea commodo consequat.</p>\n <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum\n dolore eu fugiat nulla pariatur.</p>\n </div>\n <esp-button id=\"show-pears\" label=\"Pears\" collapsed></esp-button>\n <template id=\"pears-description\">\n <p>Ripen pears at room temperature until the neck yields gently to\n pressure, then refrigerate them to slow further ripening.</p>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer\n nec odio. Praesent libero. Sed cursus ante dapibus diam.</p>\n <p>Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis\n sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper\n porta.</p>\n <p>Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent\n taciti sociosqu ad litora torquent per conubia nostra.</p>\n <p>Curabitur sodales ligula in libero. Sed dignissim lacinia nunc.\n Curabitur tortor. Pellentesque nibh. Aenean quam.</p>\n <p>In scelerisque sem at dolor. Maecenas mattis. Sed convallis\n tristique sem. Proin ut ligula vel nunc egestas porttitor.</p>\n <p>Morbi lectus risus, iaculis vel, suscipit quis, luctus non,\n massa. Fusce ac turpis quis ligula lacinia aliquet.</p>\n <p>Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed,\n euismod in, nibh. Quisque volutpat condimentum velit.</p>\n </template>\n <div class=\"flyout-demo-copy\">\n <p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.</p>\n <p>Curabitur pretium tincidunt lacus. Nulla gravida orci a odio, nullam\n varius, turpis et commodo pharetra.</p>\n </div>\n </div>\n</esp-page>\n<script>\n const applesButton = findById(\"show-apples\");\n applesButton.addEventListener(\"clicked\", () => {\n showFlyout({ heading: \"Apples\", content: \"Crisp. Store cold.\", anchor: applesButton });\n });\n const pearsButton = findById(\"show-pears\");\n const pearsDescription = findById(\"pears-description\");\n pearsButton.addEventListener(\"clicked\", () => {\n showFlyout({\n heading: \"Pears\",\n content: pearsDescription.content.cloneNode(true),\n anchor: pearsButton,\n });\n });\n</script>\n```",
16279
+ "description": "A transient panel for help and more-info content that claims designed spare\nwidth before ever covering the page.\n\nPlace one `esp-flyout` in an `esp-page`'s `flyout` slot. The panel\nlives on the canvas after any persistent preview, outside the content\nsurface. It negotiates between `--esp-page-flyout-min-width` and\n`--esp-page-flyout-max-width`; preview receives flexible room first. The page\ndecides where help goes, from widest viewport to narrowest:\n\n1. **Gutter** — the panel occupies the right canvas gutter. When the\n gutter already has room, it claims existing spare canvas and the\n main content does not move at all, on any alignment.\n2. **Shift** — when the gutter is not quite wide enough, the surface\n slides toward `start` by exactly the shortfall (no more) to free\n the difference.\n3. **Docked sidebar** — once the gutter is gone, the panel competes\n for width with the main well; content narrows but is never\n covered.\n4. **Overlay drawer** — when the complete sidebar + main + help\n minimums do not fit, or below the mobile threshold (`50em`, the\n same one the `esp-menu` drawer uses), the panel becomes a fixed\n drawer over a vellum backdrop. Set `mode=\"overlay\"` to get this\n presentation at every width.\n\nThe panel is styled as a tear-off piece: a dotted perforation on\nits leading edge, rounded trailing corners, and no shadow — all\noverridable through the `--esp-flyout-*` tokens below.\nAn anchored panel shown with preview keeps its caret at the main/preview\nedge and receives a non-interactive dotted bridge across preview from the\npage. A short, thick terminus on the preview/help seam completes that\nconnection; no consumer positioning is required.\n\nA11y follows the presentation. In the in-grid modes (1–3) the\nflyout is a non-modal `complementary` landmark named by its\n`heading`, opening it never steals focus, and boundary scrolling chains\nback to the main document. In the overlay-drawer mode (4) it is a true\nmodal: `role=\"dialog\"` + `aria-modal`, the\nbackground goes inert, scroll is locked, focus moves into the drawer\nand is trapped, and focus is restored on close. `Escape` closes it\nin every mode.\n\n```html\n<style>\nesp-page.flyout-demo {\n --esp-page-main-max-width: 420px;\n --esp-page-canvas-background: var(--esp-color-layer-1);\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-demo\" align=\"center\">\n <esp-flyout slot=\"flyout\" heading=\"More info\" id=\"demo-flyout\" standalone>\n <p>Spare width claimed; the well shifted only enough to make room.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"toggle-flyout\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const flyout = findById(\"demo-flyout\");\n findById(\"toggle-flyout\").addEventListener(\"clicked\", () => flyout.toggle());\n</script>\n```\n\nBy default the panel is a tear-off — a dotted perforation on its\nleading edge, rounded trailing corners, no shadow. Add\n`match-surface` to lift the trailing edge with the page's surface\nedge shadow, so the flyout reads as a raised peer of the content it\nflies out from while staying attached at the leading perforation:\n\n```html\n<style>\nesp-page.flyout-match-demo {\n --esp-page-main-max-width: 420px;\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-match-demo\" align=\"center\">\n <esp-flyout slot=\"flyout\" heading=\"More info\" id=\"match-flyout\" match-surface standalone>\n <p>Attached at the perforation, trailing edge raised like the surface.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"toggle-match\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const matchFlyout = findById(\"match-flyout\");\n findById(\"toggle-match\").addEventListener(\"clicked\", () => matchFlyout.toggle());\n</script>\n```\n\nWhen the page has no spare width to claim — a `kind=\"full\"` page,\nor a capped page on a viewport at the cap — the open flyout docks\nas a right sidebar and the content makes room:\n\n```html\n<style>\nesp-page.flyout-docked-demo {\n &::part(wrapper) {\n min-height: 320px;\n height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-docked-demo\" kind=\"full\">\n <esp-flyout slot=\"flyout\" heading=\"Docked\" id=\"docked-flyout\" standalone>\n <p>No gutter to claim, so the content narrows instead.</p>\n </esp-flyout>\n <div>\n <p>A <code>kind=\"full\"</code> page has no canvas gutters at any\n width — the flyout squeezes the main well and never covers it.</p>\n <esp-button id=\"toggle-docked\" label=\"Toggle flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const dockedFlyout = findById(\"docked-flyout\");\n findById(\"toggle-docked\").addEventListener(\"clicked\", () => dockedFlyout.toggle());\n</script>\n```\n\nBelow the `50em` viewport threshold every flyout becomes a fixed\noverlay drawer over a vellum — there is no room for a side-by-side\nsplit on a phone. `mode=\"overlay\"` forces that presentation at any\nwidth (try it here; `Escape` or the vellum closes it):\n\n```html\n<style>\nesp-page.flyout-overlay-demo {\n &::part(wrapper) {\n min-height: 160px;\n height: 160px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n}\n</style>\n<esp-page class=\"flyout-overlay-demo\">\n <esp-flyout slot=\"flyout\" heading=\"Overlay drawer\" mode=\"overlay\" id=\"overlay-flyout\" standalone>\n <p>A fixed drawer over a vellum — what every flyout becomes on\n small viewports.</p>\n </esp-flyout>\n <div>\n <esp-button id=\"open-overlay\" label=\"Open overlay flyout\" collapsed></esp-button>\n </div>\n</esp-page>\n<script>\n const overlayFlyout = findById(\"overlay-flyout\");\n findById(\"open-overlay\").addEventListener(\"clicked\", () => overlayFlyout.toggle());\n</script>\n```\n\nComponents that cannot know where the flyout lives can request it\nover the bus with `showFlyout()` — the same pattern `showToast()`\nuses. A second request swaps the content in place; it never\nstacks. Content passed as a string renders as plain text; pass a\n`Node` for rich content. Pass the triggering element as `anchor` to\nalign the in-grid panel with that control and keep both in the same\nscroll flow. If the panel would cross the visible viewport's bottom,\nit shifts up only far enough to fit and returns to its natural trigger\nalignment as the page scrolls. Content taller than the viewport\nscrolls inside the panel. Pass `fullHeight: true` (or set the\n`full-height` attribute) when a reading surface should fill the visible\nblock-size even when its content is short. Overlay drawers stay\nviewport-fixed.\n\nBus requests anchored inside nested pages are presented by the\noutermost containing page's flyout by default. This keeps previews,\nembedded tools, and nested layouts from trapping application-level\nhelp or detail panels. Set `scope=\"nearest\"` on a nested flyout when\nthat page should explicitly own requests originating inside it.\nThe demos above are each driven by their own toggle button, so they\nare marked `standalone` to opt out of the bus entirely.\n\n```html\n<style>\nesp-page.flyout-bus-demo {\n --esp-page-max-width: 420px;\n &::part(wrapper) {\n min-height: 320px;\n }\n > div {\n padding: var(--esp-size-padding);\n }\n .flyout-demo-copy {\n max-inline-size: 42ch;\n }\n}\n</style>\n<esp-page class=\"flyout-bus-demo\">\n <esp-flyout slot=\"flyout\"></esp-flyout>\n <div>\n <esp-button id=\"show-apples\" label=\"Apples\" collapsed></esp-button>\n <div class=\"flyout-demo-copy\">\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua.</p>\n <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi\n ut aliquip ex ea commodo consequat.</p>\n <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum\n dolore eu fugiat nulla pariatur.</p>\n </div>\n <esp-button id=\"show-pears\" label=\"Pears\" collapsed></esp-button>\n <template id=\"pears-description\">\n <p>Ripen pears at room temperature until the neck yields gently to\n pressure, then refrigerate them to slow further ripening.</p>\n <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer\n nec odio. Praesent libero. Sed cursus ante dapibus diam.</p>\n <p>Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis\n sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper\n porta.</p>\n <p>Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent\n taciti sociosqu ad litora torquent per conubia nostra.</p>\n <p>Curabitur sodales ligula in libero. Sed dignissim lacinia nunc.\n Curabitur tortor. Pellentesque nibh. Aenean quam.</p>\n <p>In scelerisque sem at dolor. Maecenas mattis. Sed convallis\n tristique sem. Proin ut ligula vel nunc egestas porttitor.</p>\n <p>Morbi lectus risus, iaculis vel, suscipit quis, luctus non,\n massa. Fusce ac turpis quis ligula lacinia aliquet.</p>\n <p>Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed,\n euismod in, nibh. Quisque volutpat condimentum velit.</p>\n </template>\n <div class=\"flyout-demo-copy\">\n <p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.</p>\n <p>Curabitur pretium tincidunt lacus. Nulla gravida orci a odio, nullam\n varius, turpis et commodo pharetra.</p>\n </div>\n </div>\n</esp-page>\n<script>\n const applesButton = findById(\"show-apples\");\n applesButton.addEventListener(\"clicked\", () => {\n showFlyout({ heading: \"Apples\", content: \"Crisp. Store cold.\", anchor: applesButton });\n });\n const pearsButton = findById(\"show-pears\");\n const pearsDescription = findById(\"pears-description\");\n pearsButton.addEventListener(\"clicked\", () => {\n showFlyout({\n heading: \"Pears\",\n content: pearsDescription.content.cloneNode(true),\n anchor: pearsButton,\n });\n });\n</script>\n```",
16280
16280
  "name": "EspalierFlyout",
16281
16281
  "cssProperties": [
16282
16282
  {
@@ -16412,7 +16412,7 @@
16412
16412
  },
16413
16413
  "privacy": "public",
16414
16414
  "default": "\"auto\"",
16415
- "description": "Placement behavior.\n\n- `\"auto\"` (default) — the page's placement ladder: gutter,\n docked sidebar, then overlay drawer below the `50em` viewport\n threshold.\n- `\"overlay\"` — always the fixed overlay drawer, at any width.\n The page never reserves a grid track for an overlay-mode\n flyout.",
16415
+ "description": "Placement behavior.\n\n- `\"auto\"` (default) — the page's placement ladder: gutter,\n docked sidebar, then overlay drawer when the complete in-grid\n minimums do not fit or below the `50em` viewport threshold.\n- `\"overlay\"` — always the fixed overlay drawer, at any width.\n The page never reserves a grid track for an overlay-mode\n flyout.",
16416
16416
  "attribute": "mode",
16417
16417
  "reflects": true
16418
16418
  },
@@ -17467,7 +17467,7 @@
17467
17467
  "text": "\"auto\" | \"overlay\""
17468
17468
  },
17469
17469
  "default": "\"auto\"",
17470
- "description": "Placement behavior.\n\n- `\"auto\"` (default) — the page's placement ladder: gutter,\n docked sidebar, then overlay drawer below the `50em` viewport\n threshold.\n- `\"overlay\"` — always the fixed overlay drawer, at any width.\n The page never reserves a grid track for an overlay-mode\n flyout.",
17470
+ "description": "Placement behavior.\n\n- `\"auto\"` (default) — the page's placement ladder: gutter,\n docked sidebar, then overlay drawer when the complete in-grid\n minimums do not fit or below the `50em` viewport threshold.\n- `\"overlay\"` — always the fixed overlay drawer, at any width.\n The page never reserves a grid track for an overlay-mode\n flyout.",
17471
17471
  "fieldName": "mode"
17472
17472
  },
17473
17473
  {
@@ -39937,6 +39937,14 @@
39937
39937
  "privacy": "private",
39938
39938
  "default": "null"
39939
39939
  },
39940
+ {
39941
+ "kind": "field",
39942
+ "name": "topOffsetOverride",
39943
+ "type": {
39944
+ "text": "() => number | undefined | undefined"
39945
+ },
39946
+ "privacy": "private"
39947
+ },
39940
39948
  {
39941
39949
  "kind": "field",
39942
39950
  "name": "_pendingSetup",
@@ -40025,7 +40033,15 @@
40025
40033
  "name": "--esp-page-background"
40026
40034
  },
40027
40035
  {
40028
- "description": "The maximum width of the main content well. Set automatically by the `kind` attribute: `1536px` (wide), `768px` (narrow), or `none` (full). This cap now sizes the main grid track; surplus width beyond it becomes the canvas gutters.",
40036
+ "description": "Minimum width of the main content well while preview or in-grid help competes for space. Defaults to `30rem`.",
40037
+ "name": "--esp-page-main-min-width"
40038
+ },
40039
+ {
40040
+ "description": "Maximum width of the main content well. Defaults from `kind`: `1536px` (wide), `768px` (narrow), or unbounded (full). Surplus width beyond it becomes canvas gutters.",
40041
+ "name": "--esp-page-main-max-width"
40042
+ },
40043
+ {
40044
+ "description": "Legacy fallback for `--esp-page-main-max-width`.",
40029
40045
  "name": "--esp-page-max-width"
40030
40046
  },
40031
40047
  {
@@ -40061,9 +40077,45 @@
40061
40077
  "name": "--esp-page-main-background"
40062
40078
  },
40063
40079
  {
40064
- "description": "The width of the open flyout track (and of the `esp-flyout` overlay drawer). Defaults to `20rem`.",
40080
+ "description": "Background of the persistent preview surface. Defaults to the main background, then the page background.",
40081
+ "name": "--esp-page-preview-background"
40082
+ },
40083
+ {
40084
+ "description": "Leading tear-off edge between main and preview. Defaults to `1px dotted var(--esp-color-border)`.",
40085
+ "name": "--esp-page-preview-border"
40086
+ },
40087
+ {
40088
+ "description": "Shadow cast from the preview's trailing edge. Defaults to the page surface edge shadow. Set to `none` for a flat additive surface.",
40089
+ "name": "--esp-page-preview-shadow"
40090
+ },
40091
+ {
40092
+ "description": "Minimum preview width. Defaults to `22.5rem` (360px, a reasonable mobile-device surface).",
40093
+ "name": "--esp-page-preview-min-width"
40094
+ },
40095
+ {
40096
+ "description": "Maximum preview width. Defaults to `48rem`. Preview receives flexible trailing space before help grows.",
40097
+ "name": "--esp-page-preview-max-width"
40098
+ },
40099
+ {
40100
+ "description": "Minimum in-grid help width. Defaults to `20rem`.",
40101
+ "name": "--esp-page-flyout-min-width"
40102
+ },
40103
+ {
40104
+ "description": "Maximum help width and overlay drawer cap before the `85vw` viewport cap. Defaults to `30rem`.",
40105
+ "name": "--esp-page-flyout-max-width"
40106
+ },
40107
+ {
40108
+ "description": "Legacy fixed-width alias that pins both preview bounds.",
40109
+ "name": "--esp-page-preview-width"
40110
+ },
40111
+ {
40112
+ "description": "Legacy fixed-width alias that pins both help bounds.",
40065
40113
  "name": "--esp-page-flyout-width"
40066
40114
  },
40115
+ {
40116
+ "description": "Legacy fallback for `--esp-page-main-min-width`.",
40117
+ "name": "--esp-page-preview-min-main-width"
40118
+ },
40067
40119
  {
40068
40120
  "description": "Offset reserved for fixed headers. Defaults to `var(--esp-header-height)`.",
40069
40121
  "name": "--esp-page-fixed-header-offset"
@@ -40143,13 +40195,21 @@
40143
40195
  "name": "canvas"
40144
40196
  },
40145
40197
  {
40146
- "description": "The surface backdrop carrying the edge shadow/border. ```html <style> esp-page.with-background { --esp-page-background-image: url(/assets/espalier-paper-texture.png); --esp-page-background-image-opacity: .5; } </style> <esp-page class=\"docs with-background\"> <div slot=\"header\" style=\"background-color: red;\">header</div> <div slot=\"sidebar\" style=\"background-color: green;\">sidebar</div> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"overflow: hidden;\"> <h2>With background image</h2> </div> </esp-page> ``` Use `align` to place the surface within the page once it hits its cap, and the canvas tokens to style the gutters. A low `--esp-page-max-width` is set here only so the gutters are visible inside the narrow demo frame; the surface edge shadow is on by default. ```html <style> esp-page.align-demo { --esp-page-max-width: 520px; --esp-page-canvas-background: var(--esp-color-layer-1); } </style> <esp-page class=\"docs align-demo\" align=\"center\"> <div slot=\"header\" style=\"background-color: red;\">header</div> <div slot=\"sidebar\" style=\"background-color: green;\">sidebar</div> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ```",
40198
+ "description": "The surface backdrop carrying the edge shadow/border.",
40147
40199
  "name": "surface"
40200
+ },
40201
+ {
40202
+ "description": "The persistent preview complementary landmark.",
40203
+ "name": "preview"
40204
+ },
40205
+ {
40206
+ "description": "The sticky wrapper around preview content. ```html <style> esp-page.with-background { --esp-page-background-image: url(/assets/espalier-paper-texture.png); --esp-page-background-image-opacity: .5; } </style> <esp-page class=\"docs with-background\"> <div slot=\"header\" style=\"background-color: red;\">header</div> <div slot=\"sidebar\" style=\"background-color: green;\">sidebar</div> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"overflow: hidden;\"> <h2>With background image</h2> </div> </esp-page> ``` Use `align` to place the surface within the page once it hits its cap, and the canvas tokens to style the gutters. A low `--esp-page-max-width` is set here only so the gutters are visible inside the narrow demo frame; the surface edge shadow is on by default. ```html <style> esp-page.align-demo { --esp-page-max-width: 520px; --esp-page-canvas-background: var(--esp-color-layer-1); } </style> <esp-page class=\"docs align-demo\" align=\"center\"> <div slot=\"header\" style=\"background-color: red;\">header</div> <div slot=\"sidebar\" style=\"background-color: green;\">sidebar</div> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ```",
40207
+ "name": "preview-content"
40148
40208
  }
40149
40209
  ],
40150
40210
  "slots": [
40151
40211
  {
40152
- "description": "Global navigation content (typically an `esp-header`). ```html <esp-page class=\"docs\"> <esp-header slot=\"header\"> <a href=\"#\" slot=\"brand\" class=\"nav-logo\"> <svg> <use href=\"/assets/icons.svg#taproot-logo\" /> </svg> </a> <esp-menu slot=\"menu\" mode=\"horizontal\"> <esp-menu-item label=\"Mammals\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Reptiles\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Amphibians\" url=\"#\"></esp-menu-item> </esp-menu> <esp-header-button slot=\"buttons\" icon=\"cog\" aria-label=\"Settings\"></esp-header-button> </esp-header> <esp-menu slot=\"sidebar\" mode=\"drawer\"></esp-menu> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ```",
40212
+ "description": "Global navigation content (typically an `esp-header`). ```html <esp-page class=\"docs\"> <esp-header slot=\"header\"> <a href=\"#\" slot=\"brand\" class=\"nav-logo\"> <svg> <use href=\"/assets/icons.svg#taproot-logo\" /> </svg> </a> <esp-menu slot=\"menu\" mode=\"horizontal\"> <esp-menu-item label=\"Mammals\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Reptiles\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Amphibians\" url=\"#\"></esp-menu-item> </esp-menu> <esp-header-button slot=\"buttons\" icon=\"cog\" aria-label=\"Settings\"></esp-header-button> </esp-header> <esp-menu slot=\"sidebar\" mode=\"drawer\"></esp-menu> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ``` The authoring workspace is ordered main, preview, then help. Each region negotiates between public minimum and maximum widths; preview grows first, then help. Opt into collapsing a directly paired header/sidebar navigation to its accessible burger/drawer mode when the combined workspace needs it.",
40153
40213
  "name": "header"
40154
40214
  },
40155
40215
  {
@@ -40161,7 +40221,11 @@
40161
40221
  "name": "right"
40162
40222
  },
40163
40223
  {
40164
- "description": "A transient `esp-flyout` panel that lives on the canvas, outside the content surface. Closed it costs no width; open it claims the right canvas gutter first — the surface keeps its alignment weighting and shifts only as far as the flyout's width requires — then docks as a width-competing right sidebar when no gutter exists, and becomes an overlay drawer on small viewports. The persistent `right` aside and the transient flyout are complementary, not alternatives. A flyout opened with an `anchor` aligns to that trigger and stays in the same document scroll flow.",
40224
+ "description": "Persistent preview content placed after the main surface and before help. It grows from `--esp-page-preview-min-width` to `--esp-page-preview-max-width`, starts at viewport top, and gives its content an independent `100dvh` vertical scroller. At either scroll boundary, wheel and trackpad motion chains back to the main document. Unlike flyout content, preview content is never replaced by the flyout request bus.",
40225
+ "name": "preview"
40226
+ },
40227
+ {
40228
+ "description": "A transient `esp-flyout` panel that lives on the canvas after preview. Closed it costs no width; open it grows from `--esp-page-flyout-min-width` to `--esp-page-flyout-max-width` after preview receives flexible space, then docks as a width-competing right sidebar when no gutter exists, and becomes an overlay drawer on small viewports. The persistent `right` aside and the transient flyout are complementary, not alternatives. A flyout opened with an `anchor` aligns to that trigger and stays in the same document scroll flow. When a preview is visible, its caret and non-interactive dotted bridge cross the preview back to the anchor, ending at a short thick marker on the preview/help seam.",
40165
40229
  "name": "flyout"
40166
40230
  },
40167
40231
  {
@@ -40189,6 +40253,152 @@
40189
40253
  "name": "footerSlot",
40190
40254
  "privacy": "private"
40191
40255
  },
40256
+ {
40257
+ "kind": "field",
40258
+ "name": "previewSlot",
40259
+ "privacy": "private"
40260
+ },
40261
+ {
40262
+ "kind": "field",
40263
+ "name": "previewSpace",
40264
+ "privacy": "private"
40265
+ },
40266
+ {
40267
+ "kind": "field",
40268
+ "name": "previewMinWidthProbe",
40269
+ "privacy": "private"
40270
+ },
40271
+ {
40272
+ "kind": "field",
40273
+ "name": "previewMaxWidthProbe",
40274
+ "privacy": "private"
40275
+ },
40276
+ {
40277
+ "kind": "field",
40278
+ "name": "flyoutMinWidthProbe",
40279
+ "privacy": "private"
40280
+ },
40281
+ {
40282
+ "kind": "field",
40283
+ "name": "flyoutMaxWidthProbe",
40284
+ "privacy": "private"
40285
+ },
40286
+ {
40287
+ "kind": "field",
40288
+ "name": "mainMinWidthProbe",
40289
+ "privacy": "private"
40290
+ },
40291
+ {
40292
+ "kind": "field",
40293
+ "name": "previewResizeObserver",
40294
+ "type": {
40295
+ "text": "ResizeObserver | undefined"
40296
+ },
40297
+ "privacy": "private"
40298
+ },
40299
+ {
40300
+ "kind": "field",
40301
+ "name": "previewObservedWidths",
40302
+ "privacy": "private",
40303
+ "default": "new WeakMap<Element, number>()"
40304
+ },
40305
+ {
40306
+ "kind": "field",
40307
+ "name": "previewMediaQuery",
40308
+ "type": {
40309
+ "text": "MediaQueryList | undefined"
40310
+ },
40311
+ "privacy": "private"
40312
+ },
40313
+ {
40314
+ "kind": "field",
40315
+ "name": "previewSyncRaf",
40316
+ "type": {
40317
+ "text": "number | null"
40318
+ },
40319
+ "privacy": "private",
40320
+ "default": "null"
40321
+ },
40322
+ {
40323
+ "kind": "field",
40324
+ "name": "previewSyncGeneration",
40325
+ "type": {
40326
+ "text": "number"
40327
+ },
40328
+ "privacy": "private",
40329
+ "default": "0"
40330
+ },
40331
+ {
40332
+ "kind": "field",
40333
+ "name": "previewSyncTask",
40334
+ "type": {
40335
+ "text": "Promise<void>"
40336
+ },
40337
+ "privacy": "private"
40338
+ },
40339
+ {
40340
+ "kind": "field",
40341
+ "name": "previewOverlayRecoveryRequested",
40342
+ "type": {
40343
+ "text": "boolean"
40344
+ },
40345
+ "privacy": "private",
40346
+ "default": "false"
40347
+ },
40348
+ {
40349
+ "kind": "field",
40350
+ "name": "previewHeader",
40351
+ "type": {
40352
+ "text": "PreviewCompactHeader | null"
40353
+ },
40354
+ "privacy": "private",
40355
+ "default": "null"
40356
+ },
40357
+ {
40358
+ "kind": "field",
40359
+ "name": "previewMenu",
40360
+ "type": {
40361
+ "text": "PreviewCompactMenu | null"
40362
+ },
40363
+ "privacy": "private",
40364
+ "default": "null"
40365
+ },
40366
+ {
40367
+ "kind": "field",
40368
+ "name": "previewCollapsedSidebarWidth",
40369
+ "type": {
40370
+ "text": "number"
40371
+ },
40372
+ "privacy": "private",
40373
+ "default": "0"
40374
+ },
40375
+ {
40376
+ "kind": "field",
40377
+ "name": "flyoutOverlayPromotionWidth",
40378
+ "type": {
40379
+ "text": "number | null"
40380
+ },
40381
+ "privacy": "private",
40382
+ "default": "null"
40383
+ },
40384
+ {
40385
+ "kind": "field",
40386
+ "name": "flyoutOverlayRecoveryReady",
40387
+ "type": {
40388
+ "text": "boolean"
40389
+ },
40390
+ "privacy": "private",
40391
+ "default": "false"
40392
+ },
40393
+ {
40394
+ "kind": "field",
40395
+ "name": "flyoutOverlayRecoveryGeneration",
40396
+ "type": {
40397
+ "text": "number"
40398
+ },
40399
+ "privacy": "private",
40400
+ "default": "0"
40401
+ },
40192
40402
  {
40193
40403
  "kind": "field",
40194
40404
  "name": "footerWrapperIsLandmark",
@@ -40218,6 +40428,559 @@
40218
40428
  ],
40219
40429
  "description": "Mirror the slotted flyout's open, overlay, and anchor state onto\nhost attributes read by the grid CSS. State is recomputed from the\nslot so multiple flyouts and slot changes stay correct."
40220
40430
  },
40431
+ {
40432
+ "kind": "method",
40433
+ "name": "syncDescendantFlyoutOverlayState",
40434
+ "privacy": "private",
40435
+ "return": {
40436
+ "type": {
40437
+ "text": "void"
40438
+ }
40439
+ },
40440
+ "description": "A modal flyout owned by a nested page cannot escape this page's main\nstacking context. Mirror that descendant state so the containing main\nregion rises above this page's header while the drawer is open."
40441
+ },
40442
+ {
40443
+ "kind": "method",
40444
+ "name": "assignedFlyouts",
40445
+ "privacy": "private",
40446
+ "return": {
40447
+ "type": {
40448
+ "text": "PageManagedFlyout[]"
40449
+ }
40450
+ }
40451
+ },
40452
+ {
40453
+ "kind": "method",
40454
+ "name": "openAutoFlyouts",
40455
+ "privacy": "private",
40456
+ "return": {
40457
+ "type": {
40458
+ "text": "PageManagedFlyout[]"
40459
+ }
40460
+ }
40461
+ },
40462
+ {
40463
+ "kind": "method",
40464
+ "name": "setPageFlyoutOverlay",
40465
+ "privacy": "private",
40466
+ "return": {
40467
+ "type": {
40468
+ "text": "Promise<boolean>"
40469
+ }
40470
+ },
40471
+ "parameters": [
40472
+ {
40473
+ "name": "requested",
40474
+ "type": {
40475
+ "text": "boolean"
40476
+ }
40477
+ }
40478
+ ]
40479
+ },
40480
+ {
40481
+ "kind": "method",
40482
+ "name": "clearFlyoutOverlayRecovery",
40483
+ "privacy": "private",
40484
+ "return": {
40485
+ "type": {
40486
+ "text": "void"
40487
+ }
40488
+ }
40489
+ },
40490
+ {
40491
+ "kind": "method",
40492
+ "name": "armFlyoutOverlayRecovery",
40493
+ "privacy": "private",
40494
+ "return": {
40495
+ "type": {
40496
+ "text": "void"
40497
+ }
40498
+ }
40499
+ },
40500
+ {
40501
+ "kind": "method",
40502
+ "name": "previewHasContent",
40503
+ "privacy": "private",
40504
+ "return": {
40505
+ "type": {
40506
+ "text": "boolean"
40507
+ }
40508
+ }
40509
+ },
40510
+ {
40511
+ "kind": "method",
40512
+ "name": "getPreviewNavigationPair",
40513
+ "privacy": "private",
40514
+ "return": {
40515
+ "type": {
40516
+ "text": "{\n header: PreviewCompactHeader;\n menu: PreviewCompactMenu;\n } | null"
40517
+ }
40518
+ }
40519
+ },
40520
+ {
40521
+ "kind": "method",
40522
+ "name": "setPreviewNavigationCollapse",
40523
+ "privacy": "private",
40524
+ "return": {
40525
+ "type": {
40526
+ "text": "Promise<boolean>"
40527
+ }
40528
+ },
40529
+ "parameters": [
40530
+ {
40531
+ "name": "requested",
40532
+ "type": {
40533
+ "text": "boolean"
40534
+ }
40535
+ }
40536
+ ]
40537
+ },
40538
+ {
40539
+ "kind": "method",
40540
+ "name": "setPreviewLayoutState",
40541
+ "privacy": "private",
40542
+ "return": {
40543
+ "type": {
40544
+ "text": "void"
40545
+ }
40546
+ },
40547
+ "parameters": [
40548
+ {
40549
+ "name": "visible",
40550
+ "type": {
40551
+ "text": "boolean"
40552
+ }
40553
+ },
40554
+ {
40555
+ "name": "reclaiming",
40556
+ "type": {
40557
+ "text": "boolean"
40558
+ }
40559
+ }
40560
+ ]
40561
+ },
40562
+ {
40563
+ "kind": "method",
40564
+ "name": "setWorkspaceWidths",
40565
+ "privacy": "private",
40566
+ "return": {
40567
+ "type": {
40568
+ "text": "void"
40569
+ }
40570
+ },
40571
+ "parameters": [
40572
+ {
40573
+ "name": "previewWidth",
40574
+ "type": {
40575
+ "text": "number"
40576
+ }
40577
+ },
40578
+ {
40579
+ "name": "flyoutWidth",
40580
+ "type": {
40581
+ "text": "number"
40582
+ }
40583
+ }
40584
+ ]
40585
+ },
40586
+ {
40587
+ "kind": "method",
40588
+ "name": "visiblePageInlineBounds",
40589
+ "privacy": "private",
40590
+ "return": {
40591
+ "type": {
40592
+ "text": "{ left: number; right: number; width: number }"
40593
+ }
40594
+ }
40595
+ },
40596
+ {
40597
+ "kind": "method",
40598
+ "name": "visibleSpaceWidth",
40599
+ "privacy": "private",
40600
+ "return": {
40601
+ "type": {
40602
+ "text": "number"
40603
+ }
40604
+ },
40605
+ "description": "The gutter's layout box can extend past the visible page bounds — most\ncommonly a page laid out wider than the visual viewport beside a classic\nscrollbar. Allocation must draw from the same visible geometry the fit\nchecks validate against, or a scrollbar-sized overhang makes the\nallocated widths permanently unfittable and help is promoted to a modal\ndrawer over a sliver of hidden canvas."
40606
+ },
40607
+ {
40608
+ "kind": "method",
40609
+ "name": "probeWidth",
40610
+ "privacy": "private",
40611
+ "return": {
40612
+ "type": {
40613
+ "text": "number"
40614
+ }
40615
+ },
40616
+ "parameters": [
40617
+ {
40618
+ "name": "probe",
40619
+ "type": {
40620
+ "text": "ReturnType<typeof createRef<HTMLDivElement>>"
40621
+ }
40622
+ }
40623
+ ]
40624
+ },
40625
+ {
40626
+ "kind": "method",
40627
+ "name": "allocateWorkspaceWidths",
40628
+ "privacy": "private",
40629
+ "return": {
40630
+ "type": {
40631
+ "text": "{ previewWidth: number; flyoutWidth: number }"
40632
+ }
40633
+ },
40634
+ "parameters": [
40635
+ {
40636
+ "name": "availableWidth",
40637
+ "type": {
40638
+ "text": "number"
40639
+ }
40640
+ },
40641
+ {
40642
+ "name": "previewRequested",
40643
+ "type": {
40644
+ "text": "boolean"
40645
+ }
40646
+ },
40647
+ {
40648
+ "name": "flyoutOpen",
40649
+ "type": {
40650
+ "text": "boolean"
40651
+ }
40652
+ },
40653
+ {
40654
+ "name": "previewMinWidth",
40655
+ "type": {
40656
+ "text": "number"
40657
+ }
40658
+ },
40659
+ {
40660
+ "name": "previewMaxWidth",
40661
+ "type": {
40662
+ "text": "number"
40663
+ }
40664
+ },
40665
+ {
40666
+ "name": "flyoutMinWidth",
40667
+ "type": {
40668
+ "text": "number"
40669
+ }
40670
+ },
40671
+ {
40672
+ "name": "flyoutMaxWidth",
40673
+ "type": {
40674
+ "text": "number"
40675
+ }
40676
+ }
40677
+ ]
40678
+ },
40679
+ {
40680
+ "kind": "method",
40681
+ "name": "previewFitsWithinPage",
40682
+ "privacy": "private",
40683
+ "return": {
40684
+ "type": {
40685
+ "text": "boolean"
40686
+ }
40687
+ },
40688
+ "parameters": [
40689
+ {
40690
+ "name": "minMainWidth",
40691
+ "type": {
40692
+ "text": "number"
40693
+ }
40694
+ },
40695
+ {
40696
+ "name": "previewMinWidth",
40697
+ "type": {
40698
+ "text": "number"
40699
+ }
40700
+ },
40701
+ {
40702
+ "name": "previewMaxWidth",
40703
+ "type": {
40704
+ "text": "number"
40705
+ }
40706
+ },
40707
+ {
40708
+ "name": "flyoutOpen",
40709
+ "type": {
40710
+ "text": "boolean"
40711
+ }
40712
+ },
40713
+ {
40714
+ "name": "flyoutMinWidth",
40715
+ "type": {
40716
+ "text": "number"
40717
+ }
40718
+ },
40719
+ {
40720
+ "name": "flyoutMaxWidth",
40721
+ "type": {
40722
+ "text": "number"
40723
+ }
40724
+ }
40725
+ ]
40726
+ },
40727
+ {
40728
+ "kind": "method",
40729
+ "name": "flyoutFitsWithinPage",
40730
+ "privacy": "private",
40731
+ "return": {
40732
+ "type": {
40733
+ "text": "boolean"
40734
+ }
40735
+ },
40736
+ "parameters": [
40737
+ {
40738
+ "name": "minMainWidth",
40739
+ "type": {
40740
+ "text": "number"
40741
+ }
40742
+ },
40743
+ {
40744
+ "name": "flyoutMinWidth",
40745
+ "type": {
40746
+ "text": "number"
40747
+ }
40748
+ },
40749
+ {
40750
+ "name": "flyoutMaxWidth",
40751
+ "type": {
40752
+ "text": "number"
40753
+ }
40754
+ }
40755
+ ]
40756
+ },
40757
+ {
40758
+ "kind": "method",
40759
+ "name": "workspaceMinimumsCanFit",
40760
+ "privacy": "private",
40761
+ "return": {
40762
+ "type": {
40763
+ "text": "boolean"
40764
+ }
40765
+ },
40766
+ "parameters": [
40767
+ {
40768
+ "name": "minMainWidth",
40769
+ "type": {
40770
+ "text": "number"
40771
+ }
40772
+ },
40773
+ {
40774
+ "name": "previewRequested",
40775
+ "type": {
40776
+ "text": "boolean"
40777
+ }
40778
+ },
40779
+ {
40780
+ "name": "previewMinWidth",
40781
+ "type": {
40782
+ "text": "number"
40783
+ }
40784
+ },
40785
+ {
40786
+ "name": "flyoutRequested",
40787
+ "type": {
40788
+ "text": "boolean"
40789
+ }
40790
+ },
40791
+ {
40792
+ "name": "flyoutMinWidth",
40793
+ "type": {
40794
+ "text": "number"
40795
+ }
40796
+ }
40797
+ ]
40798
+ },
40799
+ {
40800
+ "kind": "method",
40801
+ "name": "workspaceGeometrySample",
40802
+ "privacy": "private",
40803
+ "return": {
40804
+ "type": {
40805
+ "text": "number[]"
40806
+ }
40807
+ }
40808
+ },
40809
+ {
40810
+ "kind": "method",
40811
+ "name": "workspaceGeometryMatches",
40812
+ "privacy": "private",
40813
+ "return": {
40814
+ "type": {
40815
+ "text": "boolean"
40816
+ }
40817
+ },
40818
+ "parameters": [
40819
+ {
40820
+ "name": "left",
40821
+ "type": {
40822
+ "text": "number[]"
40823
+ }
40824
+ },
40825
+ {
40826
+ "name": "right",
40827
+ "type": {
40828
+ "text": "number[]"
40829
+ }
40830
+ }
40831
+ ]
40832
+ },
40833
+ {
40834
+ "kind": "method",
40835
+ "name": "workspaceCandidateIsMeasurable",
40836
+ "privacy": "private",
40837
+ "return": {
40838
+ "type": {
40839
+ "text": "boolean"
40840
+ }
40841
+ },
40842
+ "parameters": [
40843
+ {
40844
+ "name": "previewRequested",
40845
+ "type": {
40846
+ "text": "boolean"
40847
+ }
40848
+ },
40849
+ {
40850
+ "name": "flyoutRequested",
40851
+ "type": {
40852
+ "text": "boolean"
40853
+ }
40854
+ }
40855
+ ]
40856
+ },
40857
+ {
40858
+ "kind": "method",
40859
+ "name": "candidateFitsAfterLayoutSettles",
40860
+ "privacy": "private",
40861
+ "return": {
40862
+ "type": {
40863
+ "text": "Promise<boolean | null>"
40864
+ }
40865
+ },
40866
+ "parameters": [
40867
+ {
40868
+ "name": "generation",
40869
+ "type": {
40870
+ "text": "number"
40871
+ }
40872
+ },
40873
+ {
40874
+ "name": "fits",
40875
+ "type": {
40876
+ "text": "() => boolean"
40877
+ }
40878
+ },
40879
+ {
40880
+ "name": "isMeasurable",
40881
+ "type": {
40882
+ "text": "() => boolean"
40883
+ }
40884
+ }
40885
+ ],
40886
+ "description": "Validate one mounted candidate rather than scheduling a new negotiation\npass. A new pass starts by removing preview and zeroing its tracks, which\nmade the old retry repeatedly measure its own teardown on slower browsers.\nLit reflection is completed first; valid geometry returns immediately,\nwhile invalid geometry must remain unchanged across several rendered\nframes before it can request the overlay fallback."
40887
+ },
40888
+ {
40889
+ "kind": "method",
40890
+ "name": "promoteFlyoutIfClipped",
40891
+ "privacy": "private",
40892
+ "return": {
40893
+ "type": {
40894
+ "text": "Promise<boolean>"
40895
+ }
40896
+ },
40897
+ "parameters": [
40898
+ {
40899
+ "name": "generation",
40900
+ "type": {
40901
+ "text": "number"
40902
+ }
40903
+ },
40904
+ {
40905
+ "name": "minMainWidth",
40906
+ "type": {
40907
+ "text": "number"
40908
+ }
40909
+ },
40910
+ {
40911
+ "name": "flyoutMinWidth",
40912
+ "type": {
40913
+ "text": "number"
40914
+ }
40915
+ },
40916
+ {
40917
+ "name": "flyoutMaxWidth",
40918
+ "type": {
40919
+ "text": "number"
40920
+ }
40921
+ }
40922
+ ]
40923
+ },
40924
+ {
40925
+ "kind": "method",
40926
+ "name": "promoteFlyoutToOverlay",
40927
+ "privacy": "private",
40928
+ "return": {
40929
+ "type": {
40930
+ "text": "Promise<void>"
40931
+ }
40932
+ }
40933
+ },
40934
+ {
40935
+ "kind": "method",
40936
+ "name": "syncPreviewLayout",
40937
+ "privacy": "private",
40938
+ "return": {
40939
+ "type": {
40940
+ "text": "Promise<void>"
40941
+ }
40942
+ },
40943
+ "parameters": [
40944
+ {
40945
+ "name": "generation",
40946
+ "type": {
40947
+ "text": "number"
40948
+ }
40949
+ },
40950
+ {
40951
+ "name": "allowOverlayRecovery",
40952
+ "default": "true"
40953
+ }
40954
+ ]
40955
+ },
40956
+ {
40957
+ "kind": "field",
40958
+ "name": "schedulePreviewLayout",
40959
+ "privacy": "private"
40960
+ },
40961
+ {
40962
+ "kind": "field",
40963
+ "name": "onPreviewMediaChange",
40964
+ "privacy": "private"
40965
+ },
40966
+ {
40967
+ "kind": "field",
40968
+ "name": "onPreviewResize",
40969
+ "type": {
40970
+ "text": "ResizeObserverCallback"
40971
+ },
40972
+ "privacy": "private"
40973
+ },
40974
+ {
40975
+ "kind": "method",
40976
+ "name": "setupPreviewLayoutObserver",
40977
+ "privacy": "private",
40978
+ "return": {
40979
+ "type": {
40980
+ "text": "void"
40981
+ }
40982
+ }
40983
+ },
40221
40984
  {
40222
40985
  "kind": "method",
40223
40986
  "name": "footerElementProvidesLandmark",
@@ -40307,6 +41070,99 @@
40307
41070
  "attribute": "fixed-menus",
40308
41071
  "reflects": true
40309
41072
  },
41073
+ {
41074
+ "kind": "field",
41075
+ "name": "previewOpen",
41076
+ "type": {
41077
+ "text": "boolean"
41078
+ },
41079
+ "privacy": "public",
41080
+ "default": "false",
41081
+ "description": "Whether the persistent preview is logically open. The page may keep the\npreview hidden while space is unavailable; `preview-visible` reflects its\nactual presentation and the preview restores automatically when room returns.",
41082
+ "attribute": "preview-open",
41083
+ "reflects": true
41084
+ },
41085
+ {
41086
+ "kind": "field",
41087
+ "name": "previewLabel",
41088
+ "type": {
41089
+ "text": "string"
41090
+ },
41091
+ "privacy": "public",
41092
+ "default": "\"Preview\"",
41093
+ "description": "Accessible name for the preview's complementary landmark.",
41094
+ "attribute": "preview-label",
41095
+ "reflects": true
41096
+ },
41097
+ {
41098
+ "kind": "field",
41099
+ "name": "previewCollapseSidebar",
41100
+ "type": {
41101
+ "text": "boolean"
41102
+ },
41103
+ "privacy": "public",
41104
+ "default": "false",
41105
+ "description": "Allow a directly slotted, safely linked vertical menu/header pair to\ncollapse to its burger/drawer presentation when preview needs more room.",
41106
+ "attribute": "preview-collapse-sidebar",
41107
+ "reflects": true
41108
+ },
41109
+ {
41110
+ "kind": "field",
41111
+ "name": "previewVisible",
41112
+ "type": {
41113
+ "text": "boolean"
41114
+ },
41115
+ "privacy": "public",
41116
+ "default": "false",
41117
+ "description": "Whether preview content is currently rendered. Managed by the page's\nspace negotiation; consumers should treat this reflected property as read-only.",
41118
+ "attribute": "preview-visible",
41119
+ "reflects": true
41120
+ },
41121
+ {
41122
+ "kind": "field",
41123
+ "name": "previewReclaiming",
41124
+ "type": {
41125
+ "text": "boolean"
41126
+ },
41127
+ "privacy": "public",
41128
+ "default": "false",
41129
+ "description": "Whether preview is currently reserving width and allowing the main well\nto shrink toward `--esp-page-main-min-width`. Managed by the page.",
41130
+ "attribute": "preview-reclaiming",
41131
+ "reflects": true
41132
+ },
41133
+ {
41134
+ "kind": "method",
41135
+ "name": "showPreview",
41136
+ "privacy": "public",
41137
+ "return": {
41138
+ "type": {
41139
+ "text": "void"
41140
+ }
41141
+ },
41142
+ "description": "Request the persistent preview without moving focus."
41143
+ },
41144
+ {
41145
+ "kind": "method",
41146
+ "name": "closePreview",
41147
+ "privacy": "public",
41148
+ "return": {
41149
+ "type": {
41150
+ "text": "void"
41151
+ }
41152
+ },
41153
+ "description": "Close the persistent preview without moving focus."
41154
+ },
41155
+ {
41156
+ "kind": "method",
41157
+ "name": "togglePreview",
41158
+ "privacy": "public",
41159
+ "return": {
41160
+ "type": {
41161
+ "text": "void"
41162
+ }
41163
+ },
41164
+ "description": "Toggle the persistent preview without moving focus."
41165
+ },
40310
41166
  {
40311
41167
  "kind": "method",
40312
41168
  "name": "AddDialog",
@@ -40861,6 +41717,51 @@
40861
41717
  "description": "Compatibility alias for the original fixed header/sidebar behavior.\nPrefer `header-position=\"fixed\"` for new code.",
40862
41718
  "fieldName": "fixedMenus"
40863
41719
  },
41720
+ {
41721
+ "name": "preview-open",
41722
+ "type": {
41723
+ "text": "boolean"
41724
+ },
41725
+ "default": "false",
41726
+ "description": "Whether the persistent preview is logically open. The page may keep the\npreview hidden while space is unavailable; `preview-visible` reflects its\nactual presentation and the preview restores automatically when room returns.",
41727
+ "fieldName": "previewOpen"
41728
+ },
41729
+ {
41730
+ "name": "preview-label",
41731
+ "type": {
41732
+ "text": "string"
41733
+ },
41734
+ "default": "\"Preview\"",
41735
+ "description": "Accessible name for the preview's complementary landmark.",
41736
+ "fieldName": "previewLabel"
41737
+ },
41738
+ {
41739
+ "name": "preview-collapse-sidebar",
41740
+ "type": {
41741
+ "text": "boolean"
41742
+ },
41743
+ "default": "false",
41744
+ "description": "Allow a directly slotted, safely linked vertical menu/header pair to\ncollapse to its burger/drawer presentation when preview needs more room.",
41745
+ "fieldName": "previewCollapseSidebar"
41746
+ },
41747
+ {
41748
+ "name": "preview-visible",
41749
+ "type": {
41750
+ "text": "boolean"
41751
+ },
41752
+ "default": "false",
41753
+ "description": "Whether preview content is currently rendered. Managed by the page's\nspace negotiation; consumers should treat this reflected property as read-only.",
41754
+ "fieldName": "previewVisible"
41755
+ },
41756
+ {
41757
+ "name": "preview-reclaiming",
41758
+ "type": {
41759
+ "text": "boolean"
41760
+ },
41761
+ "default": "false",
41762
+ "description": "Whether preview is currently reserving width and allowing the main well\nto shrink toward `--esp-page-main-min-width`. Managed by the page.",
41763
+ "fieldName": "previewReclaiming"
41764
+ },
40864
41765
  {
40865
41766
  "name": "scheme",
40866
41767
  "type": {
@@ -40928,6 +41829,12 @@
40928
41829
  "module": "dist/shared/esp-element-base.js"
40929
41830
  }
40930
41831
  }
41832
+ ],
41833
+ "examples": [
41834
+ {
41835
+ "title": "Main, preview, and contextual help",
41836
+ "body": "```html\n<style>\n.page-workspace-demo {\n--esp-page-main-min-width: 26rem;\n--esp-page-main-max-width: 48rem;\n--esp-page-preview-min-width: 18rem;\n--esp-page-preview-max-width: 26rem;\n--esp-page-flyout-min-width: 18rem;\n--esp-page-flyout-max-width: 22rem;\n}\n\n.page-workspace-demo > main,\n.page-workspace-demo > [slot=\"preview\"] {\nbox-sizing: border-box;\npadding: var(--esp-size-padding-page);\n}\n\n.page-workspace-demo > main {\nmin-block-size: 120vh;\n}\n</style>\n\n<esp-page\nid=\"page-workspace-demo\"\nclass=\"page-workspace-demo\"\npreview-open\npreview-label=\"Rendered page preview\"\n>\n<main>\n<h2>Page details</h2>\n<esp-form-item label=\"Site title\">\n<esp-input id=\"page-workspace-title\" name=\"title\" value=\"Field notes\"></esp-input>\n</esp-form-item>\n<p>\nHelp is anchored to the title field in this main editor. Its caret and\ndotted connector cross the persistent preview without blocking it.\n</p>\n<esp-button id=\"page-workspace-preview-toggle\" label=\"Toggle preview\"></esp-button>\n<esp-button id=\"page-workspace-help-toggle\" label=\"Toggle title help\"></esp-button>\n</main>\n\n<article slot=\"preview\">\n<h2>Field notes</h2>\n<p>This preview is a full-viewport secondary surface with its own scroller.</p>\n</article>\n\n<esp-flyout\nid=\"page-workspace-help\"\nslot=\"flyout\"\nheading=\"Site title help\"\nstandalone\n>\n<p>Use a short, recognizable title. It appears in navigation and browser tabs.</p>\n</esp-flyout>\n</esp-page>\n\n<script>\nconst page = findById(\"page-workspace-demo\");\nconst title = findById(\"page-workspace-title\");\nconst help = findById(\"page-workspace-help\");\nhelp.anchor = title;\n\nconst syncMainWidth = () => {\npage.kind = page.previewOpen || help.open ? \"wide\" : \"full\";\n};\n\nfindById(\"page-workspace-preview-toggle\").addEventListener(\"clicked\", () => {\npage.togglePreview();\nsyncMainWidth();\n});\nfindById(\"page-workspace-help-toggle\").addEventListener(\"clicked\", () => {\nhelp.anchor = title;\nhelp.toggle();\nsyncMainWidth();\n});\nhelp.addEventListener(\"flyout-opened\", syncMainWidth);\nhelp.addEventListener(\"flyout-closed\", syncMainWidth);\nsyncMainWidth();\n</script>\n```"
41837
+ }
40931
41838
  ]
40932
41839
  }
40933
41840
  ],