@taprootio/espalier 6.4.0 → 6.6.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 +15 -0
- package/custom-elements.json +618 -542
- package/dist/details/esp-details.js +12 -11
- package/dist/page/esp-page.d.ts +8 -2
- package/dist/page/esp-page.js +41 -41
- package/dist/page/esp-page.styles.js +1 -0
- package/dist/page/workspace-geometry.js +1 -1
- package/dist/page/workspace-resize-session.js +1 -1
- package/dist/root/helpers/compute-theme-properties.js +1 -1
- package/dist/root/helpers/surface-polarity-property.js +1 -0
- package/dist/shared/esp-element-base.js +20 -16
- package/dist/tabs/esp-tab-group.js +12 -11
- package/espalier.css-data.json +5 -1
- package/espalier.token-manifest.json +7 -1
- package/package.json +1 -1
package/custom-elements.json
CHANGED
|
@@ -54021,7 +54021,7 @@
|
|
|
54021
54021
|
"type": {
|
|
54022
54022
|
"text": "array"
|
|
54023
54023
|
},
|
|
54024
|
-
"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; } } `, ]"
|
|
54024
|
+
"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); background-attachment: var(--esp-page-canvas-background-attachment, scroll); 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; } } `, ]"
|
|
54025
54025
|
}
|
|
54026
54026
|
],
|
|
54027
54027
|
"exports": [
|
|
@@ -54080,6 +54080,10 @@
|
|
|
54080
54080
|
"description": "The opacity of the canvas gutter image layer. Defaults to `1`.",
|
|
54081
54081
|
"name": "--esp-page-canvas-background-image-opacity"
|
|
54082
54082
|
},
|
|
54083
|
+
{
|
|
54084
|
+
"description": "Whether the canvas gutter image scrolls with the page (`scroll`) or stays put against the viewport (`fixed`). Defaults to `scroll`.",
|
|
54085
|
+
"name": "--esp-page-canvas-background-attachment"
|
|
54086
|
+
},
|
|
54083
54087
|
{
|
|
54084
54088
|
"description": "The box shadow drawn on the left and right edges of the content surface. On by default; casts into the gutters and is clipped away when the surface fills the viewport, so it only shows above the cap. Set to `none` to remove it.",
|
|
54085
54089
|
"name": "--esp-page-surface-shadow"
|
|
@@ -54113,7 +54117,7 @@
|
|
|
54113
54117
|
"name": "--esp-page-preview-default-width"
|
|
54114
54118
|
},
|
|
54115
54119
|
{
|
|
54116
|
-
"description": "Maximum preview width. Defaults to `48rem`. Preview receives flexible trailing space before help grows.",
|
|
54120
|
+
"description": "Maximum preview width. Defaults to `48rem`. Preview receives flexible trailing space before help grows, and absorbs the width beyond a capped main up to this maximum.",
|
|
54117
54121
|
"name": "--esp-page-preview-max-width"
|
|
54118
54122
|
},
|
|
54119
54123
|
{
|
|
@@ -54261,7 +54265,7 @@
|
|
|
54261
54265
|
],
|
|
54262
54266
|
"slots": [
|
|
54263
54267
|
{
|
|
54264
|
-
"description": "Global navigation content (typically an `esp-header`). ```html <esp-page class=\"docs\"> <esp-header slot=\"header\"> <a href=\"#\" slot=\"brand\" class=\"nav-logo\"> <svg> <use href=\"/assets/icons.svg#taproot-logo\" /> </svg> </a> <esp-menu slot=\"menu\" mode=\"horizontal\"> <esp-menu-item label=\"Mammals\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Reptiles\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Amphibians\" url=\"#\"></esp-menu-item> </esp-menu> <esp-header-button slot=\"buttons\" icon=\"cog\" aria-label=\"Settings\"></esp-header-button> </esp-header> <esp-menu slot=\"sidebar\" mode=\"drawer\"></esp-menu> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ``` The authoring workspace is ordered main, preview, then help. Each region negotiates between public minimum and maximum widths; preview grows first, then help. Set `workspace-resizable` to expose accessible drag and keyboard separators on the dotted internal seams and the exposed trailing edge of the last auxiliary pane. Preferred pane sizes remain attached to the mounted page instance and are re-clamped by the same allocator whenever the available inline size changes. Opt into collapsing a directly paired header/sidebar navigation to its accessible burger/drawer mode after auxiliary panes contract and before main is reclaimed. The rail returns only when doing so preserves the settled pane allocation.",
|
|
54268
|
+
"description": "Global navigation content (typically an `esp-header`). ```html <esp-page class=\"docs\"> <esp-header slot=\"header\"> <a href=\"#\" slot=\"brand\" class=\"nav-logo\"> <svg> <use href=\"/assets/icons.svg#taproot-logo\" /> </svg> </a> <esp-menu slot=\"menu\" mode=\"horizontal\"> <esp-menu-item label=\"Mammals\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Reptiles\" url=\"#\"></esp-menu-item> <esp-menu-item label=\"Amphibians\" url=\"#\"></esp-menu-item> </esp-menu> <esp-header-button slot=\"buttons\" icon=\"cog\" aria-label=\"Settings\"></esp-header-button> </esp-header> <esp-menu slot=\"sidebar\" mode=\"drawer\"></esp-menu> <div slot=\"right\" style=\"background-color: purple;\">right</div> <esp-footer slot=\"footer\" brand-text=\"Espalier\"></esp-footer> <div style=\"background-color: black; overflow: hidden;\"> content </div> </esp-page> ``` The authoring workspace is ordered main, preview, then help. Each region negotiates between public minimum and maximum widths; preview grows first, then help. Set `workspace-resizable` to expose accessible drag and keyboard separators on the dotted internal seams and the exposed trailing edge of the last auxiliary pane. Preferred pane sizes remain attached to the mounted page instance and are re-clamped by the same allocator whenever the available inline size changes. A chosen size is a floor while main sits at its configured maximum: the preview, then help, absorb the spare width up to their maximums before any canvas appears. Opt into collapsing a directly paired header/sidebar navigation to its accessible burger/drawer mode after auxiliary panes contract and before main is reclaimed. The rail returns only when doing so preserves the settled pane allocation.",
|
|
54265
54269
|
"name": "header"
|
|
54266
54270
|
},
|
|
54267
54271
|
{
|
|
@@ -56905,6 +56909,36 @@
|
|
|
56905
56909
|
}
|
|
56906
56910
|
}
|
|
56907
56911
|
]
|
|
56912
|
+
},
|
|
56913
|
+
{
|
|
56914
|
+
"kind": "function",
|
|
56915
|
+
"name": "absorbWorkspaceSurplus",
|
|
56916
|
+
"return": {
|
|
56917
|
+
"type": {
|
|
56918
|
+
"text": "WorkspaceAllocation | null"
|
|
56919
|
+
}
|
|
56920
|
+
},
|
|
56921
|
+
"parameters": [
|
|
56922
|
+
{
|
|
56923
|
+
"name": "surplus",
|
|
56924
|
+
"type": {
|
|
56925
|
+
"text": "number"
|
|
56926
|
+
}
|
|
56927
|
+
},
|
|
56928
|
+
{
|
|
56929
|
+
"name": "preview",
|
|
56930
|
+
"type": {
|
|
56931
|
+
"text": "PaneSurplusClaim"
|
|
56932
|
+
}
|
|
56933
|
+
},
|
|
56934
|
+
{
|
|
56935
|
+
"name": "flyout",
|
|
56936
|
+
"type": {
|
|
56937
|
+
"text": "PaneSurplusClaim | null"
|
|
56938
|
+
}
|
|
56939
|
+
}
|
|
56940
|
+
],
|
|
56941
|
+
"description": "Split the width left beyond a capped main well between the preview and then\nhelp, each growing from its floor up to its maximum, so no canvas sits beside\nan open preview. Returns null when the floors already fill the surplus.\n\n`surplus` is the workspace width available without narrowing main below its\nconfigured maximum (`WorkspaceWidthCapacity.natural`); it is zero when main\nis not capped, which makes this a no-op there."
|
|
56908
56942
|
}
|
|
56909
56943
|
],
|
|
56910
56944
|
"exports": [
|
|
@@ -56931,6 +56965,14 @@
|
|
|
56931
56965
|
"name": "clampWorkspaceWidth",
|
|
56932
56966
|
"module": "dist/page/workspace-geometry.js"
|
|
56933
56967
|
}
|
|
56968
|
+
},
|
|
56969
|
+
{
|
|
56970
|
+
"kind": "js",
|
|
56971
|
+
"name": "absorbWorkspaceSurplus",
|
|
56972
|
+
"declaration": {
|
|
56973
|
+
"name": "absorbWorkspaceSurplus",
|
|
56974
|
+
"module": "dist/page/workspace-geometry.js"
|
|
56975
|
+
}
|
|
56934
56976
|
}
|
|
56935
56977
|
]
|
|
56936
56978
|
},
|
|
@@ -86633,40 +86675,60 @@
|
|
|
86633
86675
|
},
|
|
86634
86676
|
{
|
|
86635
86677
|
"kind": "javascript-module",
|
|
86636
|
-
"path": "dist/
|
|
86678
|
+
"path": "dist/switch/esp-switch.js",
|
|
86637
86679
|
"declarations": [
|
|
86638
86680
|
{
|
|
86639
86681
|
"kind": "class",
|
|
86640
|
-
"description": "
|
|
86641
|
-
"name": "
|
|
86682
|
+
"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.",
|
|
86683
|
+
"name": "EspalierSwitch",
|
|
86642
86684
|
"cssProperties": [
|
|
86643
86685
|
{
|
|
86644
|
-
"description": "
|
|
86645
|
-
"name": "--esp-
|
|
86686
|
+
"description": "The width of the switch track. Defaults to `calc(var(--esp-size-normal-to-medium) * 1.75)`.",
|
|
86687
|
+
"name": "--esp-switch-width"
|
|
86646
86688
|
},
|
|
86647
86689
|
{
|
|
86648
|
-
"description": "
|
|
86649
|
-
"name": "--esp-
|
|
86690
|
+
"description": "The height of the switch track. Defaults to `var(--esp-size-normal-to-medium)`.",
|
|
86691
|
+
"name": "--esp-switch-height"
|
|
86650
86692
|
},
|
|
86651
86693
|
{
|
|
86652
|
-
"description": "
|
|
86653
|
-
"name": "--esp-
|
|
86694
|
+
"description": "The diameter of the thumb. Defaults to `calc(var(--esp-switch-height) - 4px)`.",
|
|
86695
|
+
"name": "--esp-switch-thumb-size"
|
|
86654
86696
|
},
|
|
86655
86697
|
{
|
|
86656
|
-
"description": "
|
|
86657
|
-
"name": "--esp-
|
|
86698
|
+
"description": "The track background color when the switch is off. Defaults to `var(--esp-color-border)`.",
|
|
86699
|
+
"name": "--esp-switch-track-color"
|
|
86658
86700
|
},
|
|
86659
86701
|
{
|
|
86660
|
-
"description": "
|
|
86661
|
-
"name": "--esp-
|
|
86702
|
+
"description": "The track background color when the switch is on. Defaults to `var(--esp-color-action-background)`.",
|
|
86703
|
+
"name": "--esp-switch-track-color-on"
|
|
86662
86704
|
},
|
|
86663
86705
|
{
|
|
86664
|
-
"description": "
|
|
86665
|
-
"name": "--esp-
|
|
86706
|
+
"description": "The thumb color. Defaults to `var(--esp-color-layer-1)`.",
|
|
86707
|
+
"name": "--esp-switch-thumb-color"
|
|
86666
86708
|
},
|
|
86667
86709
|
{
|
|
86668
|
-
"description": "
|
|
86669
|
-
"name": "--esp-
|
|
86710
|
+
"description": "The color of the focus ring shadow. Defaults to `var(--esp-color-shadow)`.",
|
|
86711
|
+
"name": "--esp-switch-focus-shadow"
|
|
86712
|
+
},
|
|
86713
|
+
{
|
|
86714
|
+
"description": "Padding inside each text-mode label cell. Defaults to `var(--esp-size-tiny) var(--esp-size-small)`.",
|
|
86715
|
+
"name": "--esp-switch-text-padding"
|
|
86716
|
+
},
|
|
86717
|
+
{
|
|
86718
|
+
"description": "Font size for text-mode labels. Defaults to `var(--esp-size-font)`.",
|
|
86719
|
+
"name": "--esp-switch-text-font-size"
|
|
86720
|
+
},
|
|
86721
|
+
{
|
|
86722
|
+
"description": "Text color of the active label in text mode. Defaults to `var(--esp-color-action-text)`.",
|
|
86723
|
+
"name": "--esp-switch-text-active-color"
|
|
86724
|
+
},
|
|
86725
|
+
{
|
|
86726
|
+
"description": "Text color of the inactive label in text mode. Defaults to `var(--esp-color-layer-1)`.",
|
|
86727
|
+
"name": "--esp-switch-text-inactive-color"
|
|
86728
|
+
},
|
|
86729
|
+
{
|
|
86730
|
+
"description": "Background color of the sliding highlight in text mode. Defaults to `var(--esp-color-action-background)`.",
|
|
86731
|
+
"name": "--esp-switch-text-highlight-color"
|
|
86670
86732
|
},
|
|
86671
86733
|
{
|
|
86672
86734
|
"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.",
|
|
@@ -86725,108 +86787,194 @@
|
|
|
86725
86787
|
}
|
|
86726
86788
|
}
|
|
86727
86789
|
],
|
|
86728
|
-
"cssParts": [
|
|
86729
|
-
{
|
|
86730
|
-
"description": "The tab strip container.",
|
|
86731
|
-
"name": "tab-list"
|
|
86732
|
-
},
|
|
86733
|
-
{
|
|
86734
|
-
"description": "Each individual tab button in the strip.",
|
|
86735
|
-
"name": "tab-button"
|
|
86736
|
-
},
|
|
86737
|
-
{
|
|
86738
|
-
"description": "The panel area below the tab strip.",
|
|
86739
|
-
"name": "panels"
|
|
86740
|
-
}
|
|
86741
|
-
],
|
|
86742
86790
|
"slots": [
|
|
86743
86791
|
{
|
|
86744
|
-
"description": "
|
|
86792
|
+
"description": "The label text for the switch. In default mode this renders beside the track; in text mode it is visually hidden and included in the control's accessible label.",
|
|
86745
86793
|
"name": ""
|
|
86746
86794
|
}
|
|
86747
86795
|
],
|
|
86748
86796
|
"members": [
|
|
86749
86797
|
{
|
|
86750
86798
|
"kind": "field",
|
|
86751
|
-
"name": "
|
|
86799
|
+
"name": "formAssociated",
|
|
86800
|
+
"type": {
|
|
86801
|
+
"text": "boolean"
|
|
86802
|
+
},
|
|
86803
|
+
"static": true,
|
|
86804
|
+
"default": "true"
|
|
86805
|
+
},
|
|
86806
|
+
{
|
|
86807
|
+
"kind": "field",
|
|
86808
|
+
"name": "internals",
|
|
86752
86809
|
"privacy": "private"
|
|
86753
86810
|
},
|
|
86754
86811
|
{
|
|
86755
86812
|
"kind": "field",
|
|
86756
|
-
"name": "
|
|
86813
|
+
"name": "formCtrl",
|
|
86814
|
+
"privacy": "private",
|
|
86815
|
+
"default": "new FormFieldController({ host: this, internals: this.internals, getFormValue: () => (this.checked ? this.value || \"on\" : null), getValidity: () => { if (this.required && !this.checked) { return { flags: { valueMissing: true }, message: this.requiredMessage || \"Please toggle this switch to continue.\", }; } return null; }, onReset: () => { this.checked = false; }, onRestore: (state: string) => { this.checked = state === \"on\" || state === this.value; }, onDisabled: (isDisabled: boolean) => { this.disabled = isDisabled; }, })"
|
|
86816
|
+
},
|
|
86817
|
+
{
|
|
86818
|
+
"kind": "field",
|
|
86819
|
+
"name": "formItemDescription",
|
|
86820
|
+
"privacy": "private",
|
|
86821
|
+
"default": "new FormFieldDescriptionController({ host: this, getTarget: () => this.shadowRoot?.querySelector<HTMLElement>(\".switch-control\"), })"
|
|
86822
|
+
},
|
|
86823
|
+
{
|
|
86824
|
+
"kind": "field",
|
|
86825
|
+
"name": "mode",
|
|
86826
|
+
"type": {
|
|
86827
|
+
"text": "\"switch\" | \"text\""
|
|
86828
|
+
},
|
|
86829
|
+
"privacy": "public",
|
|
86830
|
+
"default": "\"switch\"",
|
|
86831
|
+
"description": "The visual presentation of the switch.\n- `\"switch\"` (default) renders a track-and-thumb toggle.\n- `\"text\"` renders two side-by-side text labels with a\n sliding highlight behind the active one.",
|
|
86832
|
+
"attribute": "mode",
|
|
86833
|
+
"reflects": true
|
|
86834
|
+
},
|
|
86835
|
+
{
|
|
86836
|
+
"kind": "field",
|
|
86837
|
+
"name": "offLabel",
|
|
86838
|
+
"type": {
|
|
86839
|
+
"text": "string"
|
|
86840
|
+
},
|
|
86841
|
+
"privacy": "public",
|
|
86842
|
+
"default": "\"\"",
|
|
86843
|
+
"description": "Label shown for the unchecked (off) state when\n`mode=\"text\"`.",
|
|
86844
|
+
"attribute": "off-label"
|
|
86845
|
+
},
|
|
86846
|
+
{
|
|
86847
|
+
"kind": "field",
|
|
86848
|
+
"name": "onLabel",
|
|
86849
|
+
"type": {
|
|
86850
|
+
"text": "string"
|
|
86851
|
+
},
|
|
86852
|
+
"privacy": "public",
|
|
86853
|
+
"default": "\"\"",
|
|
86854
|
+
"description": "Label shown for the checked (on) state when\n`mode=\"text\"`.",
|
|
86855
|
+
"attribute": "on-label"
|
|
86856
|
+
},
|
|
86857
|
+
{
|
|
86858
|
+
"kind": "field",
|
|
86859
|
+
"name": "checked",
|
|
86757
86860
|
"type": {
|
|
86758
86861
|
"text": "boolean"
|
|
86759
86862
|
},
|
|
86760
86863
|
"privacy": "public",
|
|
86761
86864
|
"default": "false",
|
|
86762
|
-
"description": "
|
|
86763
|
-
"attribute": "
|
|
86865
|
+
"description": "Whether the switch is in the on state.",
|
|
86866
|
+
"attribute": "checked",
|
|
86764
86867
|
"reflects": true
|
|
86765
86868
|
},
|
|
86766
86869
|
{
|
|
86767
86870
|
"kind": "field",
|
|
86768
|
-
"name": "
|
|
86871
|
+
"name": "value",
|
|
86769
86872
|
"type": {
|
|
86770
|
-
"text": "
|
|
86873
|
+
"text": "string"
|
|
86771
86874
|
},
|
|
86772
|
-
"privacy": "
|
|
86773
|
-
"default": "
|
|
86875
|
+
"privacy": "public",
|
|
86876
|
+
"default": "\"\"",
|
|
86877
|
+
"description": "The value associated with this switch. Submitted with the\nform when the switch is on.",
|
|
86878
|
+
"attribute": "value"
|
|
86879
|
+
},
|
|
86880
|
+
{
|
|
86881
|
+
"kind": "field",
|
|
86882
|
+
"name": "name",
|
|
86883
|
+
"type": {
|
|
86884
|
+
"text": "string"
|
|
86885
|
+
},
|
|
86886
|
+
"privacy": "public",
|
|
86887
|
+
"default": "\"\"",
|
|
86888
|
+
"description": "The name used when the switch participates in a `<form>`.",
|
|
86889
|
+
"attribute": "name",
|
|
86890
|
+
"reflects": true
|
|
86891
|
+
},
|
|
86892
|
+
{
|
|
86893
|
+
"kind": "field",
|
|
86894
|
+
"name": "required",
|
|
86895
|
+
"type": {
|
|
86896
|
+
"text": "boolean"
|
|
86897
|
+
},
|
|
86898
|
+
"privacy": "public",
|
|
86899
|
+
"default": "false",
|
|
86900
|
+
"description": "When true, the switch must be on before the form can\nbe submitted.",
|
|
86901
|
+
"attribute": "required",
|
|
86902
|
+
"reflects": true
|
|
86903
|
+
},
|
|
86904
|
+
{
|
|
86905
|
+
"kind": "field",
|
|
86906
|
+
"name": "requiredMessage",
|
|
86907
|
+
"type": {
|
|
86908
|
+
"text": "string"
|
|
86909
|
+
},
|
|
86910
|
+
"privacy": "public",
|
|
86911
|
+
"default": "\"\"",
|
|
86912
|
+
"description": "A custom message to display when the switch is required but\nnot on. Defaults to `\"Please toggle this switch to continue.\"`\nwhen not set.\n\n```html\n<esp-switch required required-message=\"You must accept the terms.\">\n I accept\n</esp-switch>\n```",
|
|
86913
|
+
"attribute": "required-message"
|
|
86914
|
+
},
|
|
86915
|
+
{
|
|
86916
|
+
"kind": "field",
|
|
86917
|
+
"name": "disabled",
|
|
86918
|
+
"type": {
|
|
86919
|
+
"text": "boolean"
|
|
86920
|
+
},
|
|
86921
|
+
"privacy": "public",
|
|
86922
|
+
"default": "false",
|
|
86923
|
+
"description": "Controls whether the switch is disabled.",
|
|
86924
|
+
"attribute": "disabled",
|
|
86925
|
+
"reflects": true
|
|
86774
86926
|
},
|
|
86775
86927
|
{
|
|
86776
86928
|
"kind": "method",
|
|
86777
|
-
"name": "
|
|
86778
|
-
"privacy": "
|
|
86929
|
+
"name": "focus",
|
|
86930
|
+
"privacy": "public",
|
|
86779
86931
|
"return": {
|
|
86780
86932
|
"type": {
|
|
86781
|
-
"text": "
|
|
86933
|
+
"text": "void"
|
|
86782
86934
|
}
|
|
86783
|
-
}
|
|
86935
|
+
},
|
|
86936
|
+
"parameters": [
|
|
86937
|
+
{
|
|
86938
|
+
"name": "options",
|
|
86939
|
+
"optional": true,
|
|
86940
|
+
"type": {
|
|
86941
|
+
"text": "FocusOptions"
|
|
86942
|
+
}
|
|
86943
|
+
}
|
|
86944
|
+
],
|
|
86945
|
+
"description": "Focus the switch control."
|
|
86784
86946
|
},
|
|
86785
86947
|
{
|
|
86786
86948
|
"kind": "method",
|
|
86787
|
-
"name": "
|
|
86788
|
-
"privacy": "
|
|
86949
|
+
"name": "validate",
|
|
86950
|
+
"privacy": "public",
|
|
86789
86951
|
"return": {
|
|
86790
86952
|
"type": {
|
|
86791
86953
|
"text": "void"
|
|
86792
86954
|
}
|
|
86793
|
-
}
|
|
86955
|
+
},
|
|
86956
|
+
"description": "Re-run constraint validation and dispatch `esp-validity-changed`."
|
|
86794
86957
|
},
|
|
86795
86958
|
{
|
|
86796
86959
|
"kind": "method",
|
|
86797
|
-
"name": "
|
|
86798
|
-
"privacy": "
|
|
86960
|
+
"name": "checkValidity",
|
|
86961
|
+
"privacy": "public",
|
|
86799
86962
|
"return": {
|
|
86800
86963
|
"type": {
|
|
86801
|
-
"text": "
|
|
86964
|
+
"text": "boolean"
|
|
86802
86965
|
}
|
|
86803
86966
|
},
|
|
86804
|
-
"
|
|
86805
|
-
{
|
|
86806
|
-
"name": "index",
|
|
86807
|
-
"type": {
|
|
86808
|
-
"text": "number"
|
|
86809
|
-
}
|
|
86810
|
-
}
|
|
86811
|
-
]
|
|
86967
|
+
"description": "Check whether the current state is valid (delegates to ElementInternals)."
|
|
86812
86968
|
},
|
|
86813
86969
|
{
|
|
86814
86970
|
"kind": "method",
|
|
86815
|
-
"name": "
|
|
86971
|
+
"name": "toggle",
|
|
86816
86972
|
"privacy": "private",
|
|
86817
86973
|
"return": {
|
|
86818
86974
|
"type": {
|
|
86819
86975
|
"text": "void"
|
|
86820
86976
|
}
|
|
86821
|
-
}
|
|
86822
|
-
"parameters": [
|
|
86823
|
-
{
|
|
86824
|
-
"name": "index",
|
|
86825
|
-
"type": {
|
|
86826
|
-
"text": "number"
|
|
86827
|
-
}
|
|
86828
|
-
}
|
|
86829
|
-
]
|
|
86977
|
+
}
|
|
86830
86978
|
},
|
|
86831
86979
|
{
|
|
86832
86980
|
"kind": "method",
|
|
@@ -86848,7 +86996,7 @@
|
|
|
86848
86996
|
},
|
|
86849
86997
|
{
|
|
86850
86998
|
"kind": "method",
|
|
86851
|
-
"name": "
|
|
86999
|
+
"name": "handleLabelSlotChange",
|
|
86852
87000
|
"privacy": "private",
|
|
86853
87001
|
"return": {
|
|
86854
87002
|
"type": {
|
|
@@ -86858,14 +87006,70 @@
|
|
|
86858
87006
|
},
|
|
86859
87007
|
{
|
|
86860
87008
|
"kind": "method",
|
|
86861
|
-
"name": "
|
|
87009
|
+
"name": "getCurrentTextModeLabel",
|
|
86862
87010
|
"privacy": "private",
|
|
86863
87011
|
"return": {
|
|
86864
87012
|
"type": {
|
|
86865
|
-
"text": "
|
|
87013
|
+
"text": "string"
|
|
87014
|
+
}
|
|
87015
|
+
}
|
|
87016
|
+
},
|
|
87017
|
+
{
|
|
87018
|
+
"kind": "method",
|
|
87019
|
+
"name": "getTextModeAriaLabel",
|
|
87020
|
+
"privacy": "private",
|
|
87021
|
+
"return": {
|
|
87022
|
+
"type": {
|
|
87023
|
+
"text": "string"
|
|
86866
87024
|
}
|
|
86867
87025
|
}
|
|
86868
87026
|
},
|
|
87027
|
+
{
|
|
87028
|
+
"kind": "method",
|
|
87029
|
+
"name": "formResetCallback",
|
|
87030
|
+
"return": {
|
|
87031
|
+
"type": {
|
|
87032
|
+
"text": "void"
|
|
87033
|
+
}
|
|
87034
|
+
},
|
|
87035
|
+
"description": "Called by the browser when the owning `<form>` is reset."
|
|
87036
|
+
},
|
|
87037
|
+
{
|
|
87038
|
+
"kind": "method",
|
|
87039
|
+
"name": "formStateRestoreCallback",
|
|
87040
|
+
"return": {
|
|
87041
|
+
"type": {
|
|
87042
|
+
"text": "void"
|
|
87043
|
+
}
|
|
87044
|
+
},
|
|
87045
|
+
"parameters": [
|
|
87046
|
+
{
|
|
87047
|
+
"name": "state",
|
|
87048
|
+
"type": {
|
|
87049
|
+
"text": "string"
|
|
87050
|
+
}
|
|
87051
|
+
}
|
|
87052
|
+
],
|
|
87053
|
+
"description": "Called by the browser to restore form state (bfcache, etc.)."
|
|
87054
|
+
},
|
|
87055
|
+
{
|
|
87056
|
+
"kind": "method",
|
|
87057
|
+
"name": "formDisabledCallback",
|
|
87058
|
+
"return": {
|
|
87059
|
+
"type": {
|
|
87060
|
+
"text": "void"
|
|
87061
|
+
}
|
|
87062
|
+
},
|
|
87063
|
+
"parameters": [
|
|
87064
|
+
{
|
|
87065
|
+
"name": "isDisabled",
|
|
87066
|
+
"type": {
|
|
87067
|
+
"text": "boolean"
|
|
87068
|
+
}
|
|
87069
|
+
}
|
|
87070
|
+
],
|
|
87071
|
+
"description": "Called by the browser when a parent `<fieldset>` is enabled or disabled."
|
|
87072
|
+
},
|
|
86869
87073
|
{
|
|
86870
87074
|
"kind": "field",
|
|
86871
87075
|
"name": "seedColorBacker",
|
|
@@ -87594,20 +87798,99 @@
|
|
|
87594
87798
|
"events": [
|
|
87595
87799
|
{
|
|
87596
87800
|
"type": {
|
|
87597
|
-
"text": "CustomEvent<{
|
|
87801
|
+
"text": "CustomEvent<{ checked: boolean; value: string }>"
|
|
87598
87802
|
},
|
|
87599
|
-
"description": "Fired when the
|
|
87600
|
-
"name": "esp-
|
|
87803
|
+
"description": "Fired when the switch is toggled. The detail contains the new `checked` state and the switch `value`.",
|
|
87804
|
+
"name": "esp-value-changed"
|
|
87805
|
+
},
|
|
87806
|
+
{
|
|
87807
|
+
"type": {
|
|
87808
|
+
"text": "CustomEvent<{ valid: boolean; message: string }>"
|
|
87809
|
+
},
|
|
87810
|
+
"description": "Fired whenever constraint validation runs.",
|
|
87811
|
+
"name": "esp-validity-changed"
|
|
87601
87812
|
}
|
|
87602
87813
|
],
|
|
87603
87814
|
"attributes": [
|
|
87815
|
+
{
|
|
87816
|
+
"name": "mode",
|
|
87817
|
+
"type": {
|
|
87818
|
+
"text": "\"switch\" | \"text\""
|
|
87819
|
+
},
|
|
87820
|
+
"default": "\"switch\"",
|
|
87821
|
+
"description": "The visual presentation of the switch.\n- `\"switch\"` (default) renders a track-and-thumb toggle.\n- `\"text\"` renders two side-by-side text labels with a\n sliding highlight behind the active one.",
|
|
87822
|
+
"fieldName": "mode"
|
|
87823
|
+
},
|
|
87824
|
+
{
|
|
87825
|
+
"name": "off-label",
|
|
87826
|
+
"type": {
|
|
87827
|
+
"text": "string"
|
|
87828
|
+
},
|
|
87829
|
+
"default": "\"\"",
|
|
87830
|
+
"description": "Label shown for the unchecked (off) state when\n`mode=\"text\"`.",
|
|
87831
|
+
"fieldName": "offLabel"
|
|
87832
|
+
},
|
|
87833
|
+
{
|
|
87834
|
+
"name": "on-label",
|
|
87835
|
+
"type": {
|
|
87836
|
+
"text": "string"
|
|
87837
|
+
},
|
|
87838
|
+
"default": "\"\"",
|
|
87839
|
+
"description": "Label shown for the checked (on) state when\n`mode=\"text\"`.",
|
|
87840
|
+
"fieldName": "onLabel"
|
|
87841
|
+
},
|
|
87842
|
+
{
|
|
87843
|
+
"name": "checked",
|
|
87844
|
+
"type": {
|
|
87845
|
+
"text": "boolean"
|
|
87846
|
+
},
|
|
87847
|
+
"default": "false",
|
|
87848
|
+
"description": "Whether the switch is in the on state.",
|
|
87849
|
+
"fieldName": "checked"
|
|
87850
|
+
},
|
|
87851
|
+
{
|
|
87852
|
+
"name": "value",
|
|
87853
|
+
"type": {
|
|
87854
|
+
"text": "string"
|
|
87855
|
+
},
|
|
87856
|
+
"default": "\"\"",
|
|
87857
|
+
"description": "The value associated with this switch. Submitted with the\nform when the switch is on.",
|
|
87858
|
+
"fieldName": "value"
|
|
87859
|
+
},
|
|
87860
|
+
{
|
|
87861
|
+
"name": "name",
|
|
87862
|
+
"type": {
|
|
87863
|
+
"text": "string"
|
|
87864
|
+
},
|
|
87865
|
+
"default": "\"\"",
|
|
87866
|
+
"description": "The name used when the switch participates in a `<form>`.",
|
|
87867
|
+
"fieldName": "name"
|
|
87868
|
+
},
|
|
87869
|
+
{
|
|
87870
|
+
"name": "required",
|
|
87871
|
+
"type": {
|
|
87872
|
+
"text": "boolean"
|
|
87873
|
+
},
|
|
87874
|
+
"default": "false",
|
|
87875
|
+
"description": "When true, the switch must be on before the form can\nbe submitted.",
|
|
87876
|
+
"fieldName": "required"
|
|
87877
|
+
},
|
|
87878
|
+
{
|
|
87879
|
+
"name": "required-message",
|
|
87880
|
+
"type": {
|
|
87881
|
+
"text": "string"
|
|
87882
|
+
},
|
|
87883
|
+
"default": "\"\"",
|
|
87884
|
+
"description": "A custom message to display when the switch is required but\nnot on. Defaults to `\"Please toggle this switch to continue.\"`\nwhen not set.\n\n```html\n<esp-switch required required-message=\"You must accept the terms.\">\n I accept\n</esp-switch>\n```",
|
|
87885
|
+
"fieldName": "requiredMessage"
|
|
87886
|
+
},
|
|
87604
87887
|
{
|
|
87605
87888
|
"name": "disabled",
|
|
87606
87889
|
"type": {
|
|
87607
87890
|
"text": "boolean"
|
|
87608
87891
|
},
|
|
87609
87892
|
"default": "false",
|
|
87610
|
-
"description": "
|
|
87893
|
+
"description": "Controls whether the switch is disabled.",
|
|
87611
87894
|
"fieldName": "disabled"
|
|
87612
87895
|
},
|
|
87613
87896
|
{
|
|
@@ -87663,60 +87946,84 @@
|
|
|
87663
87946
|
"name": "EspalierElementBase",
|
|
87664
87947
|
"module": "dist/shared/esp-element-base.js"
|
|
87665
87948
|
},
|
|
87666
|
-
"tagName": "esp-tab-group",
|
|
87667
|
-
"customElement": true,
|
|
87668
87949
|
"docPageTitle": {
|
|
87669
|
-
"name": "
|
|
87670
|
-
"description": "
|
|
87950
|
+
"name": "Switch",
|
|
87951
|
+
"description": ""
|
|
87671
87952
|
},
|
|
87672
87953
|
"docUrl": {
|
|
87673
|
-
"name": "/components/
|
|
87954
|
+
"name": "/components/switch",
|
|
87674
87955
|
"description": ""
|
|
87675
87956
|
},
|
|
87676
87957
|
"menuGroup": {
|
|
87677
|
-
"name": "
|
|
87678
|
-
"description": ""
|
|
87958
|
+
"name": "Form",
|
|
87959
|
+
"description": "Controls"
|
|
87679
87960
|
},
|
|
87680
87961
|
"menuLabel": {
|
|
87681
|
-
"name": "
|
|
87682
|
-
"description": "
|
|
87962
|
+
"name": "Switch",
|
|
87963
|
+
"description": ""
|
|
87683
87964
|
},
|
|
87684
87965
|
"menuIcon": {
|
|
87685
|
-
"name": "
|
|
87966
|
+
"name": "button",
|
|
87686
87967
|
"description": ""
|
|
87687
|
-
}
|
|
87968
|
+
},
|
|
87969
|
+
"tagName": "esp-switch",
|
|
87970
|
+
"customElement": true
|
|
87688
87971
|
}
|
|
87689
87972
|
],
|
|
87690
87973
|
"exports": [
|
|
87691
87974
|
{
|
|
87692
87975
|
"kind": "js",
|
|
87693
|
-
"name": "
|
|
87976
|
+
"name": "EspalierSwitch",
|
|
87694
87977
|
"declaration": {
|
|
87695
|
-
"name": "
|
|
87696
|
-
"module": "dist/
|
|
87978
|
+
"name": "EspalierSwitch",
|
|
87979
|
+
"module": "dist/switch/esp-switch.js"
|
|
87697
87980
|
}
|
|
87698
87981
|
},
|
|
87699
87982
|
{
|
|
87700
87983
|
"kind": "custom-element-definition",
|
|
87701
|
-
"name": "esp-
|
|
87984
|
+
"name": "esp-switch",
|
|
87702
87985
|
"declaration": {
|
|
87703
|
-
"name": "
|
|
87704
|
-
"module": "dist/
|
|
87986
|
+
"name": "EspalierSwitch",
|
|
87987
|
+
"module": "dist/switch/esp-switch.js"
|
|
87705
87988
|
}
|
|
87706
87989
|
}
|
|
87707
87990
|
]
|
|
87708
87991
|
},
|
|
87709
87992
|
{
|
|
87710
87993
|
"kind": "javascript-module",
|
|
87711
|
-
"path": "dist/tabs/esp-tab.js",
|
|
87994
|
+
"path": "dist/tabs/esp-tab-group.js",
|
|
87712
87995
|
"declarations": [
|
|
87713
87996
|
{
|
|
87714
87997
|
"kind": "class",
|
|
87715
|
-
"description": "A
|
|
87716
|
-
"name": "
|
|
87998
|
+
"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```",
|
|
87999
|
+
"name": "EspalierTabGroup",
|
|
87717
88000
|
"cssProperties": [
|
|
87718
88001
|
{
|
|
87719
|
-
"description": "
|
|
88002
|
+
"description": "Border color of the tab group container.",
|
|
88003
|
+
"name": "--esp-tab-color-border"
|
|
88004
|
+
},
|
|
88005
|
+
{
|
|
88006
|
+
"description": "Background color of the overall component.",
|
|
88007
|
+
"name": "--esp-tab-color-background"
|
|
88008
|
+
},
|
|
88009
|
+
{
|
|
88010
|
+
"description": "Background color of the tab strip.",
|
|
88011
|
+
"name": "--esp-tab-color-strip-background"
|
|
88012
|
+
},
|
|
88013
|
+
{
|
|
88014
|
+
"description": "Tab button hover background.",
|
|
88015
|
+
"name": "--esp-tab-color-button-hover"
|
|
88016
|
+
},
|
|
88017
|
+
{
|
|
88018
|
+
"description": "Active tab button background.",
|
|
88019
|
+
"name": "--esp-tab-color-button-active"
|
|
88020
|
+
},
|
|
88021
|
+
{
|
|
88022
|
+
"description": "Text color for tab buttons.",
|
|
88023
|
+
"name": "--esp-tab-color-text"
|
|
88024
|
+
},
|
|
88025
|
+
{
|
|
88026
|
+
"description": "Padding inside the panel area and tab buttons.",
|
|
87720
88027
|
"name": "--esp-tab-size-padding"
|
|
87721
88028
|
},
|
|
87722
88029
|
{
|
|
@@ -87778,51 +88085,144 @@
|
|
|
87778
88085
|
],
|
|
87779
88086
|
"cssParts": [
|
|
87780
88087
|
{
|
|
87781
|
-
"description": "The
|
|
87782
|
-
"name": "
|
|
88088
|
+
"description": "The tab strip container.",
|
|
88089
|
+
"name": "tab-list"
|
|
88090
|
+
},
|
|
88091
|
+
{
|
|
88092
|
+
"description": "Each individual tab button in the strip.",
|
|
88093
|
+
"name": "tab-button"
|
|
88094
|
+
},
|
|
88095
|
+
{
|
|
88096
|
+
"description": "The panel area below the tab strip.",
|
|
88097
|
+
"name": "panels"
|
|
87783
88098
|
}
|
|
87784
88099
|
],
|
|
87785
88100
|
"slots": [
|
|
87786
88101
|
{
|
|
87787
|
-
"description": "
|
|
88102
|
+
"description": "Place `esp-tab` elements in the default slot.",
|
|
87788
88103
|
"name": ""
|
|
87789
88104
|
}
|
|
87790
88105
|
],
|
|
87791
88106
|
"members": [
|
|
87792
88107
|
{
|
|
87793
88108
|
"kind": "field",
|
|
87794
|
-
"name": "
|
|
87795
|
-
"
|
|
87796
|
-
"text": "string"
|
|
87797
|
-
},
|
|
87798
|
-
"privacy": "public",
|
|
87799
|
-
"default": "\"\"",
|
|
87800
|
-
"description": "The text displayed in the tab button within the tab strip.",
|
|
87801
|
-
"attribute": "label"
|
|
88109
|
+
"name": "panelsSlot",
|
|
88110
|
+
"privacy": "private"
|
|
87802
88111
|
},
|
|
87803
88112
|
{
|
|
87804
88113
|
"kind": "field",
|
|
87805
|
-
"name": "
|
|
88114
|
+
"name": "disabled",
|
|
87806
88115
|
"type": {
|
|
87807
88116
|
"text": "boolean"
|
|
87808
88117
|
},
|
|
87809
88118
|
"privacy": "public",
|
|
87810
88119
|
"default": "false",
|
|
87811
|
-
"description": "
|
|
87812
|
-
"attribute": "
|
|
88120
|
+
"description": "Disables all tabs in the group, preventing any tab from\nbeing selected.",
|
|
88121
|
+
"attribute": "disabled",
|
|
87813
88122
|
"reflects": true
|
|
87814
88123
|
},
|
|
87815
88124
|
{
|
|
87816
88125
|
"kind": "field",
|
|
87817
|
-
"name": "
|
|
88126
|
+
"name": "tabData",
|
|
87818
88127
|
"type": {
|
|
87819
|
-
"text": "
|
|
88128
|
+
"text": "TabData[]"
|
|
87820
88129
|
},
|
|
87821
|
-
"privacy": "
|
|
87822
|
-
"default": "
|
|
87823
|
-
|
|
87824
|
-
|
|
87825
|
-
"
|
|
88130
|
+
"privacy": "private",
|
|
88131
|
+
"default": "[]"
|
|
88132
|
+
},
|
|
88133
|
+
{
|
|
88134
|
+
"kind": "method",
|
|
88135
|
+
"name": "getTabs",
|
|
88136
|
+
"privacy": "private",
|
|
88137
|
+
"return": {
|
|
88138
|
+
"type": {
|
|
88139
|
+
"text": "EspalierTab[]"
|
|
88140
|
+
}
|
|
88141
|
+
}
|
|
88142
|
+
},
|
|
88143
|
+
{
|
|
88144
|
+
"kind": "method",
|
|
88145
|
+
"name": "syncTabData",
|
|
88146
|
+
"privacy": "private",
|
|
88147
|
+
"return": {
|
|
88148
|
+
"type": {
|
|
88149
|
+
"text": "void"
|
|
88150
|
+
}
|
|
88151
|
+
}
|
|
88152
|
+
},
|
|
88153
|
+
{
|
|
88154
|
+
"kind": "method",
|
|
88155
|
+
"name": "activateTab",
|
|
88156
|
+
"privacy": "private",
|
|
88157
|
+
"return": {
|
|
88158
|
+
"type": {
|
|
88159
|
+
"text": "void"
|
|
88160
|
+
}
|
|
88161
|
+
},
|
|
88162
|
+
"parameters": [
|
|
88163
|
+
{
|
|
88164
|
+
"name": "index",
|
|
88165
|
+
"type": {
|
|
88166
|
+
"text": "number"
|
|
88167
|
+
}
|
|
88168
|
+
}
|
|
88169
|
+
]
|
|
88170
|
+
},
|
|
88171
|
+
{
|
|
88172
|
+
"kind": "method",
|
|
88173
|
+
"name": "handleTabClick",
|
|
88174
|
+
"privacy": "private",
|
|
88175
|
+
"return": {
|
|
88176
|
+
"type": {
|
|
88177
|
+
"text": "void"
|
|
88178
|
+
}
|
|
88179
|
+
},
|
|
88180
|
+
"parameters": [
|
|
88181
|
+
{
|
|
88182
|
+
"name": "index",
|
|
88183
|
+
"type": {
|
|
88184
|
+
"text": "number"
|
|
88185
|
+
}
|
|
88186
|
+
}
|
|
88187
|
+
]
|
|
88188
|
+
},
|
|
88189
|
+
{
|
|
88190
|
+
"kind": "method",
|
|
88191
|
+
"name": "handleKeyDown",
|
|
88192
|
+
"privacy": "private",
|
|
88193
|
+
"return": {
|
|
88194
|
+
"type": {
|
|
88195
|
+
"text": "void"
|
|
88196
|
+
}
|
|
88197
|
+
},
|
|
88198
|
+
"parameters": [
|
|
88199
|
+
{
|
|
88200
|
+
"name": "ev",
|
|
88201
|
+
"type": {
|
|
88202
|
+
"text": "KeyboardEvent"
|
|
88203
|
+
}
|
|
88204
|
+
}
|
|
88205
|
+
]
|
|
88206
|
+
},
|
|
88207
|
+
{
|
|
88208
|
+
"kind": "method",
|
|
88209
|
+
"name": "handleChildUpdated",
|
|
88210
|
+
"privacy": "private",
|
|
88211
|
+
"return": {
|
|
88212
|
+
"type": {
|
|
88213
|
+
"text": "void"
|
|
88214
|
+
}
|
|
88215
|
+
}
|
|
88216
|
+
},
|
|
88217
|
+
{
|
|
88218
|
+
"kind": "method",
|
|
88219
|
+
"name": "handleSlotChange",
|
|
88220
|
+
"privacy": "private",
|
|
88221
|
+
"return": {
|
|
88222
|
+
"type": {
|
|
88223
|
+
"text": "void"
|
|
88224
|
+
}
|
|
88225
|
+
}
|
|
87826
88226
|
},
|
|
87827
88227
|
{
|
|
87828
88228
|
"kind": "field",
|
|
@@ -88549,33 +88949,23 @@
|
|
|
88549
88949
|
}
|
|
88550
88950
|
}
|
|
88551
88951
|
],
|
|
88552
|
-
"events": [
|
|
88553
|
-
"attributes": [
|
|
88554
|
-
{
|
|
88555
|
-
"name": "label",
|
|
88556
|
-
"type": {
|
|
88557
|
-
"text": "string"
|
|
88558
|
-
},
|
|
88559
|
-
"default": "\"\"",
|
|
88560
|
-
"description": "The text displayed in the tab button within the tab strip.",
|
|
88561
|
-
"fieldName": "label"
|
|
88562
|
-
},
|
|
88952
|
+
"events": [
|
|
88563
88953
|
{
|
|
88564
|
-
"name": "active",
|
|
88565
88954
|
"type": {
|
|
88566
|
-
"text": "
|
|
88955
|
+
"text": "CustomEvent<{ index: number; label: string }>"
|
|
88567
88956
|
},
|
|
88568
|
-
"
|
|
88569
|
-
"
|
|
88570
|
-
|
|
88571
|
-
|
|
88957
|
+
"description": "Fired when the active tab changes. The detail contains the `index` and `label` of the newly active tab.",
|
|
88958
|
+
"name": "esp-tab-group-changed"
|
|
88959
|
+
}
|
|
88960
|
+
],
|
|
88961
|
+
"attributes": [
|
|
88572
88962
|
{
|
|
88573
88963
|
"name": "disabled",
|
|
88574
88964
|
"type": {
|
|
88575
88965
|
"text": "boolean"
|
|
88576
88966
|
},
|
|
88577
88967
|
"default": "false",
|
|
88578
|
-
"description": "
|
|
88968
|
+
"description": "Disables all tabs in the group, preventing any tab from\nbeing selected.",
|
|
88579
88969
|
"fieldName": "disabled"
|
|
88580
88970
|
},
|
|
88581
88971
|
{
|
|
@@ -88631,97 +89021,61 @@
|
|
|
88631
89021
|
"name": "EspalierElementBase",
|
|
88632
89022
|
"module": "dist/shared/esp-element-base.js"
|
|
88633
89023
|
},
|
|
88634
|
-
"tagName": "esp-tab",
|
|
89024
|
+
"tagName": "esp-tab-group",
|
|
88635
89025
|
"customElement": true,
|
|
88636
89026
|
"docPageTitle": {
|
|
88637
89027
|
"name": "Tab",
|
|
88638
|
-
"description": ""
|
|
89028
|
+
"description": "Group"
|
|
88639
89029
|
},
|
|
88640
89030
|
"docUrl": {
|
|
88641
|
-
"name": "/components/tabs
|
|
89031
|
+
"name": "/components/tabs",
|
|
88642
89032
|
"description": ""
|
|
88643
89033
|
},
|
|
88644
89034
|
"menuGroup": {
|
|
88645
89035
|
"name": "Navigation",
|
|
88646
89036
|
"description": ""
|
|
89037
|
+
},
|
|
89038
|
+
"menuLabel": {
|
|
89039
|
+
"name": "Tab",
|
|
89040
|
+
"description": "Group"
|
|
89041
|
+
},
|
|
89042
|
+
"menuIcon": {
|
|
89043
|
+
"name": "layout-navbar",
|
|
89044
|
+
"description": ""
|
|
88647
89045
|
}
|
|
88648
89046
|
}
|
|
88649
89047
|
],
|
|
88650
89048
|
"exports": [
|
|
88651
89049
|
{
|
|
88652
89050
|
"kind": "js",
|
|
88653
|
-
"name": "
|
|
89051
|
+
"name": "EspalierTabGroup",
|
|
88654
89052
|
"declaration": {
|
|
88655
|
-
"name": "
|
|
88656
|
-
"module": "dist/tabs/esp-tab.js"
|
|
89053
|
+
"name": "EspalierTabGroup",
|
|
89054
|
+
"module": "dist/tabs/esp-tab-group.js"
|
|
88657
89055
|
}
|
|
88658
89056
|
},
|
|
88659
89057
|
{
|
|
88660
89058
|
"kind": "custom-element-definition",
|
|
88661
|
-
"name": "esp-tab",
|
|
89059
|
+
"name": "esp-tab-group",
|
|
88662
89060
|
"declaration": {
|
|
88663
|
-
"name": "
|
|
88664
|
-
"module": "dist/tabs/esp-tab.js"
|
|
89061
|
+
"name": "EspalierTabGroup",
|
|
89062
|
+
"module": "dist/tabs/esp-tab-group.js"
|
|
88665
89063
|
}
|
|
88666
89064
|
}
|
|
88667
89065
|
]
|
|
88668
89066
|
},
|
|
88669
89067
|
{
|
|
88670
89068
|
"kind": "javascript-module",
|
|
88671
|
-
"path": "dist/
|
|
89069
|
+
"path": "dist/tabs/esp-tab.js",
|
|
88672
89070
|
"declarations": [
|
|
88673
89071
|
{
|
|
88674
89072
|
"kind": "class",
|
|
88675
|
-
"description": "
|
|
88676
|
-
"name": "
|
|
89073
|
+
"description": "A single tab panel used inside\n[esp-tab-group](/components/tabs). Each tab provides a\n`label` that appears in the generated tab strip and a default\nslot for the panel content.\n\n```html\n<esp-tab-group>\n <esp-tab label=\"First\">\n <p>Content for the first tab.</p>\n </esp-tab>\n <esp-tab label=\"Second\">\n <p>Content for the second tab.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Pre-selected tab\n\nSet the `active` attribute to make a tab active on load:\n\n```html\n<esp-tab-group>\n <esp-tab label=\"One\">\n <p>Not active by default.</p>\n </esp-tab>\n <esp-tab label=\"Two\" active>\n <p>This tab starts active.</p>\n </esp-tab>\n</esp-tab-group>\n```\n\n### Disabled tab\n\n```html\n<esp-tab-group>\n <esp-tab label=\"Enabled\">\n <p>This tab works normally.</p>\n </esp-tab>\n <esp-tab label=\"Disabled\" disabled>\n <p>Cannot reach this panel.</p>\n </esp-tab>\n</esp-tab-group>\n```",
|
|
89074
|
+
"name": "EspalierTab",
|
|
88677
89075
|
"cssProperties": [
|
|
88678
89076
|
{
|
|
88679
|
-
"description": "
|
|
88680
|
-
"name": "--esp-
|
|
88681
|
-
},
|
|
88682
|
-
{
|
|
88683
|
-
"description": "The height of the switch track. Defaults to `var(--esp-size-normal-to-medium)`.",
|
|
88684
|
-
"name": "--esp-switch-height"
|
|
88685
|
-
},
|
|
88686
|
-
{
|
|
88687
|
-
"description": "The diameter of the thumb. Defaults to `calc(var(--esp-switch-height) - 4px)`.",
|
|
88688
|
-
"name": "--esp-switch-thumb-size"
|
|
88689
|
-
},
|
|
88690
|
-
{
|
|
88691
|
-
"description": "The track background color when the switch is off. Defaults to `var(--esp-color-border)`.",
|
|
88692
|
-
"name": "--esp-switch-track-color"
|
|
88693
|
-
},
|
|
88694
|
-
{
|
|
88695
|
-
"description": "The track background color when the switch is on. Defaults to `var(--esp-color-action-background)`.",
|
|
88696
|
-
"name": "--esp-switch-track-color-on"
|
|
88697
|
-
},
|
|
88698
|
-
{
|
|
88699
|
-
"description": "The thumb color. Defaults to `var(--esp-color-layer-1)`.",
|
|
88700
|
-
"name": "--esp-switch-thumb-color"
|
|
88701
|
-
},
|
|
88702
|
-
{
|
|
88703
|
-
"description": "The color of the focus ring shadow. Defaults to `var(--esp-color-shadow)`.",
|
|
88704
|
-
"name": "--esp-switch-focus-shadow"
|
|
88705
|
-
},
|
|
88706
|
-
{
|
|
88707
|
-
"description": "Padding inside each text-mode label cell. Defaults to `var(--esp-size-tiny) var(--esp-size-small)`.",
|
|
88708
|
-
"name": "--esp-switch-text-padding"
|
|
88709
|
-
},
|
|
88710
|
-
{
|
|
88711
|
-
"description": "Font size for text-mode labels. Defaults to `var(--esp-size-font)`.",
|
|
88712
|
-
"name": "--esp-switch-text-font-size"
|
|
88713
|
-
},
|
|
88714
|
-
{
|
|
88715
|
-
"description": "Text color of the active label in text mode. Defaults to `var(--esp-color-action-text)`.",
|
|
88716
|
-
"name": "--esp-switch-text-active-color"
|
|
88717
|
-
},
|
|
88718
|
-
{
|
|
88719
|
-
"description": "Text color of the inactive label in text mode. Defaults to `var(--esp-color-layer-1)`.",
|
|
88720
|
-
"name": "--esp-switch-text-inactive-color"
|
|
88721
|
-
},
|
|
88722
|
-
{
|
|
88723
|
-
"description": "Background color of the sliding highlight in text mode. Defaults to `var(--esp-color-action-background)`.",
|
|
88724
|
-
"name": "--esp-switch-text-highlight-color"
|
|
89077
|
+
"description": "Padding inside the panel area.",
|
|
89078
|
+
"name": "--esp-tab-size-padding"
|
|
88725
89079
|
},
|
|
88726
89080
|
{
|
|
88727
89081
|
"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.",
|
|
@@ -88780,131 +89134,42 @@
|
|
|
88780
89134
|
}
|
|
88781
89135
|
}
|
|
88782
89136
|
],
|
|
89137
|
+
"cssParts": [
|
|
89138
|
+
{
|
|
89139
|
+
"description": "The panel wrapper element.",
|
|
89140
|
+
"name": "panel"
|
|
89141
|
+
}
|
|
89142
|
+
],
|
|
88783
89143
|
"slots": [
|
|
88784
89144
|
{
|
|
88785
|
-
"description": "The
|
|
89145
|
+
"description": "The default slot holds the panel content displayed when this tab is active. Label, active-state, and disabled-state updates are reported through a private coordination event consumed by the parent tab group.",
|
|
88786
89146
|
"name": ""
|
|
88787
89147
|
}
|
|
88788
89148
|
],
|
|
88789
89149
|
"members": [
|
|
88790
89150
|
{
|
|
88791
89151
|
"kind": "field",
|
|
88792
|
-
"name": "
|
|
88793
|
-
"type": {
|
|
88794
|
-
"text": "boolean"
|
|
88795
|
-
},
|
|
88796
|
-
"static": true,
|
|
88797
|
-
"default": "true"
|
|
88798
|
-
},
|
|
88799
|
-
{
|
|
88800
|
-
"kind": "field",
|
|
88801
|
-
"name": "internals",
|
|
88802
|
-
"privacy": "private"
|
|
88803
|
-
},
|
|
88804
|
-
{
|
|
88805
|
-
"kind": "field",
|
|
88806
|
-
"name": "formCtrl",
|
|
88807
|
-
"privacy": "private",
|
|
88808
|
-
"default": "new FormFieldController({ host: this, internals: this.internals, getFormValue: () => (this.checked ? this.value || \"on\" : null), getValidity: () => { if (this.required && !this.checked) { return { flags: { valueMissing: true }, message: this.requiredMessage || \"Please toggle this switch to continue.\", }; } return null; }, onReset: () => { this.checked = false; }, onRestore: (state: string) => { this.checked = state === \"on\" || state === this.value; }, onDisabled: (isDisabled: boolean) => { this.disabled = isDisabled; }, })"
|
|
88809
|
-
},
|
|
88810
|
-
{
|
|
88811
|
-
"kind": "field",
|
|
88812
|
-
"name": "formItemDescription",
|
|
88813
|
-
"privacy": "private",
|
|
88814
|
-
"default": "new FormFieldDescriptionController({ host: this, getTarget: () => this.shadowRoot?.querySelector<HTMLElement>(\".switch-control\"), })"
|
|
88815
|
-
},
|
|
88816
|
-
{
|
|
88817
|
-
"kind": "field",
|
|
88818
|
-
"name": "mode",
|
|
88819
|
-
"type": {
|
|
88820
|
-
"text": "\"switch\" | \"text\""
|
|
88821
|
-
},
|
|
88822
|
-
"privacy": "public",
|
|
88823
|
-
"default": "\"switch\"",
|
|
88824
|
-
"description": "The visual presentation of the switch.\n- `\"switch\"` (default) renders a track-and-thumb toggle.\n- `\"text\"` renders two side-by-side text labels with a\n sliding highlight behind the active one.",
|
|
88825
|
-
"attribute": "mode",
|
|
88826
|
-
"reflects": true
|
|
88827
|
-
},
|
|
88828
|
-
{
|
|
88829
|
-
"kind": "field",
|
|
88830
|
-
"name": "offLabel",
|
|
88831
|
-
"type": {
|
|
88832
|
-
"text": "string"
|
|
88833
|
-
},
|
|
88834
|
-
"privacy": "public",
|
|
88835
|
-
"default": "\"\"",
|
|
88836
|
-
"description": "Label shown for the unchecked (off) state when\n`mode=\"text\"`.",
|
|
88837
|
-
"attribute": "off-label"
|
|
88838
|
-
},
|
|
88839
|
-
{
|
|
88840
|
-
"kind": "field",
|
|
88841
|
-
"name": "onLabel",
|
|
88842
|
-
"type": {
|
|
88843
|
-
"text": "string"
|
|
88844
|
-
},
|
|
88845
|
-
"privacy": "public",
|
|
88846
|
-
"default": "\"\"",
|
|
88847
|
-
"description": "Label shown for the checked (on) state when\n`mode=\"text\"`.",
|
|
88848
|
-
"attribute": "on-label"
|
|
88849
|
-
},
|
|
88850
|
-
{
|
|
88851
|
-
"kind": "field",
|
|
88852
|
-
"name": "checked",
|
|
88853
|
-
"type": {
|
|
88854
|
-
"text": "boolean"
|
|
88855
|
-
},
|
|
88856
|
-
"privacy": "public",
|
|
88857
|
-
"default": "false",
|
|
88858
|
-
"description": "Whether the switch is in the on state.",
|
|
88859
|
-
"attribute": "checked",
|
|
88860
|
-
"reflects": true
|
|
88861
|
-
},
|
|
88862
|
-
{
|
|
88863
|
-
"kind": "field",
|
|
88864
|
-
"name": "value",
|
|
88865
|
-
"type": {
|
|
88866
|
-
"text": "string"
|
|
88867
|
-
},
|
|
88868
|
-
"privacy": "public",
|
|
88869
|
-
"default": "\"\"",
|
|
88870
|
-
"description": "The value associated with this switch. Submitted with the\nform when the switch is on.",
|
|
88871
|
-
"attribute": "value"
|
|
88872
|
-
},
|
|
88873
|
-
{
|
|
88874
|
-
"kind": "field",
|
|
88875
|
-
"name": "name",
|
|
89152
|
+
"name": "label",
|
|
88876
89153
|
"type": {
|
|
88877
89154
|
"text": "string"
|
|
88878
89155
|
},
|
|
88879
89156
|
"privacy": "public",
|
|
88880
89157
|
"default": "\"\"",
|
|
88881
|
-
"description": "The
|
|
88882
|
-
"attribute": "
|
|
88883
|
-
"reflects": true
|
|
89158
|
+
"description": "The text displayed in the tab button within the tab strip.",
|
|
89159
|
+
"attribute": "label"
|
|
88884
89160
|
},
|
|
88885
89161
|
{
|
|
88886
89162
|
"kind": "field",
|
|
88887
|
-
"name": "
|
|
89163
|
+
"name": "active",
|
|
88888
89164
|
"type": {
|
|
88889
89165
|
"text": "boolean"
|
|
88890
89166
|
},
|
|
88891
89167
|
"privacy": "public",
|
|
88892
89168
|
"default": "false",
|
|
88893
|
-
"description": "
|
|
88894
|
-
"attribute": "
|
|
89169
|
+
"description": "Whether this tab is currently active (its panel is visible).",
|
|
89170
|
+
"attribute": "active",
|
|
88895
89171
|
"reflects": true
|
|
88896
89172
|
},
|
|
88897
|
-
{
|
|
88898
|
-
"kind": "field",
|
|
88899
|
-
"name": "requiredMessage",
|
|
88900
|
-
"type": {
|
|
88901
|
-
"text": "string"
|
|
88902
|
-
},
|
|
88903
|
-
"privacy": "public",
|
|
88904
|
-
"default": "\"\"",
|
|
88905
|
-
"description": "A custom message to display when the switch is required but\nnot on. Defaults to `\"Please toggle this switch to continue.\"`\nwhen not set.\n\n```html\n<esp-switch required required-message=\"You must accept the terms.\">\n I accept\n</esp-switch>\n```",
|
|
88906
|
-
"attribute": "required-message"
|
|
88907
|
-
},
|
|
88908
89173
|
{
|
|
88909
89174
|
"kind": "field",
|
|
88910
89175
|
"name": "disabled",
|
|
@@ -88913,156 +89178,10 @@
|
|
|
88913
89178
|
},
|
|
88914
89179
|
"privacy": "public",
|
|
88915
89180
|
"default": "false",
|
|
88916
|
-
"description": "
|
|
89181
|
+
"description": "Whether this tab is disabled (cannot be selected).",
|
|
88917
89182
|
"attribute": "disabled",
|
|
88918
89183
|
"reflects": true
|
|
88919
89184
|
},
|
|
88920
|
-
{
|
|
88921
|
-
"kind": "method",
|
|
88922
|
-
"name": "focus",
|
|
88923
|
-
"privacy": "public",
|
|
88924
|
-
"return": {
|
|
88925
|
-
"type": {
|
|
88926
|
-
"text": "void"
|
|
88927
|
-
}
|
|
88928
|
-
},
|
|
88929
|
-
"parameters": [
|
|
88930
|
-
{
|
|
88931
|
-
"name": "options",
|
|
88932
|
-
"optional": true,
|
|
88933
|
-
"type": {
|
|
88934
|
-
"text": "FocusOptions"
|
|
88935
|
-
}
|
|
88936
|
-
}
|
|
88937
|
-
],
|
|
88938
|
-
"description": "Focus the switch control."
|
|
88939
|
-
},
|
|
88940
|
-
{
|
|
88941
|
-
"kind": "method",
|
|
88942
|
-
"name": "validate",
|
|
88943
|
-
"privacy": "public",
|
|
88944
|
-
"return": {
|
|
88945
|
-
"type": {
|
|
88946
|
-
"text": "void"
|
|
88947
|
-
}
|
|
88948
|
-
},
|
|
88949
|
-
"description": "Re-run constraint validation and dispatch `esp-validity-changed`."
|
|
88950
|
-
},
|
|
88951
|
-
{
|
|
88952
|
-
"kind": "method",
|
|
88953
|
-
"name": "checkValidity",
|
|
88954
|
-
"privacy": "public",
|
|
88955
|
-
"return": {
|
|
88956
|
-
"type": {
|
|
88957
|
-
"text": "boolean"
|
|
88958
|
-
}
|
|
88959
|
-
},
|
|
88960
|
-
"description": "Check whether the current state is valid (delegates to ElementInternals)."
|
|
88961
|
-
},
|
|
88962
|
-
{
|
|
88963
|
-
"kind": "method",
|
|
88964
|
-
"name": "toggle",
|
|
88965
|
-
"privacy": "private",
|
|
88966
|
-
"return": {
|
|
88967
|
-
"type": {
|
|
88968
|
-
"text": "void"
|
|
88969
|
-
}
|
|
88970
|
-
}
|
|
88971
|
-
},
|
|
88972
|
-
{
|
|
88973
|
-
"kind": "method",
|
|
88974
|
-
"name": "handleKeyDown",
|
|
88975
|
-
"privacy": "private",
|
|
88976
|
-
"return": {
|
|
88977
|
-
"type": {
|
|
88978
|
-
"text": "void"
|
|
88979
|
-
}
|
|
88980
|
-
},
|
|
88981
|
-
"parameters": [
|
|
88982
|
-
{
|
|
88983
|
-
"name": "ev",
|
|
88984
|
-
"type": {
|
|
88985
|
-
"text": "KeyboardEvent"
|
|
88986
|
-
}
|
|
88987
|
-
}
|
|
88988
|
-
]
|
|
88989
|
-
},
|
|
88990
|
-
{
|
|
88991
|
-
"kind": "method",
|
|
88992
|
-
"name": "handleLabelSlotChange",
|
|
88993
|
-
"privacy": "private",
|
|
88994
|
-
"return": {
|
|
88995
|
-
"type": {
|
|
88996
|
-
"text": "void"
|
|
88997
|
-
}
|
|
88998
|
-
}
|
|
88999
|
-
},
|
|
89000
|
-
{
|
|
89001
|
-
"kind": "method",
|
|
89002
|
-
"name": "getCurrentTextModeLabel",
|
|
89003
|
-
"privacy": "private",
|
|
89004
|
-
"return": {
|
|
89005
|
-
"type": {
|
|
89006
|
-
"text": "string"
|
|
89007
|
-
}
|
|
89008
|
-
}
|
|
89009
|
-
},
|
|
89010
|
-
{
|
|
89011
|
-
"kind": "method",
|
|
89012
|
-
"name": "getTextModeAriaLabel",
|
|
89013
|
-
"privacy": "private",
|
|
89014
|
-
"return": {
|
|
89015
|
-
"type": {
|
|
89016
|
-
"text": "string"
|
|
89017
|
-
}
|
|
89018
|
-
}
|
|
89019
|
-
},
|
|
89020
|
-
{
|
|
89021
|
-
"kind": "method",
|
|
89022
|
-
"name": "formResetCallback",
|
|
89023
|
-
"return": {
|
|
89024
|
-
"type": {
|
|
89025
|
-
"text": "void"
|
|
89026
|
-
}
|
|
89027
|
-
},
|
|
89028
|
-
"description": "Called by the browser when the owning `<form>` is reset."
|
|
89029
|
-
},
|
|
89030
|
-
{
|
|
89031
|
-
"kind": "method",
|
|
89032
|
-
"name": "formStateRestoreCallback",
|
|
89033
|
-
"return": {
|
|
89034
|
-
"type": {
|
|
89035
|
-
"text": "void"
|
|
89036
|
-
}
|
|
89037
|
-
},
|
|
89038
|
-
"parameters": [
|
|
89039
|
-
{
|
|
89040
|
-
"name": "state",
|
|
89041
|
-
"type": {
|
|
89042
|
-
"text": "string"
|
|
89043
|
-
}
|
|
89044
|
-
}
|
|
89045
|
-
],
|
|
89046
|
-
"description": "Called by the browser to restore form state (bfcache, etc.)."
|
|
89047
|
-
},
|
|
89048
|
-
{
|
|
89049
|
-
"kind": "method",
|
|
89050
|
-
"name": "formDisabledCallback",
|
|
89051
|
-
"return": {
|
|
89052
|
-
"type": {
|
|
89053
|
-
"text": "void"
|
|
89054
|
-
}
|
|
89055
|
-
},
|
|
89056
|
-
"parameters": [
|
|
89057
|
-
{
|
|
89058
|
-
"name": "isDisabled",
|
|
89059
|
-
"type": {
|
|
89060
|
-
"text": "boolean"
|
|
89061
|
-
}
|
|
89062
|
-
}
|
|
89063
|
-
],
|
|
89064
|
-
"description": "Called by the browser when a parent `<fieldset>` is enabled or disabled."
|
|
89065
|
-
},
|
|
89066
89185
|
{
|
|
89067
89186
|
"kind": "field",
|
|
89068
89187
|
"name": "seedColorBacker",
|
|
@@ -89788,94 +89907,25 @@
|
|
|
89788
89907
|
}
|
|
89789
89908
|
}
|
|
89790
89909
|
],
|
|
89791
|
-
"events": [
|
|
89792
|
-
{
|
|
89793
|
-
"type": {
|
|
89794
|
-
"text": "CustomEvent<{ checked: boolean; value: string }>"
|
|
89795
|
-
},
|
|
89796
|
-
"description": "Fired when the switch is toggled. The detail contains the new `checked` state and the switch `value`.",
|
|
89797
|
-
"name": "esp-value-changed"
|
|
89798
|
-
},
|
|
89799
|
-
{
|
|
89800
|
-
"type": {
|
|
89801
|
-
"text": "CustomEvent<{ valid: boolean; message: string }>"
|
|
89802
|
-
},
|
|
89803
|
-
"description": "Fired whenever constraint validation runs.",
|
|
89804
|
-
"name": "esp-validity-changed"
|
|
89805
|
-
}
|
|
89806
|
-
],
|
|
89910
|
+
"events": [],
|
|
89807
89911
|
"attributes": [
|
|
89808
89912
|
{
|
|
89809
|
-
"name": "
|
|
89810
|
-
"type": {
|
|
89811
|
-
"text": "\"switch\" | \"text\""
|
|
89812
|
-
},
|
|
89813
|
-
"default": "\"switch\"",
|
|
89814
|
-
"description": "The visual presentation of the switch.\n- `\"switch\"` (default) renders a track-and-thumb toggle.\n- `\"text\"` renders two side-by-side text labels with a\n sliding highlight behind the active one.",
|
|
89815
|
-
"fieldName": "mode"
|
|
89816
|
-
},
|
|
89817
|
-
{
|
|
89818
|
-
"name": "off-label",
|
|
89819
|
-
"type": {
|
|
89820
|
-
"text": "string"
|
|
89821
|
-
},
|
|
89822
|
-
"default": "\"\"",
|
|
89823
|
-
"description": "Label shown for the unchecked (off) state when\n`mode=\"text\"`.",
|
|
89824
|
-
"fieldName": "offLabel"
|
|
89825
|
-
},
|
|
89826
|
-
{
|
|
89827
|
-
"name": "on-label",
|
|
89828
|
-
"type": {
|
|
89829
|
-
"text": "string"
|
|
89830
|
-
},
|
|
89831
|
-
"default": "\"\"",
|
|
89832
|
-
"description": "Label shown for the checked (on) state when\n`mode=\"text\"`.",
|
|
89833
|
-
"fieldName": "onLabel"
|
|
89834
|
-
},
|
|
89835
|
-
{
|
|
89836
|
-
"name": "checked",
|
|
89837
|
-
"type": {
|
|
89838
|
-
"text": "boolean"
|
|
89839
|
-
},
|
|
89840
|
-
"default": "false",
|
|
89841
|
-
"description": "Whether the switch is in the on state.",
|
|
89842
|
-
"fieldName": "checked"
|
|
89843
|
-
},
|
|
89844
|
-
{
|
|
89845
|
-
"name": "value",
|
|
89846
|
-
"type": {
|
|
89847
|
-
"text": "string"
|
|
89848
|
-
},
|
|
89849
|
-
"default": "\"\"",
|
|
89850
|
-
"description": "The value associated with this switch. Submitted with the\nform when the switch is on.",
|
|
89851
|
-
"fieldName": "value"
|
|
89852
|
-
},
|
|
89853
|
-
{
|
|
89854
|
-
"name": "name",
|
|
89913
|
+
"name": "label",
|
|
89855
89914
|
"type": {
|
|
89856
89915
|
"text": "string"
|
|
89857
89916
|
},
|
|
89858
89917
|
"default": "\"\"",
|
|
89859
|
-
"description": "The
|
|
89860
|
-
"fieldName": "
|
|
89918
|
+
"description": "The text displayed in the tab button within the tab strip.",
|
|
89919
|
+
"fieldName": "label"
|
|
89861
89920
|
},
|
|
89862
89921
|
{
|
|
89863
|
-
"name": "
|
|
89922
|
+
"name": "active",
|
|
89864
89923
|
"type": {
|
|
89865
89924
|
"text": "boolean"
|
|
89866
89925
|
},
|
|
89867
89926
|
"default": "false",
|
|
89868
|
-
"description": "
|
|
89869
|
-
"fieldName": "
|
|
89870
|
-
},
|
|
89871
|
-
{
|
|
89872
|
-
"name": "required-message",
|
|
89873
|
-
"type": {
|
|
89874
|
-
"text": "string"
|
|
89875
|
-
},
|
|
89876
|
-
"default": "\"\"",
|
|
89877
|
-
"description": "A custom message to display when the switch is required but\nnot on. Defaults to `\"Please toggle this switch to continue.\"`\nwhen not set.\n\n```html\n<esp-switch required required-message=\"You must accept the terms.\">\n I accept\n</esp-switch>\n```",
|
|
89878
|
-
"fieldName": "requiredMessage"
|
|
89927
|
+
"description": "Whether this tab is currently active (its panel is visible).",
|
|
89928
|
+
"fieldName": "active"
|
|
89879
89929
|
},
|
|
89880
89930
|
{
|
|
89881
89931
|
"name": "disabled",
|
|
@@ -89883,7 +89933,7 @@
|
|
|
89883
89933
|
"text": "boolean"
|
|
89884
89934
|
},
|
|
89885
89935
|
"default": "false",
|
|
89886
|
-
"description": "
|
|
89936
|
+
"description": "Whether this tab is disabled (cannot be selected).",
|
|
89887
89937
|
"fieldName": "disabled"
|
|
89888
89938
|
},
|
|
89889
89939
|
{
|
|
@@ -89939,45 +89989,37 @@
|
|
|
89939
89989
|
"name": "EspalierElementBase",
|
|
89940
89990
|
"module": "dist/shared/esp-element-base.js"
|
|
89941
89991
|
},
|
|
89992
|
+
"tagName": "esp-tab",
|
|
89993
|
+
"customElement": true,
|
|
89942
89994
|
"docPageTitle": {
|
|
89943
|
-
"name": "
|
|
89995
|
+
"name": "Tab",
|
|
89944
89996
|
"description": ""
|
|
89945
89997
|
},
|
|
89946
89998
|
"docUrl": {
|
|
89947
|
-
"name": "/components/
|
|
89999
|
+
"name": "/components/tabs/tab",
|
|
89948
90000
|
"description": ""
|
|
89949
90001
|
},
|
|
89950
90002
|
"menuGroup": {
|
|
89951
|
-
"name": "
|
|
89952
|
-
"description": "Controls"
|
|
89953
|
-
},
|
|
89954
|
-
"menuLabel": {
|
|
89955
|
-
"name": "Switch",
|
|
89956
|
-
"description": ""
|
|
89957
|
-
},
|
|
89958
|
-
"menuIcon": {
|
|
89959
|
-
"name": "button",
|
|
90003
|
+
"name": "Navigation",
|
|
89960
90004
|
"description": ""
|
|
89961
|
-
}
|
|
89962
|
-
"tagName": "esp-switch",
|
|
89963
|
-
"customElement": true
|
|
90005
|
+
}
|
|
89964
90006
|
}
|
|
89965
90007
|
],
|
|
89966
90008
|
"exports": [
|
|
89967
90009
|
{
|
|
89968
90010
|
"kind": "js",
|
|
89969
|
-
"name": "
|
|
90011
|
+
"name": "EspalierTab",
|
|
89970
90012
|
"declaration": {
|
|
89971
|
-
"name": "
|
|
89972
|
-
"module": "dist/
|
|
90013
|
+
"name": "EspalierTab",
|
|
90014
|
+
"module": "dist/tabs/esp-tab.js"
|
|
89973
90015
|
}
|
|
89974
90016
|
},
|
|
89975
90017
|
{
|
|
89976
90018
|
"kind": "custom-element-definition",
|
|
89977
|
-
"name": "esp-
|
|
90019
|
+
"name": "esp-tab",
|
|
89978
90020
|
"declaration": {
|
|
89979
|
-
"name": "
|
|
89980
|
-
"module": "dist/
|
|
90021
|
+
"name": "EspalierTab",
|
|
90022
|
+
"module": "dist/tabs/esp-tab.js"
|
|
89981
90023
|
}
|
|
89982
90024
|
}
|
|
89983
90025
|
]
|
|
@@ -100724,6 +100766,40 @@
|
|
|
100724
100766
|
}
|
|
100725
100767
|
]
|
|
100726
100768
|
},
|
|
100769
|
+
{
|
|
100770
|
+
"kind": "javascript-module",
|
|
100771
|
+
"path": "dist/root/helpers/surface-polarity-property.js",
|
|
100772
|
+
"declarations": [
|
|
100773
|
+
{
|
|
100774
|
+
"kind": "function",
|
|
100775
|
+
"name": "surfacePolarityProperty",
|
|
100776
|
+
"return": {
|
|
100777
|
+
"type": {
|
|
100778
|
+
"text": "Record<string, string>"
|
|
100779
|
+
}
|
|
100780
|
+
},
|
|
100781
|
+
"parameters": [
|
|
100782
|
+
{
|
|
100783
|
+
"name": "semantic",
|
|
100784
|
+
"type": {
|
|
100785
|
+
"text": "Readonly<Record<string, string>>"
|
|
100786
|
+
}
|
|
100787
|
+
}
|
|
100788
|
+
],
|
|
100789
|
+
"description": "The private `--_esp-surface-polarity` number for a semantic table: `1`\nwhere the zone's text is darker than its background (a light zone), `0`\nwhere it is lighter.\n\nEmitted by `<esp-root>` and re-emitted by context zones beside their\nsemantic table. Component chrome that nudges a fill on hover or focus\nreads it to move away from the zone's ink. The root scheme cannot decide\nthis, because an inverted context flips polarity inside one scheme. It is\na bare number so relative colors can use it in channel arithmetic, which\nthe percentage `--esp-l-*` ramp cannot join."
|
|
100790
|
+
}
|
|
100791
|
+
],
|
|
100792
|
+
"exports": [
|
|
100793
|
+
{
|
|
100794
|
+
"kind": "js",
|
|
100795
|
+
"name": "surfacePolarityProperty",
|
|
100796
|
+
"declaration": {
|
|
100797
|
+
"name": "surfacePolarityProperty",
|
|
100798
|
+
"module": "dist/root/helpers/surface-polarity-property.js"
|
|
100799
|
+
}
|
|
100800
|
+
}
|
|
100801
|
+
]
|
|
100802
|
+
},
|
|
100727
100803
|
{
|
|
100728
100804
|
"kind": "javascript-module",
|
|
100729
100805
|
"path": "dist/shared/svgs/calendar-icon.js",
|