@taprootio/espalier 6.2.0 → 6.3.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.
- package/CHANGELOG.md +8 -0
- package/README.md +5 -5
- package/custom-elements.json +945 -241
- package/dist/action-menu/esp-action-menu-item.js +1 -0
- package/dist/action-menu/esp-action-menu.js +4 -3
- package/dist/box/esp-box.d.ts +14 -3
- package/dist/box/esp-box.js +5 -5
- package/dist/button/esp-button.d.ts +4 -4
- package/dist/date-picker/helpers/styles.js +1 -0
- package/dist/details/esp-details.d.ts +3 -0
- package/dist/details/esp-details.js +13 -6
- package/dist/dialog/esp-dialog.d.ts +6 -2
- package/dist/dialog/esp-dialog.js +62 -62
- package/dist/flyout/esp-flyout.d.ts +2 -2
- package/dist/flyout/esp-flyout.js +6 -5
- package/dist/focus-picker/esp-focus-picker.js +3 -2
- package/dist/footer/esp-footer.d.ts +3 -3
- package/dist/footer/esp-footer.js +10 -10
- package/dist/grid/esp-grid.d.ts +3 -0
- package/dist/grid/esp-grid.js +25 -17
- package/dist/header/esp-header-button.d.ts +6 -15
- package/dist/header/esp-header.d.ts +4 -2
- package/dist/header/esp-header.js +8 -7
- package/dist/image-picker/esp-image-picker.js +1 -0
- package/dist/image-upload/esp-image-upload.js +1 -0
- package/dist/info/esp-info.d.ts +3 -1
- package/dist/info/esp-info.js +8 -8
- package/dist/lightbox/esp-lightbox.d.ts +3 -0
- package/dist/lightbox/esp-lightbox.js +12 -9
- package/dist/menu/esp-menu-group.js +6 -2
- package/dist/menu/esp-menu-item.js +7 -3
- package/dist/menu/esp-menu.js +4 -2
- package/dist/page/esp-page.d.ts +1 -1
- package/dist/page/esp-page.styles.js +1 -0
- package/dist/pickers/esp-pick-one.d.ts +1 -2
- package/dist/pickers/esp-pick-some.d.ts +1 -1
- package/dist/pickers/esp-picker-item.js +9 -5
- package/dist/pickers/esp-picker-menu.js +2 -0
- package/dist/popover/esp-popover.d.ts +2 -4
- package/dist/repeater/esp-repeater.js +1 -0
- package/dist/root/esp-root.d.ts +4 -4
- package/dist/root/esp-root.js +5 -3
- package/dist/row/esp-row.d.ts +1 -2
- package/dist/search/esp-search.js +2 -0
- package/dist/section/esp-section.d.ts +1 -1
- package/dist/section/esp-section.js +2 -1
- package/dist/shared/configured-brand.d.ts +11 -37
- package/dist/shared/esp-element-base.d.ts +4 -1
- package/dist/shared/esp-element-base.js +27 -30
- package/dist/shared/justified-layout.d.ts +6 -18
- package/dist/shared/surface-layer.d.ts +12 -0
- package/dist/shared/surface-layer.js +10 -0
- package/dist/shared/theme.d.ts +7 -18
- package/dist/slider/esp-slider.d.ts +2 -4
- package/dist/stack/esp-stack.d.ts +1 -2
- package/dist/switch/esp-switch.d.ts +2 -4
- package/dist/tabs/esp-tab-group.d.ts +3 -0
- package/dist/tabs/esp-tab-group.js +7 -7
- package/dist/tooltip/esp-tooltip.js +1 -0
- package/dist/tree/esp-tree.d.ts +0 -5
- package/dist/tree/esp-tree.js +3 -0
- package/espalier.css-data.json +1 -1
- package/espalier.token-manifest.json +1 -1
- package/licenses/README.md +18 -15
- package/package.json +5 -1
package/custom-elements.json
CHANGED
|
@@ -1967,7 +1967,7 @@
|
|
|
1967
1967
|
"name": "--esp-action-menu-item-icon-border-color"
|
|
1968
1968
|
},
|
|
1969
1969
|
{
|
|
1970
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
1970
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
1971
1971
|
"name": "--esp-field-background",
|
|
1972
1972
|
"inheritedFrom": {
|
|
1973
1973
|
"name": "EspalierElementBase",
|
|
@@ -2909,6 +2909,17 @@
|
|
|
2909
2909
|
"description": "Where the optional icon slot is positioned within the item.\n\nUse `\"right\"` for Taproot-style action rows where the icon sits\nin a differentiated trailing cell with a dotted divider.",
|
|
2910
2910
|
"fieldName": "iconPosition"
|
|
2911
2911
|
},
|
|
2912
|
+
{
|
|
2913
|
+
"type": {
|
|
2914
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
2915
|
+
},
|
|
2916
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
2917
|
+
"name": "surface-layer",
|
|
2918
|
+
"inheritedFrom": {
|
|
2919
|
+
"name": "EspalierElementBase",
|
|
2920
|
+
"module": "dist/shared/esp-element-base.js"
|
|
2921
|
+
}
|
|
2922
|
+
},
|
|
2912
2923
|
{
|
|
2913
2924
|
"name": "scheme",
|
|
2914
2925
|
"type": {
|
|
@@ -3020,7 +3031,7 @@
|
|
|
3020
3031
|
"name": "--esp-action-menu-min-width"
|
|
3021
3032
|
},
|
|
3022
3033
|
{
|
|
3023
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
3034
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
3024
3035
|
"name": "--esp-field-background",
|
|
3025
3036
|
"inheritedFrom": {
|
|
3026
3037
|
"name": "EspalierElementBase",
|
|
@@ -4202,6 +4213,17 @@
|
|
|
4202
4213
|
"description": "Controls where item icons appear inside the menu.\n\n`\"left\"` keeps icons before labels. `\"right\"` moves icons into\na trailing cell with a differentiated background and dotted divider.",
|
|
4203
4214
|
"fieldName": "iconPosition"
|
|
4204
4215
|
},
|
|
4216
|
+
{
|
|
4217
|
+
"type": {
|
|
4218
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
4219
|
+
},
|
|
4220
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
4221
|
+
"name": "surface-layer",
|
|
4222
|
+
"inheritedFrom": {
|
|
4223
|
+
"name": "EspalierElementBase",
|
|
4224
|
+
"module": "dist/shared/esp-element-base.js"
|
|
4225
|
+
}
|
|
4226
|
+
},
|
|
4205
4227
|
{
|
|
4206
4228
|
"name": "scheme",
|
|
4207
4229
|
"type": {
|
|
@@ -4454,7 +4476,7 @@
|
|
|
4454
4476
|
"name": "--esp-avatar-size"
|
|
4455
4477
|
},
|
|
4456
4478
|
{
|
|
4457
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
4479
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
4458
4480
|
"name": "--esp-field-background",
|
|
4459
4481
|
"inheritedFrom": {
|
|
4460
4482
|
"name": "EspalierElementBase",
|
|
@@ -5472,6 +5494,17 @@
|
|
|
5472
5494
|
"description": "Referrer policy forwarded to the internal image. Defaults to\n`no-referrer`.",
|
|
5473
5495
|
"fieldName": "referrerPolicy"
|
|
5474
5496
|
},
|
|
5497
|
+
{
|
|
5498
|
+
"type": {
|
|
5499
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
5500
|
+
},
|
|
5501
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
5502
|
+
"name": "surface-layer",
|
|
5503
|
+
"inheritedFrom": {
|
|
5504
|
+
"name": "EspalierElementBase",
|
|
5505
|
+
"module": "dist/shared/esp-element-base.js"
|
|
5506
|
+
}
|
|
5507
|
+
},
|
|
5475
5508
|
{
|
|
5476
5509
|
"name": "scheme",
|
|
5477
5510
|
"type": {
|
|
@@ -5612,7 +5645,7 @@
|
|
|
5612
5645
|
"name": "--esp-avatar-border-radius"
|
|
5613
5646
|
},
|
|
5614
5647
|
{
|
|
5615
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
5648
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
5616
5649
|
"name": "--esp-field-background",
|
|
5617
5650
|
"inheritedFrom": {
|
|
5618
5651
|
"name": "EspalierElementBase",
|
|
@@ -6521,6 +6554,17 @@
|
|
|
6521
6554
|
"description": "Optional presence state passed to the internal avatar.",
|
|
6522
6555
|
"fieldName": "presence"
|
|
6523
6556
|
},
|
|
6557
|
+
{
|
|
6558
|
+
"type": {
|
|
6559
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
6560
|
+
},
|
|
6561
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
6562
|
+
"name": "surface-layer",
|
|
6563
|
+
"inheritedFrom": {
|
|
6564
|
+
"name": "EspalierElementBase",
|
|
6565
|
+
"module": "dist/shared/esp-element-base.js"
|
|
6566
|
+
}
|
|
6567
|
+
},
|
|
6524
6568
|
{
|
|
6525
6569
|
"name": "scheme",
|
|
6526
6570
|
"type": {
|
|
@@ -6621,7 +6665,7 @@
|
|
|
6621
6665
|
"name": "--esp-badge-border-radius"
|
|
6622
6666
|
},
|
|
6623
6667
|
{
|
|
6624
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
6668
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
6625
6669
|
"name": "--esp-field-background",
|
|
6626
6670
|
"inheritedFrom": {
|
|
6627
6671
|
"name": "EspalierElementBase",
|
|
@@ -7468,6 +7512,17 @@
|
|
|
7468
7512
|
"description": "Badge size.",
|
|
7469
7513
|
"fieldName": "size"
|
|
7470
7514
|
},
|
|
7515
|
+
{
|
|
7516
|
+
"type": {
|
|
7517
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
7518
|
+
},
|
|
7519
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
7520
|
+
"name": "surface-layer",
|
|
7521
|
+
"inheritedFrom": {
|
|
7522
|
+
"name": "EspalierElementBase",
|
|
7523
|
+
"module": "dist/shared/esp-element-base.js"
|
|
7524
|
+
}
|
|
7525
|
+
},
|
|
7471
7526
|
{
|
|
7472
7527
|
"name": "scheme",
|
|
7473
7528
|
"type": {
|
|
@@ -7560,7 +7615,7 @@
|
|
|
7560
7615
|
"declarations": [
|
|
7561
7616
|
{
|
|
7562
7617
|
"kind": "class",
|
|
7563
|
-
"description": "
|
|
7618
|
+
"description": "Groups related content in a themed container. Style its `box` CSS part\nto create cards, forms, or other grouped regions.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\n```html\n<esp-box>\n <h2>Box things</h2>\n <p>Things grouped visually.</p>\n</esp-box>\n```\n\n**What esp-box is not:** a full-bleed page band. The box is a *card* —\nit paints its own raised surface (`--esp-color-layer-1`), carries\npadding, and fills its container's height. A band is\n[`esp-section`](/components/section): it paints the local canvas edge\nto edge with a centered well and hosts a theme zone (`context=\"…\"`)\nwith nothing to neutralize. Keep boxes for what they are for — cards,\npanels, and form surfaces — and replace any pre-3.2 \"neutralized box\"\nband with a bare section.\n\nSelect a raised form surface with `surface-layer`; fields follow it automatically.\n\n```html\n<esp-box surface-layer=\"2\">\n <esp-input placeholder=\"Search\"></esp-input>\n <esp-input readonly value=\"A read-only value\"></esp-input>\n</esp-box>\n```",
|
|
7564
7619
|
"name": "EspalierBox",
|
|
7565
7620
|
"cssProperties": [
|
|
7566
7621
|
{
|
|
@@ -7584,7 +7639,7 @@
|
|
|
7584
7639
|
"name": "--esp-box-shadow"
|
|
7585
7640
|
},
|
|
7586
7641
|
{
|
|
7587
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
7642
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
7588
7643
|
"name": "--esp-field-background",
|
|
7589
7644
|
"inheritedFrom": {
|
|
7590
7645
|
"name": "EspalierElementBase",
|
|
@@ -8399,6 +8454,17 @@
|
|
|
8399
8454
|
"description": "Whether the box should take up the full screen. Useful when\ndisplaying a dialog in full-screen mode.\n\n```html\n<esp-box>\n <h2>Box things</h2>\n <esp-box>\n <h2>Box in box</h2>\n <esp-button label=\"Toggle full screen\"></esp-button>\n </esp-box>\n</esp-box>\n<script>\n let fullScreen = false;\n const theBox = findByTagName(\"esp-box\")[0];\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", () => {\n fullScreen = !fullScreen;\n\n if(fullScreen) {\n theBox.setAttribute(\"full-screen\", true);\n } else {\n theBox.removeAttribute(\"full-screen\");\n }\n });\n</script>\n```",
|
|
8400
8455
|
"fieldName": "fullScreen"
|
|
8401
8456
|
},
|
|
8457
|
+
{
|
|
8458
|
+
"type": {
|
|
8459
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
8460
|
+
},
|
|
8461
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
8462
|
+
"name": "surface-layer",
|
|
8463
|
+
"inheritedFrom": {
|
|
8464
|
+
"name": "EspalierElementBase",
|
|
8465
|
+
"module": "dist/shared/esp-element-base.js"
|
|
8466
|
+
}
|
|
8467
|
+
},
|
|
8402
8468
|
{
|
|
8403
8469
|
"name": "scheme",
|
|
8404
8470
|
"type": {
|
|
@@ -8662,7 +8728,7 @@
|
|
|
8662
8728
|
"name": "--esp-breadcrumb-separator-color"
|
|
8663
8729
|
},
|
|
8664
8730
|
{
|
|
8665
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
8731
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
8666
8732
|
"name": "--esp-field-background",
|
|
8667
8733
|
"inheritedFrom": {
|
|
8668
8734
|
"name": "EspalierElementBase",
|
|
@@ -8739,7 +8805,7 @@
|
|
|
8739
8805
|
"text": "void"
|
|
8740
8806
|
}
|
|
8741
8807
|
},
|
|
8742
|
-
"description": "
|
|
8808
|
+
"description": "Keep the end-of-trail state current without replacing custom separators.\n\nEvery crumb needs `isLastElement`, even when it supplies a custom separator.\nOnly separators this component wrote may be repointed. Check emptiness by\ntruthiness: Lit sets a removed String attribute to `null`."
|
|
8743
8809
|
},
|
|
8744
8810
|
{
|
|
8745
8811
|
"kind": "field",
|
|
@@ -9493,6 +9559,17 @@
|
|
|
9493
9559
|
"description": ""
|
|
9494
9560
|
},
|
|
9495
9561
|
"attributes": [
|
|
9562
|
+
{
|
|
9563
|
+
"type": {
|
|
9564
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
9565
|
+
},
|
|
9566
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
9567
|
+
"name": "surface-layer",
|
|
9568
|
+
"inheritedFrom": {
|
|
9569
|
+
"name": "EspalierElementBase",
|
|
9570
|
+
"module": "dist/shared/esp-element-base.js"
|
|
9571
|
+
}
|
|
9572
|
+
},
|
|
9496
9573
|
{
|
|
9497
9574
|
"name": "scheme",
|
|
9498
9575
|
"type": {
|
|
@@ -10010,7 +10087,7 @@
|
|
|
10010
10087
|
"declarations": [
|
|
10011
10088
|
{
|
|
10012
10089
|
"kind": "class",
|
|
10013
|
-
"description": "
|
|
10090
|
+
"description": "Triggers an action or links to another page.\n\n```html\n<esp-button label=\"Hello there!\"></esp-button>\n<script>\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", () => {\n showToast({\n message: `You clicked the button!`,\n icon: \"info-i\",\n duration: 2\n });\n });\n</script>\n```\n\nChoose an intent to express the action's status:\n\n```html\n<div style=\"display: flex; flex-wrap: wrap; gap: var(--esp-size-padding);\">\n <esp-button label=\"Neutral\" intent=\"neutral\" collapsed></esp-button>\n <esp-button label=\"Success\" intent=\"success\" collapsed></esp-button>\n <esp-button label=\"Warning\" intent=\"warning\" collapsed></esp-button>\n <esp-button label=\"Danger\" intent=\"danger\" collapsed></esp-button>\n <esp-button label=\"Info\" intent=\"info\" collapsed></esp-button>\n</div>\n```\n\nUse `icon-position=\"left\"` for a leading icon. The default `\"right\"`\nposition keeps the icon trailing; both positions follow writing direction\nand therefore mirror in RTL.\n\n```html\n<div style=\"display: flex; gap: var(--esp-size-padding);\">\n <esp-button\n collapsed\n label=\"Save\"\n icon=\"save\"\n icon-position=\"left\">\n </esp-button>\n <esp-button\n collapsed\n label=\"Next\"\n icon=\"arrow-big-right\"\n icon-position=\"right\">\n </esp-button>\n</div>\n```",
|
|
10014
10091
|
"name": "EspalierButton",
|
|
10015
10092
|
"cssProperties": [
|
|
10016
10093
|
{
|
|
@@ -10022,7 +10099,7 @@
|
|
|
10022
10099
|
"name": "--esp-button-incognito-padding"
|
|
10023
10100
|
},
|
|
10024
10101
|
{
|
|
10025
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
10102
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
10026
10103
|
"name": "--esp-field-background",
|
|
10027
10104
|
"inheritedFrom": {
|
|
10028
10105
|
"name": "EspalierElementBase",
|
|
@@ -10196,7 +10273,7 @@
|
|
|
10196
10273
|
},
|
|
10197
10274
|
"privacy": "public",
|
|
10198
10275
|
"default": "false",
|
|
10199
|
-
"description": "
|
|
10276
|
+
"description": "Disables the button.\n\n```html\n<esp-button disabled label=\"Disabled\"></esp-button>\n<script>\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", () => {\n alert(\"We will not get here...\");\n});\n</script>\n```",
|
|
10200
10277
|
"attribute": "disabled",
|
|
10201
10278
|
"reflects": true
|
|
10202
10279
|
},
|
|
@@ -10275,7 +10352,7 @@
|
|
|
10275
10352
|
},
|
|
10276
10353
|
"privacy": "public",
|
|
10277
10354
|
"default": "false",
|
|
10278
|
-
"description": "
|
|
10355
|
+
"description": "Shows the button's loading state.\nThe button will be disabled and show a spinner while loading\nis true.\n\n```html\n<esp-button label=\"Click me...\" icon=\"save\"></esp-button>\n<script>\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", async () => {\n theButton.loading = true;\n setTimeout(function() {\n theButton.loading = false;\n }, 5000);\n });\n</script>\n```",
|
|
10279
10356
|
"attribute": "loading",
|
|
10280
10357
|
"reflects": true
|
|
10281
10358
|
},
|
|
@@ -11105,7 +11182,7 @@
|
|
|
11105
11182
|
"text": "boolean"
|
|
11106
11183
|
},
|
|
11107
11184
|
"default": "false",
|
|
11108
|
-
"description": "
|
|
11185
|
+
"description": "Disables the button.\n\n```html\n<esp-button disabled label=\"Disabled\"></esp-button>\n<script>\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", () => {\n alert(\"We will not get here...\");\n});\n</script>\n```",
|
|
11109
11186
|
"fieldName": "disabled"
|
|
11110
11187
|
},
|
|
11111
11188
|
{
|
|
@@ -11159,7 +11236,7 @@
|
|
|
11159
11236
|
"text": "boolean"
|
|
11160
11237
|
},
|
|
11161
11238
|
"default": "false",
|
|
11162
|
-
"description": "
|
|
11239
|
+
"description": "Shows the button's loading state.\nThe button will be disabled and show a spinner while loading\nis true.\n\n```html\n<esp-button label=\"Click me...\" icon=\"save\"></esp-button>\n<script>\n const theButton = findByTagName(\"esp-button\")[0];\n theButton.addEventListener(\"esp-clicked\", async () => {\n theButton.loading = true;\n setTimeout(function() {\n theButton.loading = false;\n }, 5000);\n });\n</script>\n```",
|
|
11163
11240
|
"fieldName": "loading"
|
|
11164
11241
|
},
|
|
11165
11242
|
{
|
|
@@ -11189,6 +11266,17 @@
|
|
|
11189
11266
|
"description": "When true and `button-type` is `\"submit\"`, the enclosing\nform is submitted without running constraint validation.\n\n```html\n<esp-button button-type=\"submit\" formnovalidate label=\"Save Draft\"></esp-button>\n```",
|
|
11190
11267
|
"fieldName": "formNoValidate"
|
|
11191
11268
|
},
|
|
11269
|
+
{
|
|
11270
|
+
"type": {
|
|
11271
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
11272
|
+
},
|
|
11273
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
11274
|
+
"name": "surface-layer",
|
|
11275
|
+
"inheritedFrom": {
|
|
11276
|
+
"name": "EspalierElementBase",
|
|
11277
|
+
"module": "dist/shared/esp-element-base.js"
|
|
11278
|
+
}
|
|
11279
|
+
},
|
|
11192
11280
|
{
|
|
11193
11281
|
"name": "scheme",
|
|
11194
11282
|
"type": {
|
|
@@ -12292,6 +12380,17 @@
|
|
|
12292
12380
|
"description": "Disables all child checkboxes in the group.",
|
|
12293
12381
|
"fieldName": "disabled"
|
|
12294
12382
|
},
|
|
12383
|
+
{
|
|
12384
|
+
"type": {
|
|
12385
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
12386
|
+
},
|
|
12387
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
12388
|
+
"name": "surface-layer",
|
|
12389
|
+
"inheritedFrom": {
|
|
12390
|
+
"name": "EspalierElementBase",
|
|
12391
|
+
"module": "dist/shared/esp-element-base.js"
|
|
12392
|
+
}
|
|
12393
|
+
},
|
|
12295
12394
|
{
|
|
12296
12395
|
"name": "scheme",
|
|
12297
12396
|
"type": {
|
|
@@ -12350,7 +12449,7 @@
|
|
|
12350
12449
|
"customElement": true,
|
|
12351
12450
|
"cssProperties": [
|
|
12352
12451
|
{
|
|
12353
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
12452
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
12354
12453
|
"name": "--esp-field-background",
|
|
12355
12454
|
"inheritedFrom": {
|
|
12356
12455
|
"name": "EspalierElementBase",
|
|
@@ -12449,7 +12548,7 @@
|
|
|
12449
12548
|
"name": "--esp-checkbox-focus-shadow"
|
|
12450
12549
|
},
|
|
12451
12550
|
{
|
|
12452
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
12551
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
12453
12552
|
"name": "--esp-field-background",
|
|
12454
12553
|
"inheritedFrom": {
|
|
12455
12554
|
"name": "EspalierElementBase",
|
|
@@ -13551,6 +13650,17 @@
|
|
|
13551
13650
|
"description": "Displays the checkbox in an indeterminate (partial) state.\nClicking the checkbox clears the indeterminate state.",
|
|
13552
13651
|
"fieldName": "indeterminate"
|
|
13553
13652
|
},
|
|
13653
|
+
{
|
|
13654
|
+
"type": {
|
|
13655
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
13656
|
+
},
|
|
13657
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
13658
|
+
"name": "surface-layer",
|
|
13659
|
+
"inheritedFrom": {
|
|
13660
|
+
"name": "EspalierElementBase",
|
|
13661
|
+
"module": "dist/shared/esp-element-base.js"
|
|
13662
|
+
}
|
|
13663
|
+
},
|
|
13554
13664
|
{
|
|
13555
13665
|
"name": "scheme",
|
|
13556
13666
|
"type": {
|
|
@@ -14651,6 +14761,17 @@
|
|
|
14651
14761
|
"description": "Truncates both text lines to a single ellipsized line.",
|
|
14652
14762
|
"fieldName": "truncate"
|
|
14653
14763
|
},
|
|
14764
|
+
{
|
|
14765
|
+
"type": {
|
|
14766
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
14767
|
+
},
|
|
14768
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
14769
|
+
"name": "surface-layer",
|
|
14770
|
+
"inheritedFrom": {
|
|
14771
|
+
"name": "EspalierElementBase",
|
|
14772
|
+
"module": "dist/shared/esp-element-base.js"
|
|
14773
|
+
}
|
|
14774
|
+
},
|
|
14654
14775
|
{
|
|
14655
14776
|
"name": "scheme",
|
|
14656
14777
|
"type": {
|
|
@@ -14717,7 +14838,7 @@
|
|
|
14717
14838
|
"customElement": true,
|
|
14718
14839
|
"cssProperties": [
|
|
14719
14840
|
{
|
|
14720
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
14841
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
14721
14842
|
"name": "--esp-field-background",
|
|
14722
14843
|
"inheritedFrom": {
|
|
14723
14844
|
"name": "EspalierElementBase",
|
|
@@ -17055,6 +17176,17 @@
|
|
|
17055
17176
|
"description": "A custom message to display when the picker is required but no\ndate is selected. Defaults to `\"Please select a date.\"` when\nnot set.\n\n```html\n<esp-date-picker required required-message=\"A departure date is required.\"></esp-date-picker>\n```",
|
|
17056
17177
|
"fieldName": "requiredMessage"
|
|
17057
17178
|
},
|
|
17179
|
+
{
|
|
17180
|
+
"type": {
|
|
17181
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
17182
|
+
},
|
|
17183
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
17184
|
+
"name": "surface-layer",
|
|
17185
|
+
"inheritedFrom": {
|
|
17186
|
+
"name": "EspalierElementBase",
|
|
17187
|
+
"module": "dist/shared/esp-element-base.js"
|
|
17188
|
+
}
|
|
17189
|
+
},
|
|
17058
17190
|
{
|
|
17059
17191
|
"name": "scheme",
|
|
17060
17192
|
"type": {
|
|
@@ -17121,7 +17253,7 @@
|
|
|
17121
17253
|
},
|
|
17122
17254
|
"cssProperties": [
|
|
17123
17255
|
{
|
|
17124
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
17256
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
17125
17257
|
"name": "--esp-field-background",
|
|
17126
17258
|
"inheritedFrom": {
|
|
17127
17259
|
"name": "EspalierElementBase",
|
|
@@ -17250,7 +17382,7 @@
|
|
|
17250
17382
|
"name": "--esp-details-group-color-border"
|
|
17251
17383
|
},
|
|
17252
17384
|
{
|
|
17253
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
17385
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
17254
17386
|
"name": "--esp-field-background",
|
|
17255
17387
|
"inheritedFrom": {
|
|
17256
17388
|
"name": "EspalierElementBase",
|
|
@@ -18121,6 +18253,17 @@
|
|
|
18121
18253
|
"description": "When true (the default), only one item can be open at a\ntime. Set to false to allow multiple items open\nsimultaneously while keeping the grouped visual treatment.",
|
|
18122
18254
|
"fieldName": "exclusive"
|
|
18123
18255
|
},
|
|
18256
|
+
{
|
|
18257
|
+
"type": {
|
|
18258
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
18259
|
+
},
|
|
18260
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
18261
|
+
"name": "surface-layer",
|
|
18262
|
+
"inheritedFrom": {
|
|
18263
|
+
"name": "EspalierElementBase",
|
|
18264
|
+
"module": "dist/shared/esp-element-base.js"
|
|
18265
|
+
}
|
|
18266
|
+
},
|
|
18124
18267
|
{
|
|
18125
18268
|
"name": "scheme",
|
|
18126
18269
|
"type": {
|
|
@@ -18208,7 +18351,7 @@
|
|
|
18208
18351
|
"declarations": [
|
|
18209
18352
|
{
|
|
18210
18353
|
"kind": "class",
|
|
18211
|
-
"description": "A disclosure widget that wraps the native `<details>` and\n`<summary>` elements. Provides themed styling with a custom\nopen/close indicator and smooth transitions. Use\n[esp-details-group](/components/details/group) to create an\naccordion where only one item is open at a time.\n\n```html\n<esp-details summary=\"What is Espalier?\">\n <p>Espalier is a design system and component library\n built on Web Components and Lit.</p>\n</esp-details>\n```\n\nDetails pick up zone theming from a `context` attribute on the group\nor any ancestor — see the [theming guide](/espalier-guides/):\n\n```html\n<esp-details-group context=\"quiet\">\n <esp-details summary=\"Inside the quiet zone\">\n <p>Zone-correct tokens, contrast enforced by the theme engine.</p>\n </esp-details>\n</esp-details-group>\n```\n\n### Pre-opened details\n\nSet the `open` attribute to render the details expanded by\ndefault:\n\n```html\n<esp-details summary=\"I start open\" open>\n <p>This content is visible from the start.</p>\n</esp-details>\n```\n\n### Disabled details\n\n```html\n<esp-details summary=\"Cannot toggle me\" disabled>\n <p>This content cannot be revealed.</p>\n</esp-details>\n```",
|
|
18354
|
+
"description": "A disclosure widget that wraps the native `<details>` and\n`<summary>` elements. Provides themed styling with a custom\nopen/close indicator and smooth transitions. Use\n[esp-details-group](/components/details/group) to create an\naccordion where only one item is open at a time.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\n```html\n<esp-details summary=\"What is Espalier?\">\n <p>Espalier is a design system and component library\n built on Web Components and Lit.</p>\n</esp-details>\n```\n\nDetails pick up zone theming from a `context` attribute on the group\nor any ancestor — see the [theming guide](/espalier-guides/):\n\n```html\n<esp-details-group context=\"quiet\">\n <esp-details summary=\"Inside the quiet zone\">\n <p>Zone-correct tokens, contrast enforced by the theme engine.</p>\n </esp-details>\n</esp-details-group>\n```\n\n### Pre-opened details\n\nSet the `open` attribute to render the details expanded by\ndefault:\n\n```html\n<esp-details summary=\"I start open\" open>\n <p>This content is visible from the start.</p>\n</esp-details>\n```\n\n### Disabled details\n\n```html\n<esp-details summary=\"Cannot toggle me\" disabled>\n <p>This content cannot be revealed.</p>\n</esp-details>\n```",
|
|
18212
18355
|
"name": "EspalierDetails",
|
|
18213
18356
|
"cssProperties": [
|
|
18214
18357
|
{
|
|
@@ -18240,7 +18383,7 @@
|
|
|
18240
18383
|
"name": "--esp-details-size-padding"
|
|
18241
18384
|
},
|
|
18242
18385
|
{
|
|
18243
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
18386
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
18244
18387
|
"name": "--esp-field-background",
|
|
18245
18388
|
"inheritedFrom": {
|
|
18246
18389
|
"name": "EspalierElementBase",
|
|
@@ -19168,6 +19311,17 @@
|
|
|
19168
19311
|
"description": "Whether the details element is disabled (cannot be toggled).\n\n```html\n<esp-details summary=\"Locked\" disabled>\n <p>Cannot be toggled.</p>\n</esp-details>\n```",
|
|
19169
19312
|
"fieldName": "disabled"
|
|
19170
19313
|
},
|
|
19314
|
+
{
|
|
19315
|
+
"type": {
|
|
19316
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
19317
|
+
},
|
|
19318
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
19319
|
+
"name": "surface-layer",
|
|
19320
|
+
"inheritedFrom": {
|
|
19321
|
+
"name": "EspalierElementBase",
|
|
19322
|
+
"module": "dist/shared/esp-element-base.js"
|
|
19323
|
+
}
|
|
19324
|
+
},
|
|
19171
19325
|
{
|
|
19172
19326
|
"name": "scheme",
|
|
19173
19327
|
"type": {
|
|
@@ -19263,7 +19417,7 @@
|
|
|
19263
19417
|
"declarations": [
|
|
19264
19418
|
{
|
|
19265
19419
|
"kind": "class",
|
|
19266
|
-
"description": "
|
|
19420
|
+
"description": "Shows content in a modal dialog. By default, on large screens the\ndialog content is centered horizontally near the top of the\nscreen. On small screens, the content always tries to take up\nthe full screen width.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\nWhen opened, the dialog:\n- Moves focus to the first `[autofocus]` element inside the slotted\n content, then the first focusable element (or the dialog container\n itself if none is found).\n- Traps focus so that `Tab` and `Shift+Tab` cycle only through\n elements inside the dialog.\n- Closes when the user presses `Escape`.\n- Marks all sibling content as `inert` to prevent screen reader\n and keyboard access to the page behind the overlay.\n- Restores focus to the element that was focused before the\n dialog was opened.",
|
|
19267
19421
|
"name": "EspalierDialog",
|
|
19268
19422
|
"cssProperties": [
|
|
19269
19423
|
{
|
|
@@ -19398,6 +19552,13 @@
|
|
|
19398
19552
|
}
|
|
19399
19553
|
],
|
|
19400
19554
|
"attributes": [
|
|
19555
|
+
{
|
|
19556
|
+
"type": {
|
|
19557
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
19558
|
+
},
|
|
19559
|
+
"description": "Declares the painted surface depth; defaults to layer 3.",
|
|
19560
|
+
"name": "surface-layer"
|
|
19561
|
+
},
|
|
19401
19562
|
{
|
|
19402
19563
|
"name": "full-screen",
|
|
19403
19564
|
"type": {
|
|
@@ -19461,71 +19622,87 @@
|
|
|
19461
19622
|
},
|
|
19462
19623
|
{
|
|
19463
19624
|
"kind": "javascript-module",
|
|
19464
|
-
"path": "dist/
|
|
19625
|
+
"path": "dist/empty-state/esp-empty-state.js",
|
|
19465
19626
|
"declarations": [
|
|
19466
19627
|
{
|
|
19467
19628
|
"kind": "class",
|
|
19468
|
-
"description": "
|
|
19469
|
-
"name": "
|
|
19629
|
+
"description": "A centered empty-state layout for list, grid, and page-level\nzero-item states.\n\n```html\n<esp-empty-state icon=\"photo-up\">\n <span slot=\"heading\">No images yet</span>\n Upload the first image to start building this library.\n <esp-button slot=\"action\" label=\"Upload Image\"></esp-button>\n</esp-empty-state>\n\n<esp-empty-state size=\"large\" icon=\"users\">\n <span slot=\"heading\">No members yet</span>\n Invite teammates when you are ready to collaborate.\n</esp-empty-state>\n```",
|
|
19630
|
+
"name": "EspalierEmptyState",
|
|
19631
|
+
"slots": [
|
|
19632
|
+
{
|
|
19633
|
+
"description": "Primary empty-state message.",
|
|
19634
|
+
"name": "heading"
|
|
19635
|
+
},
|
|
19636
|
+
{
|
|
19637
|
+
"description": "Supporting body text.",
|
|
19638
|
+
"name": ""
|
|
19639
|
+
},
|
|
19640
|
+
{
|
|
19641
|
+
"description": "Optional custom icon. When provided, it overrides the generated SVG from the `icon` attribute.",
|
|
19642
|
+
"name": "icon"
|
|
19643
|
+
},
|
|
19644
|
+
{
|
|
19645
|
+
"description": "Optional call-to-action button or link.",
|
|
19646
|
+
"name": "action"
|
|
19647
|
+
}
|
|
19648
|
+
],
|
|
19470
19649
|
"members": [
|
|
19471
19650
|
{
|
|
19472
19651
|
"kind": "field",
|
|
19473
|
-
"name": "
|
|
19652
|
+
"name": "iconSlot",
|
|
19653
|
+
"privacy": "private",
|
|
19654
|
+
"default": "new SlottedIconController(this)"
|
|
19655
|
+
},
|
|
19656
|
+
{
|
|
19657
|
+
"kind": "field",
|
|
19658
|
+
"name": "actionSlot",
|
|
19474
19659
|
"privacy": "private"
|
|
19475
19660
|
},
|
|
19476
19661
|
{
|
|
19477
19662
|
"kind": "field",
|
|
19478
|
-
"name": "
|
|
19663
|
+
"name": "sizeBacker",
|
|
19479
19664
|
"type": {
|
|
19480
|
-
"text": "
|
|
19665
|
+
"text": "EspalierEmptyStateSize"
|
|
19481
19666
|
},
|
|
19482
19667
|
"privacy": "private",
|
|
19483
|
-
"default": "
|
|
19668
|
+
"default": "\"medium\""
|
|
19484
19669
|
},
|
|
19485
19670
|
{
|
|
19486
19671
|
"kind": "field",
|
|
19487
|
-
"name": "
|
|
19672
|
+
"name": "hasSlottedAction",
|
|
19488
19673
|
"type": {
|
|
19489
|
-
"text": "
|
|
19674
|
+
"text": "boolean"
|
|
19490
19675
|
},
|
|
19491
|
-
"privacy": "
|
|
19492
|
-
"default": "
|
|
19493
|
-
"description": "The accepted file types. For example, to allow JPEG, PNG, and WebP images:\n\n`image/jpeg, image/png, image/webp`",
|
|
19494
|
-
"attribute": "accept"
|
|
19676
|
+
"privacy": "private",
|
|
19677
|
+
"default": "false"
|
|
19495
19678
|
},
|
|
19496
19679
|
{
|
|
19497
19680
|
"kind": "field",
|
|
19498
|
-
"name": "
|
|
19681
|
+
"name": "icon",
|
|
19499
19682
|
"type": {
|
|
19500
19683
|
"text": "string"
|
|
19501
19684
|
},
|
|
19502
19685
|
"privacy": "public",
|
|
19503
|
-
"default": "\"
|
|
19504
|
-
"description": "
|
|
19505
|
-
"attribute": "
|
|
19686
|
+
"default": "\"\"",
|
|
19687
|
+
"description": "Optional icon name from the Espalier SVG sprite.",
|
|
19688
|
+
"attribute": "icon"
|
|
19506
19689
|
},
|
|
19507
19690
|
{
|
|
19508
19691
|
"kind": "field",
|
|
19509
|
-
"name": "
|
|
19692
|
+
"name": "size",
|
|
19510
19693
|
"type": {
|
|
19511
|
-
"text": "
|
|
19694
|
+
"text": "EspalierEmptyStateSize"
|
|
19512
19695
|
},
|
|
19513
19696
|
"privacy": "public",
|
|
19514
|
-
"
|
|
19515
|
-
"
|
|
19516
|
-
"
|
|
19697
|
+
"description": "Empty-state scale.",
|
|
19698
|
+
"attribute": "size",
|
|
19699
|
+
"reflects": true
|
|
19517
19700
|
},
|
|
19518
19701
|
{
|
|
19519
19702
|
"kind": "field",
|
|
19520
|
-
"name": "
|
|
19703
|
+
"name": "handleActionSlotChange",
|
|
19521
19704
|
"privacy": "private"
|
|
19522
19705
|
},
|
|
19523
|
-
{
|
|
19524
|
-
"kind": "method",
|
|
19525
|
-
"name": "finishedProcessingFiles",
|
|
19526
|
-
"privacy": "public",
|
|
19527
|
-
"description": "The `esp-file-upload-files-selected` event sets the file upload to a processing state.\nCall this method when you have finished processing the selected files\nto reset the file upload."
|
|
19528
|
-
},
|
|
19529
19706
|
{
|
|
19530
19707
|
"kind": "field",
|
|
19531
19708
|
"name": "seedColorBacker",
|
|
@@ -20251,42 +20428,34 @@
|
|
|
20251
20428
|
}
|
|
20252
20429
|
}
|
|
20253
20430
|
],
|
|
20254
|
-
"events": [
|
|
20255
|
-
{
|
|
20256
|
-
"type": {
|
|
20257
|
-
"text": "CustomEvent<FileList>"
|
|
20258
|
-
},
|
|
20259
|
-
"description": "Fired after the user selects one or more files.",
|
|
20260
|
-
"name": "esp-file-upload-files-selected"
|
|
20261
|
-
}
|
|
20262
|
-
],
|
|
20263
20431
|
"attributes": [
|
|
20264
20432
|
{
|
|
20265
|
-
"name": "
|
|
20433
|
+
"name": "icon",
|
|
20266
20434
|
"type": {
|
|
20267
20435
|
"text": "string"
|
|
20268
20436
|
},
|
|
20269
|
-
"default": "\"
|
|
20270
|
-
"description": "
|
|
20271
|
-
"fieldName": "
|
|
20437
|
+
"default": "\"\"",
|
|
20438
|
+
"description": "Optional icon name from the Espalier SVG sprite.",
|
|
20439
|
+
"fieldName": "icon"
|
|
20272
20440
|
},
|
|
20273
20441
|
{
|
|
20274
|
-
"name": "
|
|
20442
|
+
"name": "size",
|
|
20275
20443
|
"type": {
|
|
20276
|
-
"text": "
|
|
20444
|
+
"text": "EspalierEmptyStateSize"
|
|
20277
20445
|
},
|
|
20278
|
-
"
|
|
20279
|
-
"
|
|
20280
|
-
"fieldName": "chooseText"
|
|
20446
|
+
"description": "Empty-state scale.",
|
|
20447
|
+
"fieldName": "size"
|
|
20281
20448
|
},
|
|
20282
20449
|
{
|
|
20283
|
-
"name": "multiple",
|
|
20284
20450
|
"type": {
|
|
20285
|
-
"text": "
|
|
20451
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
20286
20452
|
},
|
|
20287
|
-
"
|
|
20288
|
-
"
|
|
20289
|
-
"
|
|
20453
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
20454
|
+
"name": "surface-layer",
|
|
20455
|
+
"inheritedFrom": {
|
|
20456
|
+
"name": "EspalierElementBase",
|
|
20457
|
+
"module": "dist/shared/esp-element-base.js"
|
|
20458
|
+
}
|
|
20290
20459
|
},
|
|
20291
20460
|
{
|
|
20292
20461
|
"name": "scheme",
|
|
@@ -20330,31 +20499,31 @@
|
|
|
20330
20499
|
"name": "EspalierElementBase",
|
|
20331
20500
|
"module": "dist/shared/esp-element-base.js"
|
|
20332
20501
|
},
|
|
20333
|
-
"tagName": "esp-file-upload",
|
|
20334
|
-
"customElement": true,
|
|
20335
20502
|
"docPageTitle": {
|
|
20336
|
-
"name": "
|
|
20337
|
-
"description": "
|
|
20503
|
+
"name": "Empty",
|
|
20504
|
+
"description": "State"
|
|
20338
20505
|
},
|
|
20339
20506
|
"docUrl": {
|
|
20340
|
-
"name": "/components/
|
|
20507
|
+
"name": "/components/empty-state",
|
|
20341
20508
|
"description": ""
|
|
20342
20509
|
},
|
|
20343
20510
|
"menuGroup": {
|
|
20344
|
-
"name": "
|
|
20345
|
-
"description": "
|
|
20511
|
+
"name": "Feedback",
|
|
20512
|
+
"description": ""
|
|
20346
20513
|
},
|
|
20347
20514
|
"menuLabel": {
|
|
20348
|
-
"name": "
|
|
20349
|
-
"description": "
|
|
20515
|
+
"name": "Empty",
|
|
20516
|
+
"description": "State"
|
|
20350
20517
|
},
|
|
20351
20518
|
"menuIcon": {
|
|
20352
|
-
"name": "
|
|
20519
|
+
"name": "box",
|
|
20353
20520
|
"description": ""
|
|
20354
20521
|
},
|
|
20522
|
+
"tagName": "esp-empty-state",
|
|
20523
|
+
"customElement": true,
|
|
20355
20524
|
"cssProperties": [
|
|
20356
20525
|
{
|
|
20357
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
20526
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
20358
20527
|
"name": "--esp-field-background",
|
|
20359
20528
|
"inheritedFrom": {
|
|
20360
20529
|
"name": "EspalierElementBase",
|
|
@@ -20409,111 +20578,96 @@
|
|
|
20409
20578
|
"module": "dist/shared/esp-element-base.js"
|
|
20410
20579
|
}
|
|
20411
20580
|
}
|
|
20412
|
-
]
|
|
20581
|
+
],
|
|
20582
|
+
"events": []
|
|
20413
20583
|
}
|
|
20414
20584
|
],
|
|
20415
20585
|
"exports": [
|
|
20416
20586
|
{
|
|
20417
20587
|
"kind": "js",
|
|
20418
|
-
"name": "
|
|
20588
|
+
"name": "EspalierEmptyState",
|
|
20419
20589
|
"declaration": {
|
|
20420
|
-
"name": "
|
|
20421
|
-
"module": "dist/
|
|
20590
|
+
"name": "EspalierEmptyState",
|
|
20591
|
+
"module": "dist/empty-state/esp-empty-state.js"
|
|
20422
20592
|
}
|
|
20423
20593
|
},
|
|
20424
20594
|
{
|
|
20425
20595
|
"kind": "custom-element-definition",
|
|
20426
|
-
"name": "esp-
|
|
20596
|
+
"name": "esp-empty-state",
|
|
20427
20597
|
"declaration": {
|
|
20428
|
-
"name": "
|
|
20429
|
-
"module": "dist/
|
|
20598
|
+
"name": "EspalierEmptyState",
|
|
20599
|
+
"module": "dist/empty-state/esp-empty-state.js"
|
|
20430
20600
|
}
|
|
20431
20601
|
}
|
|
20432
20602
|
]
|
|
20433
20603
|
},
|
|
20434
20604
|
{
|
|
20435
20605
|
"kind": "javascript-module",
|
|
20436
|
-
"path": "dist/
|
|
20606
|
+
"path": "dist/file-upload/esp-file-upload.js",
|
|
20437
20607
|
"declarations": [
|
|
20438
20608
|
{
|
|
20439
20609
|
"kind": "class",
|
|
20440
|
-
"description": "
|
|
20441
|
-
"name": "
|
|
20442
|
-
"slots": [
|
|
20443
|
-
{
|
|
20444
|
-
"description": "Primary empty-state message.",
|
|
20445
|
-
"name": "heading"
|
|
20446
|
-
},
|
|
20447
|
-
{
|
|
20448
|
-
"description": "Supporting body text.",
|
|
20449
|
-
"name": ""
|
|
20450
|
-
},
|
|
20451
|
-
{
|
|
20452
|
-
"description": "Optional custom icon. When provided, it overrides the generated SVG from the `icon` attribute.",
|
|
20453
|
-
"name": "icon"
|
|
20454
|
-
},
|
|
20455
|
-
{
|
|
20456
|
-
"description": "Optional call-to-action button or link.",
|
|
20457
|
-
"name": "action"
|
|
20458
|
-
}
|
|
20459
|
-
],
|
|
20610
|
+
"description": "Used to upload files.\n\n```html\n<esp-file-upload choose-text=\"Upload Document\"></esp-file-upload>\n<script>\n const theFileUpload = findByTagName(\"esp-file-upload\")[0];\n theFileUpload.addEventListener(\"esp-file-upload-files-selected\", () => {\n showToast({\n message: `You selected a file!`,\n icon: \"info-i\",\n duration: 2,\n onClosed: () => {\n theFileUpload.finishedProcessingFiles();\n },\n });\n });\n</script>\n```",
|
|
20611
|
+
"name": "EspalierFileUpload",
|
|
20460
20612
|
"members": [
|
|
20461
20613
|
{
|
|
20462
20614
|
"kind": "field",
|
|
20463
|
-
"name": "
|
|
20464
|
-
"privacy": "private",
|
|
20465
|
-
"default": "new SlottedIconController(this)"
|
|
20466
|
-
},
|
|
20467
|
-
{
|
|
20468
|
-
"kind": "field",
|
|
20469
|
-
"name": "actionSlot",
|
|
20615
|
+
"name": "uploadInput",
|
|
20470
20616
|
"privacy": "private"
|
|
20471
20617
|
},
|
|
20472
20618
|
{
|
|
20473
20619
|
"kind": "field",
|
|
20474
|
-
"name": "
|
|
20620
|
+
"name": "processingFiles",
|
|
20475
20621
|
"type": {
|
|
20476
|
-
"text": "
|
|
20622
|
+
"text": "boolean"
|
|
20477
20623
|
},
|
|
20478
20624
|
"privacy": "private",
|
|
20479
|
-
"default": "
|
|
20625
|
+
"default": "false"
|
|
20480
20626
|
},
|
|
20481
20627
|
{
|
|
20482
20628
|
"kind": "field",
|
|
20483
|
-
"name": "
|
|
20629
|
+
"name": "accept",
|
|
20484
20630
|
"type": {
|
|
20485
|
-
"text": "
|
|
20631
|
+
"text": "string"
|
|
20486
20632
|
},
|
|
20487
|
-
"privacy": "
|
|
20488
|
-
"default": "
|
|
20633
|
+
"privacy": "public",
|
|
20634
|
+
"default": "\"*\"",
|
|
20635
|
+
"description": "The accepted file types. For example, to allow JPEG, PNG, and WebP images:\n\n`image/jpeg, image/png, image/webp`",
|
|
20636
|
+
"attribute": "accept"
|
|
20489
20637
|
},
|
|
20490
20638
|
{
|
|
20491
20639
|
"kind": "field",
|
|
20492
|
-
"name": "
|
|
20640
|
+
"name": "chooseText",
|
|
20493
20641
|
"type": {
|
|
20494
20642
|
"text": "string"
|
|
20495
20643
|
},
|
|
20496
20644
|
"privacy": "public",
|
|
20497
|
-
"default": "\"\"",
|
|
20498
|
-
"description": "
|
|
20499
|
-
"attribute": "
|
|
20645
|
+
"default": "\"Choose File\"",
|
|
20646
|
+
"description": "The text to display on the button.",
|
|
20647
|
+
"attribute": "choose-text"
|
|
20500
20648
|
},
|
|
20501
20649
|
{
|
|
20502
20650
|
"kind": "field",
|
|
20503
|
-
"name": "
|
|
20651
|
+
"name": "multiple",
|
|
20504
20652
|
"type": {
|
|
20505
|
-
"text": "
|
|
20653
|
+
"text": "boolean"
|
|
20506
20654
|
},
|
|
20507
20655
|
"privacy": "public",
|
|
20508
|
-
"
|
|
20509
|
-
"
|
|
20510
|
-
"
|
|
20656
|
+
"default": "false",
|
|
20657
|
+
"description": "Allow multiple files to be selected.",
|
|
20658
|
+
"attribute": "multiple"
|
|
20511
20659
|
},
|
|
20512
20660
|
{
|
|
20513
20661
|
"kind": "field",
|
|
20514
|
-
"name": "
|
|
20662
|
+
"name": "filesSelected",
|
|
20515
20663
|
"privacy": "private"
|
|
20516
20664
|
},
|
|
20665
|
+
{
|
|
20666
|
+
"kind": "method",
|
|
20667
|
+
"name": "finishedProcessingFiles",
|
|
20668
|
+
"privacy": "public",
|
|
20669
|
+
"description": "The `esp-file-upload-files-selected` event sets the file upload to a processing state.\nCall this method when you have finished processing the selected files\nto reset the file upload."
|
|
20670
|
+
},
|
|
20517
20671
|
{
|
|
20518
20672
|
"kind": "field",
|
|
20519
20673
|
"name": "seedColorBacker",
|
|
@@ -21239,23 +21393,53 @@
|
|
|
21239
21393
|
}
|
|
21240
21394
|
}
|
|
21241
21395
|
],
|
|
21396
|
+
"events": [
|
|
21397
|
+
{
|
|
21398
|
+
"type": {
|
|
21399
|
+
"text": "CustomEvent<FileList>"
|
|
21400
|
+
},
|
|
21401
|
+
"description": "Fired after the user selects one or more files.",
|
|
21402
|
+
"name": "esp-file-upload-files-selected"
|
|
21403
|
+
}
|
|
21404
|
+
],
|
|
21242
21405
|
"attributes": [
|
|
21243
21406
|
{
|
|
21244
|
-
"name": "
|
|
21407
|
+
"name": "accept",
|
|
21245
21408
|
"type": {
|
|
21246
21409
|
"text": "string"
|
|
21247
21410
|
},
|
|
21248
|
-
"default": "\"
|
|
21249
|
-
"description": "
|
|
21250
|
-
"fieldName": "
|
|
21411
|
+
"default": "\"*\"",
|
|
21412
|
+
"description": "The accepted file types. For example, to allow JPEG, PNG, and WebP images:\n\n`image/jpeg, image/png, image/webp`",
|
|
21413
|
+
"fieldName": "accept"
|
|
21251
21414
|
},
|
|
21252
21415
|
{
|
|
21253
|
-
"name": "
|
|
21416
|
+
"name": "choose-text",
|
|
21254
21417
|
"type": {
|
|
21255
|
-
"text": "
|
|
21418
|
+
"text": "string"
|
|
21256
21419
|
},
|
|
21257
|
-
"
|
|
21258
|
-
"
|
|
21420
|
+
"default": "\"Choose File\"",
|
|
21421
|
+
"description": "The text to display on the button.",
|
|
21422
|
+
"fieldName": "chooseText"
|
|
21423
|
+
},
|
|
21424
|
+
{
|
|
21425
|
+
"name": "multiple",
|
|
21426
|
+
"type": {
|
|
21427
|
+
"text": "boolean"
|
|
21428
|
+
},
|
|
21429
|
+
"default": "false",
|
|
21430
|
+
"description": "Allow multiple files to be selected.",
|
|
21431
|
+
"fieldName": "multiple"
|
|
21432
|
+
},
|
|
21433
|
+
{
|
|
21434
|
+
"type": {
|
|
21435
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
21436
|
+
},
|
|
21437
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
21438
|
+
"name": "surface-layer",
|
|
21439
|
+
"inheritedFrom": {
|
|
21440
|
+
"name": "EspalierElementBase",
|
|
21441
|
+
"module": "dist/shared/esp-element-base.js"
|
|
21442
|
+
}
|
|
21259
21443
|
},
|
|
21260
21444
|
{
|
|
21261
21445
|
"name": "scheme",
|
|
@@ -21299,31 +21483,31 @@
|
|
|
21299
21483
|
"name": "EspalierElementBase",
|
|
21300
21484
|
"module": "dist/shared/esp-element-base.js"
|
|
21301
21485
|
},
|
|
21486
|
+
"tagName": "esp-file-upload",
|
|
21487
|
+
"customElement": true,
|
|
21302
21488
|
"docPageTitle": {
|
|
21303
|
-
"name": "
|
|
21304
|
-
"description": "
|
|
21489
|
+
"name": "File",
|
|
21490
|
+
"description": "Upload"
|
|
21305
21491
|
},
|
|
21306
21492
|
"docUrl": {
|
|
21307
|
-
"name": "/components/
|
|
21493
|
+
"name": "/components/file-upload",
|
|
21308
21494
|
"description": ""
|
|
21309
21495
|
},
|
|
21310
21496
|
"menuGroup": {
|
|
21311
|
-
"name": "
|
|
21312
|
-
"description": ""
|
|
21497
|
+
"name": "Form",
|
|
21498
|
+
"description": "Controls"
|
|
21313
21499
|
},
|
|
21314
21500
|
"menuLabel": {
|
|
21315
|
-
"name": "
|
|
21316
|
-
"description": "
|
|
21501
|
+
"name": "File",
|
|
21502
|
+
"description": "Upload"
|
|
21317
21503
|
},
|
|
21318
21504
|
"menuIcon": {
|
|
21319
|
-
"name": "
|
|
21505
|
+
"name": "upload",
|
|
21320
21506
|
"description": ""
|
|
21321
21507
|
},
|
|
21322
|
-
"tagName": "esp-empty-state",
|
|
21323
|
-
"customElement": true,
|
|
21324
21508
|
"cssProperties": [
|
|
21325
21509
|
{
|
|
21326
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
21510
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
21327
21511
|
"name": "--esp-field-background",
|
|
21328
21512
|
"inheritedFrom": {
|
|
21329
21513
|
"name": "EspalierElementBase",
|
|
@@ -21378,25 +21562,24 @@
|
|
|
21378
21562
|
"module": "dist/shared/esp-element-base.js"
|
|
21379
21563
|
}
|
|
21380
21564
|
}
|
|
21381
|
-
]
|
|
21382
|
-
"events": []
|
|
21565
|
+
]
|
|
21383
21566
|
}
|
|
21384
21567
|
],
|
|
21385
21568
|
"exports": [
|
|
21386
21569
|
{
|
|
21387
21570
|
"kind": "js",
|
|
21388
|
-
"name": "
|
|
21571
|
+
"name": "EspalierFileUpload",
|
|
21389
21572
|
"declaration": {
|
|
21390
|
-
"name": "
|
|
21391
|
-
"module": "dist/
|
|
21573
|
+
"name": "EspalierFileUpload",
|
|
21574
|
+
"module": "dist/file-upload/esp-file-upload.js"
|
|
21392
21575
|
}
|
|
21393
21576
|
},
|
|
21394
21577
|
{
|
|
21395
21578
|
"kind": "custom-element-definition",
|
|
21396
|
-
"name": "esp-
|
|
21579
|
+
"name": "esp-file-upload",
|
|
21397
21580
|
"declaration": {
|
|
21398
|
-
"name": "
|
|
21399
|
-
"module": "dist/
|
|
21581
|
+
"name": "EspalierFileUpload",
|
|
21582
|
+
"module": "dist/file-upload/esp-file-upload.js"
|
|
21400
21583
|
}
|
|
21401
21584
|
}
|
|
21402
21585
|
]
|
|
@@ -21407,7 +21590,7 @@
|
|
|
21407
21590
|
"declarations": [
|
|
21408
21591
|
{
|
|
21409
21592
|
"kind": "class",
|
|
21410
|
-
"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 `COMPACT_VIEWPORT_MEDIA_QUERY` (the\n same breakpoint 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(\"esp-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(\"esp-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(\"esp-clicked\", () => dockedFlyout.toggle());\n</script>\n```\n\nBelow `COMPACT_VIEWPORT_MEDIA_QUERY` 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(\"esp-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-main-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(\"esp-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(\"esp-clicked\", () => {\n showFlyout({\n heading: \"Pears\",\n content: pearsDescription.content.cloneNode(true),\n anchor: pearsButton,\n });\n });\n</script>\n```",
|
|
21593
|
+
"description": "A panel for help and additional information. Uses spare page width when\navailable and switches to an overlay when the workspace cannot fit it.\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 `COMPACT_VIEWPORT_MEDIA_QUERY` (the\n same breakpoint 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(\"esp-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(\"esp-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(\"esp-clicked\", () => dockedFlyout.toggle());\n</script>\n```\n\nBelow `COMPACT_VIEWPORT_MEDIA_QUERY` 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(\"esp-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-main-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(\"esp-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(\"esp-clicked\", () => {\n showFlyout({\n heading: \"Pears\",\n content: pearsDescription.content.cloneNode(true),\n anchor: pearsButton,\n });\n });\n</script>\n```",
|
|
21411
21594
|
"name": "EspalierFlyout",
|
|
21412
21595
|
"cssProperties": [
|
|
21413
21596
|
{
|
|
@@ -21435,7 +21618,7 @@
|
|
|
21435
21618
|
"name": "--esp-flyout-z-index"
|
|
21436
21619
|
},
|
|
21437
21620
|
{
|
|
21438
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
21621
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
21439
21622
|
"name": "--esp-field-background",
|
|
21440
21623
|
"inheritedFrom": {
|
|
21441
21624
|
"name": "EspalierElementBase",
|
|
@@ -22866,6 +23049,17 @@
|
|
|
22866
23049
|
"description": "Which containing page owns anchored bus requests.\n\n- `\"outermost\"` (default) routes to the flyout in the outermost\n `esp-page` containing the request trigger.\n- `\"nearest\"` explicitly gives this flyout precedence for requests\n originating in its own page or nested descendants.\n\nA `scope=\"nearest\"` flyout must be a light-DOM descendant of the\n`esp-page` whose requests it owns so that page can discover it.\n\nRequests without an `anchor` or `returnFocusTo` have no local context,\nso only outermost page flyouts service them. Use the instance API for\na directly controlled nested flyout.",
|
|
22867
23050
|
"fieldName": "scope"
|
|
22868
23051
|
},
|
|
23052
|
+
{
|
|
23053
|
+
"type": {
|
|
23054
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
23055
|
+
},
|
|
23056
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
23057
|
+
"name": "surface-layer",
|
|
23058
|
+
"inheritedFrom": {
|
|
23059
|
+
"name": "EspalierElementBase",
|
|
23060
|
+
"module": "dist/shared/esp-element-base.js"
|
|
23061
|
+
}
|
|
23062
|
+
},
|
|
22869
23063
|
{
|
|
22870
23064
|
"name": "scheme",
|
|
22871
23065
|
"type": {
|
|
@@ -22997,7 +23191,7 @@
|
|
|
22997
23191
|
"name": "--esp-focus-picker-focus-outline"
|
|
22998
23192
|
},
|
|
22999
23193
|
{
|
|
23000
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
23194
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
23001
23195
|
"name": "--esp-field-background",
|
|
23002
23196
|
"inheritedFrom": {
|
|
23003
23197
|
"name": "EspalierElementBase",
|
|
@@ -23981,6 +24175,17 @@
|
|
|
23981
24175
|
"description": "Aspect ratio for the compact live preview.",
|
|
23982
24176
|
"fieldName": "compactRatio"
|
|
23983
24177
|
},
|
|
24178
|
+
{
|
|
24179
|
+
"type": {
|
|
24180
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
24181
|
+
},
|
|
24182
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
24183
|
+
"name": "surface-layer",
|
|
24184
|
+
"inheritedFrom": {
|
|
24185
|
+
"name": "EspalierElementBase",
|
|
24186
|
+
"module": "dist/shared/esp-element-base.js"
|
|
24187
|
+
}
|
|
24188
|
+
},
|
|
23984
24189
|
{
|
|
23985
24190
|
"name": "scheme",
|
|
23986
24191
|
"type": {
|
|
@@ -25108,6 +25313,17 @@
|
|
|
25108
25313
|
"description": "The placeholder text for the picker input.",
|
|
25109
25314
|
"fieldName": "placeholder"
|
|
25110
25315
|
},
|
|
25316
|
+
{
|
|
25317
|
+
"type": {
|
|
25318
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
25319
|
+
},
|
|
25320
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
25321
|
+
"name": "surface-layer",
|
|
25322
|
+
"inheritedFrom": {
|
|
25323
|
+
"name": "EspalierElementBase",
|
|
25324
|
+
"module": "dist/shared/esp-element-base.js"
|
|
25325
|
+
}
|
|
25326
|
+
},
|
|
25111
25327
|
{
|
|
25112
25328
|
"name": "scheme",
|
|
25113
25329
|
"type": {
|
|
@@ -25174,7 +25390,7 @@
|
|
|
25174
25390
|
},
|
|
25175
25391
|
"cssProperties": [
|
|
25176
25392
|
{
|
|
25177
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
25393
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
25178
25394
|
"name": "--esp-field-background",
|
|
25179
25395
|
"inheritedFrom": {
|
|
25180
25396
|
"name": "EspalierElementBase",
|
|
@@ -25472,7 +25688,7 @@
|
|
|
25472
25688
|
"name": "--esp-footer-row-gap"
|
|
25473
25689
|
},
|
|
25474
25690
|
{
|
|
25475
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
25691
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
25476
25692
|
"name": "--esp-field-background",
|
|
25477
25693
|
"inheritedFrom": {
|
|
25478
25694
|
"name": "EspalierElementBase",
|
|
@@ -26287,6 +26503,17 @@
|
|
|
26287
26503
|
"description": ""
|
|
26288
26504
|
},
|
|
26289
26505
|
"attributes": [
|
|
26506
|
+
{
|
|
26507
|
+
"type": {
|
|
26508
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
26509
|
+
},
|
|
26510
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
26511
|
+
"name": "surface-layer",
|
|
26512
|
+
"inheritedFrom": {
|
|
26513
|
+
"name": "EspalierElementBase",
|
|
26514
|
+
"module": "dist/shared/esp-element-base.js"
|
|
26515
|
+
}
|
|
26516
|
+
},
|
|
26290
26517
|
{
|
|
26291
26518
|
"name": "scheme",
|
|
26292
26519
|
"type": {
|
|
@@ -27122,6 +27349,17 @@
|
|
|
27122
27349
|
"description": "Visible heading for the link group. It also labels the navigation\nlandmark. When omitted, the landmark receives the fallback label\n“Footer links” without rendering an empty heading.",
|
|
27123
27350
|
"fieldName": "heading"
|
|
27124
27351
|
},
|
|
27352
|
+
{
|
|
27353
|
+
"type": {
|
|
27354
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
27355
|
+
},
|
|
27356
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
27357
|
+
"name": "surface-layer",
|
|
27358
|
+
"inheritedFrom": {
|
|
27359
|
+
"name": "EspalierElementBase",
|
|
27360
|
+
"module": "dist/shared/esp-element-base.js"
|
|
27361
|
+
}
|
|
27362
|
+
},
|
|
27125
27363
|
{
|
|
27126
27364
|
"name": "scheme",
|
|
27127
27365
|
"type": {
|
|
@@ -27184,7 +27422,7 @@
|
|
|
27184
27422
|
},
|
|
27185
27423
|
"cssProperties": [
|
|
27186
27424
|
{
|
|
27187
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
27425
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
27188
27426
|
"name": "--esp-field-background",
|
|
27189
27427
|
"inheritedFrom": {
|
|
27190
27428
|
"name": "EspalierElementBase",
|
|
@@ -27268,7 +27506,7 @@
|
|
|
27268
27506
|
"declarations": [
|
|
27269
27507
|
{
|
|
27270
27508
|
"kind": "class",
|
|
27271
|
-
"description": "A responsive site footer with structured spaces for branding, feature\nartwork, link groups, supporting actions, and legal or utility content.\nIts background remains full-bleed while its content automatically aligns\nto the surface of a containing [`<esp-page>`](/components/page/).\
|
|
27509
|
+
"description": "A responsive site footer with structured spaces for branding, feature\nartwork, link groups, supporting actions, and legal or utility content.\nIts background remains full-bleed while its content automatically aligns\nto the surface of a containing [`<esp-page>`](/components/page/).\nUse bare [`<esp-footer-link-group>`](/components/footer/link-group/) children\nwhen navigation groups should auto-flow independently through the grid.\n`columns` is a maximum: the grid always drops columns when they no longer fit.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\n```html\n<esp-footer\n light-brand-logo=\"/assets/logo-light.svg\"\n dark-brand-logo=\"/assets/logo-dark.svg\"\n brand-text=\"Espalier\"\n brand-href=\"/\"\n brand-alt=\"Espalier logo\"\n light-brand-color=\"oklch(0.35 0.12 216)\"\n dark-brand-color=\"oklch(0.9 0.08 216)\"\n columns=\"3\">\n <esp-footer-link-group heading=\"Explore\">\n <a href=\"/components\">Components</a>\n <a href=\"/api\">API</a>\n </esp-footer-link-group>\n <esp-footer-link-group heading=\"Learn\">\n <a href=\"/guides/getting-started\">Getting started</a>\n <a href=\"/guides/styling\">Styling</a>\n </esp-footer-link-group>\n <p slot=\"aside\">Themeable web components built on web standards.</p>\n <div slot=\"bottom\">Copyright 2026 Example Organization</div>\n</esp-footer>\n```\n\nFor creator-controlled columns, wrap each ordered stack of groups in\n[`<esp-footer-column>`](/components/footer/column/). Each wrapper is one grid\nitem at wide sizes; below the footer's compact container breakpoint, the\ncolumns become full-width rows in their slotted order. `columns` remains the\nmaximum number of grid items per row:\n\n```html\n<esp-footer columns=\"3\">\n <esp-footer-column>\n <esp-footer-link-group heading=\"Product\">\n <a href=\"/features\">Features</a>\n <a href=\"/pricing\">Pricing</a>\n </esp-footer-link-group>\n <esp-footer-link-group heading=\"Company\">\n <a href=\"/about\">About</a>\n <a href=\"/careers\">Careers</a>\n </esp-footer-link-group>\n </esp-footer-column>\n <esp-footer-column>\n <esp-footer-link-group heading=\"Resources\">\n <a href=\"/docs\">Documentation</a>\n <a href=\"/support\">Support</a>\n </esp-footer-link-group>\n </esp-footer-column>\n</esp-footer>\n```\n\nA slotted brand replaces configured branding, while the media slot accepts\na responsive `picture`, native image, or `esp-image`. Media spans the\nsurface-aligned content well; use the decorative background layer for\nedge-to-edge artwork:\n\n```html\n<esp-footer columns=\"4\">\n <picture slot=\"media\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"/assets/canvas-bg-dark.jpg\" />\n <img\n src=\"/assets/canvas-bg.jpg\"\n alt=\"A colorful floral pattern\"\n style=\"display: block; width: 100%; height: auto;\" />\n </picture>\n <a slot=\"brand\" href=\"/\" aria-label=\"Espalier home\">\n <img src=\"/assets/espalier-logo.svg\" alt=\"Espalier\" />\n </a>\n <esp-footer-link-group heading=\"Product\">\n <a href=\"/components\">Components</a>\n </esp-footer-link-group>\n</esp-footer>\n```\n\nDecorative art uses an image layer independent of the base color. The same\nAPI supports a repeating landscape band or one large cover image:\n\n```html\n<style>\n esp-footer.mountains {\n --esp-footer-background: oklch(0.48 0.12 145);\n --esp-footer-background-image-opacity: 0.55;\n --esp-footer-background-image:\n linear-gradient(to bottom, transparent 8rem, oklch(0.48 0.12 145)),\n url(\"/assets/espalier-geometric-texture.png\");\n --esp-footer-background-repeat: no-repeat, repeat-x;\n --esp-footer-background-position: 0 0, top;\n --esp-footer-background-size: 100% 100%, auto 10rem;\n --esp-footer-padding-block: 6rem;\n }\n\n esp-footer.photo {\n --esp-footer-background: oklch(0.2 0.04 216);\n --esp-footer-heading-color: white;\n --esp-footer-background-image:\n linear-gradient(oklch(0.1 0 0 / 0.55), oklch(0.1 0 0 / 0.55)),\n url(\"/assets/canvas-bg.jpg\");\n --esp-footer-background-repeat: no-repeat;\n --esp-footer-background-position: center;\n --esp-footer-background-size: cover;\n }\n</style>\n<esp-footer class=\"mountains\" brand-text=\"Mountain Studio\"></esp-footer>\n<esp-footer class=\"photo\" brand-text=\"Photo Studio\"></esp-footer>\n```\n\nSurface alignment is automatic inside `esp-page`; opt out only when the\nfooter's content should also span the entire bar:\n\n```html\n<esp-page align=\"center\" style=\"--esp-page-main-max-width: 36rem;\">\n <main>Surface-aligned page content</main>\n <esp-footer slot=\"footer\" brand-text=\"Aligned Studio\" columns=\"3\">\n <esp-footer-link-group heading=\"Explore\">\n <a href=\"/work\">Work</a>\n <a href=\"/about\">About</a>\n </esp-footer-link-group>\n </esp-footer>\n</esp-page>\n\n<esp-footer full-bleed-content brand-text=\"Full-width Studio\"></esp-footer>\n```",
|
|
27272
27510
|
"name": "EspalierFooter",
|
|
27273
27511
|
"cssProperties": [
|
|
27274
27512
|
{
|
|
@@ -27372,7 +27610,7 @@
|
|
|
27372
27610
|
"name": "--esp-footer-content-lead"
|
|
27373
27611
|
},
|
|
27374
27612
|
{
|
|
27375
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
27613
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
27376
27614
|
"name": "--esp-field-background",
|
|
27377
27615
|
"inheritedFrom": {
|
|
27378
27616
|
"name": "EspalierElementBase",
|
|
@@ -28489,6 +28727,17 @@
|
|
|
28489
28727
|
"description": "Optional accessible label for pages containing multiple footer landmarks.",
|
|
28490
28728
|
"fieldName": "landmarkLabel"
|
|
28491
28729
|
},
|
|
28730
|
+
{
|
|
28731
|
+
"type": {
|
|
28732
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
28733
|
+
},
|
|
28734
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
28735
|
+
"name": "surface-layer",
|
|
28736
|
+
"inheritedFrom": {
|
|
28737
|
+
"name": "EspalierElementBase",
|
|
28738
|
+
"module": "dist/shared/esp-element-base.js"
|
|
28739
|
+
}
|
|
28740
|
+
},
|
|
28492
28741
|
{
|
|
28493
28742
|
"name": "scheme",
|
|
28494
28743
|
"type": {
|
|
@@ -30146,7 +30395,7 @@
|
|
|
30146
30395
|
},
|
|
30147
30396
|
{
|
|
30148
30397
|
"kind": "class",
|
|
30149
|
-
"description": "Renders data in a table. Specify grid column definitions by\nadding [esp-grid-column](/components/grid/grid-column) elements to\nthe default slot.",
|
|
30398
|
+
"description": "Renders data in a table. Specify grid column definitions by\nadding [esp-grid-column](/components/grid/grid-column) elements to\nthe default slot.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.",
|
|
30150
30399
|
"name": "EspalierGrid",
|
|
30151
30400
|
"cssProperties": [
|
|
30152
30401
|
{
|
|
@@ -30202,7 +30451,7 @@
|
|
|
30202
30451
|
"name": "--esp-grid-link-hover-color"
|
|
30203
30452
|
},
|
|
30204
30453
|
{
|
|
30205
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
30454
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
30206
30455
|
"name": "--esp-field-background",
|
|
30207
30456
|
"inheritedFrom": {
|
|
30208
30457
|
"name": "EspalierElementBase",
|
|
@@ -31930,6 +32179,17 @@
|
|
|
31930
32179
|
"description": "The fields to include when filtering results. It defaults to\nan empty array, which includes all fields. The test dataset\nincludes an address field that is not displayed, so to only\nfilter results by fields displayed in the grid, specify those\nfields in the `search-fields` attribute.\n\n> **Warning:** When specifying arrays in plain HTML, the attributes\n> should be wrapped in single quotes.\n\n```html\n<esp-grid\n data-url=\"/assets/data/grid-data.json\"\n search-fields='[\"first_name\", \"last_name\"]'>\n <esp-grid-column header=\"Id\" field-name=\"id\" text-align=\"right\" sortable sort-type=\"number\"></esp-grid-column>\n <esp-grid-column header=\"Name\" sort-field=\"first_name\" sortable>\n <a href=\"mailto:${email}\">${first_name} ${last_name}</a>\n </esp-grid-column>\n</esp-grid>\n```",
|
|
31931
32180
|
"fieldName": "searchFields"
|
|
31932
32181
|
},
|
|
32182
|
+
{
|
|
32183
|
+
"type": {
|
|
32184
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
32185
|
+
},
|
|
32186
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
32187
|
+
"name": "surface-layer",
|
|
32188
|
+
"inheritedFrom": {
|
|
32189
|
+
"name": "EspalierElementBase",
|
|
32190
|
+
"module": "dist/shared/esp-element-base.js"
|
|
32191
|
+
}
|
|
32192
|
+
},
|
|
31933
32193
|
{
|
|
31934
32194
|
"name": "scheme",
|
|
31935
32195
|
"type": {
|
|
@@ -32124,7 +32384,7 @@
|
|
|
32124
32384
|
},
|
|
32125
32385
|
"privacy": "public",
|
|
32126
32386
|
"default": "null",
|
|
32127
|
-
"description": "Id of the region
|
|
32387
|
+
"description": "Id of the controlled region, forwarded to the inner native button.\n\nAssistive technology and role locators target that button, so host state must\nbe forwarded. A string id reference still cannot resolve a target outside\nits shadow root; ESP0222 tracks forwarding a resolved element reference.\n\n`ariaControls` has no base string member in the current DOM types. Keep it\nwithout `override`; `noImplicitOverride` will flag a future base declaration.",
|
|
32128
32388
|
"attribute": "aria-controls"
|
|
32129
32389
|
},
|
|
32130
32390
|
{
|
|
@@ -32187,7 +32447,7 @@
|
|
|
32187
32447
|
"text": "string | null"
|
|
32188
32448
|
},
|
|
32189
32449
|
"default": "null",
|
|
32190
|
-
"description": "Id of the region
|
|
32450
|
+
"description": "Id of the controlled region, forwarded to the inner native button.\n\nAssistive technology and role locators target that button, so host state must\nbe forwarded. A string id reference still cannot resolve a target outside\nits shadow root; ESP0222 tracks forwarding a resolved element reference.\n\n`ariaControls` has no base string member in the current DOM types. Keep it\nwithout `override`; `noImplicitOverride` will flag a future base declaration.",
|
|
32191
32451
|
"fieldName": "ariaControls"
|
|
32192
32452
|
},
|
|
32193
32453
|
{
|
|
@@ -32254,7 +32514,7 @@
|
|
|
32254
32514
|
"declarations": [
|
|
32255
32515
|
{
|
|
32256
32516
|
"kind": "class",
|
|
32257
|
-
"description": "
|
|
32517
|
+
"description": "Builds a site's top navigation bar. Use its four slots to add content:\n`topbar`, `brand`, `menu`, and `buttons`.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\nThe header works together with several companion components:\n[`<esp-menu>`](/components/menu/) provides the navigation\ncontainer, [`<esp-menu-item>`](/components/menu/item/)\nrenders individual links, and\n[`<esp-header-button>`](/components/header/button/) adds icon\nbuttons for global actions.\n\n```html\n<esp-header>\n <div slot=\"brand\" style=\"background-color: red;\" class=\"header-example\">brand</div>\n <esp-menu slot=\"menu\" mode=\"horizontal\" style=\"background-color: green;\">\n <esp-menu-item label=\"menu\" url=\"#\"></esp-menu-item>\n </esp-menu>\n <div slot=\"buttons\" style=\"background-color: yellow;\" class=\"header-example\">buttons</div>\n</esp-header>\n```",
|
|
32258
32518
|
"name": "EspalierHeader",
|
|
32259
32519
|
"cssProperties": [
|
|
32260
32520
|
{
|
|
@@ -32418,7 +32678,7 @@
|
|
|
32418
32678
|
"name": "--esp-header-button-stroke-width"
|
|
32419
32679
|
},
|
|
32420
32680
|
{
|
|
32421
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
32681
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
32422
32682
|
"name": "--esp-field-background",
|
|
32423
32683
|
"inheritedFrom": {
|
|
32424
32684
|
"name": "EspalierElementBase",
|
|
@@ -34245,6 +34505,17 @@
|
|
|
34245
34505
|
"description": "Opt out of surface alignment. When an `esp-header` is slotted into an\n`esp-page`, it constrains its bar content to the page's content\nsurface by default (the bar background stays full-bleed). Set this to\nlet the content span the full width instead, as it did before the\npage grew alignment modes. Standalone headers (outside `esp-page`) are\nalready full-bleed and unaffected.",
|
|
34246
34506
|
"fieldName": "fullBleedContent"
|
|
34247
34507
|
},
|
|
34508
|
+
{
|
|
34509
|
+
"type": {
|
|
34510
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
34511
|
+
},
|
|
34512
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
34513
|
+
"name": "surface-layer",
|
|
34514
|
+
"inheritedFrom": {
|
|
34515
|
+
"name": "EspalierElementBase",
|
|
34516
|
+
"module": "dist/shared/esp-element-base.js"
|
|
34517
|
+
}
|
|
34518
|
+
},
|
|
34248
34519
|
{
|
|
34249
34520
|
"name": "scheme",
|
|
34250
34521
|
"type": {
|
|
@@ -35252,6 +35523,17 @@
|
|
|
35252
35523
|
"description": "Whether this button's exact help topic is currently showing.",
|
|
35253
35524
|
"fieldName": "active"
|
|
35254
35525
|
},
|
|
35526
|
+
{
|
|
35527
|
+
"type": {
|
|
35528
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
35529
|
+
},
|
|
35530
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
35531
|
+
"name": "surface-layer",
|
|
35532
|
+
"inheritedFrom": {
|
|
35533
|
+
"name": "EspalierElementBase",
|
|
35534
|
+
"module": "dist/shared/esp-element-base.js"
|
|
35535
|
+
}
|
|
35536
|
+
},
|
|
35255
35537
|
{
|
|
35256
35538
|
"name": "scheme",
|
|
35257
35539
|
"type": {
|
|
@@ -35318,7 +35600,7 @@
|
|
|
35318
35600
|
"customElement": true,
|
|
35319
35601
|
"cssProperties": [
|
|
35320
35602
|
{
|
|
35321
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
35603
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
35322
35604
|
"name": "--esp-field-background",
|
|
35323
35605
|
"inheritedFrom": {
|
|
35324
35606
|
"name": "EspalierElementBase",
|
|
@@ -36400,7 +36682,7 @@
|
|
|
36400
36682
|
"customElement": true,
|
|
36401
36683
|
"cssProperties": [
|
|
36402
36684
|
{
|
|
36403
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
36685
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
36404
36686
|
"name": "--esp-field-background",
|
|
36405
36687
|
"inheritedFrom": {
|
|
36406
36688
|
"name": "EspalierElementBase",
|
|
@@ -36457,6 +36739,17 @@
|
|
|
36457
36739
|
}
|
|
36458
36740
|
],
|
|
36459
36741
|
"attributes": [
|
|
36742
|
+
{
|
|
36743
|
+
"type": {
|
|
36744
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
36745
|
+
},
|
|
36746
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
36747
|
+
"name": "surface-layer",
|
|
36748
|
+
"inheritedFrom": {
|
|
36749
|
+
"name": "EspalierElementBase",
|
|
36750
|
+
"module": "dist/shared/esp-element-base.js"
|
|
36751
|
+
}
|
|
36752
|
+
},
|
|
36460
36753
|
{
|
|
36461
36754
|
"name": "scheme",
|
|
36462
36755
|
"type": {
|
|
@@ -36851,7 +37144,7 @@
|
|
|
36851
37144
|
"name": "--esp-image-overlay-text-shadow"
|
|
36852
37145
|
},
|
|
36853
37146
|
{
|
|
36854
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
37147
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
36855
37148
|
"name": "--esp-field-background",
|
|
36856
37149
|
"inheritedFrom": {
|
|
36857
37150
|
"name": "EspalierElementBase",
|
|
@@ -37612,7 +37905,7 @@
|
|
|
37612
37905
|
}
|
|
37613
37906
|
}
|
|
37614
37907
|
],
|
|
37615
|
-
"description": "Grow
|
|
37908
|
+
"description": "Grow a ratio-sized banner when its text would be clipped; restore the ratio\nwhen the copy and its spacing fit again. Use separate grow and shrink checks\nto avoid oscillation. Explicit, capped, or stretched block sizes take precedence.\n\nAfter growth, verify that the frame did not widen and that the host grew\nwith it. Content-sized width can create a grow/shrink loop, while a host cap\ncan leave copy clipped outside the visible image. Roll back either failure\non the next frame, then retry after the width or cap changes.\n\nGrow in the observer callback to avoid a painted frame with clipped copy.\nChrome may report one benign ResizeObserver notification warning per growth;\ndeferring growth would introduce a visible shift.\n\nReturns whether the state changed and needs a render."
|
|
37616
37909
|
},
|
|
37617
37910
|
{
|
|
37618
37911
|
"kind": "method",
|
|
@@ -38685,6 +38978,17 @@
|
|
|
38685
38978
|
"description": "Aspect ratio used below the component-relative compact threshold.",
|
|
38686
38979
|
"fieldName": "compactRatio"
|
|
38687
38980
|
},
|
|
38981
|
+
{
|
|
38982
|
+
"type": {
|
|
38983
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
38984
|
+
},
|
|
38985
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
38986
|
+
"name": "surface-layer",
|
|
38987
|
+
"inheritedFrom": {
|
|
38988
|
+
"name": "EspalierElementBase",
|
|
38989
|
+
"module": "dist/shared/esp-element-base.js"
|
|
38990
|
+
}
|
|
38991
|
+
},
|
|
38688
38992
|
{
|
|
38689
38993
|
"name": "scheme",
|
|
38690
38994
|
"type": {
|
|
@@ -39179,7 +39483,7 @@
|
|
|
39179
39483
|
"name": "--esp-image-picker-option-height"
|
|
39180
39484
|
},
|
|
39181
39485
|
{
|
|
39182
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
39486
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
39183
39487
|
"name": "--esp-field-background",
|
|
39184
39488
|
"inheritedFrom": {
|
|
39185
39489
|
"name": "EspalierElementBase",
|
|
@@ -40357,6 +40661,17 @@
|
|
|
40357
40661
|
"description": "The name used when this picker participates in a `<form>`.",
|
|
40358
40662
|
"fieldName": "name"
|
|
40359
40663
|
},
|
|
40664
|
+
{
|
|
40665
|
+
"type": {
|
|
40666
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
40667
|
+
},
|
|
40668
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
40669
|
+
"name": "surface-layer",
|
|
40670
|
+
"inheritedFrom": {
|
|
40671
|
+
"name": "EspalierElementBase",
|
|
40672
|
+
"module": "dist/shared/esp-element-base.js"
|
|
40673
|
+
}
|
|
40674
|
+
},
|
|
40360
40675
|
{
|
|
40361
40676
|
"name": "scheme",
|
|
40362
40677
|
"type": {
|
|
@@ -40460,7 +40775,7 @@
|
|
|
40460
40775
|
"name": "--esp-image-preview-overlay-text"
|
|
40461
40776
|
},
|
|
40462
40777
|
{
|
|
40463
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
40778
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
40464
40779
|
"name": "--esp-field-background",
|
|
40465
40780
|
"inheritedFrom": {
|
|
40466
40781
|
"name": "EspalierElementBase",
|
|
@@ -41620,6 +41935,17 @@
|
|
|
41620
41935
|
"description": "Whether the upload for this image has failed.\nShows an error overlay with a retry button.",
|
|
41621
41936
|
"fieldName": "failed"
|
|
41622
41937
|
},
|
|
41938
|
+
{
|
|
41939
|
+
"type": {
|
|
41940
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
41941
|
+
},
|
|
41942
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
41943
|
+
"name": "surface-layer",
|
|
41944
|
+
"inheritedFrom": {
|
|
41945
|
+
"name": "EspalierElementBase",
|
|
41946
|
+
"module": "dist/shared/esp-element-base.js"
|
|
41947
|
+
}
|
|
41948
|
+
},
|
|
41623
41949
|
{
|
|
41624
41950
|
"name": "scheme",
|
|
41625
41951
|
"type": {
|
|
@@ -41699,7 +42025,7 @@
|
|
|
41699
42025
|
"name": "--esp-image-upload-preview-background"
|
|
41700
42026
|
},
|
|
41701
42027
|
{
|
|
41702
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
42028
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
41703
42029
|
"name": "--esp-field-background",
|
|
41704
42030
|
"inheritedFrom": {
|
|
41705
42031
|
"name": "EspalierElementBase",
|
|
@@ -43079,6 +43405,17 @@
|
|
|
43079
43405
|
},
|
|
43080
43406
|
"fieldName": "maxRowHeightVh"
|
|
43081
43407
|
},
|
|
43408
|
+
{
|
|
43409
|
+
"type": {
|
|
43410
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
43411
|
+
},
|
|
43412
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
43413
|
+
"name": "surface-layer",
|
|
43414
|
+
"inheritedFrom": {
|
|
43415
|
+
"name": "EspalierElementBase",
|
|
43416
|
+
"module": "dist/shared/esp-element-base.js"
|
|
43417
|
+
}
|
|
43418
|
+
},
|
|
43082
43419
|
{
|
|
43083
43420
|
"name": "scheme",
|
|
43084
43421
|
"type": {
|
|
@@ -43259,7 +43596,7 @@
|
|
|
43259
43596
|
"declarations": [
|
|
43260
43597
|
{
|
|
43261
43598
|
"kind": "class",
|
|
43262
|
-
"description": "
|
|
43599
|
+
"description": "Shows an informational or status message.\n\nA field fills one layer above the surface it sits on.\n\n```html\n<esp-info>\n Info defaults to intent=\"info\" and its informational surface treatment.\n</esp-info>\n```",
|
|
43263
43600
|
"name": "EspalierInfo",
|
|
43264
43601
|
"cssProperties": [
|
|
43265
43602
|
{
|
|
@@ -43275,7 +43612,7 @@
|
|
|
43275
43612
|
"name": "--esp-info-color-text"
|
|
43276
43613
|
},
|
|
43277
43614
|
{
|
|
43278
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
43615
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
43279
43616
|
"name": "--esp-field-background",
|
|
43280
43617
|
"inheritedFrom": {
|
|
43281
43618
|
"name": "EspalierElementBase",
|
|
@@ -44123,6 +44460,17 @@
|
|
|
44123
44460
|
"description": "If an info box is destroyable, it has a button that will fire the\n`esp-info-destroy` event when clicked.\n\n```html\n<esp-info destroyable>\n I am destroyable.\n</esp-info>\n```",
|
|
44124
44461
|
"fieldName": "destroyable"
|
|
44125
44462
|
},
|
|
44463
|
+
{
|
|
44464
|
+
"type": {
|
|
44465
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
44466
|
+
},
|
|
44467
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
44468
|
+
"name": "surface-layer",
|
|
44469
|
+
"inheritedFrom": {
|
|
44470
|
+
"name": "EspalierElementBase",
|
|
44471
|
+
"module": "dist/shared/esp-element-base.js"
|
|
44472
|
+
}
|
|
44473
|
+
},
|
|
44126
44474
|
{
|
|
44127
44475
|
"name": "scheme",
|
|
44128
44476
|
"type": {
|
|
@@ -45893,6 +46241,17 @@
|
|
|
45893
46241
|
"description": "Space-separated list of region codes that defines which\nphone localities are accepted for `input-type=\"tel\"`. The\nfirst locality whose format matches wins. When omitted,\ndefaults to a set of 10 common regions.\n\n```html\n<esp-input input-type=\"tel\" tel-localities=\"US CA GB\"></esp-input>\n```",
|
|
45894
46242
|
"fieldName": "telLocalities"
|
|
45895
46243
|
},
|
|
46244
|
+
{
|
|
46245
|
+
"type": {
|
|
46246
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
46247
|
+
},
|
|
46248
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
46249
|
+
"name": "surface-layer",
|
|
46250
|
+
"inheritedFrom": {
|
|
46251
|
+
"name": "EspalierElementBase",
|
|
46252
|
+
"module": "dist/shared/esp-element-base.js"
|
|
46253
|
+
}
|
|
46254
|
+
},
|
|
45896
46255
|
{
|
|
45897
46256
|
"name": "scheme",
|
|
45898
46257
|
"type": {
|
|
@@ -45959,7 +46318,7 @@
|
|
|
45959
46318
|
},
|
|
45960
46319
|
"cssProperties": [
|
|
45961
46320
|
{
|
|
45962
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
46321
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
45963
46322
|
"name": "--esp-field-background",
|
|
45964
46323
|
"inheritedFrom": {
|
|
45965
46324
|
"name": "EspalierElementBase",
|
|
@@ -46158,7 +46517,7 @@
|
|
|
46158
46517
|
"declarations": [
|
|
46159
46518
|
{
|
|
46160
46519
|
"kind": "class",
|
|
46161
|
-
"description": "A full-screen lightbox for viewing high-res versions of\n[esp-image](/components/image) elements. Point the `for` attribute\nat a CSS selector for the container that holds the images. Clicking\nany image in that container opens the lightbox at that image.\n\nOn mobile, swipe left or right to navigate. The gallery wraps\naround — swiping past the last image goes back to the first.\n\nA subtle caret at the bottom of the screen reveals a drawer\noverlay containing the image caption and a `comments` slot.\n\nBoth halves of that panel are optional. `hide-comments` drops the\ncomment count and the `comments` slot; `hide-caption` drops the\nimage caption. With only the caption left, the bar shows it on one\nline and slides up only when the line is actually clipped — a\ncaption that already fits has no caret and no tab stop. With both\nhidden there is no bar, though navigation dots remain for a\nmulti-image gallery.\n\n```html\n<esp-lightbox for=\".gallery\" hide-comments></esp-lightbox>\n```\n\n```html\n<div class=\"gallery\">\n <esp-image caption=\"A mountain lake\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/29/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/29/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/29/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/29/1200/800\"></esp-image-option>\n </esp-image>\n <esp-image caption=\"A forest path\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/15/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/15/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/15/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/15/1200/800\"></esp-image-option>\n </esp-image>\n <esp-image caption=\"Ocean waves\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/65/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/65/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/65/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/65/1200/800\"></esp-image-option>\n </esp-image>\n</div>\n<esp-lightbox for=\".gallery\"></esp-lightbox>\n```",
|
|
46520
|
+
"description": "A full-screen lightbox for viewing high-res versions of\n[esp-image](/components/image) elements. Point the `for` attribute\nat a CSS selector for the container that holds the images. Clicking\nany image in that container opens the lightbox at that image.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\nOn mobile, swipe left or right to navigate. The gallery wraps\naround — swiping past the last image goes back to the first.\n\nA subtle caret at the bottom of the screen reveals a drawer\noverlay containing the image caption and a `comments` slot.\n\nBoth halves of that panel are optional. `hide-comments` drops the\ncomment count and the `comments` slot; `hide-caption` drops the\nimage caption. With only the caption left, the bar shows it on one\nline and slides up only when the line is actually clipped — a\ncaption that already fits has no caret and no tab stop. With both\nhidden there is no bar, though navigation dots remain for a\nmulti-image gallery.\n\n```html\n<esp-lightbox for=\".gallery\" hide-comments></esp-lightbox>\n```\n\n```html\n<div class=\"gallery\">\n <esp-image caption=\"A mountain lake\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/29/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/29/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/29/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/29/1200/800\"></esp-image-option>\n </esp-image>\n <esp-image caption=\"A forest path\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/15/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/15/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/15/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/15/1200/800\"></esp-image-option>\n </esp-image>\n <esp-image caption=\"Ocean waves\" original-width=\"1200\" original-height=\"800\" low-res=\"https://picsum.photos/id/65/300/200\">\n <esp-image-option width=\"400\" url=\"https://picsum.photos/id/65/600/400\"></esp-image-option>\n <esp-image-option width=\"800\" url=\"https://picsum.photos/id/65/900/600\"></esp-image-option>\n <esp-image-option width=\"1024\" url=\"https://picsum.photos/id/65/1200/800\"></esp-image-option>\n </esp-image>\n</div>\n<esp-lightbox for=\".gallery\"></esp-lightbox>\n```",
|
|
46162
46521
|
"name": "EspalierLightbox",
|
|
46163
46522
|
"cssProperties": [
|
|
46164
46523
|
{
|
|
@@ -46178,7 +46537,7 @@
|
|
|
46178
46537
|
"name": "--esp-vellum-background-image-opacity"
|
|
46179
46538
|
},
|
|
46180
46539
|
{
|
|
46181
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
46540
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
46182
46541
|
"name": "--esp-field-background",
|
|
46183
46542
|
"inheritedFrom": {
|
|
46184
46543
|
"name": "EspalierElementBase",
|
|
@@ -47993,6 +48352,17 @@
|
|
|
47993
48352
|
"description": "Remove the image caption from the bar and the drawer.",
|
|
47994
48353
|
"fieldName": "hideCaption"
|
|
47995
48354
|
},
|
|
48355
|
+
{
|
|
48356
|
+
"type": {
|
|
48357
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
48358
|
+
},
|
|
48359
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
48360
|
+
"name": "surface-layer",
|
|
48361
|
+
"inheritedFrom": {
|
|
48362
|
+
"name": "EspalierElementBase",
|
|
48363
|
+
"module": "dist/shared/esp-element-base.js"
|
|
48364
|
+
}
|
|
48365
|
+
},
|
|
47996
48366
|
{
|
|
47997
48367
|
"name": "scheme",
|
|
47998
48368
|
"type": {
|
|
@@ -48170,7 +48540,7 @@
|
|
|
48170
48540
|
"name": "--esp-menu-item-font-family"
|
|
48171
48541
|
},
|
|
48172
48542
|
{
|
|
48173
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
48543
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
48174
48544
|
"name": "--esp-field-background",
|
|
48175
48545
|
"inheritedFrom": {
|
|
48176
48546
|
"name": "EspalierElementBase",
|
|
@@ -49394,6 +49764,17 @@
|
|
|
49394
49764
|
"description": "URL prefix for automatic expansion. If `location.pathname`\nstarts with this value, the group opens on connect.",
|
|
49395
49765
|
"fieldName": "urlPrefix"
|
|
49396
49766
|
},
|
|
49767
|
+
{
|
|
49768
|
+
"type": {
|
|
49769
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
49770
|
+
},
|
|
49771
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
49772
|
+
"name": "surface-layer",
|
|
49773
|
+
"inheritedFrom": {
|
|
49774
|
+
"name": "EspalierElementBase",
|
|
49775
|
+
"module": "dist/shared/esp-element-base.js"
|
|
49776
|
+
}
|
|
49777
|
+
},
|
|
49397
49778
|
{
|
|
49398
49779
|
"name": "scheme",
|
|
49399
49780
|
"type": {
|
|
@@ -49565,7 +49946,7 @@
|
|
|
49565
49946
|
"name": "--esp-menu-item-icon-size"
|
|
49566
49947
|
},
|
|
49567
49948
|
{
|
|
49568
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
49949
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
49569
49950
|
"name": "--esp-field-background",
|
|
49570
49951
|
"inheritedFrom": {
|
|
49571
49952
|
"name": "EspalierElementBase",
|
|
@@ -50488,6 +50869,17 @@
|
|
|
50488
50869
|
"description": "Optional icon name from the configured Espalier SVG sprite.",
|
|
50489
50870
|
"fieldName": "icon"
|
|
50490
50871
|
},
|
|
50872
|
+
{
|
|
50873
|
+
"type": {
|
|
50874
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
50875
|
+
},
|
|
50876
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
50877
|
+
"name": "surface-layer",
|
|
50878
|
+
"inheritedFrom": {
|
|
50879
|
+
"name": "EspalierElementBase",
|
|
50880
|
+
"module": "dist/shared/esp-element-base.js"
|
|
50881
|
+
}
|
|
50882
|
+
},
|
|
50491
50883
|
{
|
|
50492
50884
|
"name": "scheme",
|
|
50493
50885
|
"type": {
|
|
@@ -50631,7 +51023,7 @@
|
|
|
50631
51023
|
"name": "--esp-menu-top-offset"
|
|
50632
51024
|
},
|
|
50633
51025
|
{
|
|
50634
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
51026
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
50635
51027
|
"name": "--esp-field-background",
|
|
50636
51028
|
"inheritedFrom": {
|
|
50637
51029
|
"name": "EspalierElementBase",
|
|
@@ -52472,6 +52864,17 @@
|
|
|
52472
52864
|
"description": "Compatibility hook used by `esp-header` when inline navigation\nbecomes too wide. Prefer `mode`/`overflow` in application code.",
|
|
52473
52865
|
"fieldName": "sliding"
|
|
52474
52866
|
},
|
|
52867
|
+
{
|
|
52868
|
+
"type": {
|
|
52869
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
52870
|
+
},
|
|
52871
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
52872
|
+
"name": "surface-layer",
|
|
52873
|
+
"inheritedFrom": {
|
|
52874
|
+
"name": "EspalierElementBase",
|
|
52875
|
+
"module": "dist/shared/esp-element-base.js"
|
|
52876
|
+
}
|
|
52877
|
+
},
|
|
52475
52878
|
{
|
|
52476
52879
|
"name": "scheme",
|
|
52477
52880
|
"type": {
|
|
@@ -53602,7 +54005,7 @@
|
|
|
53602
54005
|
"type": {
|
|
53603
54006
|
"text": "array"
|
|
53604
54007
|
},
|
|
53605
|
-
"default": "[ ...EspalierElementBase.styles, css` :host { --_esp-page-resolved-max-width: var(--esp-page-main-max-width, 1536px); --_esp-page-main-min-width: var(--esp-page-main-min-width, 30rem); --_esp-page-preview-resolved-min-width: var(--esp-page-preview-min-width, 22.5rem); --_esp-page-preview-resolved-max-width: var(--esp-page-preview-max-width, 48rem); --_esp-page-flyout-resolved-min-width: var(--esp-page-flyout-min-width, 20rem); --_esp-page-flyout-resolved-max-width: var(--esp-page-flyout-max-width, 30rem); --_esp-page-preview-used-width: 0px; --_esp-page-flyout-used-width: 0px; --_esp-page-workspace-track: minmax( calc(var(--_esp-page-flyout-min) + var(--_esp-page-preview-min)), calc(var(--_esp-page-preview-used-width) + var(--_esp-page-flyout-used-width)) ); /* The cap sizes the main content *well*: the main track maxes at the cap and the surplus beyond the surface becomes canvas gutters. (Contract preserved from v2.1.0.) */ --_esp-page-main-track: minmax(0, var(--_esp-page-resolved-max-width)); /* Canvas gutter weights (physical left/right in LTR). The flexible gutters claim only the space left once the main track reaches its cap, so they appear exactly when the surface exceeds the cap — at any cap, with no viewport breakpoint (ADR-011). The start default keeps no leading gutter and lets all surplus collect trailing. Empty asides collapse to zero because the header and footer regions are inline-size-contained and no longer leak their min-content into the aside tracks (see the .esp-page-top / .esp-page-footer rules). The fr weights are written as 0fr/1fr (never bare 0) so the track list stays pairwise-interpolable and the flyout open/close can animate via grid track interpolation where supported. */ --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 1fr; /* Help and preview share an exact auxiliary workspace track before the outer trailing gutter. Opening help raises that track's safe minimum; the allocator supplies its concrete used width. */ --_esp-page-flyout-min: 0px; /* Preview starts at the surface edge before help. Reclaiming raises this minimum so the auxiliary track reserves both pane floors while the main track retains its own floor. */ --_esp-page-preview-min: 0px; /* A raised surface edge's drop shadow, cast in the trailing (inline-end) direction. The surface mirrors it onto both inline edges; a match-surface flyout casts only this trailing edge, so it lifts off the canvas while staying attached at its leading perforation (no shadow bleeding over the content it flies out from). */ --_esp-page-surface-edge-shadow: 0.75rem 0 1.5rem -0.75rem var(--esp-color-shadow); /* Resolve the surface shadow/border once (public override plus the built-in default) so the value is readable downstream — the surface layer and the match-surface flyout contract both consume it, and it stays a single source of truth. */ --_esp-page-surface-shadow: var( --esp-page-surface-shadow, -0.75rem 0 1.5rem -0.75rem var(--esp-color-shadow), var(--_esp-page-surface-edge-shadow) ); --_esp-page-surface-border: var(--esp-page-surface-border, none); --_esp-page-fixed-header-offset: var( --esp-page-fixed-header-offset, var(--esp-header-height, calc(4.5 * var(--esp-size-small))) ); display: block; } :host([kind=\"narrow\"]) { --_esp-page-resolved-max-width: var(--esp-page-main-max-width, 768px); } :host([align=\"center\"]) { --_esp-page-gutter-left: 1fr; --_esp-page-gutter-right: 1fr; } :host([align=\"end\"]) { --_esp-page-gutter-left: 1fr; --_esp-page-gutter-right: 0fr; } /* Full is unbounded only while the consumer has not supplied the explicit main maximum. The internal marker is synchronized from the computed public token before workspace allocation, allowing a finite full-kind authoring surface to retain normal alignment gutters. */ :host([kind=\"full\"]) { --_esp-page-resolved-max-width: var(--esp-page-main-max-width, none); } :host([kind=\"full\"]:not([data-main-max-configured])) { --_esp-page-main-track: 1fr; --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 0fr; } /* Site: the marketing shell (ESP0174). The main region is always unbounded — slotted esp-section bands own their centered wells — so this is the unconfigured-full geometry, unconditionally, and align's gutter weights do not apply. Declared after the align rules so it wins on order. */ :host([kind=\"site\"]) { --_esp-page-resolved-max-width: none; --_esp-page-main-track: 1fr; --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 0fr; } /* Flyout placement ladder (ESP0111). Preview and help occupy an exact auxiliary track between the main surface and the outer gutter: 1. spare canvas is converted into the allocated auxiliary track while main remains at its natural maximum 2. help and preview contract to their floors 3. an eligible linked navigation rail yields before the main track narrows toward its minimum 4. if the complete main + preview + help minimums do not fit, JS requests the flyout's existing modal overlay presentation 5. mobile → the media query below releases the minimum and esp-flyout itself becomes a fixed overlay drawer. The flyout-open host attribute is maintained by syncFlyoutState (Blink cannot match :has() inside :host(), so the state is mirrored instead). Declared after the align/kind rules so the open state wins. */ :host([flyout-open]) { --_esp-page-flyout-min: var(--_esp-page-flyout-resolved-min-width); } :host([preview-reclaiming]) { --_esp-page-preview-min: var(--_esp-page-preview-resolved-min-width); } /* Configured defaults and retained drag/keyboard choices participate in the same grid minima as automatic allocation. This lets a target that must reclaim main do so instead of overflowing the gutter, while the allocator still clamps private used widths before they reach Grid. */ :host([flyout-open][data-workspace-targeted]) { --_esp-page-flyout-min: var(--_esp-page-flyout-used-width); } :host([preview-reclaiming][data-workspace-targeted]) { --_esp-page-preview-min: var(--_esp-page-preview-used-width); } :host([flyout-open]), :host([preview-reclaiming]) { --_esp-page-main-track: minmax( var(--_esp-page-main-min-width), var(--_esp-page-resolved-max-width) ); } :host([kind=\"full\"]:not([data-main-max-configured])[flyout-open]), :host([kind=\"full\"]:not([data-main-max-configured])[preview-reclaiming]), :host([kind=\"site\"][flyout-open]), :host([kind=\"site\"][preview-reclaiming]) { --_esp-page-main-track: minmax(var(--_esp-page-main-min-width), 1fr); } /* Deliberate ADR-011 exception: like the esp-menu drawer (same 50em threshold), the flyout's overlay rung is a genuinely viewport-level decision — below it the flyout leaves the grid for a fixed drawer, so the gutter must release the minimum it was reserving. */ @media ${unsafeCSS(COMPACT_VIEWPORT_MEDIA_QUERY)} { :host([flyout-open]) { --_esp-page-flyout-min: 0px; } :host([preview-reclaiming]) { --_esp-page-preview-min: 0px; } :host([flyout-open]), :host([preview-reclaiming]) { --_esp-page-main-track: minmax(0, var(--_esp-page-resolved-max-width)); } :host([kind=\"full\"]:not([data-main-max-configured])[flyout-open]), :host([kind=\"full\"]:not([data-main-max-configured])[preview-reclaiming]), :host([kind=\"site\"][flyout-open]), :host([kind=\"site\"][preview-reclaiming]) { --_esp-page-main-track: 1fr; } .esp-page > .esp-page-preview-space, .esp-page > .esp-page-workspace-resize-handles { display: none; } } /* A forced mode=\"overlay\" flyout is a fixed drawer at any viewport width, so its aside needs the same above-the-header hoist the sub-50em media rule gives the auto-mode drawer — without this the desktop drawer paints beneath the header (aside z 5 vs header z 20). Keyed off the flyout-overlay-open state attribute maintained by syncFlyoutState. */ :host([flyout-overlay-open]) .esp-page > div.esp-page-flyout { z-index: var(--esp-flyout-z-index, 3000); } /* A nested page's fixed drawer still participates in this page's main stacking context. Raise that complete context while the descendant modal is open so the drawer and vellum paint above this page's header instead of trapping their close control beneath it. */ :host([descendant-flyout-overlay-open]) .esp-page > div.esp-page-main { z-index: var(--esp-flyout-z-index, 3000); overflow: visible; } /* Trigger-anchored panels belong to the same document flow as their initiator. BiDirectionalStickyController can keep updating the wrapper's inline top, but position: static deliberately makes it inert until the anchored panel closes. */ :host([flyout-anchored]:not([flyout-full-height])) .esp-page > div.esp-page-flyout > .sticky-wrapper { position: static; } /* Full-document help owns the visible block-size rather than following one field. Span header through footer so the page footer cannot push a viewport-height panel out of view at the document boundary; the sticky controller pins this presentation to the viewport top. */ :host([flyout-full-height]) .esp-page > div.esp-page-flyout { grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 2); } /* Anchored help connects back to its trigger across a visible preview. Raise only the sized help wrapper above the preview surface; the bridge itself is non-interactive inside esp-flyout. */ :host([flyout-anchored][preview-visible]) .esp-page > div.esp-page-flyout { z-index: calc(var(--esp-page-header-z-index, 20) + 2); } slot[name=\"flyout\"]::slotted(esp-flyout) { --_esp-flyout-used-width: var(--_esp-page-flyout-used-width); --_esp-flyout-preview-bridge-width: 0px; --_esp-flyout-preview-anchor-display: none; } :host([preview-visible]) slot[name=\"flyout\"]::slotted(esp-flyout) { --_esp-flyout-preview-bridge-width: var(--_esp-page-preview-used-width); --_esp-flyout-preview-anchor-display: block; } /* Flyout surface-match contract. A slotted esp-flyout with match-surface lifts its trailing edge with the surface's edge shadow, so the panel reads as a raised peer of the content surface rather than the shadowless tear-off. The leading edge keeps its perforation (the border is not overridden) and casts no shadow, so it stays attached at the tear line instead of floating over the content it flies out from. Opt-in and page-scoped: a standalone flyout has no surface to match and is unaffected. */ slot[name=\"flyout\"]::slotted(esp-flyout[match-surface]) { --esp-flyout-shadow: var(--_esp-page-surface-edge-shadow); } /* Header alignment contract. Published on the slotted esp-header (not :host) so it never shadows an inherited or author override and only the header-slot header adopts it — see the host-token-defaults architecture rule and ADR-005. max-width is the resolved cap; lead is the fraction of surplus placed before the content (0 = start, .5 = center, 1 = end). */ slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: var(--_esp-page-resolved-max-width); --esp-header-content-lead: 0; } :host([align=\"center\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-lead: 0.5; } :host([align=\"end\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-lead: 1; } /* full has no cap; publish 100% (not none) so the header contract calc resolves to zero surplus and leaves the header full-bleed. */ :host([kind=\"full\"]:not([data-main-max-configured])) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: 100%; } /* Footer alignment mirrors the header behavior with footer-owned contract names. The full-bleed footer paints its own background; only its internal content adopts the page's cap and lead fraction. */ slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: var(--_esp-page-resolved-max-width); --esp-footer-content-lead: 0; } :host([align=\"center\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-lead: 0.5; } :host([align=\"end\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-lead: 1; } :host([kind=\"full\"]:not([data-main-max-configured])) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: 100%; } /* Site: bar content aligns with the section wells, not a main cap. One public token governs the header, the footer, and every esp-section well, and the well is centered — declared after the align lead rules so the centered site column wins on order. */ :host([kind=\"site\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: var(--esp-page-well-max-width, 72rem); --esp-header-content-lead: 0.5; } :host([kind=\"site\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: var(--esp-page-well-max-width, 72rem); --esp-footer-content-lead: 0.5; } /* Contained shell: the header and footer ride the surface instead of the full viewport, so the whole page reads as one band on the canvas. Only their column placement changes — the full-height canvas and surface layers already do the rest. */ :host([contained]) .esp-page > div.esp-page-top, :host([contained]) .esp-page > div.esp-page-footer { grid-column: surface; } /* On the surface the bar already spans the content width, so the header fills it (no content padding) and drops its own shadow — the continuous surface edge shadow does the framing. */ :host([contained]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-shadow: none; } /* The 100% contract belongs to the capped kinds, where the surface column IS the content width. A contained site keeps the shared well column (ESP0174) — sections and chrome must not split columns just because the shell is contained. */ :host([contained]:not([kind=\"site\"])) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: 100%; } :host([contained]:not([kind=\"site\"])) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: 100%; } :host([kind=\"narrow\"]) .esp-page > div.esp-page-main { /* The golden reading measure, from the shared token (ESP0174); 66ch remains the fallback and the default emission. */ > ::slotted(*) { max-inline-size: var(--esp-measure, 66ch); } } #dialog-drop-zone { z-index: 4000; position: absolute; } :host([preview-visible]) .esp-page > div.esp-page-preview-space > .esp-page-preview { display: block; } :host([workspace-resizable][preview-visible]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-main-preview-resize-handle, :host([workspace-resizable][flyout-open]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-preview-flyout-resize-handle { display: block; } :host([workspace-resizable]:not([data-workspace-resize-ready])) .esp-page > .esp-page-workspace-resize-handles { display: none; } :host([workspace-resizable][data-workspace-trailing-edge-exposed]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle, :host([workspace-resizable][data-workspace-position-held]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle { display: block; } /* Pointer-owned resizing controls the logical leading gutter. It stays fixed for zero-sum pane trades and yields as an outward drag consumes centered outside canvas, keeping the active separator under the pointer in both cases. On release JS moves this pixel track to the aligned target; the normal grid transition supplies the glide before the intrinsic fr gutter contract resumes. */ :host([data-workspace-position-held]) { --_esp-page-gutter-left: var(--_esp-page-resize-leading-gutter-width, 0px); --_esp-page-gutter-right: 1fr; } :host([data-workspace-resizing]) { cursor: col-resize; user-select: none; } /* The grid-track glide that makes programmatic open/close feel animated reads as cursor lag while a pointer owns the seam, and a mid-glide grid feeds stale geometry into the clamp ranges of the next keyboard step. Track changes must be immediate for the whole resize session, pointer or keyboard. */ :host([data-workspace-resizing]) .esp-page, :host([data-workspace-keyboard-adjusting]) .esp-page { transition: none; } /* The linked menu switches its rail to a fixed drawer, but light-DOM menu content can still contribute an intrinsic width to the page's sidebar track. Collapse the owning aside only after the validated header/menu handshake is active, so unmatched navigation remains visible and reachable. */ :host([data-preview-navigation-collapsed]) .esp-page > aside.esp-page-left { inline-size: 0; min-inline-size: 0; } :host([data-preview-measuring]) .esp-page { transition: none; } /* New preview layouts are validated against visible geometry before presentation. Keep that candidate surface non-visible so a rejected measurement can never flash on screen. */ :host([data-preview-validating]) .esp-page-preview { visibility: hidden; } .esp-page { /* dvh keeps the shell within the visible mobile viewport; 100vh is the fallback for browsers without dvh (dvh === vh on desktop). */ min-height: 100vh; min-height: 100dvh; display: grid; grid-template-columns: [full-start canvas-left-start] var(--_esp-page-gutter-left) [canvas-left-end surface-start left-start] min-content [left-end main-start] var(--_esp-page-main-track) [main-end right-start] min-content [right-end surface-end canvas-right-start flyout-start] var(--_esp-page-workspace-track) [flyout-end] var(--_esp-page-gutter-right) [canvas-right-end full-end]; /* Animate the flyout claiming/releasing its track (and the gutter rebalance) via grid track interpolation where supported; elsewhere the modes still apply, just without the glide. Keep this 0.25s duration synchronized with WORKSPACE_RECENTER_DURATION in workspace-resize-session.ts. */ transition: grid-template-columns 0.25s ease; grid-template-rows: [top-start] min-content [top-end content-start] 1fr [content-end footer-start] min-content [footer-end]; overflow-x: clip; background: var(--esp-page-background, var(--esp-color-background)); line-height: 1.5; font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-type-normal); color: var(--esp-color-text); position: relative; &:before { content: \" \"; display: block; position: absolute; left: 0; top: 0; right: 0; bottom: 0; opacity: var(--esp-page-background-image-opacity, 1); background-image: var(--esp-page-background-image, none); z-index: 1; } > div.esp-page-top { z-index: var(--esp-page-header-z-index, 20); grid-column: full; grid-row: top; position: relative; /* The header spans every column, so without inline-size containment its content's min-content would be distributed into the aside tracks and inflate them below the cap (the asides would never collapse). Contain it like the main well so it takes its width from the grid, not the grid from it. */ contain: inline-size; } /* Sidebar containers — act as the \"track\" for sticky positioning */ aside.esp-page-left, aside.esp-page-right { z-index: 5; grid-row: content; position: relative; /* No explicit height — grid stretch fills the 1fr row, and the aside's bottom edge constrains sticky children. */ } > aside.esp-page-left { grid-column: left; } > div.esp-page-main { z-index: 5; grid-column: main; grid-row: content; position: relative; /* Clip oversized content without becoming a scroll container. A hidden-overflow wrapper traps descendant view timelines (and sticky positioning) on this non-scrolling main well. */ overflow: clip; /* The main well's own background. Defaults to transparent, so the well shows the page background exactly as before; set it to give the content well a distinct card color, or leave it transparent (with --esp-page-surface-shadow: none) for content that floats directly on the page/canvas. */ background: var(--esp-page-main-background, transparent); /* The cap now lives in the main track (minmax(0, cap)); the element fills its column. contain: inline-size still holds because the track gives a definite inline size. */ contain: inline-size; } > aside.esp-page-right { grid-column: right; } /* A neutral div, unlike the left/right asides: the slotted esp-flyout is itself the complementary landmark, and an aside wrapper would nest a second, empty landmark around it. */ > div.esp-page-flyout { /* Sits after preview inside the exact auxiliary track and sizes to the allocated help width. Outer surplus remains in the following gutter rather than under an empty stretched wrapper. */ grid-column: flyout; justify-self: start; grid-row: content; z-index: 5; position: relative; inline-size: var(--_esp-page-flyout-used-width); min-inline-size: 0; margin-inline-start: var(--_esp-page-preview-used-width); /* In the drawer rung the fixed esp-flyout paints inside this wrapper's stacking context, so the wrapper itself must rise above the header (z 20) while staying below the dialog drop zone (4000). Uses the same token as the drawer — set it on the page (or higher) to move both together. */ @media ${unsafeCSS(COMPACT_VIEWPORT_MEDIA_QUERY)} { z-index: var(--esp-flyout-z-index, 3000); } } /* Preview begins at the surface edge and help is offset after its resolved width, producing the logical order main → preview → help inside their exact shared auxiliary track. */ > div.esp-page-preview-space { grid-column: flyout; grid-row: content; z-index: 4; position: relative; min-inline-size: 0; > .esp-page-preview { display: none; box-sizing: border-box; inline-size: var(--_esp-page-preview-used-width); position: relative; background: var( --esp-page-preview-background, var(--esp-page-main-background, var(--esp-page-background, var(--esp-color-background))) ); border-inline-start: var(--esp-page-preview-border, 1px dotted var(--esp-color-border)); box-shadow: var(--esp-page-preview-shadow, var(--_esp-page-surface-edge-shadow)); } } /* A transparent interaction layer keeps the complete hit target above main, preview, and anchored help without raising either painted surface (which would hide the help bridge). */ > div.esp-page-workspace-resize-handles { grid-column: flyout; grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 3); position: relative; min-inline-size: 0; pointer-events: none; } > div.esp-page-workspace-resize-handles > .esp-page-workspace-resize-handle { display: none; box-sizing: border-box; position: absolute; inset-block: 0; z-index: 3; inline-size: var(--esp-page-resize-handle-hit-size, 2.75rem); margin-inline-start: calc(-0.5 * var(--esp-page-resize-handle-hit-size, 2.75rem)); border: 0; outline: 0; background: transparent; cursor: col-resize; pointer-events: auto; touch-action: none; /* The target spans the seam so it remains reachable during document scroll. Focus draws a dashed line along the seam itself — the visible height of the dotted tear-off edge, capped at one viewport — kept in view by sticky positioning while the page scrolls. */ &::after { content: \"\"; display: block; position: sticky; inset-block-start: 0; box-sizing: border-box; inline-size: 0; margin-inline: auto; block-size: 100dvh; max-block-size: 100%; pointer-events: none; } &:focus-visible::after { border-inline-start: var( --esp-page-resize-focus-outline, 2px dashed var(--esp-color-link) ); /* Glow in the line's own color so the focused seam reads as one deliberate highlight rather than a neutral drop shadow. */ box-shadow: var(--esp-page-resize-focus-shadow, 0 0 0.75rem var(--esp-color-link)); } } > div.esp-page-workspace-resize-handles > .esp-page-main-preview-resize-handle { inset-inline-start: 0; } > div.esp-page-workspace-resize-handles > .esp-page-preview-flyout-resize-handle { inset-inline-start: var(--_esp-page-preview-used-width); } > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle { inset-inline-start: calc( var(--_esp-page-preview-used-width) + var(--_esp-page-flyout-used-width) ); } /* Keep token-sized probes outside the width-constrained gutter. If they lived inside a zero-width preview space, layout would clamp their rectangles to zero before JS could decide whether the reclaim rung should be activated. */ > .esp-page-preview-min-width-probe, > .esp-page-preview-default-width-probe, > .esp-page-preview-max-width-probe, > .esp-page-flyout-min-width-probe, > .esp-page-flyout-default-width-probe, > .esp-page-flyout-max-width-probe, > .esp-page-main-min-width-probe, > .esp-page-main-configured-max-width-probe, > .esp-page-main-max-width-probe, > .esp-page-resize-step-probe, > .esp-page-resize-large-step-probe { position: absolute; block-size: 0; visibility: hidden; pointer-events: none; contain: strict; } > .esp-page-preview-min-width-probe { inline-size: var(--_esp-page-preview-resolved-min-width); } > .esp-page-preview-max-width-probe { inline-size: var(--_esp-page-preview-resolved-max-width); } > .esp-page-preview-default-width-probe { inline-size: var(--esp-page-preview-default-width, 0px); } > .esp-page-flyout-min-width-probe { inline-size: var(--_esp-page-flyout-resolved-min-width); } > .esp-page-flyout-max-width-probe { inline-size: var(--_esp-page-flyout-resolved-max-width); } > .esp-page-flyout-default-width-probe { inline-size: var(--esp-page-flyout-default-width, 0px); } > .esp-page-main-min-width-probe { inline-size: var(--_esp-page-main-min-width); } > .esp-page-main-configured-max-width-probe { inline-size: var(--esp-page-main-max-width, 0px); } > .esp-page-main-max-width-probe { inline-size: var(--_esp-page-resolved-max-width); } > .esp-page-resize-step-probe { inline-size: var(--esp-page-resize-step, 1rem); } > .esp-page-resize-large-step-probe { inline-size: var(--esp-page-resize-large-step, 4rem); } /* Canvas: the outer gutter regions promoted to a styleable layer. They only have width once the viewport exceeds the cap, so with the transparent defaults they are invisible and narrow pages are unchanged. Painted below the content (z-index 5) and below the surface shadow. */ > .esp-page-canvas { /* Full height: the canvas runs top-to-bottom. In the default full-bleed chrome the header/footer span the gutters and cover it there, so only the content-band gutters show; in contained mode the header/footer sit on the surface and the canvas shows full height beside them. */ grid-row: top-start / footer-end; z-index: 1; position: relative; pointer-events: none; background-color: var(--esp-page-canvas-background, transparent); /* Image layer mirrors the page background-image knobs: a separate layer so its opacity does not fade the color. */ &::before { content: \"\"; position: absolute; inset: 0; background-image: var(--esp-page-canvas-background-image, none); opacity: var(--esp-page-canvas-background-image-opacity, 1); } } > .esp-page-canvas--left { grid-column: canvas-left; } > .esp-page-canvas--right { /* The canvas spans both the auxiliary workspace and the independent outer gutter beneath it. */ grid-column: canvas-right; } /* Surface: a transparent backdrop spanning the surface cluster (left aside + main + right aside). It carries the surface edge shadow (on by default) and an optional hairline border. The shadow casts outward into the gutters; when there are no gutters the surface fills the viewport and overflow-x: clip on .esp-page trims the shadow away — so it is visible only above the cap with no container query needed. */ > .esp-page-surface { grid-column: surface; /* Full height so the edge shadow is one continuous line from the header through the content to the footer — no fade at the region joins. */ grid-row: top-start / footer-end; z-index: 2; pointer-events: none; box-shadow: var(--_esp-page-surface-shadow); border-inline: var(--_esp-page-surface-border); } /* Internal wrapper manipulated by BiDirectionalStickyController */ .sticky-wrapper { will-change: top; display: block; width: 100%; position: sticky; top: 0; } > div.esp-page-footer { grid-column: full; grid-row: footer; z-index: 10; background: var(--esp-page-background, var(--esp-color-background)); /* Spans every column; contain it so its content does not inflate the aside tracks (see the header note above). */ contain: inline-size; } &.sticky-header { slot[name=\"header\"]::slotted(esp-header), slot[name=\"sidebar\"]::slotted(esp-menu), slot[name=\"right\"]::slotted(esp-menu) { --esp-menu-top-offset: var(--_esp-page-fixed-header-offset); } > div.esp-page-top { position: sticky; top: var(--esp-page-sticky-header-top, 0); } } &.fixed-header { slot[name=\"header\"]::slotted(esp-header), slot[name=\"sidebar\"]::slotted(esp-menu), slot[name=\"right\"]::slotted(esp-menu) { --esp-menu-top-offset: var(--_esp-page-fixed-header-offset); } > div.esp-page-top { position: fixed; top: 0; left: 0; right: 0; } > div.esp-page-main, > aside.esp-page-left, > aside.esp-page-right, > div.esp-page-flyout, > .esp-page-surface, > .esp-page-canvas { margin-top: var(--_esp-page-fixed-header-offset); } } /* Inherit fonts for inputs and buttons */ input, button, textarea, select { font-family: inherit; font-size: inherit; } /* Make sure text areas without a rows attribute are not tiny */ textarea:not([rows]) { min-height: 10em; } /* Anything that has been anchored to should have extra scroll margin */ :target { scroll-margin-block: 5ex; } } .esp-page:has(esp-dialog[is-open=\"true\"]) { overflow: hidden; } /* Main and preview are additive surfaces. Once preview owns the trailing edge, move elevation there so no shadow appears at the internal join; the surface resumes its normal frame when preview is hidden. */ :host([preview-visible]) .esp-page > .esp-page-surface { box-shadow: none; } /* The preview's outer grid item and landmark span the complete page so the sticky wrapper's containing block has enough travel to remain pinned throughout a tall document. Its dynamic-viewport block size and vertical overflow keep its scroll position independent from the main document. It paints above full-bleed header chrome only in the preview's negotiated gutter track; overlay flyouts still take precedence by hiding preview presentation. */ .esp-page > div.esp-page-preview-space { grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 1); pointer-events: none; > .esp-page-preview { position: absolute; inset-block: 0; inset-inline-start: 0; pointer-events: auto; > .sticky-wrapper { block-size: 100vh; block-size: 100dvh; overflow-y: auto; /* Scroll preview first, then hand wheel/trackpad motion back to the document at either boundary (or when no overflow exists). */ overscroll-behavior-y: auto; } } } @media (prefers-reduced-motion: reduce) { .esp-page { transition: none; } } `, ]"
|
|
54008
|
+
"default": "[ ...EspalierElementBase.styles, css` :host { --_esp-surface-layer: initial; --_esp-page-resolved-max-width: var(--esp-page-main-max-width, 1536px); --_esp-page-main-min-width: var(--esp-page-main-min-width, 30rem); --_esp-page-preview-resolved-min-width: var(--esp-page-preview-min-width, 22.5rem); --_esp-page-preview-resolved-max-width: var(--esp-page-preview-max-width, 48rem); --_esp-page-flyout-resolved-min-width: var(--esp-page-flyout-min-width, 20rem); --_esp-page-flyout-resolved-max-width: var(--esp-page-flyout-max-width, 30rem); --_esp-page-preview-used-width: 0px; --_esp-page-flyout-used-width: 0px; --_esp-page-workspace-track: minmax( calc(var(--_esp-page-flyout-min) + var(--_esp-page-preview-min)), calc(var(--_esp-page-preview-used-width) + var(--_esp-page-flyout-used-width)) ); /* The cap sizes the main content *well*: the main track maxes at the cap and the surplus beyond the surface becomes canvas gutters. (Contract preserved from v2.1.0.) */ --_esp-page-main-track: minmax(0, var(--_esp-page-resolved-max-width)); /* Canvas gutter weights (physical left/right in LTR). The flexible gutters claim only the space left once the main track reaches its cap, so they appear exactly when the surface exceeds the cap — at any cap, with no viewport breakpoint (ADR-011). The start default keeps no leading gutter and lets all surplus collect trailing. Empty asides collapse to zero because the header and footer regions are inline-size-contained and no longer leak their min-content into the aside tracks (see the .esp-page-top / .esp-page-footer rules). The fr weights are written as 0fr/1fr (never bare 0) so the track list stays pairwise-interpolable and the flyout open/close can animate via grid track interpolation where supported. */ --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 1fr; /* Help and preview share an exact auxiliary workspace track before the outer trailing gutter. Opening help raises that track's safe minimum; the allocator supplies its concrete used width. */ --_esp-page-flyout-min: 0px; /* Preview starts at the surface edge before help. Reclaiming raises this minimum so the auxiliary track reserves both pane floors while the main track retains its own floor. */ --_esp-page-preview-min: 0px; /* A raised surface edge's drop shadow, cast in the trailing (inline-end) direction. The surface mirrors it onto both inline edges; a match-surface flyout casts only this trailing edge, so it lifts off the canvas while staying attached at its leading perforation (no shadow bleeding over the content it flies out from). */ --_esp-page-surface-edge-shadow: 0.75rem 0 1.5rem -0.75rem var(--esp-color-shadow); /* Resolve the surface shadow/border once (public override plus the built-in default) so the value is readable downstream — the surface layer and the match-surface flyout contract both consume it, and it stays a single source of truth. */ --_esp-page-surface-shadow: var( --esp-page-surface-shadow, -0.75rem 0 1.5rem -0.75rem var(--esp-color-shadow), var(--_esp-page-surface-edge-shadow) ); --_esp-page-surface-border: var(--esp-page-surface-border, none); --_esp-page-fixed-header-offset: var( --esp-page-fixed-header-offset, var(--esp-header-height, calc(4.5 * var(--esp-size-small))) ); display: block; } :host([kind=\"narrow\"]) { --_esp-page-resolved-max-width: var(--esp-page-main-max-width, 768px); } :host([align=\"center\"]) { --_esp-page-gutter-left: 1fr; --_esp-page-gutter-right: 1fr; } :host([align=\"end\"]) { --_esp-page-gutter-left: 1fr; --_esp-page-gutter-right: 0fr; } /* Full is unbounded only while the consumer has not supplied the explicit main maximum. The internal marker is synchronized from the computed public token before workspace allocation, allowing a finite full-kind authoring surface to retain normal alignment gutters. */ :host([kind=\"full\"]) { --_esp-page-resolved-max-width: var(--esp-page-main-max-width, none); } :host([kind=\"full\"]:not([data-main-max-configured])) { --_esp-page-main-track: 1fr; --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 0fr; } /* Site: the marketing shell (ESP0174). The main region is always unbounded — slotted esp-section bands own their centered wells — so this is the unconfigured-full geometry, unconditionally, and align's gutter weights do not apply. Declared after the align rules so it wins on order. */ :host([kind=\"site\"]) { --_esp-page-resolved-max-width: none; --_esp-page-main-track: 1fr; --_esp-page-gutter-left: 0fr; --_esp-page-gutter-right: 0fr; } /* Flyout placement ladder (ESP0111). Preview and help occupy an exact auxiliary track between the main surface and the outer gutter: 1. spare canvas is converted into the allocated auxiliary track while main remains at its natural maximum 2. help and preview contract to their floors 3. an eligible linked navigation rail yields before the main track narrows toward its minimum 4. if the complete main + preview + help minimums do not fit, JS requests the flyout's existing modal overlay presentation 5. mobile → the media query below releases the minimum and esp-flyout itself becomes a fixed overlay drawer. The flyout-open host attribute is maintained by syncFlyoutState (Blink cannot match :has() inside :host(), so the state is mirrored instead). Declared after the align/kind rules so the open state wins. */ :host([flyout-open]) { --_esp-page-flyout-min: var(--_esp-page-flyout-resolved-min-width); } :host([preview-reclaiming]) { --_esp-page-preview-min: var(--_esp-page-preview-resolved-min-width); } /* Configured defaults and retained drag/keyboard choices participate in the same grid minima as automatic allocation. This lets a target that must reclaim main do so instead of overflowing the gutter, while the allocator still clamps private used widths before they reach Grid. */ :host([flyout-open][data-workspace-targeted]) { --_esp-page-flyout-min: var(--_esp-page-flyout-used-width); } :host([preview-reclaiming][data-workspace-targeted]) { --_esp-page-preview-min: var(--_esp-page-preview-used-width); } :host([flyout-open]), :host([preview-reclaiming]) { --_esp-page-main-track: minmax( var(--_esp-page-main-min-width), var(--_esp-page-resolved-max-width) ); } :host([kind=\"full\"]:not([data-main-max-configured])[flyout-open]), :host([kind=\"full\"]:not([data-main-max-configured])[preview-reclaiming]), :host([kind=\"site\"][flyout-open]), :host([kind=\"site\"][preview-reclaiming]) { --_esp-page-main-track: minmax(var(--_esp-page-main-min-width), 1fr); } /* Deliberate ADR-011 exception: like the esp-menu drawer (same 50em threshold), the flyout's overlay rung is a genuinely viewport-level decision — below it the flyout leaves the grid for a fixed drawer, so the gutter must release the minimum it was reserving. */ @media ${unsafeCSS(COMPACT_VIEWPORT_MEDIA_QUERY)} { :host([flyout-open]) { --_esp-page-flyout-min: 0px; } :host([preview-reclaiming]) { --_esp-page-preview-min: 0px; } :host([flyout-open]), :host([preview-reclaiming]) { --_esp-page-main-track: minmax(0, var(--_esp-page-resolved-max-width)); } :host([kind=\"full\"]:not([data-main-max-configured])[flyout-open]), :host([kind=\"full\"]:not([data-main-max-configured])[preview-reclaiming]), :host([kind=\"site\"][flyout-open]), :host([kind=\"site\"][preview-reclaiming]) { --_esp-page-main-track: 1fr; } .esp-page > .esp-page-preview-space, .esp-page > .esp-page-workspace-resize-handles { display: none; } } /* A forced mode=\"overlay\" flyout is a fixed drawer at any viewport width, so its aside needs the same above-the-header hoist the sub-50em media rule gives the auto-mode drawer — without this the desktop drawer paints beneath the header (aside z 5 vs header z 20). Keyed off the flyout-overlay-open state attribute maintained by syncFlyoutState. */ :host([flyout-overlay-open]) .esp-page > div.esp-page-flyout { z-index: var(--esp-flyout-z-index, 3000); } /* A nested page's fixed drawer still participates in this page's main stacking context. Raise that complete context while the descendant modal is open so the drawer and vellum paint above this page's header instead of trapping their close control beneath it. */ :host([descendant-flyout-overlay-open]) .esp-page > div.esp-page-main { z-index: var(--esp-flyout-z-index, 3000); overflow: visible; } /* Trigger-anchored panels belong to the same document flow as their initiator. BiDirectionalStickyController can keep updating the wrapper's inline top, but position: static deliberately makes it inert until the anchored panel closes. */ :host([flyout-anchored]:not([flyout-full-height])) .esp-page > div.esp-page-flyout > .sticky-wrapper { position: static; } /* Full-document help owns the visible block-size rather than following one field. Span header through footer so the page footer cannot push a viewport-height panel out of view at the document boundary; the sticky controller pins this presentation to the viewport top. */ :host([flyout-full-height]) .esp-page > div.esp-page-flyout { grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 2); } /* Anchored help connects back to its trigger across a visible preview. Raise only the sized help wrapper above the preview surface; the bridge itself is non-interactive inside esp-flyout. */ :host([flyout-anchored][preview-visible]) .esp-page > div.esp-page-flyout { z-index: calc(var(--esp-page-header-z-index, 20) + 2); } slot[name=\"flyout\"]::slotted(esp-flyout) { --_esp-flyout-used-width: var(--_esp-page-flyout-used-width); --_esp-flyout-preview-bridge-width: 0px; --_esp-flyout-preview-anchor-display: none; } :host([preview-visible]) slot[name=\"flyout\"]::slotted(esp-flyout) { --_esp-flyout-preview-bridge-width: var(--_esp-page-preview-used-width); --_esp-flyout-preview-anchor-display: block; } /* Flyout surface-match contract. A slotted esp-flyout with match-surface lifts its trailing edge with the surface's edge shadow, so the panel reads as a raised peer of the content surface rather than the shadowless tear-off. The leading edge keeps its perforation (the border is not overridden) and casts no shadow, so it stays attached at the tear line instead of floating over the content it flies out from. Opt-in and page-scoped: a standalone flyout has no surface to match and is unaffected. */ slot[name=\"flyout\"]::slotted(esp-flyout[match-surface]) { --esp-flyout-shadow: var(--_esp-page-surface-edge-shadow); } /* Header alignment contract. Published on the slotted esp-header (not :host) so it never shadows an inherited or author override and only the header-slot header adopts it — see the host-token-defaults architecture rule and ADR-005. max-width is the resolved cap; lead is the fraction of surplus placed before the content (0 = start, .5 = center, 1 = end). */ slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: var(--_esp-page-resolved-max-width); --esp-header-content-lead: 0; } :host([align=\"center\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-lead: 0.5; } :host([align=\"end\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-lead: 1; } /* full has no cap; publish 100% (not none) so the header contract calc resolves to zero surplus and leaves the header full-bleed. */ :host([kind=\"full\"]:not([data-main-max-configured])) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: 100%; } /* Footer alignment mirrors the header behavior with footer-owned contract names. The full-bleed footer paints its own background; only its internal content adopts the page's cap and lead fraction. */ slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: var(--_esp-page-resolved-max-width); --esp-footer-content-lead: 0; } :host([align=\"center\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-lead: 0.5; } :host([align=\"end\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-lead: 1; } :host([kind=\"full\"]:not([data-main-max-configured])) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: 100%; } /* Site: bar content aligns with the section wells, not a main cap. One public token governs the header, the footer, and every esp-section well, and the well is centered — declared after the align lead rules so the centered site column wins on order. */ :host([kind=\"site\"]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: var(--esp-page-well-max-width, 72rem); --esp-header-content-lead: 0.5; } :host([kind=\"site\"]) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: var(--esp-page-well-max-width, 72rem); --esp-footer-content-lead: 0.5; } /* Contained shell: the header and footer ride the surface instead of the full viewport, so the whole page reads as one band on the canvas. Only their column placement changes — the full-height canvas and surface layers already do the rest. */ :host([contained]) .esp-page > div.esp-page-top, :host([contained]) .esp-page > div.esp-page-footer { grid-column: surface; } /* On the surface the bar already spans the content width, so the header fills it (no content padding) and drops its own shadow — the continuous surface edge shadow does the framing. */ :host([contained]) slot[name=\"header\"]::slotted(esp-header) { --esp-header-shadow: none; } /* The 100% contract belongs to the capped kinds, where the surface column IS the content width. A contained site keeps the shared well column (ESP0174) — sections and chrome must not split columns just because the shell is contained. */ :host([contained]:not([kind=\"site\"])) slot[name=\"header\"]::slotted(esp-header) { --esp-header-content-max-width: 100%; } :host([contained]:not([kind=\"site\"])) slot[name=\"footer\"]::slotted(esp-footer) { --esp-footer-content-max-width: 100%; } :host([kind=\"narrow\"]) .esp-page > div.esp-page-main { /* The golden reading measure, from the shared token (ESP0174); 66ch remains the fallback and the default emission. */ > ::slotted(*) { max-inline-size: var(--esp-measure, 66ch); } } #dialog-drop-zone { z-index: 4000; position: absolute; } :host([preview-visible]) .esp-page > div.esp-page-preview-space > .esp-page-preview { display: block; } :host([workspace-resizable][preview-visible]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-main-preview-resize-handle, :host([workspace-resizable][flyout-open]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-preview-flyout-resize-handle { display: block; } :host([workspace-resizable]:not([data-workspace-resize-ready])) .esp-page > .esp-page-workspace-resize-handles { display: none; } :host([workspace-resizable][data-workspace-trailing-edge-exposed]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle, :host([workspace-resizable][data-workspace-position-held]:not([flyout-overlay-open])) .esp-page > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle { display: block; } /* Pointer-owned resizing controls the logical leading gutter. It stays fixed for zero-sum pane trades and yields as an outward drag consumes centered outside canvas, keeping the active separator under the pointer in both cases. On release JS moves this pixel track to the aligned target; the normal grid transition supplies the glide before the intrinsic fr gutter contract resumes. */ :host([data-workspace-position-held]) { --_esp-page-gutter-left: var(--_esp-page-resize-leading-gutter-width, 0px); --_esp-page-gutter-right: 1fr; } :host([data-workspace-resizing]) { cursor: col-resize; user-select: none; } /* The grid-track glide that makes programmatic open/close feel animated reads as cursor lag while a pointer owns the seam, and a mid-glide grid feeds stale geometry into the clamp ranges of the next keyboard step. Track changes must be immediate for the whole resize session, pointer or keyboard. */ :host([data-workspace-resizing]) .esp-page, :host([data-workspace-keyboard-adjusting]) .esp-page { transition: none; } /* The linked menu switches its rail to a fixed drawer, but light-DOM menu content can still contribute an intrinsic width to the page's sidebar track. Collapse the owning aside only after the validated header/menu handshake is active, so unmatched navigation remains visible and reachable. */ :host([data-preview-navigation-collapsed]) .esp-page > aside.esp-page-left { inline-size: 0; min-inline-size: 0; } :host([data-preview-measuring]) .esp-page { transition: none; } /* New preview layouts are validated against visible geometry before presentation. Keep that candidate surface non-visible so a rejected measurement can never flash on screen. */ :host([data-preview-validating]) .esp-page-preview { visibility: hidden; } .esp-page { /* dvh keeps the shell within the visible mobile viewport; 100vh is the fallback for browsers without dvh (dvh === vh on desktop). */ min-height: 100vh; min-height: 100dvh; display: grid; grid-template-columns: [full-start canvas-left-start] var(--_esp-page-gutter-left) [canvas-left-end surface-start left-start] min-content [left-end main-start] var(--_esp-page-main-track) [main-end right-start] min-content [right-end surface-end canvas-right-start flyout-start] var(--_esp-page-workspace-track) [flyout-end] var(--_esp-page-gutter-right) [canvas-right-end full-end]; /* Animate the flyout claiming/releasing its track (and the gutter rebalance) via grid track interpolation where supported; elsewhere the modes still apply, just without the glide. Keep this 0.25s duration synchronized with WORKSPACE_RECENTER_DURATION in workspace-resize-session.ts. */ transition: grid-template-columns 0.25s ease; grid-template-rows: [top-start] min-content [top-end content-start] 1fr [content-end footer-start] min-content [footer-end]; overflow-x: clip; background: var(--esp-page-background, var(--esp-color-background)); line-height: 1.5; font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-type-normal); color: var(--esp-color-text); position: relative; &:before { content: \" \"; display: block; position: absolute; left: 0; top: 0; right: 0; bottom: 0; opacity: var(--esp-page-background-image-opacity, 1); background-image: var(--esp-page-background-image, none); z-index: 1; } > div.esp-page-top { z-index: var(--esp-page-header-z-index, 20); grid-column: full; grid-row: top; position: relative; /* The header spans every column, so without inline-size containment its content's min-content would be distributed into the aside tracks and inflate them below the cap (the asides would never collapse). Contain it like the main well so it takes its width from the grid, not the grid from it. */ contain: inline-size; } /* Sidebar containers — act as the \"track\" for sticky positioning */ aside.esp-page-left, aside.esp-page-right { z-index: 5; grid-row: content; position: relative; /* No explicit height — grid stretch fills the 1fr row, and the aside's bottom edge constrains sticky children. */ } > aside.esp-page-left { grid-column: left; } > div.esp-page-main { z-index: 5; grid-column: main; grid-row: content; position: relative; /* Clip oversized content without becoming a scroll container. A hidden-overflow wrapper traps descendant view timelines (and sticky positioning) on this non-scrolling main well. */ overflow: clip; /* The main well's own background. Defaults to transparent, so the well shows the page background exactly as before; set it to give the content well a distinct card color, or leave it transparent (with --esp-page-surface-shadow: none) for content that floats directly on the page/canvas. */ background: var(--esp-page-main-background, transparent); /* The cap now lives in the main track (minmax(0, cap)); the element fills its column. contain: inline-size still holds because the track gives a definite inline size. */ contain: inline-size; } > aside.esp-page-right { grid-column: right; } /* A neutral div, unlike the left/right asides: the slotted esp-flyout is itself the complementary landmark, and an aside wrapper would nest a second, empty landmark around it. */ > div.esp-page-flyout { /* Sits after preview inside the exact auxiliary track and sizes to the allocated help width. Outer surplus remains in the following gutter rather than under an empty stretched wrapper. */ grid-column: flyout; justify-self: start; grid-row: content; z-index: 5; position: relative; inline-size: var(--_esp-page-flyout-used-width); min-inline-size: 0; margin-inline-start: var(--_esp-page-preview-used-width); /* In the drawer rung the fixed esp-flyout paints inside this wrapper's stacking context, so the wrapper itself must rise above the header (z 20) while staying below the dialog drop zone (4000). Uses the same token as the drawer — set it on the page (or higher) to move both together. */ @media ${unsafeCSS(COMPACT_VIEWPORT_MEDIA_QUERY)} { z-index: var(--esp-flyout-z-index, 3000); } } /* Preview begins at the surface edge and help is offset after its resolved width, producing the logical order main → preview → help inside their exact shared auxiliary track. */ > div.esp-page-preview-space { grid-column: flyout; grid-row: content; z-index: 4; position: relative; min-inline-size: 0; > .esp-page-preview { display: none; box-sizing: border-box; inline-size: var(--_esp-page-preview-used-width); position: relative; background: var( --esp-page-preview-background, var(--esp-page-main-background, var(--esp-page-background, var(--esp-color-background))) ); border-inline-start: var(--esp-page-preview-border, 1px dotted var(--esp-color-border)); box-shadow: var(--esp-page-preview-shadow, var(--_esp-page-surface-edge-shadow)); } } /* A transparent interaction layer keeps the complete hit target above main, preview, and anchored help without raising either painted surface (which would hide the help bridge). */ > div.esp-page-workspace-resize-handles { grid-column: flyout; grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 3); position: relative; min-inline-size: 0; pointer-events: none; } > div.esp-page-workspace-resize-handles > .esp-page-workspace-resize-handle { display: none; box-sizing: border-box; position: absolute; inset-block: 0; z-index: 3; inline-size: var(--esp-page-resize-handle-hit-size, 2.75rem); margin-inline-start: calc(-0.5 * var(--esp-page-resize-handle-hit-size, 2.75rem)); border: 0; outline: 0; background: transparent; cursor: col-resize; pointer-events: auto; touch-action: none; /* The target spans the seam so it remains reachable during document scroll. Focus draws a dashed line along the seam itself — the visible height of the dotted tear-off edge, capped at one viewport — kept in view by sticky positioning while the page scrolls. */ &::after { content: \"\"; display: block; position: sticky; inset-block-start: 0; box-sizing: border-box; inline-size: 0; margin-inline: auto; block-size: 100dvh; max-block-size: 100%; pointer-events: none; } &:focus-visible::after { border-inline-start: var( --esp-page-resize-focus-outline, 2px dashed var(--esp-color-link) ); /* Glow in the line's own color so the focused seam reads as one deliberate highlight rather than a neutral drop shadow. */ box-shadow: var(--esp-page-resize-focus-shadow, 0 0 0.75rem var(--esp-color-link)); } } > div.esp-page-workspace-resize-handles > .esp-page-main-preview-resize-handle { inset-inline-start: 0; } > div.esp-page-workspace-resize-handles > .esp-page-preview-flyout-resize-handle { inset-inline-start: var(--_esp-page-preview-used-width); } > div.esp-page-workspace-resize-handles > .esp-page-workspace-end-resize-handle { inset-inline-start: calc( var(--_esp-page-preview-used-width) + var(--_esp-page-flyout-used-width) ); } /* Keep token-sized probes outside the width-constrained gutter. If they lived inside a zero-width preview space, layout would clamp their rectangles to zero before JS could decide whether the reclaim rung should be activated. */ > .esp-page-preview-min-width-probe, > .esp-page-preview-default-width-probe, > .esp-page-preview-max-width-probe, > .esp-page-flyout-min-width-probe, > .esp-page-flyout-default-width-probe, > .esp-page-flyout-max-width-probe, > .esp-page-main-min-width-probe, > .esp-page-main-configured-max-width-probe, > .esp-page-main-max-width-probe, > .esp-page-resize-step-probe, > .esp-page-resize-large-step-probe { position: absolute; block-size: 0; visibility: hidden; pointer-events: none; contain: strict; } > .esp-page-preview-min-width-probe { inline-size: var(--_esp-page-preview-resolved-min-width); } > .esp-page-preview-max-width-probe { inline-size: var(--_esp-page-preview-resolved-max-width); } > .esp-page-preview-default-width-probe { inline-size: var(--esp-page-preview-default-width, 0px); } > .esp-page-flyout-min-width-probe { inline-size: var(--_esp-page-flyout-resolved-min-width); } > .esp-page-flyout-max-width-probe { inline-size: var(--_esp-page-flyout-resolved-max-width); } > .esp-page-flyout-default-width-probe { inline-size: var(--esp-page-flyout-default-width, 0px); } > .esp-page-main-min-width-probe { inline-size: var(--_esp-page-main-min-width); } > .esp-page-main-configured-max-width-probe { inline-size: var(--esp-page-main-max-width, 0px); } > .esp-page-main-max-width-probe { inline-size: var(--_esp-page-resolved-max-width); } > .esp-page-resize-step-probe { inline-size: var(--esp-page-resize-step, 1rem); } > .esp-page-resize-large-step-probe { inline-size: var(--esp-page-resize-large-step, 4rem); } /* Canvas: the outer gutter regions promoted to a styleable layer. They only have width once the viewport exceeds the cap, so with the transparent defaults they are invisible and narrow pages are unchanged. Painted below the content (z-index 5) and below the surface shadow. */ > .esp-page-canvas { /* Full height: the canvas runs top-to-bottom. In the default full-bleed chrome the header/footer span the gutters and cover it there, so only the content-band gutters show; in contained mode the header/footer sit on the surface and the canvas shows full height beside them. */ grid-row: top-start / footer-end; z-index: 1; position: relative; pointer-events: none; background-color: var(--esp-page-canvas-background, transparent); /* Image layer mirrors the page background-image knobs: a separate layer so its opacity does not fade the color. */ &::before { content: \"\"; position: absolute; inset: 0; background-image: var(--esp-page-canvas-background-image, none); opacity: var(--esp-page-canvas-background-image-opacity, 1); } } > .esp-page-canvas--left { grid-column: canvas-left; } > .esp-page-canvas--right { /* The canvas spans both the auxiliary workspace and the independent outer gutter beneath it. */ grid-column: canvas-right; } /* Surface: a transparent backdrop spanning the surface cluster (left aside + main + right aside). It carries the surface edge shadow (on by default) and an optional hairline border. The shadow casts outward into the gutters; when there are no gutters the surface fills the viewport and overflow-x: clip on .esp-page trims the shadow away — so it is visible only above the cap with no container query needed. */ > .esp-page-surface { grid-column: surface; /* Full height so the edge shadow is one continuous line from the header through the content to the footer — no fade at the region joins. */ grid-row: top-start / footer-end; z-index: 2; pointer-events: none; box-shadow: var(--_esp-page-surface-shadow); border-inline: var(--_esp-page-surface-border); } /* Internal wrapper manipulated by BiDirectionalStickyController */ .sticky-wrapper { will-change: top; display: block; width: 100%; position: sticky; top: 0; } > div.esp-page-footer { grid-column: full; grid-row: footer; z-index: 10; background: var(--esp-page-background, var(--esp-color-background)); /* Spans every column; contain it so its content does not inflate the aside tracks (see the header note above). */ contain: inline-size; } &.sticky-header { slot[name=\"header\"]::slotted(esp-header), slot[name=\"sidebar\"]::slotted(esp-menu), slot[name=\"right\"]::slotted(esp-menu) { --esp-menu-top-offset: var(--_esp-page-fixed-header-offset); } > div.esp-page-top { position: sticky; top: var(--esp-page-sticky-header-top, 0); } } &.fixed-header { slot[name=\"header\"]::slotted(esp-header), slot[name=\"sidebar\"]::slotted(esp-menu), slot[name=\"right\"]::slotted(esp-menu) { --esp-menu-top-offset: var(--_esp-page-fixed-header-offset); } > div.esp-page-top { position: fixed; top: 0; left: 0; right: 0; } > div.esp-page-main, > aside.esp-page-left, > aside.esp-page-right, > div.esp-page-flyout, > .esp-page-surface, > .esp-page-canvas { margin-top: var(--_esp-page-fixed-header-offset); } } /* Inherit fonts for inputs and buttons */ input, button, textarea, select { font-family: inherit; font-size: inherit; } /* Make sure text areas without a rows attribute are not tiny */ textarea:not([rows]) { min-height: 10em; } /* Anything that has been anchored to should have extra scroll margin */ :target { scroll-margin-block: 5ex; } } .esp-page:has(esp-dialog[is-open=\"true\"]) { overflow: hidden; } /* Main and preview are additive surfaces. Once preview owns the trailing edge, move elevation there so no shadow appears at the internal join; the surface resumes its normal frame when preview is hidden. */ :host([preview-visible]) .esp-page > .esp-page-surface { box-shadow: none; } /* The preview's outer grid item and landmark span the complete page so the sticky wrapper's containing block has enough travel to remain pinned throughout a tall document. Its dynamic-viewport block size and vertical overflow keep its scroll position independent from the main document. It paints above full-bleed header chrome only in the preview's negotiated gutter track; overlay flyouts still take precedence by hiding preview presentation. */ .esp-page > div.esp-page-preview-space { grid-row: top-start / footer-end; z-index: calc(var(--esp-page-header-z-index, 20) + 1); pointer-events: none; > .esp-page-preview { position: absolute; inset-block: 0; inset-inline-start: 0; pointer-events: auto; > .sticky-wrapper { block-size: 100vh; block-size: 100dvh; overflow-y: auto; /* Scroll preview first, then hand wheel/trackpad motion back to the document at either boundary (or when no overflow exists). */ overscroll-behavior-y: auto; } } } @media (prefers-reduced-motion: reduce) { .esp-page { transition: none; } } `, ]"
|
|
53606
54009
|
}
|
|
53607
54010
|
],
|
|
53608
54011
|
"exports": [
|
|
@@ -53622,7 +54025,7 @@
|
|
|
53622
54025
|
"declarations": [
|
|
53623
54026
|
{
|
|
53624
54027
|
"kind": "class",
|
|
53625
|
-
"description": "
|
|
54028
|
+
"description": "Arranges a page's header, navigation, main content, and footer.",
|
|
53626
54029
|
"name": "EspalierPage",
|
|
53627
54030
|
"cssProperties": [
|
|
53628
54031
|
{
|
|
@@ -53742,7 +54145,7 @@
|
|
|
53742
54145
|
"name": "--esp-page-header-z-index"
|
|
53743
54146
|
},
|
|
53744
54147
|
{
|
|
53745
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
54148
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
53746
54149
|
"name": "--esp-field-background",
|
|
53747
54150
|
"inheritedFrom": {
|
|
53748
54151
|
"name": "EspalierElementBase",
|
|
@@ -56286,6 +56689,17 @@
|
|
|
56286
56689
|
"description": "Whether preview is currently reserving width and allowing the main well\nto shrink toward `--esp-page-main-min-width`. Managed by the page.",
|
|
56287
56690
|
"fieldName": "previewReclaiming"
|
|
56288
56691
|
},
|
|
56692
|
+
{
|
|
56693
|
+
"type": {
|
|
56694
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
56695
|
+
},
|
|
56696
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
56697
|
+
"name": "surface-layer",
|
|
56698
|
+
"inheritedFrom": {
|
|
56699
|
+
"name": "EspalierElementBase",
|
|
56700
|
+
"module": "dist/shared/esp-element-base.js"
|
|
56701
|
+
}
|
|
56702
|
+
},
|
|
56289
56703
|
{
|
|
56290
56704
|
"name": "scheme",
|
|
56291
56705
|
"type": {
|
|
@@ -57121,7 +57535,7 @@
|
|
|
57121
57535
|
"declarations": [
|
|
57122
57536
|
{
|
|
57123
57537
|
"kind": "class",
|
|
57124
|
-
"description": "
|
|
57538
|
+
"description": "Selects one option from a list. For selecting multiple options, see\n[esp-pick-some](/components/pickers/pick-some/).\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick a fruit\">\n <esp-pick-one>\n <esp-picker-item text=\"Apple\" value=\"apple\" icon=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\" icon=\"cherry\"></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"lemon\" icon=\"lemon\"></esp-picker-item>\n </esp-pick-one>\n </esp-form-item>\n</esp-box>\n```\n\n### Initial state\n\nSet the initially selected item using the `selected` attribute\non the `esp-picker-item`:\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick a fruit\">\n <esp-pick-one>\n <esp-picker-item text=\"Apple\" value=\"apple\" icon=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\" icon=\"cherry\"></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"lemon\" icon=\"lemon\" selected></esp-picker-item>\n </esp-pick-one>\n </esp-form-item>\n</esp-box>\n```\n\nAn item's `text`, `icon`, and `styles` may change after it is selected (a\nplaceholder label replaced once its data loads, say), and the picker shows\nthe new label; the selection follows the item's `value`.\n\n### Variable-height items\n\nItems with longer text wrap naturally. The menu sizes itself\nto fit the actual content height of each item:\n\n```html\n<div style=\"width: 260px\">\n <esp-box>\n <esp-form-item label=\"Pick a plan\">\n <esp-pick-one>\n <esp-picker-item\n text=\"Basic - includes core features only\"\n value=\"basic\">\n </esp-picker-item>\n <esp-picker-item\n text=\"Pro - adds analytics, priority support, and advanced integrations for growing teams\"\n value=\"pro\">\n </esp-picker-item>\n <esp-picker-item\n text=\"Enterprise - everything in Pro plus SSO, audit logs, dedicated account management, and custom SLAs\"\n value=\"enterprise\">\n </esp-picker-item>\n <esp-picker-item\n text=\"Starter\"\n value=\"starter\">\n </esp-picker-item>\n </esp-pick-one>\n </esp-form-item>\n </esp-box>\n</div>\n```\n\n### Typeahead (local filtering)\n\nAdd the `typeahead` attribute to let the user type to filter\nthe option list. The input becomes editable and the picker\nswitches to a filter icon on focus:\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick a fruit\">\n <esp-pick-one typeahead>\n <esp-picker-item text=\"Apple\" value=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\"></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"lemon\"></esp-picker-item>\n </esp-pick-one>\n </esp-form-item>\n</esp-box>\n```\n\n### Typeahead (remote filtering)\n\nSet the `fetchItems` property to a callback that returns\nmatching items from a server. The picker debounces input\n(300 ms by default) and shows a loading indicator while\nthe request is in flight. Use the provided `AbortSignal`\nto cancel stale requests:\n\n```html\n<esp-box>\n <esp-form-item label=\"Search users\">\n <esp-pick-one typeahead placeholder=\"Type a name\\u2026\">\n </esp-pick-one>\n </esp-form-item>\n</esp-box>\n<script>\n const picker = findByTagName(\"esp-pick-one\")[0];\n picker.fetchItems = async (query, signal) => {\n const res = await fetch(\"/assets/data/grid-data.json\", { signal });\n const all = await res.json();\n const q = query.toLowerCase();\n return all\n .filter(u =>\n u.first_name.toLowerCase().includes(q) ||\n u.last_name.toLowerCase().includes(q))\n .slice(0, 20)\n .map(u => ({\n text: `${u.first_name} ${u.last_name}`,\n value: String(u.id),\n }));\n };\n</script>\n```",
|
|
57125
57539
|
"name": "EspalierPickOne",
|
|
57126
57540
|
"members": [
|
|
57127
57541
|
{
|
|
@@ -59011,6 +59425,17 @@
|
|
|
59011
59425
|
"module": "dist/pickers/esp-picker-base.js"
|
|
59012
59426
|
}
|
|
59013
59427
|
},
|
|
59428
|
+
{
|
|
59429
|
+
"type": {
|
|
59430
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
59431
|
+
},
|
|
59432
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
59433
|
+
"name": "surface-layer",
|
|
59434
|
+
"inheritedFrom": {
|
|
59435
|
+
"name": "EspalierElementBase",
|
|
59436
|
+
"module": "dist/shared/esp-element-base.js"
|
|
59437
|
+
}
|
|
59438
|
+
},
|
|
59014
59439
|
{
|
|
59015
59440
|
"name": "scheme",
|
|
59016
59441
|
"type": {
|
|
@@ -59077,7 +59502,7 @@
|
|
|
59077
59502
|
},
|
|
59078
59503
|
"cssProperties": [
|
|
59079
59504
|
{
|
|
59080
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
59505
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
59081
59506
|
"name": "--esp-field-background",
|
|
59082
59507
|
"inheritedFrom": {
|
|
59083
59508
|
"name": "EspalierElementBase",
|
|
@@ -59160,7 +59585,7 @@
|
|
|
59160
59585
|
"declarations": [
|
|
59161
59586
|
{
|
|
59162
59587
|
"kind": "class",
|
|
59163
|
-
"description": "
|
|
59588
|
+
"description": "Selects multiple options from a list.\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick some fruit\">\n <esp-pick-some>\n <esp-picker-item text=\"Apple\" value=\"apple\" icon=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\" icon=\"cherry\"></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"banana\" icon=\"lemon\"></esp-picker-item>\n </esp-pick-some>\n </esp-form-item>\n</esp-box>\n```\n\n### Initial state (HTML)\n\nSet the initially selected items using the `selected` attribute\non the `esp-picker-item` elements:\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick a fruit\">\n <esp-pick-some>\n <esp-picker-item text=\"Apple\" value=\"apple\" icon=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\" icon=\"cherry\" selected></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"lemon\" icon=\"lemon\" selected></esp-picker-item>\n </esp-pick-some>\n </esp-form-item>\n</esp-box>\n```\n\n### Initial state (programmatic / pickerItems)\n\nWhen populating options via the `pickerItems` property (common\nin Lit templates that load data from an API), set `selected: true`\non items that should be pre-selected. The picker automatically\ndetects items with `selected: true` and renders them as chips:\n\n```ts\nconst allTopics = await fetchTopics();\nconst mySelectedIds = new Set(user.topicIds);\n\npicker.pickerItems = allTopics.map(t => ({\n text: t.name,\n value: t.id,\n selected: mySelectedIds.has(t.id),\n}));\n```\n\nThis works with all modes — plain, typeahead (local), and\ntypeahead (remote via `fetchItems`). The component reads the\n`selected` flag from `pickerItems` during `willUpdate()` and\npopulates `selectedItems` automatically. **Do not** separately\nassign `selectedItems` — just set `selected: true` on the\nitems in `pickerItems`.\n\n### Typeahead (local filtering)\n\nAdd the `typeahead` attribute to let the user type to filter\nthe option list. The input becomes editable and the picker\nswitches to a filter icon on focus:\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick some fruit\">\n <esp-pick-some typeahead>\n <esp-picker-item text=\"Apple\" value=\"apple\"></esp-picker-item>\n <esp-picker-item text=\"Cherry\" value=\"cherry\"></esp-picker-item>\n <esp-picker-item text=\"Lemon\" value=\"lemon\"></esp-picker-item>\n <esp-picker-item text=\"Banana\" value=\"banana\"></esp-picker-item>\n <esp-picker-item text=\"Mango\" value=\"mango\"></esp-picker-item>\n </esp-pick-some>\n </esp-form-item>\n</esp-box>\n```\n\n### Typeahead (remote filtering)\n\nSet the `fetchItems` property to a callback that returns\nmatching items from a server. The picker debounces input\n(300 ms by default) and shows a loading indicator while\nthe request is in flight. Use the provided `AbortSignal`\nto cancel stale requests:\n\n```html\n<esp-box>\n <esp-form-item label=\"Search users\">\n <esp-pick-some typeahead placeholder=\"Type a name…\">\n </esp-pick-some>\n </esp-form-item>\n</esp-box>\n<script>\n const picker = findByTagName(\"esp-pick-some\")[0];\n picker.fetchItems = async (query, signal) => {\n const res = await fetch(\"/assets/data/grid-data.json\", { signal });\n const all = await res.json();\n const q = query.toLowerCase();\n return all\n .filter(u =>\n u.first_name.toLowerCase().includes(q) ||\n u.last_name.toLowerCase().includes(q))\n .slice(0, 20)\n .map(u => ({\n text: `${u.first_name} ${u.last_name}`,\n value: String(u.id),\n }));\n };\n</script>\n```\n\n### Add new value\n\nSet the `addNewValue` property to a callback that creates\na new picker item from the typed text. When the user types\na value that does not match any existing item, the dropdown\ncaret becomes a plus icon. Clicking the plus (or pressing\nEnter) invokes the callback and adds the returned item as\na checked selection:\n\n```html\n<esp-box>\n <esp-form-item label=\"Pick some tags\">\n <esp-pick-some typeahead placeholder=\"Type to search or add…\">\n <esp-picker-item text=\"Bug\" value=\"bug\"></esp-picker-item>\n <esp-picker-item text=\"Feature\" value=\"feature\"></esp-picker-item>\n <esp-picker-item text=\"Docs\" value=\"docs\"></esp-picker-item>\n </esp-pick-some>\n </esp-form-item>\n</esp-box>\n<script>\n const picker = findByTagName(\"esp-pick-some\")[0];\n picker.addNewValue = (text) => ({\n text,\n value: text.toLowerCase().replace(/\\s+/g, \"-\"),\n selected: true,\n });\n</script>\n```",
|
|
59164
59589
|
"name": "EspalierPickSome",
|
|
59165
59590
|
"members": [
|
|
59166
59591
|
{
|
|
@@ -61120,6 +61545,17 @@
|
|
|
61120
61545
|
"module": "dist/pickers/esp-picker-base.js"
|
|
61121
61546
|
}
|
|
61122
61547
|
},
|
|
61548
|
+
{
|
|
61549
|
+
"type": {
|
|
61550
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
61551
|
+
},
|
|
61552
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
61553
|
+
"name": "surface-layer",
|
|
61554
|
+
"inheritedFrom": {
|
|
61555
|
+
"name": "EspalierElementBase",
|
|
61556
|
+
"module": "dist/shared/esp-element-base.js"
|
|
61557
|
+
}
|
|
61558
|
+
},
|
|
61123
61559
|
{
|
|
61124
61560
|
"name": "scheme",
|
|
61125
61561
|
"type": {
|
|
@@ -61178,7 +61614,7 @@
|
|
|
61178
61614
|
},
|
|
61179
61615
|
"cssProperties": [
|
|
61180
61616
|
{
|
|
61181
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
61617
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
61182
61618
|
"name": "--esp-field-background",
|
|
61183
61619
|
"inheritedFrom": {
|
|
61184
61620
|
"name": "EspalierElementBase",
|
|
@@ -62781,6 +63217,17 @@
|
|
|
62781
63217
|
"description": "An explicit width for the picker trigger. Accepts any valid\nCSS width value (e.g. `\"5em\"`, `\"80px\"`). When set, the host\nelement is sized to this width while the dropdown menu is\nallowed to be wider to accommodate longer items.\n\n```html\n<esp-pick-one width=\"5em\">\n <esp-picker-item text=\"Apple\" value=\"apple\"></esp-picker-item>\n</esp-pick-one>\n```",
|
|
62782
63218
|
"fieldName": "width"
|
|
62783
63219
|
},
|
|
63220
|
+
{
|
|
63221
|
+
"type": {
|
|
63222
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
63223
|
+
},
|
|
63224
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
63225
|
+
"name": "surface-layer",
|
|
63226
|
+
"inheritedFrom": {
|
|
63227
|
+
"name": "EspalierElementBase",
|
|
63228
|
+
"module": "dist/shared/esp-element-base.js"
|
|
63229
|
+
}
|
|
63230
|
+
},
|
|
62784
63231
|
{
|
|
62785
63232
|
"name": "scheme",
|
|
62786
63233
|
"type": {
|
|
@@ -62825,7 +63272,7 @@
|
|
|
62825
63272
|
},
|
|
62826
63273
|
"cssProperties": [
|
|
62827
63274
|
{
|
|
62828
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
63275
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
62829
63276
|
"name": "--esp-field-background",
|
|
62830
63277
|
"inheritedFrom": {
|
|
62831
63278
|
"name": "EspalierElementBase",
|
|
@@ -63946,7 +64393,7 @@
|
|
|
63946
64393
|
"declarations": [
|
|
63947
64394
|
{
|
|
63948
64395
|
"kind": "class",
|
|
63949
|
-
"description": "
|
|
64396
|
+
"description": "Track the selected item and any programmatic value waiting for matching options.\n\nConsumers may set `.value` before options arrive. A provisional selection\nfrom a DOM `selected` attribute can coexist with that pending value; the\nprogrammatic value wins once a matching item becomes available. See\nwithProvisionalItem.\n\n`pending` is separate from `undefined` because `.value = undefined` explicitly\nclears the selection.",
|
|
63950
64397
|
"name": "PickOneSelection",
|
|
63951
64398
|
"members": [
|
|
63952
64399
|
{
|
|
@@ -64427,7 +64874,7 @@
|
|
|
64427
64874
|
"declarations": [
|
|
64428
64875
|
{
|
|
64429
64876
|
"kind": "class",
|
|
64430
|
-
"description": "
|
|
64877
|
+
"description": "Shows contextual information, options, or actions while the underlying\npage remains interactive. Uses the native Popover API to render\nin the browser's top layer, escaping all ancestor `overflow`\nand `z-index` contexts.\n\n```html\n<esp-popover>\n <esp-button label=\"Show popover\" slot=\"target\"></esp-button>\n <esp-box slot=\"popover\">\n <h2>I'm a popover!</h2>\n <p>It can have anything in it.</p>\n <esp-popover>\n <esp-button label=\"Show nested popover\" slot=\"target\"></esp-button>\n <esp-box slot=\"popover\">\n <h2>I'm a nested popover!</h2>\n <p>I will not cause my parent popover to close.</p>\n <esp-popover>\n <esp-button label=\"Show another popover\" slot=\"target\"></esp-button>\n <esp-box slot=\"popover\">\n <h2>I'm a very nested popover!</h2>\n <p>I will not cause my parent popovers to close.</p>\n </esp-box>\n </esp-popover>\n </esp-box>\n </esp-popover>\n </esp-box>\n</esp-popover>\n```",
|
|
64431
64878
|
"name": "EspalierPopover",
|
|
64432
64879
|
"slots": [
|
|
64433
64880
|
{
|
|
@@ -64922,7 +65369,7 @@
|
|
|
64922
65369
|
"name": "--esp-progress-text-color"
|
|
64923
65370
|
},
|
|
64924
65371
|
{
|
|
64925
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
65372
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
64926
65373
|
"name": "--esp-field-background",
|
|
64927
65374
|
"inheritedFrom": {
|
|
64928
65375
|
"name": "EspalierElementBase",
|
|
@@ -65864,6 +66311,17 @@
|
|
|
65864
66311
|
"description": "Display mode for the progress indicator.\n\n- `bar` — linear progress bar (default)\n- `circle` — circular SVG ring",
|
|
65865
66312
|
"fieldName": "mode"
|
|
65866
66313
|
},
|
|
66314
|
+
{
|
|
66315
|
+
"type": {
|
|
66316
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
66317
|
+
},
|
|
66318
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
66319
|
+
"name": "surface-layer",
|
|
66320
|
+
"inheritedFrom": {
|
|
66321
|
+
"name": "EspalierElementBase",
|
|
66322
|
+
"module": "dist/shared/esp-element-base.js"
|
|
66323
|
+
}
|
|
66324
|
+
},
|
|
65867
66325
|
{
|
|
65868
66326
|
"name": "scheme",
|
|
65869
66327
|
"type": {
|
|
@@ -66990,6 +67448,17 @@
|
|
|
66990
67448
|
"description": "Disables all child radio buttons in the group.",
|
|
66991
67449
|
"fieldName": "disabled"
|
|
66992
67450
|
},
|
|
67451
|
+
{
|
|
67452
|
+
"type": {
|
|
67453
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
67454
|
+
},
|
|
67455
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
67456
|
+
"name": "surface-layer",
|
|
67457
|
+
"inheritedFrom": {
|
|
67458
|
+
"name": "EspalierElementBase",
|
|
67459
|
+
"module": "dist/shared/esp-element-base.js"
|
|
67460
|
+
}
|
|
67461
|
+
},
|
|
66993
67462
|
{
|
|
66994
67463
|
"name": "scheme",
|
|
66995
67464
|
"type": {
|
|
@@ -67048,7 +67517,7 @@
|
|
|
67048
67517
|
"customElement": true,
|
|
67049
67518
|
"cssProperties": [
|
|
67050
67519
|
{
|
|
67051
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
67520
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
67052
67521
|
"name": "--esp-field-background",
|
|
67053
67522
|
"inheritedFrom": {
|
|
67054
67523
|
"name": "EspalierElementBase",
|
|
@@ -67147,7 +67616,7 @@
|
|
|
67147
67616
|
"name": "--esp-radio-button-focus-shadow"
|
|
67148
67617
|
},
|
|
67149
67618
|
{
|
|
67150
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
67619
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
67151
67620
|
"name": "--esp-field-background",
|
|
67152
67621
|
"inheritedFrom": {
|
|
67153
67622
|
"name": "EspalierElementBase",
|
|
@@ -68061,6 +68530,17 @@
|
|
|
68061
68530
|
"description": "Controls whether the radio button is disabled.",
|
|
68062
68531
|
"fieldName": "disabled"
|
|
68063
68532
|
},
|
|
68533
|
+
{
|
|
68534
|
+
"type": {
|
|
68535
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
68536
|
+
},
|
|
68537
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
68538
|
+
"name": "surface-layer",
|
|
68539
|
+
"inheritedFrom": {
|
|
68540
|
+
"name": "EspalierElementBase",
|
|
68541
|
+
"module": "dist/shared/esp-element-base.js"
|
|
68542
|
+
}
|
|
68543
|
+
},
|
|
68064
68544
|
{
|
|
68065
68545
|
"name": "scheme",
|
|
68066
68546
|
"type": {
|
|
@@ -68192,7 +68672,7 @@
|
|
|
68192
68672
|
"name": "--esp-repeater-grid-row-gap"
|
|
68193
68673
|
},
|
|
68194
68674
|
{
|
|
68195
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
68675
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
68196
68676
|
"name": "--esp-field-background",
|
|
68197
68677
|
"inheritedFrom": {
|
|
68198
68678
|
"name": "EspalierElementBase",
|
|
@@ -70236,6 +70716,17 @@
|
|
|
70236
70716
|
"description": "Optional consumer-provided error message. When set it takes priority\nover internal fetch errors for display purposes.",
|
|
70237
70717
|
"fieldName": "errorMessage"
|
|
70238
70718
|
},
|
|
70719
|
+
{
|
|
70720
|
+
"type": {
|
|
70721
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
70722
|
+
},
|
|
70723
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
70724
|
+
"name": "surface-layer",
|
|
70725
|
+
"inheritedFrom": {
|
|
70726
|
+
"name": "EspalierElementBase",
|
|
70727
|
+
"module": "dist/shared/esp-element-base.js"
|
|
70728
|
+
}
|
|
70729
|
+
},
|
|
70239
70730
|
{
|
|
70240
70731
|
"name": "scheme",
|
|
70241
70732
|
"type": {
|
|
@@ -70354,7 +70845,7 @@
|
|
|
70354
70845
|
"declarations": [
|
|
70355
70846
|
{
|
|
70356
70847
|
"kind": "class",
|
|
70357
|
-
"description": "Root container for the Espalier design system.\n\
|
|
70848
|
+
"description": "Root container for the Espalier design system.\n\nSupplies descendant components with color, size, and font tokens.\nConfigure light and dark themes through JavaScript properties or\nBase64-encoded attributes. The root emits CSS custom properties\nfor the active theme.\n\n### Theme API\n\nSupply a `light-theme` and/or `dark-theme` attribute containing\na **Base64-encoded JSON** partial theme. Fields you omit fall\nback to built-in defaults. Switch between them with `scheme`.\n\n```html\n<esp-root\n light-theme=\"eyJzZWVkQ29sb3IiOiJva2xjaCgwLjcgMC4yIDE1NSkifQ==\"\n scheme=\"light\">\n <esp-box>\n <h2>Themed content</h2>\n </esp-box>\n</esp-root>\n```\n\n### Nested theme previews and scoped events\n\nA nested root creates a scoped theme for its descendants. It does not create\na separate event bus: every root publishes theme changes through the same\nEspalier singleton. Subscribe through the root whose changes you own so a\nnested preview cannot be mistaken for an application-level theme change.\n\n```ts\nconst applicationRoot = document.querySelector<EspalierRoot>(\"#application-theme\")!;\n\nconst unsubscribe = applicationRoot.subscribeScoped(\"scheme-changed\", ({ scheme }) => {\n localStorage.setItem(\"scheme\", scheme);\n});\n\n// Initial state is read directly; scoped events report later changes only.\nrenderScheme(applicationRoot.scheme);\n\n// Call when the owning integration is disposed.\nunsubscribe();\n```\n\nThis contract covers `scheme-changed`, `seed-color-changed`,\n`theme-changed`, and `icon-sprite-url-changed`. Components derived from\n`EspalierElementBase` use the same closest-root filter internally.\n\nThe root also owns the application's banner-texture vocabulary:\n`EspalierRoot.registerTexture(name, definition)` registers an\nimage-backed texture preset that any\n[esp-image](/components/image) banner in the application selects with\n`texture=\"<name>\"`, and `EspalierRoot.registeredTextures()` enumerates\nthe presets for building texture pickers.",
|
|
70358
70849
|
"name": "EspalierRoot",
|
|
70359
70850
|
"cssProperties": [
|
|
70360
70851
|
{
|
|
@@ -71176,7 +71667,7 @@
|
|
|
71176
71667
|
"kind": "field",
|
|
71177
71668
|
"name": "lightDomStyles",
|
|
71178
71669
|
"static": true,
|
|
71179
|
-
"default": "` /* ── Base typography ──────────────────────────────────── */ esp-root { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); font-weight: var(--esp-font-weight-body); line-height: 1.5; font-size: var(--esp-type-normal); color: var(--esp-color-text); } /* ── Lists ────────────────────────────────────────────── */ esp-root ul[role=\"list\"], esp-root ol[role=\"list\"] { list-style: none; } esp-root ul li::marker, esp-root ol li::marker { font-weight: bold; } /* ── Form controls ────────────────────────────────────── */ esp-root input, esp-root select, esp-root button { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); } /* ── Links ────────────────────────────────────────────── */ esp-root a:not([class]) { text-decoration-skip-ink: auto; font-weight: bold; color: var(--esp-color-link); } esp-root a { text-decoration: underline; text-decoration-skip-ink: auto; color: var(--esp-color-link); } esp-root a:hover { background-color: var(--esp-color-link-hover-bg); color: var(--esp-color-link-hover); text-decoration: none; } /* ── Inherited text styles ────────────────────────────── */ esp-root input, esp-root button, esp-root textarea, esp-root select, esp-root p, esp-root ul, esp-root li { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); color: var(--esp-color-text); font-size: inherit; } esp-root textarea:not([rows]) { min-height: 10em; } /* ── Headings ─────────────────────────────────────────── */ esp-root h1, esp-root h2, esp-root h3, esp-root h4, esp-root h5 { font-family: var( --_esp-font-headings-effective, var( --esp-font-headings, var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)) ) ); font-weight: var(--esp-font-weight-headings); color: var(--esp-color-headings); margin: var(--esp-size-small-to-normal) 0 var(--esp-size-tiny-to-small); } esp-root h5 { font-size: var(--esp-type-small); line-height: 1.4; } esp-root h4 { font-size: var(--esp-type-medium); line-height: 1.3; } esp-root h3 { font-size: var(--esp-type-big); line-height: 1.2; } esp-root h2 { font-size: var(--esp-type-large); line-height: 1.15; } esp-root h1 { font-size: var(--esp-type-huge); line-height: 1.1; } /* ── Code / Pre ───────────────────────────────────────── */ esp-root pre, esp-root code { font-family: var(--_esp-font-monospace-effective, var(--esp-font-monospace, monospace)); font-weight: var(--esp-font-weight-monospace); } esp-root code { font-size: var(--esp-type-small); background: var(--esp-color-layer-1); border-radius: var(--esp-size-border-radius); padding: 0 0.35em; display: inline-block; border: 1px dotted var(--esp-color-border); } esp-root pre { background-color: var(--esp-color-layer-1); border-radius: var(--esp-size-border-radius); border: 1px dotted var(--esp-color-border); } esp-root pre > code { font-size: var(--esp-type-tiny); display: block; background: none; border: none; hyphens: none; tab-size: 2; white-space: pre; padding: var(--esp-size-padding); overflow: auto; line-height: 1.8; } /* ── Images ────────────────────────────────────────────── */ esp-root img, esp-root picture { max-width: 100%; display: block; } `",
|
|
71670
|
+
"default": "` ${surfaceLayerAttributes(\"esp-root [surface-layer]\").cssText} /* ── Base typography ──────────────────────────────────── */ esp-root { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); font-weight: var(--esp-font-weight-body); line-height: 1.5; font-size: var(--esp-type-normal); color: var(--esp-color-text); } /* ── Lists ────────────────────────────────────────────── */ esp-root ul[role=\"list\"], esp-root ol[role=\"list\"] { list-style: none; } esp-root ul li::marker, esp-root ol li::marker { font-weight: bold; } /* ── Form controls ────────────────────────────────────── */ esp-root input, esp-root select, esp-root button { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); } /* ── Links ────────────────────────────────────────────── */ esp-root a:not([class]) { text-decoration-skip-ink: auto; font-weight: bold; color: var(--esp-color-link); } esp-root a { text-decoration: underline; text-decoration-skip-ink: auto; color: var(--esp-color-link); } esp-root a:hover { background-color: var(--esp-color-link-hover-bg); color: var(--esp-color-link-hover); text-decoration: none; } /* ── Inherited text styles ────────────────────────────── */ esp-root input, esp-root button, esp-root textarea, esp-root select, esp-root p, esp-root ul, esp-root li { font-family: var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)); color: var(--esp-color-text); font-size: inherit; } esp-root textarea:not([rows]) { min-height: 10em; } /* ── Headings ─────────────────────────────────────────── */ esp-root h1, esp-root h2, esp-root h3, esp-root h4, esp-root h5 { font-family: var( --_esp-font-headings-effective, var( --esp-font-headings, var(--_esp-font-body-effective, var(--esp-font-body, system-ui, sans-serif)) ) ); font-weight: var(--esp-font-weight-headings); color: var(--esp-color-headings); margin: var(--esp-size-small-to-normal) 0 var(--esp-size-tiny-to-small); } esp-root h5 { font-size: var(--esp-type-small); line-height: 1.4; } esp-root h4 { font-size: var(--esp-type-medium); line-height: 1.3; } esp-root h3 { font-size: var(--esp-type-big); line-height: 1.2; } esp-root h2 { font-size: var(--esp-type-large); line-height: 1.15; } esp-root h1 { font-size: var(--esp-type-huge); line-height: 1.1; } /* ── Code / Pre ───────────────────────────────────────── */ esp-root pre, esp-root code { font-family: var(--_esp-font-monospace-effective, var(--esp-font-monospace, monospace)); font-weight: var(--esp-font-weight-monospace); } esp-root code { font-size: var(--esp-type-small); background: var(--esp-color-layer-1); border-radius: var(--esp-size-border-radius); padding: 0 0.35em; display: inline-block; border: 1px dotted var(--esp-color-border); } esp-root pre { background-color: var(--esp-color-layer-1); border-radius: var(--esp-size-border-radius); border: 1px dotted var(--esp-color-border); } esp-root pre > code { font-size: var(--esp-type-tiny); display: block; background: none; border: none; hyphens: none; tab-size: 2; white-space: pre; padding: var(--esp-size-padding); overflow: auto; line-height: 1.8; } /* ── Images ────────────────────────────────────────────── */ esp-root img, esp-root picture { max-width: 100%; display: block; } `",
|
|
71180
71671
|
"description": "Light-DOM styles injected into `document.head` so that\nslotted content (headings, links, code blocks, lists, etc.)\ninherits the design-system tokens defined on `:host`.\nSelectors are scoped to `esp-root` descendants to avoid\nleaking into content outside the root."
|
|
71181
71672
|
}
|
|
71182
71673
|
],
|
|
@@ -71368,7 +71859,7 @@
|
|
|
71368
71859
|
},
|
|
71369
71860
|
{
|
|
71370
71861
|
"kind": "class",
|
|
71371
|
-
"description": "
|
|
71862
|
+
"description": "Arranges children in a wrapping row with a themed gap.\n\n```html\n<esp-row gap=\"small\" justify=\"between\">\n <span>Yoga · 60 min</span>\n <esp-button label=\"Book\"></esp-button>\n</esp-row>\n```\n\nRows wrap by default, so a button row or badge cluster degrades to\nmultiple lines at narrow widths instead of overflowing; set `nowrap`\nfor toolbars that must stay on one line. Cross-axis alignment\ndefaults to `center` — the icon-beside-label, text-beside-button\ncase a row exists for.",
|
|
71372
71863
|
"name": "EspalierRow",
|
|
71373
71864
|
"cssProperties": [
|
|
71374
71865
|
{
|
|
@@ -71376,7 +71867,7 @@
|
|
|
71376
71867
|
"name": "--esp-row-gap"
|
|
71377
71868
|
},
|
|
71378
71869
|
{
|
|
71379
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
71870
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
71380
71871
|
"name": "--esp-field-background",
|
|
71381
71872
|
"inheritedFrom": {
|
|
71382
71873
|
"name": "EspalierElementBase",
|
|
@@ -72255,6 +72746,17 @@
|
|
|
72255
72746
|
"description": "Keeps every child on one line instead of wrapping.",
|
|
72256
72747
|
"fieldName": "nowrap"
|
|
72257
72748
|
},
|
|
72749
|
+
{
|
|
72750
|
+
"type": {
|
|
72751
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
72752
|
+
},
|
|
72753
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
72754
|
+
"name": "surface-layer",
|
|
72755
|
+
"inheritedFrom": {
|
|
72756
|
+
"name": "EspalierElementBase",
|
|
72757
|
+
"module": "dist/shared/esp-element-base.js"
|
|
72758
|
+
}
|
|
72759
|
+
},
|
|
72258
72760
|
{
|
|
72259
72761
|
"name": "scheme",
|
|
72260
72762
|
"type": {
|
|
@@ -72407,7 +72909,7 @@
|
|
|
72407
72909
|
"name": "--esp-search-loading-indicator-track-color"
|
|
72408
72910
|
},
|
|
72409
72911
|
{
|
|
72410
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
72912
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
72411
72913
|
"name": "--esp-field-background",
|
|
72412
72914
|
"inheritedFrom": {
|
|
72413
72915
|
"name": "EspalierElementBase",
|
|
@@ -73490,6 +73992,17 @@
|
|
|
73490
73992
|
"description": "Placeholder text for the search input.",
|
|
73491
73993
|
"fieldName": "placeholder"
|
|
73492
73994
|
},
|
|
73995
|
+
{
|
|
73996
|
+
"type": {
|
|
73997
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
73998
|
+
},
|
|
73999
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
74000
|
+
"name": "surface-layer",
|
|
74001
|
+
"inheritedFrom": {
|
|
74002
|
+
"name": "EspalierElementBase",
|
|
74003
|
+
"module": "dist/shared/esp-element-base.js"
|
|
74004
|
+
}
|
|
74005
|
+
},
|
|
73493
74006
|
{
|
|
73494
74007
|
"name": "scheme",
|
|
73495
74008
|
"type": {
|
|
@@ -73591,7 +74104,7 @@
|
|
|
73591
74104
|
"declarations": [
|
|
73592
74105
|
{
|
|
73593
74106
|
"kind": "class",
|
|
73594
|
-
"description": "A full-bleed page band with a centered content well — the natural host\nfor a theme zone.\n\n`esp-section` paints the local `--esp-color-background` edge to edge\nand centers its content in a capped well. It carries no card identity:\nno raised surface, no border radius, no shadow. Give it a `context`\n(see
|
|
74107
|
+
"description": "A full-bleed page band with a centered content well — the natural host\nfor a theme zone.\n\n`esp-section` paints the local `--esp-color-background` edge to edge\nand centers its content in a capped well. It carries no card identity:\nno raised surface, no border radius, no shadow. Give it a `context`\n(see [theme overview](/espalier-guides/#foundations)) and\nthe band renders the zone's complete token table with nothing to\nneutralize:\n\n```html\n<esp-section context=\"inverted\">\n <h2>The reversed band</h2>\n <p>Everything in here renders on the zone's tokens, and the band\n spans its container edge to edge.</p>\n</esp-section>\n```\n\nInside `esp-page kind=\"site\"` sections stack full-width and their\nwells share the page's `--esp-page-well-max-width`, so section\ncontent, the header, and the footer all align on one column. Outside\na page the well defaults to the same width and the band fills\nwhatever container it is given.\n\nThe vertical rhythm defaults to the theme's fluid `--esp-size-section`\nstep. For edge-to-edge content (a full-bleed hero image) clear both\nthe well cap and the inline breathing room —\n`--esp-section-max-width: none; --esp-section-padding-inline: 0;` —\nand drop `--esp-section-padding-block` too when the media should\nmeet the band's edges; the band's zone behavior is unaffected.\n\nA section may also tint one raster alpha mask behind its content.\nThe component owns clipping, no-repeat mask behavior, stacking, and\ninteraction isolation; consumers opt in with the `decoration`\nattribute and supply only the image, semantic tint, position, size, and\nopacity:\n\n```html\n<esp-section\n decoration\n style=\"\n --esp-section-decoration-image: url('/assets/brand-mark.png');\n --esp-section-decoration-position: calc(100% + 2rem) -2rem;\n --esp-section-decoration-size: min(34rem, 62%);\n --esp-section-decoration-opacity: 0.09;\n \"\n>\n <h1>Rooted in warmth</h1>\n</esp-section>\n```\n\nWithout `decoration` the section renders no decorative layer at all, and\nthe `--esp-section-decoration-*` hooks have no effect. The attribute is\nwhat keeps an undecorated band free of painted planes: accessibility\nauditors such as axe-core and Lighthouse do not model `mask-image`, so a\ntinted plane hidden only by a mask is read as the background behind every\nword in the section. Set it together with the image, never on its own. A\ndecorated band is audited as though the tint covered it everywhere, so\ntext that passes an audit also reads where it crosses the mark.\n\nCSS image values are trusted stylesheet input. Products that accept image\nreferences from documents or users must enforce their own asset ownership\nand URL policy before mapping a value to this hook.",
|
|
73595
74108
|
"name": "EspalierSection",
|
|
73596
74109
|
"cssProperties": [
|
|
73597
74110
|
{
|
|
@@ -73631,7 +74144,7 @@
|
|
|
73631
74144
|
"name": "--esp-section-decoration-opacity"
|
|
73632
74145
|
},
|
|
73633
74146
|
{
|
|
73634
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
74147
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
73635
74148
|
"name": "--esp-field-background",
|
|
73636
74149
|
"inheritedFrom": {
|
|
73637
74150
|
"name": "EspalierElementBase",
|
|
@@ -74451,6 +74964,17 @@
|
|
|
74451
74964
|
"description": "Whether the section paints its decorative mask plane. Set it whenever\n`--esp-section-decoration-image` names an image; without it the\nsection renders no decorative layer and the decoration hooks are\ninert.",
|
|
74452
74965
|
"fieldName": "decoration"
|
|
74453
74966
|
},
|
|
74967
|
+
{
|
|
74968
|
+
"type": {
|
|
74969
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
74970
|
+
},
|
|
74971
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
74972
|
+
"name": "surface-layer",
|
|
74973
|
+
"inheritedFrom": {
|
|
74974
|
+
"name": "EspalierElementBase",
|
|
74975
|
+
"module": "dist/shared/esp-element-base.js"
|
|
74976
|
+
}
|
|
74977
|
+
},
|
|
74454
74978
|
{
|
|
74455
74979
|
"name": "scheme",
|
|
74456
74980
|
"type": {
|
|
@@ -74930,7 +75454,7 @@
|
|
|
74930
75454
|
"description": "The minimum absolute $L_c$ score (default 60)"
|
|
74931
75455
|
}
|
|
74932
75456
|
],
|
|
74933
|
-
"description": "
|
|
75457
|
+
"description": "Adjust a text color toward the target absolute APCA Lc score.\n\nIf the current contrast is insufficient, lightness is\nadjusted (made darker on light bg, lighter on dark bg)\nuntil the target is met or the lightness boundary is hit."
|
|
74934
75458
|
},
|
|
74935
75459
|
{
|
|
74936
75460
|
"kind": "function",
|
|
@@ -75372,13 +75896,13 @@
|
|
|
75372
75896
|
"kind": "variable",
|
|
75373
75897
|
"name": "CONFIGURED_BRAND_LOGO_ASPECT_RATIO",
|
|
75374
75898
|
"default": "css`3 / 1`",
|
|
75375
|
-
"description": "
|
|
75899
|
+
"description": "Reserve a logo's width while its image is loading or has failed.\n\nThe header and footer give logos a fixed block size, so an image without\nintrinsic dimensions would otherwise have zero width or use its alt text's\nwidth. `aspect-ratio: auto <ratio>` uses this fallback only until a natural\nratio is available, keeping loaded logos unchanged.\n\nThe 3:1 fallback fits below both hosts' existing inline caps, so the initial\nreservation is not clipped."
|
|
75376
75900
|
},
|
|
75377
75901
|
{
|
|
75378
75902
|
"kind": "variable",
|
|
75379
75903
|
"name": "configuredBrandLogoGeometry",
|
|
75380
75904
|
"default": "css` .brand-logo { overflow-wrap: anywhere; } `",
|
|
75381
|
-
"description": "
|
|
75905
|
+
"description": "Allow failed-image alt text to wrap within the reserved logo width.\n\nA failed image can take its automatic minimum width from its alt text.\nBreaking long words prevents that minimum from overriding the reserved box.\nThe text remains visible and accessible. Loaded images are unaffected."
|
|
75382
75906
|
},
|
|
75383
75907
|
{
|
|
75384
75908
|
"kind": "function",
|
|
@@ -76216,11 +76740,11 @@
|
|
|
76216
76740
|
"declarations": [
|
|
76217
76741
|
{
|
|
76218
76742
|
"kind": "class",
|
|
76219
|
-
"description": "Shared base class for Espalier elements.\n\nThe reusable `.esp-field` shell used by text inputs, textareas,\npickers, date pickers, buttons, and similar controls exposes the\nfollowing shared styling hooks
|
|
76743
|
+
"description": "Shared base class for Espalier elements.\n\nThe reusable `.esp-field` shell used by text inputs, textareas,\npickers, date pickers, buttons, and similar controls exposes the\nfollowing shared styling hooks:\n\nA field fills one layer above the surface it sits on.",
|
|
76220
76744
|
"name": "EspalierElementBase",
|
|
76221
76745
|
"cssProperties": [
|
|
76222
76746
|
{
|
|
76223
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
76747
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
76224
76748
|
"name": "--esp-field-background"
|
|
76225
76749
|
},
|
|
76226
76750
|
{
|
|
@@ -76804,6 +77328,13 @@
|
|
|
76804
77328
|
],
|
|
76805
77329
|
"events": [],
|
|
76806
77330
|
"attributes": [
|
|
77331
|
+
{
|
|
77332
|
+
"type": {
|
|
77333
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
77334
|
+
},
|
|
77335
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
77336
|
+
"name": "surface-layer"
|
|
77337
|
+
},
|
|
76807
77338
|
{
|
|
76808
77339
|
"name": "scheme",
|
|
76809
77340
|
"type": {
|
|
@@ -78912,7 +79443,7 @@
|
|
|
78912
79443
|
}
|
|
78913
79444
|
}
|
|
78914
79445
|
],
|
|
78915
|
-
"description": "Compute justified album rows
|
|
79446
|
+
"description": "Compute justified album rows and the geometry a renderer needs for cropping.\n\nCompleted rows fill the available width. A row capped by `maxRowHeight` keeps\nrelative cell widths, allowing `object-fit: cover` to crop its images. A final\nrow below a finite `maxImagesPerRow` remains partial and preserves proportions;\nits height is capped by the preceding rows or target height and `maxRowHeight`.\n\nAn omitted or invalid `maxImagesPerRow` means unlimited, completed rows."
|
|
78916
79447
|
}
|
|
78917
79448
|
],
|
|
78918
79449
|
"exports": [
|
|
@@ -80418,6 +80949,47 @@
|
|
|
80418
80949
|
}
|
|
80419
80950
|
]
|
|
80420
80951
|
},
|
|
80952
|
+
{
|
|
80953
|
+
"kind": "javascript-module",
|
|
80954
|
+
"path": "dist/shared/surface-layer.js",
|
|
80955
|
+
"declarations": [
|
|
80956
|
+
{
|
|
80957
|
+
"kind": "function",
|
|
80958
|
+
"name": "surfaceLayerAttributes",
|
|
80959
|
+
"return": {
|
|
80960
|
+
"type": {
|
|
80961
|
+
"text": "CSSResult"
|
|
80962
|
+
}
|
|
80963
|
+
},
|
|
80964
|
+
"parameters": [
|
|
80965
|
+
{
|
|
80966
|
+
"name": "selector",
|
|
80967
|
+
"type": {
|
|
80968
|
+
"text": "string"
|
|
80969
|
+
}
|
|
80970
|
+
},
|
|
80971
|
+
{
|
|
80972
|
+
"name": "defaultLayer",
|
|
80973
|
+
"optional": true,
|
|
80974
|
+
"type": {
|
|
80975
|
+
"text": "SurfaceLayer"
|
|
80976
|
+
}
|
|
80977
|
+
}
|
|
80978
|
+
],
|
|
80979
|
+
"description": "Support `surface-layer=\"1|2|3|4\"` on consumer surfaces in a shadow root.\nInclude `surfaceLayerAttributes(\":host\")` for the consumer component's host,\nor `surfaceLayerAttributes(\"[surface-layer]\")` for elements inside its shadow\ntree. Espalier installs these rules for its own hosts and root light DOM.\nThe attribute declares depth; consumer components still paint their surface.\nA component that always paints a known layer can pass that depth as its\ndefault, so callers do not need to declare it on each instance."
|
|
80980
|
+
}
|
|
80981
|
+
],
|
|
80982
|
+
"exports": [
|
|
80983
|
+
{
|
|
80984
|
+
"kind": "js",
|
|
80985
|
+
"name": "surfaceLayerAttributes",
|
|
80986
|
+
"declaration": {
|
|
80987
|
+
"name": "surfaceLayerAttributes",
|
|
80988
|
+
"module": "dist/shared/surface-layer.js"
|
|
80989
|
+
}
|
|
80990
|
+
}
|
|
80991
|
+
]
|
|
80992
|
+
},
|
|
80421
80993
|
{
|
|
80422
80994
|
"kind": "javascript-module",
|
|
80423
80995
|
"path": "dist/shared/theme-fit-report.js",
|
|
@@ -80974,7 +81546,7 @@
|
|
|
80974
81546
|
"text": "Readonly<\n Record<RoleName, Readonly<Record<string, ReadonlyArray<[SemanticColorName, LightnessKey]>>>>\n>"
|
|
80975
81547
|
},
|
|
80976
81548
|
"default": "{ canvas: { color: [ [\"background\", \"surface\"], [\"layer1\", \"raised1\"], [\"layer2\", \"raised2\"], [\"layer3\", \"raised3\"], [\"layer4\", \"raised4\"], ], }, ink: { color: [ [\"text\", \"text\"], [\"typeOverline\", \"text\"], [\"typeLabel\", \"text\"], [\"typeLead\", \"text\"], [\"typeCaption\", \"text\"], [\"inputSelection\", \"text\"], ], heading: [ [\"headings\", \"muted\"], [\"headingsHover\", \"ink\"], ], }, accent: { color: [ [\"linkHoverBg\", \"raised2\"], [\"inputSelectionBg\", \"raised2\"], [\"inputCaret\", \"ink\"], ], text: [[\"link\", \"accent\"]], hover: [[\"linkHover\", \"text\"]], }, action: { // Neither stop here is fixed — both are derived per scheme, whether // or not the theme names the slot. See ACTION_SURFACE_TARGET_L, // ROLE_DERIVED_SURFACE, and ROLE_DERIVED_INK. The values below are // the token → stop structure this table exists to declare; the // derivation replaces them at compile time. color: [[\"actionBackground\", \"muted\"]], ink: [[\"actionText\", \"surface\"]], }, structure: { color: [ [\"border\", \"border\"], [\"shadow\", \"shadow\"], ], }, }",
|
|
80977
|
-
"description": "
|
|
81549
|
+
"description": "Map role slots to semantic tokens and ramp stops.\n\n`dangerText` stays outside the roles layer because status meanings are reserved.\nAccent body copy must use the legible `accent.text` slot. `accent.hover` can\nselect a different family; without it, hovered links follow `accent.text`."
|
|
80978
81550
|
},
|
|
80979
81551
|
{
|
|
80980
81552
|
"kind": "variable",
|
|
@@ -81029,7 +81601,7 @@
|
|
|
81029
81601
|
}
|
|
81030
81602
|
}
|
|
81031
81603
|
],
|
|
81032
|
-
"description": "Compile roles into semantic mappings.\n\
|
|
81604
|
+
"description": "Compile declared roles into semantic mappings.\n\nA theme with no roles produces no role overrides. Token-level\n`semanticMappings` take precedence over the compiled result."
|
|
81033
81605
|
},
|
|
81034
81606
|
{
|
|
81035
81607
|
"kind": "function",
|
|
@@ -82439,7 +83011,7 @@
|
|
|
82439
83011
|
"declarations": [
|
|
82440
83012
|
{
|
|
82441
83013
|
"kind": "class",
|
|
82442
|
-
"description": "A range slider
|
|
83014
|
+
"description": "A numeric range slider with ARIA `role=\"slider\"`, keyboard support,\nand separate touch and pointer behavior.\n\nOn touch devices, only dragging the thumb changes the value.\nTapping the track is ignored so the user can scroll the page\nwithout accidentally adjusting the slider. On desktop, clicking\nanywhere on the track jumps to that value and begins a drag.\n\nThe slider accepts an accessible name from two sources, checked\nin priority order:\n\n1. Slot content — `<esp-slider>Volume</esp-slider>` renders a\n visible label and names the slider via `aria-labelledby`.\n2. The `label` attribute — `<esp-slider label=\"Volume\">` applies\n an invisible `aria-label` when no slot content is present.\n\n```html\n<esp-box>\n <esp-slider min=\"0\" max=\"10\" step=\"0.5\" value=\"5\">\n Rating\n </esp-slider>\n <esp-slider disabled min=\"0\" max=\"100\" value=\"30\"\n label=\"Disabled slider\">\n </esp-slider>\n</esp-box>\n```",
|
|
82443
83015
|
"name": "EspalierSlider",
|
|
82444
83016
|
"cssProperties": [
|
|
82445
83017
|
{
|
|
@@ -82479,7 +83051,7 @@
|
|
|
82479
83051
|
"name": "--esp-slider-focus-shadow"
|
|
82480
83052
|
},
|
|
82481
83053
|
{
|
|
82482
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
83054
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
82483
83055
|
"name": "--esp-field-background",
|
|
82484
83056
|
"inheritedFrom": {
|
|
82485
83057
|
"name": "EspalierElementBase",
|
|
@@ -83841,6 +84413,17 @@
|
|
|
83841
84413
|
"description": "Accessible label for the slider. Used as `aria-label` on the\nthumb when no slot content is present. When the default slot\nhas content, `aria-labelledby` takes precedence and this\nproperty is ignored.",
|
|
83842
84414
|
"fieldName": "label"
|
|
83843
84415
|
},
|
|
84416
|
+
{
|
|
84417
|
+
"type": {
|
|
84418
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
84419
|
+
},
|
|
84420
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
84421
|
+
"name": "surface-layer",
|
|
84422
|
+
"inheritedFrom": {
|
|
84423
|
+
"name": "EspalierElementBase",
|
|
84424
|
+
"module": "dist/shared/esp-element-base.js"
|
|
84425
|
+
}
|
|
84426
|
+
},
|
|
83844
84427
|
{
|
|
83845
84428
|
"name": "scheme",
|
|
83846
84429
|
"type": {
|
|
@@ -83948,7 +84531,7 @@
|
|
|
83948
84531
|
},
|
|
83949
84532
|
{
|
|
83950
84533
|
"kind": "class",
|
|
83951
|
-
"description": "
|
|
84534
|
+
"description": "Stacks children vertically with a themed gap.\n\n```html\n<esp-stack gap=\"medium\">\n <h2>Title</h2>\n <p>Copy under it.</p>\n <esp-button label=\"Act\"></esp-button>\n</esp-stack>\n```\n\nThe default cross-axis alignment is `stretch`, matching normal block\nflow: grids, form fields, and text fill the column — with one\ndeliberate exception: slotted `esp-button` and `esp-button-group`\nkeep their natural width, because a field should fill its column\nwhile the submit button under it should not. That is the pairing a\nplain flex column cannot express with any single `align-items`\nvalue. An explicit `align` — `align=\"stretch\"` included, authored as\nan attribute or assigned to the property — governs every child\nuniformly; removing the attribute restores the default state, and\n`align-self` on any child overrides either way.",
|
|
83952
84535
|
"name": "EspalierStack",
|
|
83953
84536
|
"cssProperties": [
|
|
83954
84537
|
{
|
|
@@ -83956,7 +84539,7 @@
|
|
|
83956
84539
|
"name": "--esp-stack-gap"
|
|
83957
84540
|
},
|
|
83958
84541
|
{
|
|
83959
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
84542
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
83960
84543
|
"name": "--esp-field-background",
|
|
83961
84544
|
"inheritedFrom": {
|
|
83962
84545
|
"name": "EspalierElementBase",
|
|
@@ -84793,6 +85376,17 @@
|
|
|
84793
85376
|
"description": "Cross-axis alignment of children: `start`, `center`, `end`, or\n`stretch`.",
|
|
84794
85377
|
"fieldName": "align"
|
|
84795
85378
|
},
|
|
85379
|
+
{
|
|
85380
|
+
"type": {
|
|
85381
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
85382
|
+
},
|
|
85383
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
85384
|
+
"name": "surface-layer",
|
|
85385
|
+
"inheritedFrom": {
|
|
85386
|
+
"name": "EspalierElementBase",
|
|
85387
|
+
"module": "dist/shared/esp-element-base.js"
|
|
85388
|
+
}
|
|
85389
|
+
},
|
|
84796
85390
|
{
|
|
84797
85391
|
"name": "scheme",
|
|
84798
85392
|
"type": {
|
|
@@ -84921,7 +85515,7 @@
|
|
|
84921
85515
|
"default": "32ch"
|
|
84922
85516
|
},
|
|
84923
85517
|
{
|
|
84924
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
85518
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
84925
85519
|
"name": "--esp-field-background",
|
|
84926
85520
|
"inheritedFrom": {
|
|
84927
85521
|
"name": "EspalierElementBase",
|
|
@@ -85924,6 +86518,17 @@
|
|
|
85924
86518
|
"description": "Visual chrome around the status icon. `pill` renders the filled\ncircular treatment, `outline` keeps only the border, and `none`\nrenders the intent-colored icon alone.",
|
|
85925
86519
|
"fieldName": "chrome"
|
|
85926
86520
|
},
|
|
86521
|
+
{
|
|
86522
|
+
"type": {
|
|
86523
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
86524
|
+
},
|
|
86525
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
86526
|
+
"name": "surface-layer",
|
|
86527
|
+
"inheritedFrom": {
|
|
86528
|
+
"name": "EspalierElementBase",
|
|
86529
|
+
"module": "dist/shared/esp-element-base.js"
|
|
86530
|
+
}
|
|
86531
|
+
},
|
|
85927
86532
|
{
|
|
85928
86533
|
"name": "scheme",
|
|
85929
86534
|
"type": {
|
|
@@ -86016,7 +86621,7 @@
|
|
|
86016
86621
|
"declarations": [
|
|
86017
86622
|
{
|
|
86018
86623
|
"kind": "class",
|
|
86019
|
-
"description": "
|
|
86624
|
+
"description": "An on/off switch for settings that take effect immediately. Use a\ncheckbox when the choice should be applied with a later form submission.\n\n```html\n<esp-box>\n <esp-form-item label=\"Notifications\">\n <esp-switch value=\"notifications\">\n Enable notifications\n </esp-switch>\n </esp-form-item>\n</esp-box>\n```\n\n```html\n<esp-box>\n <esp-switch checked value=\"dark-mode\">\n Dark mode\n </esp-switch>\n <esp-switch disabled value=\"disabled-opt\">\n Disabled option\n </esp-switch>\n</esp-box>\n```\n\n### Text mode\n\nSet `mode=\"text\"` with `off-label` and `on-label` to render a\ntwo-option text toggle instead of a track and thumb. This is\nideal for binary choices like a billing-period selector:\n\n```html\n<esp-box>\n <esp-switch\n mode=\"text\"\n off-label=\"Monthly\"\n on-label=\"Annual\"\n value=\"annual\"\n >Billing period</esp-switch>\n</esp-box>\n```\n\nThe slotted text is visually hidden in text mode and folded\ninto the control's accessible label together with the current\nselected option. Screen readers will announce both the label\nand the active choice while the `off-label` / `on-label`\ntext is presented visually.",
|
|
86020
86625
|
"name": "EspalierSwitch",
|
|
86021
86626
|
"cssProperties": [
|
|
86022
86627
|
{
|
|
@@ -86068,7 +86673,7 @@
|
|
|
86068
86673
|
"name": "--esp-switch-text-highlight-color"
|
|
86069
86674
|
},
|
|
86070
86675
|
{
|
|
86071
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
86676
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
86072
86677
|
"name": "--esp-field-background",
|
|
86073
86678
|
"inheritedFrom": {
|
|
86074
86679
|
"name": "EspalierElementBase",
|
|
@@ -87230,6 +87835,17 @@
|
|
|
87230
87835
|
"description": "Controls whether the switch is disabled.",
|
|
87231
87836
|
"fieldName": "disabled"
|
|
87232
87837
|
},
|
|
87838
|
+
{
|
|
87839
|
+
"type": {
|
|
87840
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
87841
|
+
},
|
|
87842
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
87843
|
+
"name": "surface-layer",
|
|
87844
|
+
"inheritedFrom": {
|
|
87845
|
+
"name": "EspalierElementBase",
|
|
87846
|
+
"module": "dist/shared/esp-element-base.js"
|
|
87847
|
+
}
|
|
87848
|
+
},
|
|
87233
87849
|
{
|
|
87234
87850
|
"name": "scheme",
|
|
87235
87851
|
"type": {
|
|
@@ -87321,7 +87937,7 @@
|
|
|
87321
87937
|
"declarations": [
|
|
87322
87938
|
{
|
|
87323
87939
|
"kind": "class",
|
|
87324
|
-
"description": "A tabbed interface that groups multiple\n[esp-tab](/components/tabs) elements. The tab strip is\ngenerated automatically from each child's `label` attribute.\nOnly one tab panel is visible at a time.\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Overview\">\n <p>Overview content goes here.</p>\n </esp-tab>\n <esp-tab label=\"Details\">\n <p>Detailed information lives here.</p>\n </esp-tab>\n <esp-tab label=\"Settings\">\n <p>Configuration options.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Pre-selected tab\n\nSet `active` on a child `esp-tab` to make it the initially\nvisible panel:\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Alpha\">\n <p>Alpha panel.</p>\n </esp-tab>\n <esp-tab label=\"Beta\" active>\n <p>Beta starts active.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Disabled tab\n\nIndividual tabs can be disabled:\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Available\">\n <p>You can select this tab.</p>\n </esp-tab>\n <esp-tab label=\"Locked\" disabled>\n <p>This tab cannot be reached.</p>\n </esp-tab>\n <esp-tab label=\"Also available\">\n <p>This tab works too.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Disabled group\n\nSet `disabled` on the group to disable all tabs at once:\n\n```html\n<esp-tab-group disabled>\n <esp-tab label=\"One\">\n <p>All tabs are disabled.</p>\n </esp-tab>\n <esp-tab label=\"Two\">\n <p>Cannot switch to this.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Zone theming\n\nTab groups pick up zone theming from a `context` attribute:\n\n```html\n<esp-tab-group context=\"quiet\">\n <esp-tab label=\"First\">\n <p>Zone-correct content.</p>\n </esp-tab>\n <esp-tab label=\"Second\">\n <p>More content.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Listening for tab changes\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Tab 1\">\n <p>First panel.</p>\n </esp-tab>\n <esp-tab label=\"Tab 2\">\n <p>Second panel.</p>\n </esp-tab>\n</esp-tab-group>\n<script>\n const tabs = findByTagName(\"esp-tab-group\")[0];\n tabs.addEventListener(\"esp-tab-group-changed\", (ev) => {\n console.log(\"Switched to:\", ev.detail.label, \"at index\", ev.detail.index);\n });\n</script>\n```",
|
|
87940
|
+
"description": "A tabbed interface that groups multiple\n[esp-tab](/components/tabs) elements. The tab strip is\ngenerated automatically from each child's `label` attribute.\nOnly one tab panel is visible at a time.\n\nA field fills one layer above the surface it sits on.\nUse `surface-layer=\"1|2|3|4\"` to select the default painted layer.\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Overview\">\n <p>Overview content goes here.</p>\n </esp-tab>\n <esp-tab label=\"Details\">\n <p>Detailed information lives here.</p>\n </esp-tab>\n <esp-tab label=\"Settings\">\n <p>Configuration options.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Pre-selected tab\n\nSet `active` on a child `esp-tab` to make it the initially\nvisible panel:\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Alpha\">\n <p>Alpha panel.</p>\n </esp-tab>\n <esp-tab label=\"Beta\" active>\n <p>Beta starts active.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Disabled tab\n\nIndividual tabs can be disabled:\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Available\">\n <p>You can select this tab.</p>\n </esp-tab>\n <esp-tab label=\"Locked\" disabled>\n <p>This tab cannot be reached.</p>\n </esp-tab>\n <esp-tab label=\"Also available\">\n <p>This tab works too.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Disabled group\n\nSet `disabled` on the group to disable all tabs at once:\n\n```html\n<esp-tab-group disabled>\n <esp-tab label=\"One\">\n <p>All tabs are disabled.</p>\n </esp-tab>\n <esp-tab label=\"Two\">\n <p>Cannot switch to this.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Zone theming\n\nTab groups pick up zone theming from a `context` attribute:\n\n```html\n<esp-tab-group context=\"quiet\">\n <esp-tab label=\"First\">\n <p>Zone-correct content.</p>\n </esp-tab>\n <esp-tab label=\"Second\">\n <p>More content.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Listening for tab changes\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Tab 1\">\n <p>First panel.</p>\n </esp-tab>\n <esp-tab label=\"Tab 2\">\n <p>Second panel.</p>\n </esp-tab>\n</esp-tab-group>\n<script>\n const tabs = findByTagName(\"esp-tab-group\")[0];\n tabs.addEventListener(\"esp-tab-group-changed\", (ev) => {\n console.log(\"Switched to:\", ev.detail.label, \"at index\", ev.detail.index);\n });\n</script>\n```",
|
|
87325
87941
|
"name": "EspalierTabGroup",
|
|
87326
87942
|
"cssProperties": [
|
|
87327
87943
|
{
|
|
@@ -87353,7 +87969,7 @@
|
|
|
87353
87969
|
"name": "--esp-tab-size-padding"
|
|
87354
87970
|
},
|
|
87355
87971
|
{
|
|
87356
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
87972
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
87357
87973
|
"name": "--esp-field-background",
|
|
87358
87974
|
"inheritedFrom": {
|
|
87359
87975
|
"name": "EspalierElementBase",
|
|
@@ -88294,6 +88910,17 @@
|
|
|
88294
88910
|
"description": "Disables all tabs in the group, preventing any tab from\nbeing selected.",
|
|
88295
88911
|
"fieldName": "disabled"
|
|
88296
88912
|
},
|
|
88913
|
+
{
|
|
88914
|
+
"type": {
|
|
88915
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
88916
|
+
},
|
|
88917
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
88918
|
+
"name": "surface-layer",
|
|
88919
|
+
"inheritedFrom": {
|
|
88920
|
+
"name": "EspalierElementBase",
|
|
88921
|
+
"module": "dist/shared/esp-element-base.js"
|
|
88922
|
+
}
|
|
88923
|
+
},
|
|
88297
88924
|
{
|
|
88298
88925
|
"name": "scheme",
|
|
88299
88926
|
"type": {
|
|
@@ -88393,7 +89020,7 @@
|
|
|
88393
89020
|
"name": "--esp-tab-size-padding"
|
|
88394
89021
|
},
|
|
88395
89022
|
{
|
|
88396
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
89023
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
88397
89024
|
"name": "--esp-field-background",
|
|
88398
89025
|
"inheritedFrom": {
|
|
88399
89026
|
"name": "EspalierElementBase",
|
|
@@ -89251,6 +89878,17 @@
|
|
|
89251
89878
|
"description": "Whether this tab is disabled (cannot be selected).",
|
|
89252
89879
|
"fieldName": "disabled"
|
|
89253
89880
|
},
|
|
89881
|
+
{
|
|
89882
|
+
"type": {
|
|
89883
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
89884
|
+
},
|
|
89885
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
89886
|
+
"name": "surface-layer",
|
|
89887
|
+
"inheritedFrom": {
|
|
89888
|
+
"name": "EspalierElementBase",
|
|
89889
|
+
"module": "dist/shared/esp-element-base.js"
|
|
89890
|
+
}
|
|
89891
|
+
},
|
|
89254
89892
|
{
|
|
89255
89893
|
"name": "scheme",
|
|
89256
89894
|
"type": {
|
|
@@ -90502,6 +91140,17 @@
|
|
|
90502
91140
|
"description": "Maximum number of characters.",
|
|
90503
91141
|
"fieldName": "maxlength"
|
|
90504
91142
|
},
|
|
91143
|
+
{
|
|
91144
|
+
"type": {
|
|
91145
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
91146
|
+
},
|
|
91147
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
91148
|
+
"name": "surface-layer",
|
|
91149
|
+
"inheritedFrom": {
|
|
91150
|
+
"name": "EspalierElementBase",
|
|
91151
|
+
"module": "dist/shared/esp-element-base.js"
|
|
91152
|
+
}
|
|
91153
|
+
},
|
|
90505
91154
|
{
|
|
90506
91155
|
"name": "scheme",
|
|
90507
91156
|
"type": {
|
|
@@ -90568,7 +91217,7 @@
|
|
|
90568
91217
|
},
|
|
90569
91218
|
"cssProperties": [
|
|
90570
91219
|
{
|
|
90571
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
91220
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
90572
91221
|
"name": "--esp-field-background",
|
|
90573
91222
|
"inheritedFrom": {
|
|
90574
91223
|
"name": "EspalierElementBase",
|
|
@@ -90667,7 +91316,7 @@
|
|
|
90667
91316
|
"name": "--esp-toaster-padding"
|
|
90668
91317
|
},
|
|
90669
91318
|
{
|
|
90670
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
91319
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
90671
91320
|
"name": "--esp-field-background",
|
|
90672
91321
|
"inheritedFrom": {
|
|
90673
91322
|
"name": "EspalierElementBase",
|
|
@@ -91631,6 +92280,17 @@
|
|
|
91631
92280
|
"tagName": "esp-toaster",
|
|
91632
92281
|
"customElement": true,
|
|
91633
92282
|
"attributes": [
|
|
92283
|
+
{
|
|
92284
|
+
"type": {
|
|
92285
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
92286
|
+
},
|
|
92287
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
92288
|
+
"name": "surface-layer",
|
|
92289
|
+
"inheritedFrom": {
|
|
92290
|
+
"name": "EspalierElementBase",
|
|
92291
|
+
"module": "dist/shared/esp-element-base.js"
|
|
92292
|
+
}
|
|
92293
|
+
},
|
|
91634
92294
|
{
|
|
91635
92295
|
"name": "scheme",
|
|
91636
92296
|
"type": {
|
|
@@ -91737,7 +92397,7 @@
|
|
|
91737
92397
|
"name": "--esp-tooltip-focus-outline"
|
|
91738
92398
|
},
|
|
91739
92399
|
{
|
|
91740
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
92400
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
91741
92401
|
"name": "--esp-field-background",
|
|
91742
92402
|
"inheritedFrom": {
|
|
91743
92403
|
"name": "EspalierElementBase",
|
|
@@ -92743,6 +93403,17 @@
|
|
|
92743
93403
|
"description": "Tabindex applied to the tooltip trigger span.\n\nLeave it unset to get the right default automatically: a tooltip\nwrapping a focusable button (`<button>` or `<esp-button>`) takes its\nwrapper span out of the tab order (`-1`) so it does not add a second,\nredundant tab stop, while a tooltip wrapping non-interactive content\n(an icon, an abbreviation, plain text) keeps the wrapper focusable\n(`0`) so keyboard users can still reveal it on focus.\n\nSet it explicitly to override that auto-detection — for example\n`trigger-tabindex=\"0\"` to force a focusable wrapper, or\n`trigger-tabindex=\"-1\"` to opt a non-button trigger out. An explicit\nvalue always wins; a non-numeric or `NaN` value falls back to `0`.\n\nWhen the wrapper leaves the tab order, keyboard focus lands on the\nslotted control instead, so the tooltip's `aria-describedby` is\nmirrored onto that control and assistive tech still announces the\ndescription on focus.",
|
|
92744
93404
|
"fieldName": "triggerTabindex"
|
|
92745
93405
|
},
|
|
93406
|
+
{
|
|
93407
|
+
"type": {
|
|
93408
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
93409
|
+
},
|
|
93410
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
93411
|
+
"name": "surface-layer",
|
|
93412
|
+
"inheritedFrom": {
|
|
93413
|
+
"name": "EspalierElementBase",
|
|
93414
|
+
"module": "dist/shared/esp-element-base.js"
|
|
93415
|
+
}
|
|
93416
|
+
},
|
|
92746
93417
|
{
|
|
92747
93418
|
"name": "scheme",
|
|
92748
93419
|
"type": {
|
|
@@ -93794,6 +94465,17 @@
|
|
|
93794
94465
|
"description": "Marks a branch whose children are lazy-loaded by the tree's\n`loadChildren` callback on first expand.",
|
|
93795
94466
|
"fieldName": "hasChildren"
|
|
93796
94467
|
},
|
|
94468
|
+
{
|
|
94469
|
+
"type": {
|
|
94470
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
94471
|
+
},
|
|
94472
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
94473
|
+
"name": "surface-layer",
|
|
94474
|
+
"inheritedFrom": {
|
|
94475
|
+
"name": "EspalierElementBase",
|
|
94476
|
+
"module": "dist/shared/esp-element-base.js"
|
|
94477
|
+
}
|
|
94478
|
+
},
|
|
93797
94479
|
{
|
|
93798
94480
|
"name": "scheme",
|
|
93799
94481
|
"type": {
|
|
@@ -93856,7 +94538,7 @@
|
|
|
93856
94538
|
"customElement": true,
|
|
93857
94539
|
"cssProperties": [
|
|
93858
94540
|
{
|
|
93859
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
94541
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
93860
94542
|
"name": "--esp-field-background",
|
|
93861
94543
|
"inheritedFrom": {
|
|
93862
94544
|
"name": "EspalierElementBase",
|
|
@@ -93975,7 +94657,7 @@
|
|
|
93975
94657
|
},
|
|
93976
94658
|
{
|
|
93977
94659
|
"kind": "class",
|
|
93978
|
-
"description": "A form-associated hierarchy primitive for displaying and selecting\nfrom a slug-structured tree — a folder/path picker, a category\nchooser, or any place a flat field should become an expandable tree.\nFor static declarative node definitions, see\n[`<esp-tree-item>`](/components/tree/item/).\n\
|
|
94660
|
+
"description": "A form-associated hierarchy primitive for displaying and selecting\nfrom a slug-structured tree — a folder/path picker, a category\nchooser, or any place a flat field should become an expandable tree.\nFor static declarative node definitions, see\n[`<esp-tree-item>`](/components/tree/item/).\n\n## Data-driven first, composition-capable\n\nBind a hierarchy to the `nodes` property for the primary, data-driven\nAPI. For static trees, nest\n[`<esp-tree-item>`](/components/tree/item) children instead — they are\nparsed into the same model, so the keyboard and accessibility model is\nidentical either way. When both are supplied, `nodes` wins. Data-driven\nnodes must provide stable, unique `id` values; the tree keys expansion,\nlazy loading, focus, and host re-feeds by `id` so relabeling or moving a\nnode can change its path without changing its identity.\n\n```html\n<esp-form-item label=\"Folder\">\n <esp-tree name=\"folder\" required></esp-tree>\n</esp-form-item>\n<script>\n const tree = findByTagName(\"esp-tree\")[0];\n tree.nodes = [\n { id: \"weddings\", segment: \"weddings\", label: \"Weddings\", children: [\n { id: \"w2026\", segment: \"2026\", label: \"2026\" },\n ] },\n { id: \"portraits\", segment: \"portraits\", label: \"Portraits\" },\n ];\n</script>\n```\n\nNodes may also carry opaque host data. The tree never reads into `data`;\nit carries the value through select, edit, toggle, and graft events so a\nhost can round-trip its own model without a side lookup.\n\n```html\n<esp-tree id=\"navigation\"></esp-tree>\n<script>\n const tree = findById(\"navigation\");\n tree.nodes = [\n {\n id: \"nav-about\",\n segment: \"about\",\n label: \"About Us\",\n data: { target: { kind: \"page\", pageId: \"about-us\" } },\n editable: true,\n },\n ];\n tree.addEventListener(\"esp-tree-select\", (event) => {\n console.log(event.detail.node.id, event.detail.node.data);\n });\n</script>\n```\n\n## Selection and form value\n\nSingle-select for v1. Clicking a selectable row selects it; selecting\na branch opens it, and clicking an already-selected branch toggles it\nopen or closed. Selecting a row outside the open selected branch\ncollapses that branch unless `keep-expanded` is set. Branches can also\nexpand and collapse through the leading icon button or with keyboard:\n`ArrowRight` expands closed branches first, then focuses a row's\ntrailing action button when one is present; `ArrowLeft` collapses or\nmoves to the parent. `Enter` and `Space` select the focused row. The\nsubmitted form value is the selected node's full path\n(defaulting to root-inclusive web paths like `/weddings/2026`), or\n`null` when nothing is selected. The root row is always present,\ndefaults to label and path `/`, and is selectable by default; set\n`root-selectable=\"false\"` when the root should be navigation-only.\nValidity reflects the committed selection through the standard\nEspalier form flow.\n\n## Lazy loading\n\nMark a branch with `hasChildren` and set the `loadChildren` callback to\nfetch its children on first expand. Expansion state is stable across\nre-renders and reloads.\n\n```html\n<esp-tree id=\"lazy\"></esp-tree>\n<script>\n const tree = findById(\"lazy\");\n tree.nodes = [{ id: \"root\", segment: \"library\", label: \"Library\", hasChildren: true }];\n tree.loadChildren = async () => {\n const res = await fetch(\"/assets/data/tree-library-children.json\");\n return await res.json();\n };\n</script>\n```\n\n## Grafting a new branch\n\nSet `allow-graft` to expose inline `+` affordances at the level where\na new child would appear. Clicking one opens the built-in graft\ndialog, which shows the parent and resulting path while the value is\nnormalized to a valid web-path segment. Enter commits, Escape\ncancels. Keyboard users can press `Insert` on the focused row to add\nbeneath it. Newly grafted branches are ephemeral client state the\nhost reads back via events — the component persists nothing.\n\n```html\n<esp-tree id=\"graftable\" allow-graft></esp-tree>\n<script>\n const tree = findById(\"graftable\");\n tree.nodes = [\n { id: \"weddings\", segment: \"weddings\", label: \"Weddings\", children: [\n { id: \"w2026\", segment: \"2026\", label: \"2026\" },\n ] },\n { id: \"portraits\", segment: \"portraits\", label: \"Portraits\" },\n ];\n tree.addEventListener(\"esp-tree-graft\", (e) => {\n console.log(\"grafted\", e.detail.path);\n });\n</script>\n```\n\nAs the input changes, the tree emits a live `esp-tree-graft-input`\nevent. A consumer can run an async check the offline component cannot\n(most importantly a server-side duplicate not present in the loaded\nchildren) and push the result back with `setGraftError(message)`; the\ntree then shows it inline and blocks the commit until it is cleared.\nFor advanced add flows, listen for the cancelable\n`esp-tree-graft-request` event and call `preventDefault()` to skip\nthe default dialog.\n\nReplace the `buildPath` property to use non-web path semantics, and\nreplace `normalizeGraftSegment` to loosen, tighten, or completely\nskip the default web-slug normalization used by the graft dialog.\n\n## Node actions\n\nMark a node with `editable: true` to render an edit action on the\ntrailing side of the row. Clicking it, or pressing `F2` on the\nfocused row, emits `esp-tree-edit` with the node path and public node\ndata so the host can open its own editor. Optional flags\n(`deletable`, `movableUp`, `movableDown`, `cuttable`, and\n`pasteChildTarget`) expose the matching built-in editing actions for\nhost-owned tree workflows.\n\nIf a row has exactly one action, the tree renders one trailing\nicon-only `esp-button` with an accessible label such as `Edit About`.\nIf a row has more than one action, the actions collapse into one\ntrailing `esp-action-menu` trigger so rows never accumulate multiple\nvisible action buttons. The tree only emits events — it does not\ndelete, move, cut, paste, mutate source nodes, or own clipboard state.\n\n```html\n<esp-tree id=\"navigation\"></esp-tree>\n<script>\n const tree = findById(\"navigation\");\n tree.nodes = [\n {\n id: \"about\",\n segment: \"about\",\n label: \"About\",\n editable: true,\n deletable: true,\n movableDown: true,\n cuttable: true,\n children: [\n {\n id: \"team\",\n segment: \"team\",\n label: \"Team\",\n editable: true,\n },\n ],\n },\n {\n id: \"services\",\n segment: \"services\",\n label: \"Services\",\n pasteChildTarget: true,\n },\n ];\n tree.addEventListener(\"esp-tree-cut\", (event) => {\n console.log(\"cut requested\", event.detail.path);\n });\n tree.addEventListener(\"esp-tree-paste-child\", (event) => {\n console.log(\"paste as child requested\", event.detail.path);\n });\n</script>\n```\n\n## Expand/collapse icon\n\nThe expand/collapse caret ships inline with the component, so unlike\nnode `icon`s it needs no icon sprite to be hosted. Override it by\nsetting the `expandIcon` property to your own (trusted) SVG markup; it\nrenders on every branch toggle and is rotated 90° when the branch is\nopen, so provide a right-pointing icon. For icon pairs that should not\nrotate, set `collapseIcon` to the trusted SVG markup to use while the\nbranch is open.\n\n```html\n<esp-tree id=\"custom-caret\"></esp-tree>\n<script>\n const tree = findById(\"custom-caret\");\n tree.nodes = [\n { id: \"weddings\", segment: \"weddings\", label: \"Weddings\", children: [\n { id: \"w2026\", segment: \"2026\", label: \"2026\" },\n ] },\n ];\n // A filled triangle caret instead of the default outline chevron.\n tree.expandIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"\n fill=\"currentColor\" stroke=\"none\"><path d=\"M9 6l6 6l-6 6z\" /></svg>`;\n</script>\n```",
|
|
93979
94661
|
"name": "EspalierTree",
|
|
93980
94662
|
"cssProperties": [
|
|
93981
94663
|
{
|
|
@@ -94023,7 +94705,7 @@
|
|
|
94023
94705
|
"name": "--esp-tree-icon-color"
|
|
94024
94706
|
},
|
|
94025
94707
|
{
|
|
94026
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
94708
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
94027
94709
|
"name": "--esp-field-background",
|
|
94028
94710
|
"inheritedFrom": {
|
|
94029
94711
|
"name": "EspalierElementBase",
|
|
@@ -97112,6 +97794,17 @@
|
|
|
97112
97794
|
"description": "Keep already-expanded branches open when selecting a row outside of\nthe selected branch. By default, selecting outside an open selected\nbranch collapses that branch.",
|
|
97113
97795
|
"fieldName": "keepExpanded"
|
|
97114
97796
|
},
|
|
97797
|
+
{
|
|
97798
|
+
"type": {
|
|
97799
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
97800
|
+
},
|
|
97801
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
97802
|
+
"name": "surface-layer",
|
|
97803
|
+
"inheritedFrom": {
|
|
97804
|
+
"name": "EspalierElementBase",
|
|
97805
|
+
"module": "dist/shared/esp-element-base.js"
|
|
97806
|
+
}
|
|
97807
|
+
},
|
|
97115
97808
|
{
|
|
97116
97809
|
"name": "scheme",
|
|
97117
97810
|
"type": {
|
|
@@ -97301,7 +97994,7 @@
|
|
|
97301
97994
|
"name": "--esp-video-message-color"
|
|
97302
97995
|
},
|
|
97303
97996
|
{
|
|
97304
|
-
"description": "Background color of the shared field shell. Defaults to `var(--esp-color-layer-2)
|
|
97997
|
+
"description": "Background color of the shared field shell. Defaults to one layer above the nearest declared surface, capped at `var(--esp-color-layer-4)`, or `var(--esp-color-layer-2)` without a declared surface. An explicit override wins.",
|
|
97305
97998
|
"name": "--esp-field-background",
|
|
97306
97999
|
"inheritedFrom": {
|
|
97307
98000
|
"name": "EspalierElementBase",
|
|
@@ -98957,6 +99650,17 @@
|
|
|
98957
99650
|
"description": "CORS mode for the video's requests, as on `<video crossorigin>`. Needed\nfor caption tracks served from another origin.",
|
|
98958
99651
|
"fieldName": "crossOrigin"
|
|
98959
99652
|
},
|
|
99653
|
+
{
|
|
99654
|
+
"type": {
|
|
99655
|
+
"text": "\"1\"|\"2\"|\"3\"|\"4\""
|
|
99656
|
+
},
|
|
99657
|
+
"description": "Declares the painted surface depth. Fields use the next local layer, capped at layer 4.",
|
|
99658
|
+
"name": "surface-layer",
|
|
99659
|
+
"inheritedFrom": {
|
|
99660
|
+
"name": "EspalierElementBase",
|
|
99661
|
+
"module": "dist/shared/esp-element-base.js"
|
|
99662
|
+
}
|
|
99663
|
+
},
|
|
98960
99664
|
{
|
|
98961
99665
|
"name": "scheme",
|
|
98962
99666
|
"type": {
|
|
@@ -99682,7 +100386,7 @@
|
|
|
99682
100386
|
{
|
|
99683
100387
|
"kind": "variable",
|
|
99684
100388
|
"name": "datePickerStyles",
|
|
99685
|
-
"default": "css` /* ── Error state ─────────────────────────────────── */ .temporal-error { font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-type-small); color: var(--esp-color-danger-text); padding: var(--esp-size-padding); } /* ── Trigger field ───────────────────────────────── */ .esp-field { display: grid; grid-template-columns: 1fr min-content; cursor: pointer; > input.esp-input { cursor: pointer; width: auto; } > .field-icon { display: grid; place-content: center; cursor: pointer; > svg { height: calc(1.2 * var(--esp-size-font)); width: calc(1.2 * var(--esp-size-font)); margin: 0 var(--esp-size-tiny); } } } /* ── Popover shell (native top-layer) ────────────── */ .picker-popover { position: fixed; inset: unset; margin: 0; padding: var(--esp-size-small); border-radius: var(--esp-size-border-radius); border: 1px solid var(--esp-color-border); background: var(--esp-color-layer-1); box-shadow: 0 4px 16px var(--esp-color-shadow); color: var(--esp-color-text); font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-size-font); opacity: 0; transition: opacity 150ms ease-in; overflow: visible; } .picker-popover.visible { opacity: 1; } /* ── Calendar ────────────────────────────────────── */ .calendar { --_cell-size: 2.4em; display: flex; flex-direction: column; gap: var(--esp-size-tiny); user-select: none; /* Clip the swiping body, but with a margin so the title controls' outset focus ring (2px offset + 2px width) paints above the header: the header has no padding above the title, so a hard clip at the box edge cut the ring's top. Browsers without overflow-clip-margin clip at the edge, as hidden did. */ overflow: clip; overflow-clip-margin: 4px; } .cal-body { will-change: transform; } .cal-header { display: flex; align-items: center; justify-content: space-between; padding-bottom: var(--esp-size-tiny); } .cal-title { font-weight: bold; font-size: var(--esp-type-normal); color: var(--esp-color-headings); } /* The month and year are buttons that open the jump surfaces, but the title must look exactly as it did as a span: every native button default is reset and the typography is inherited from .cal-title. Users discover the controls by clicking; the pointer cursor is the only pointer affordance, and the focus ring shows for keyboard focus only. No hover or expanded treatment, by design. */ .cal-title-part { appearance: none; display: inline; margin: 0; padding: 0; border: 0; border-radius: var(--esp-size-border-radius); background: none; font: inherit; letter-spacing: inherit; color: inherit; cursor: pointer; /* Outset, unlike .nav-btn's inset ring: an inset ring would cross the glyphs of a padding-less control. The ring's top lies outside the calendar box; .calendar's overflow-clip-margin lets it paint. Focus rings read against the calendar's own ground, so they take --esp-color-text. They used --esp-color-action-text until ESP0223: that token is only guaranteed legible on --esp-color-action-background, and it happened to be near-black in light and near-white in dark, which is the polarity the calendar ground wants too. The moment the default action surface moved, the borrowed token inverted and the ring vanished into the calendar. A ring drawn inside a selected cell is the exception and overrides this, because that cell paints the action surface. */ &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: 2px; } } .nav-btn { display: grid; place-content: center; background: none; border: none; cursor: pointer; padding: var(--esp-size-tiny); border-radius: var(--esp-size-border-radius); color: var(--esp-color-text); transition: background-color 120ms ease; > svg { height: var(--esp-size-normal); width: var(--esp-size-normal); } &:hover { background-color: var(--esp-color-layer-3); } &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: -2px; } } /* ── Weekday labels ──────────────────────────────── */ .weekday-row { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; } .weekday-label { font-size: var(--esp-type-tiny); font-weight: 600; color: var(--esp-color-headings); text-decoration: none; padding: var(--esp-size-tiny) 0; } /* ── Day grid ────────────────────────────────────── */ .day-grid { display: flex; flex-direction: column; } /* Show the focused-day ring only when the grid itself contains focus, so it disappears when the user tabs to the nav arrows or time picker. */ .day-grid:focus-within .day-cell.focused { outline: 2px solid var(--esp-color-text); outline-offset: -2px; z-index: 1; } .day-row { display: grid; grid-template-columns: repeat(7, 1fr); } /* ── Day, month, and year cells ──────────────────── */ /* The month and year surfaces reuse the day cell's rest, hover, selected, disabled, and focus treatments so they read as the same calendar; only the geometry and the day-specific states differ. */ .day-cell, .jump-cell { position: relative; display: grid; place-content: center; border: none; border-radius: var(--esp-size-border-radius); background: none; cursor: pointer; font-family: inherit; font-size: inherit; color: var(--esp-color-text); transition: background-color 100ms ease, color 100ms ease; &:hover:not(.disabled):not(.selected) { background-color: var(--esp-color-layer-3); } &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: -2px; z-index: 1; } /* Selected / range endpoints. A selected cell is a filled state, so it paints the one surface/ink pair the engine guarantees: APCA enforces --esp-color-action-text against --esp-color-action-background and nothing against --esp-color-layer-3, which this rule used to paint. Under a layer-3 ground the label had no enforced partner at all — it read at Lc 24.6 in light once ESP0223 moved the action surface, and 60.4 after taking --esp-color-text, still under the Lc 75 that ADR-002 sets for content text. On the action pair it is 76.0 and 81.6. In the dark scheme layer-3 and the action surface resolve to the same value, so that scheme is unchanged. */ &.selected { background-color: var(--esp-color-action-background); color: var(--esp-color-action-text); font-weight: bold; } } /* Everything drawn ON a selected cell reads against the action surface that cell paints, not against the calendar ground, so it takes that surface's own ink. These are declared at top level rather than nested under .selected because the focused-day ring is .day-grid:focus-within .day-cell.focused — specificity (0,4,0). A nested &:focus-visible compiles to (0,3,0) and loses to it, which is how a first attempt at this left a keyboard-focused selected day ringed in --esp-color-text at Lc 9.1 while looking correct on the month and year surfaces, whose cells carry no .focused rule. Naming the same selector plus .selected is what actually wins. A .day-cell.selected:focus-visible form would be unreachable: _renderDayCell drives .focused and tabindex=\"0\" off one flag and a day cell only renders inside .day-grid, so the grid selector always matches first. The jump surfaces have no .focused rule, so they take the :focus-visible form. */ .day-grid:focus-within .day-cell.focused.selected, .jump-cell.selected:focus-visible { outline-color: var(--esp-color-action-text); } .day-cell.today.selected { box-shadow: inset 0 0 0 1px var(--esp-color-action-text); } .day-cell { width: var(--_cell-size); height: var(--_cell-size); /* Outside month — dim */ &.outside-month { opacity: 0.38; } /* Today ring */ &.today { font-weight: bold; box-shadow: inset 0 0 0 1px var(--esp-color-border); border-radius: var(--esp-size-border-radius); } /* Range span highlight — washed-out brand colour */ &.in-range { background-color: oklch(from var(--esp-color-layer-3) calc(l + 0.15) calc(c * 0.4) h); border-radius: 0; } &.range-start { border-radius: var(--esp-size-border-radius) 0 0 var(--esp-size-border-radius); } &.range-end { border-radius: 0 var(--esp-size-border-radius) var(--esp-size-border-radius) 0; } } /* Disabled — declared after the day-specific states at the same specificity, so a disabled day that is also outside the month keeps the disabled opacity, as it did before the surfaces shared the cell rules. */ .day-cell.disabled, .jump-cell.disabled { opacity: 0.3; cursor: not-allowed; } /* ── Month and year jump surfaces ────────────────── */ /* A surface fills the body, which is pinned to the day grid's measured height while the surface is showing (see _applySurfaceChange), so the popover keeps its footprint and position. */ .jump-surface { box-sizing: border-box; block-size: 100%; } .month-surface { display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: 1fr; gap: var(--esp-size-tiny); } .year-surface { /* Relative so each year's offsetTop is measured against the list, which is what _scrollYearIntoView positions by. */ position: relative; display: flex; flex-direction: column; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; } .year-cell { flex: 0 0 auto; min-block-size: var(--_cell-size); } /* ── Time picker ─────────────────────────────────── */ .time-picker { display: flex; align-items: center; flex-wrap: nowrap; gap: var(--esp-size-tiny); padding-top: var(--esp-size-small); border-top: 1px solid var(--esp-color-border); margin-top: var(--esp-size-small); white-space: nowrap; /* Push the action buttons to the right edge */ > esp-button:first-of-type { margin-left: auto; } } /* Only-time mode: no top border */ :host([mode=\"time\"]) .time-picker { border-top: none; margin-top: 0; padding-top: 0; } .popover-actions { display: flex; gap: var(--esp-size-tiny); align-items: center; justify-content: flex-end; padding-top: var(--esp-size-small); border-top: 1px solid var(--esp-color-border); margin-top: var(--esp-size-small); } .time-sep { font-size: var(--esp-type-medium); font-weight: bold; color: var(--esp-color-headings); padding: 0 2px; } `",
|
|
100389
|
+
"default": "css` /* ── Error state ─────────────────────────────────── */ .temporal-error { font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-type-small); color: var(--esp-color-danger-text); padding: var(--esp-size-padding); } /* ── Trigger field ───────────────────────────────── */ .esp-field { display: grid; grid-template-columns: 1fr min-content; cursor: pointer; > input.esp-input { cursor: pointer; width: auto; } > .field-icon { display: grid; place-content: center; cursor: pointer; > svg { height: calc(1.2 * var(--esp-size-font)); width: calc(1.2 * var(--esp-size-font)); margin: 0 var(--esp-size-tiny); } } } /* ── Popover shell (native top-layer) ────────────── */ .picker-popover { --_esp-surface-layer: 1; position: fixed; inset: unset; margin: 0; padding: var(--esp-size-small); border-radius: var(--esp-size-border-radius); border: 1px solid var(--esp-color-border); background: var(--esp-color-layer-1); box-shadow: 0 4px 16px var(--esp-color-shadow); color: var(--esp-color-text); font-family: var( --_esp-font-body-effective, var(--esp-font-body, var(--_esp-font-body-fallback)) ); font-size: var(--esp-size-font); opacity: 0; transition: opacity 150ms ease-in; overflow: visible; } .picker-popover.visible { opacity: 1; } /* ── Calendar ────────────────────────────────────── */ .calendar { --_cell-size: 2.4em; display: flex; flex-direction: column; gap: var(--esp-size-tiny); user-select: none; /* Clip the swiping body, but with a margin so the title controls' outset focus ring (2px offset + 2px width) paints above the header: the header has no padding above the title, so a hard clip at the box edge cut the ring's top. Browsers without overflow-clip-margin clip at the edge, as hidden did. */ overflow: clip; overflow-clip-margin: 4px; } .cal-body { will-change: transform; } .cal-header { display: flex; align-items: center; justify-content: space-between; padding-bottom: var(--esp-size-tiny); } .cal-title { font-weight: bold; font-size: var(--esp-type-normal); color: var(--esp-color-headings); } /* The month and year are buttons that open the jump surfaces, but the title must look exactly as it did as a span: every native button default is reset and the typography is inherited from .cal-title. Users discover the controls by clicking; the pointer cursor is the only pointer affordance, and the focus ring shows for keyboard focus only. No hover or expanded treatment, by design. */ .cal-title-part { appearance: none; display: inline; margin: 0; padding: 0; border: 0; border-radius: var(--esp-size-border-radius); background: none; font: inherit; letter-spacing: inherit; color: inherit; cursor: pointer; /* Outset, unlike .nav-btn's inset ring: an inset ring would cross the glyphs of a padding-less control. The ring's top lies outside the calendar box; .calendar's overflow-clip-margin lets it paint. Focus rings read against the calendar's own ground, so they take --esp-color-text. They used --esp-color-action-text until ESP0223: that token is only guaranteed legible on --esp-color-action-background, and it happened to be near-black in light and near-white in dark, which is the polarity the calendar ground wants too. The moment the default action surface moved, the borrowed token inverted and the ring vanished into the calendar. A ring drawn inside a selected cell is the exception and overrides this, because that cell paints the action surface. */ &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: 2px; } } .nav-btn { display: grid; place-content: center; background: none; border: none; cursor: pointer; padding: var(--esp-size-tiny); border-radius: var(--esp-size-border-radius); color: var(--esp-color-text); transition: background-color 120ms ease; > svg { height: var(--esp-size-normal); width: var(--esp-size-normal); } &:hover { background-color: var(--esp-color-layer-3); } &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: -2px; } } /* ── Weekday labels ──────────────────────────────── */ .weekday-row { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; } .weekday-label { font-size: var(--esp-type-tiny); font-weight: 600; color: var(--esp-color-headings); text-decoration: none; padding: var(--esp-size-tiny) 0; } /* ── Day grid ────────────────────────────────────── */ .day-grid { display: flex; flex-direction: column; } /* Show the focused-day ring only when the grid itself contains focus, so it disappears when the user tabs to the nav arrows or time picker. */ .day-grid:focus-within .day-cell.focused { outline: 2px solid var(--esp-color-text); outline-offset: -2px; z-index: 1; } .day-row { display: grid; grid-template-columns: repeat(7, 1fr); } /* ── Day, month, and year cells ──────────────────── */ /* The month and year surfaces reuse the day cell's rest, hover, selected, disabled, and focus treatments so they read as the same calendar; only the geometry and the day-specific states differ. */ .day-cell, .jump-cell { position: relative; display: grid; place-content: center; border: none; border-radius: var(--esp-size-border-radius); background: none; cursor: pointer; font-family: inherit; font-size: inherit; color: var(--esp-color-text); transition: background-color 100ms ease, color 100ms ease; &:hover:not(.disabled):not(.selected) { background-color: var(--esp-color-layer-3); } &:focus-visible { outline: 2px solid var(--esp-color-text); outline-offset: -2px; z-index: 1; } /* Selected / range endpoints. A selected cell is a filled state, so it paints the one surface/ink pair the engine guarantees: APCA enforces --esp-color-action-text against --esp-color-action-background and nothing against --esp-color-layer-3, which this rule used to paint. Under a layer-3 ground the label had no enforced partner at all — it read at Lc 24.6 in light once ESP0223 moved the action surface, and 60.4 after taking --esp-color-text, still under the Lc 75 that ADR-002 sets for content text. On the action pair it is 76.0 and 81.6. In the dark scheme layer-3 and the action surface resolve to the same value, so that scheme is unchanged. */ &.selected { background-color: var(--esp-color-action-background); color: var(--esp-color-action-text); font-weight: bold; } } /* Everything drawn ON a selected cell reads against the action surface that cell paints, not against the calendar ground, so it takes that surface's own ink. These are declared at top level rather than nested under .selected because the focused-day ring is .day-grid:focus-within .day-cell.focused — specificity (0,4,0). A nested &:focus-visible compiles to (0,3,0) and loses to it, which is how a first attempt at this left a keyboard-focused selected day ringed in --esp-color-text at Lc 9.1 while looking correct on the month and year surfaces, whose cells carry no .focused rule. Naming the same selector plus .selected is what actually wins. A .day-cell.selected:focus-visible form would be unreachable: _renderDayCell drives .focused and tabindex=\"0\" off one flag and a day cell only renders inside .day-grid, so the grid selector always matches first. The jump surfaces have no .focused rule, so they take the :focus-visible form. */ .day-grid:focus-within .day-cell.focused.selected, .jump-cell.selected:focus-visible { outline-color: var(--esp-color-action-text); } .day-cell.today.selected { box-shadow: inset 0 0 0 1px var(--esp-color-action-text); } .day-cell { width: var(--_cell-size); height: var(--_cell-size); /* Outside month — dim */ &.outside-month { opacity: 0.38; } /* Today ring */ &.today { font-weight: bold; box-shadow: inset 0 0 0 1px var(--esp-color-border); border-radius: var(--esp-size-border-radius); } /* Range span highlight — washed-out brand colour */ &.in-range { background-color: oklch(from var(--esp-color-layer-3) calc(l + 0.15) calc(c * 0.4) h); border-radius: 0; } &.range-start { border-radius: var(--esp-size-border-radius) 0 0 var(--esp-size-border-radius); } &.range-end { border-radius: 0 var(--esp-size-border-radius) var(--esp-size-border-radius) 0; } } /* Disabled — declared after the day-specific states at the same specificity, so a disabled day that is also outside the month keeps the disabled opacity, as it did before the surfaces shared the cell rules. */ .day-cell.disabled, .jump-cell.disabled { opacity: 0.3; cursor: not-allowed; } /* ── Month and year jump surfaces ────────────────── */ /* A surface fills the body, which is pinned to the day grid's measured height while the surface is showing (see _applySurfaceChange), so the popover keeps its footprint and position. */ .jump-surface { box-sizing: border-box; block-size: 100%; } .month-surface { display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: 1fr; gap: var(--esp-size-tiny); } .year-surface { /* Relative so each year's offsetTop is measured against the list, which is what _scrollYearIntoView positions by. */ position: relative; display: flex; flex-direction: column; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; } .year-cell { flex: 0 0 auto; min-block-size: var(--_cell-size); } /* ── Time picker ─────────────────────────────────── */ .time-picker { display: flex; align-items: center; flex-wrap: nowrap; gap: var(--esp-size-tiny); padding-top: var(--esp-size-small); border-top: 1px solid var(--esp-color-border); margin-top: var(--esp-size-small); white-space: nowrap; /* Push the action buttons to the right edge */ > esp-button:first-of-type { margin-left: auto; } } /* Only-time mode: no top border */ :host([mode=\"time\"]) .time-picker { border-top: none; margin-top: 0; padding-top: 0; } .popover-actions { display: flex; gap: var(--esp-size-tiny); align-items: center; justify-content: flex-end; padding-top: var(--esp-size-small); border-top: 1px solid var(--esp-color-border); margin-top: var(--esp-size-small); } .time-sep { font-size: var(--esp-type-medium); font-weight: bold; color: var(--esp-color-headings); padding: 0 2px; } `",
|
|
99686
100390
|
"description": "Component-specific styles for `esp-date-picker`."
|
|
99687
100391
|
}
|
|
99688
100392
|
],
|