@awc-ui/core 1.0.0-beta.10 → 1.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/bin/templates/astro/package.json +2 -2
  2. package/bin/templates/html/index.html +2 -2
  3. package/bin/templates/html/package.json +2 -2
  4. package/bin/templates/next/package.json +3 -3
  5. package/bin/templates/nuxt/package.json +2 -2
  6. package/bin/templates/sveltekit/package.json +2 -2
  7. package/custom-elements.json +8 -8
  8. package/dist/cjs/md-navigation-rail-tab.cjs.entry.js +185 -37
  9. package/dist/cjs/md-navigation-rail-tab.cjs.entry.js.map +1 -1
  10. package/dist/cjs/md-navigation-rail.cjs.entry.js +15 -16
  11. package/dist/cjs/md-navigation-rail.cjs.entry.js.map +1 -1
  12. package/dist/cjs/navigation-rail-motion-IOseZpRz.js +90 -0
  13. package/dist/cjs/navigation-rail-motion-IOseZpRz.js.map +1 -0
  14. package/dist/collection/components/md-navigation-rail/md-navigation-rail.css +90 -85
  15. package/dist/collection/components/md-navigation-rail/md-navigation-rail.js +14 -15
  16. package/dist/collection/components/md-navigation-rail/md-navigation-rail.js.map +1 -1
  17. package/dist/collection/components/md-navigation-rail-tab/md-navigation-rail-tab.css +8 -11
  18. package/dist/collection/components/md-navigation-rail-tab/md-navigation-rail-tab.js +184 -36
  19. package/dist/collection/components/md-navigation-rail-tab/md-navigation-rail-tab.js.map +1 -1
  20. package/dist/collection/utils/navigation-rail-motion.js +80 -0
  21. package/dist/collection/utils/navigation-rail-motion.js.map +1 -0
  22. package/dist/components/md-navigation-rail-tab.js +1 -1
  23. package/dist/components/md-navigation-rail-tab.js.map +1 -1
  24. package/dist/components/md-navigation-rail.js +1 -1
  25. package/dist/components/md-navigation-rail.js.map +1 -1
  26. package/dist/components/p-BTQOOQYQ.js +2 -0
  27. package/dist/components/p-BTQOOQYQ.js.map +1 -0
  28. package/dist/components-csr/md-navigation-rail-tab.js +1 -1
  29. package/dist/components-csr/md-navigation-rail-tab.js.map +1 -1
  30. package/dist/components-csr/md-navigation-rail.js +1 -1
  31. package/dist/components-csr/md-navigation-rail.js.map +1 -1
  32. package/dist/components-csr/p-BTQOOQYQ.js +2 -0
  33. package/dist/components-csr/p-BTQOOQYQ.js.map +1 -0
  34. package/dist/esm/md-navigation-rail-tab.entry.js +185 -37
  35. package/dist/esm/md-navigation-rail-tab.entry.js.map +1 -1
  36. package/dist/esm/md-navigation-rail.entry.js +15 -16
  37. package/dist/esm/md-navigation-rail.entry.js.map +1 -1
  38. package/dist/esm/navigation-rail-motion-BTQOOQYQ.js +84 -0
  39. package/dist/esm/navigation-rail-motion-BTQOOQYQ.js.map +1 -0
  40. package/dist/md3/md3.esm.js +1 -1
  41. package/dist/md3/p-88d49766.entry.js +2 -0
  42. package/dist/md3/p-88d49766.entry.js.map +1 -0
  43. package/dist/md3/p-BTQOOQYQ.js +2 -0
  44. package/dist/md3/p-BTQOOQYQ.js.map +1 -0
  45. package/dist/md3/p-c38e1473.entry.js +2 -0
  46. package/dist/md3/p-c38e1473.entry.js.map +1 -0
  47. package/dist/sources/{20812305a6a9bf6e0ac3bcaa49cf729c7e1f1d944f6467cc179222ebbfe7c036 → 0ff3480d9a3ad4d643358cd2d23546b2045fcacf8afbea2e0280ca4d1d7c2d09}/md-navigation-rail.tsx +12 -12
  48. package/dist/sources/{6c14a0a0c65f2aec64d62332f49f228b81d0cbbb288795543716266e9f70f444 → 2f4b6a7ed1aaf6a2a7b0e44123a4b5d30a18047aa5c2121896389bd6d11fcc66}/md-navigation-rail.css_tag_md-navigation-rail_encapsulation_shadow +90 -85
  49. package/dist/sources/{822acc654bb272fea6b5455c9869791448b125cae2c1eb1df0f97b27263a18f3 → 67e302a0ddf9f68ba82638d32533a0e69408184931f9f1268243f7246c714ae8}/md-navigation-rail-tab.css_tag_md-navigation-rail-tab_encapsulation_shadow +8 -11
  50. package/dist/sources/{4b1bf2d27bc87d12e416a1ae2bdc0f361033c40d13b252fe4c9f51a197ca95e1 → b3d606320b653bcbde553e6d61569edd0fc6cbdb1cb179f4d36ad796e76b133c}/md-navigation-rail-tab.tsx +208 -45
  51. package/dist/sources/f41e60167e8f17a6297648047951ef2d3dd96a3652adecfbe959df57bdef48dd/navigation-rail-motion.ts +97 -0
  52. package/dist/types/components/md-navigation-rail/md-navigation-rail.d.ts +3 -5
  53. package/dist/types/components/md-navigation-rail-tab/md-navigation-rail-tab.d.ts +17 -10
  54. package/dist/types/utils/navigation-rail-motion.d.ts +17 -0
  55. package/hydrate/index.js +278 -53
  56. package/hydrate/index.mjs +278 -53
  57. package/package.json +2 -2
  58. package/src/components/md-navigation-rail/readme.md +8 -0
  59. package/src/components/md-navigation-rail-tab/readme.md +6 -2
  60. package/dist/md3/p-7ca4c543.entry.js +0 -2
  61. package/dist/md3/p-7ca4c543.entry.js.map +0 -1
  62. package/dist/md3/p-9acadde5.entry.js +0 -2
  63. package/dist/md3/p-9acadde5.entry.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{r as i,c as a,h as t,H as n,g as o}from"./p-DUZ-GXnb.js";import{t as e}from"./p-DYBUr7K_.js";import{r as s,a as r,g as l,s as d}from"./p-BTQOOQYQ.js";import{s as c,S as m}from"./p-BdEoSBtL.js";const h=()=>`:host{--_icon-color:var( --md-navigation-rail-tab-icon-color, var(--md-sys-color-on-surface-variant, #49454F) );--_active-icon-color:var( --md-navigation-rail-tab-active-icon-color, var(--md-sys-color-on-secondary-container, #4A4458) );--_label-color:var( --md-navigation-rail-tab-label-color, var(--md-sys-color-on-surface-variant, #49454F) );--_active-label-color:var( --md-navigation-rail-tab-active-label-color, var(--md-sys-color-secondary, #625B71) );--_indicator-color:var( --md-navigation-rail-tab-indicator-color, var(--md-sys-color-secondary-container, #E8DEF8) );--_indicator-shape:var( --md-navigation-rail-tab-indicator-shape, var(--md-sys-shape-corner-full, 9999px) );--_indicator-width:var(--md-navigation-rail-tab-indicator-width, max(40px, calc(56px + var(--md-sys-density-scale, 0) * 4px)));--_indicator-height:var(--md-navigation-rail-tab-indicator-height, max(24px, calc(32px + var(--md-sys-density-scale, 0) * 2px)));--_icon-size:var(--md-navigation-rail-tab-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));--_min-height:var(--md-navigation-rail-tab-min-height, 56px);--_badge-color:var( --md-navigation-rail-tab-badge-color, var(--md-sys-color-error, #B3261E) );--_badge-content-color:var( --md-navigation-rail-tab-badge-content-color, var(--md-sys-color-on-error, #FFFFFF) );--_focus-ring-color:var( --md-navigation-rail-tab-focus-ring-color, var(--md-sys-color-secondary, #625B71) );--_state-layer-color:var( --md-navigation-rail-tab-state-layer-color, var(--md-sys-color-on-secondary-container, #4A4458) );--_motion-duration:var(--md-sys-motion-spring-effects-fast-duration, 150ms);--_motion-easing:var( --md-sys-motion-spring-effects-fast-easing, cubic-bezier(0.31, 0.94, 0.34, 1) );--_hover-opacity:var(--md-sys-state-hover-state-layer-opacity, 0.08);--_focus-opacity:var(--md-navigation-rail-tab-focus-state-layer-opacity, 0.10);--_press-opacity:var(--md-navigation-rail-tab-press-state-layer-opacity, 0.10);--_disabled-opacity:var(--md-sys-state-disabled-content-opacity, 0.38);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:max(2px, calc(4px + var(--md-sys-density-scale, 0) * 1px));inline-size:100%;min-block-size:max(48px, calc(var(--_min-height) + var(--md-sys-density-scale, 0) * 4px));padding-block:max(0px, calc(2px + var(--md-sys-density-scale, 0) * 0.5px));padding-inline:0;box-sizing:border-box;cursor:pointer;user-select:none;position:relative;outline:none;-webkit-tap-highlight-color:transparent;color:var(--_icon-color);transition:color var(--_motion-duration) var(--_motion-easing)}:host(.md-navigation-rail-tab--active){color:var(--_active-icon-color)}:host(.md-navigation-rail-tab--disabled){cursor:default;pointer-events:none;color:color-mix( in srgb, var(--md-sys-color-on-surface, #1C1B1F) calc(var(--_disabled-opacity) * 100%), transparent )}:host(:focus-visible){outline:none}:host(:focus-visible) .md-navigation-rail-tab__indicator{outline:3px solid var(--_focus-ring-color);outline-offset:2px}:host(.md-navigation-rail-tab--expanded:focus-visible) .md-navigation-rail-tab__indicator{outline-offset:-3px}md-ripple{border-radius:inherit}.md-navigation-rail-tab__indicator{position:absolute;inset-block-start:max(2px, calc(2px + var(--md-sys-density-scale, 0) * -0.5px));inset-inline:0;margin-inline:auto;inline-size:var(--_indicator-width);block-size:var(--_indicator-height);border-radius:var(--_indicator-shape);background-color:transparent;pointer-events:none;overflow:hidden;transition:background-color var(--_motion-duration) var(--_motion-easing);z-index:0}:host(.md-navigation-rail-tab--active) .md-navigation-rail-tab__indicator{background-color:var(--_indicator-color)}:host(.md-navigation-rail-tab--labels-none:not(.md-navigation-rail-tab--expanded)) .md-navigation-rail-tab__indicator,:host(.md-navigation-rail-tab--labels-selected:not(.md-navigation-rail-tab--active):not(.md-navigation-rail-tab--expanded)) .md-navigation-rail-tab__indicator{inset-block:0;margin-block:auto}.md-navigation-rail-tab__state-layer{position:absolute;inset:0;background-color:var(--_state-layer-color);opacity:0;pointer-events:none;transition:opacity var(--_motion-duration) var(--_motion-easing);border-radius:inherit}:host(:hover:not(.md-navigation-rail-tab--disabled)) .md-navigation-rail-tab__state-layer{opacity:var(--_hover-opacity)}:host(:focus-visible:not(.md-navigation-rail-tab--disabled)) .md-navigation-rail-tab__state-layer{opacity:var(--_focus-opacity)}:host(:active:not(.md-navigation-rail-tab--disabled)) .md-navigation-rail-tab__state-layer{opacity:var(--_press-opacity)}.md-navigation-rail-tab__icon-wrapper{position:relative;display:flex;align-items:center;justify-content:center;inline-size:var(--_indicator-width);block-size:var(--_indicator-height);z-index:1;pointer-events:none}.md-navigation-rail-tab__icon-box{position:relative;display:inline-flex;align-items:center;justify-content:center;inline-size:var(--_icon-size);block-size:var(--_icon-size)}.md-navigation-rail-tab__icon{font-family:var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');font-size:var(--_icon-size);inline-size:var(--_icon-size);block-size:var(--_icon-size);line-height:1;font-weight:normal;font-style:normal;letter-spacing:normal;text-transform:none;white-space:nowrap;overflow-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;justify-content:center;font-variation-settings:'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;transition:font-variation-settings var(--_motion-duration) var(--_motion-easing);color:inherit}:host(.md-navigation-rail-tab--active) .md-navigation-rail-tab__icon{font-variation-settings:'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24}::slotted([slot='icon']){display:inline-flex;align-items:center;justify-content:center;inline-size:var(--_icon-size);block-size:var(--_icon-size);font-size:var(--_icon-size);color:currentColor;fill:currentColor;pointer-events:none}.md-navigation-rail-tab__label{position:relative;z-index:1;font-family:var(--md-sys-typescale-label-medium-font-family, Roboto, sans-serif);font-size:max(10px, calc(12px + var(--md-sys-density-scale, 0) * 0.5px));font-weight:var(--md-sys-typescale-label-medium-font-weight, 500);line-height:max(14px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));letter-spacing:var(--md-sys-typescale-label-medium-letter-spacing, 0.5px);text-align:center;color:var(--_label-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-inline-size:100%;transition:color var(--_motion-duration) var(--_motion-easing), font-weight var(--_motion-duration) var(--_motion-easing), opacity var(--_motion-duration) var(--_motion-easing);padding-inline:var(--md-sys-spacing-inset-xs, 4px);box-sizing:border-box}:host(.md-navigation-rail-tab--active) .md-navigation-rail-tab__label{color:var(--_active-label-color);font-weight:var(--md-sys-typescale-label-medium-prominent-font-weight, 700)}:host(.md-navigation-rail-tab--labels-none) .md-navigation-rail-tab__label{display:none}:host(.md-navigation-rail-tab--labels-selected:not(.md-navigation-rail-tab--expanded)) .md-navigation-rail-tab__label{max-block-size:1.25rem;transition:color var(--_motion-duration) var(--_motion-easing), font-weight var(--_motion-duration) var(--_motion-easing), opacity var(--_motion-duration) var(--_motion-easing), max-block-size var(--_motion-duration) var(--_motion-easing), margin-block-start var(--_motion-duration) var(--_motion-easing)}:host(.md-navigation-rail-tab--labels-selected:not(.md-navigation-rail-tab--active):not(.md-navigation-rail-tab--expanded)) .md-navigation-rail-tab__label{opacity:0;max-block-size:0;margin-block-start:-4px}:host(.md-navigation-rail-tab--labels-selected.md-navigation-rail-tab--expanded:not(.md-navigation-rail-tab--active)) .md-navigation-rail-tab__label{display:none}:host(.md-navigation-rail-tab--expanded){flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--md-sys-spacing-gap-sm, 8px);padding-inline:var(--md-sys-spacing-inset-lg, 16px);padding-inline-start:calc(var(--_rail-icon-axis, calc(var(--md-sys-spacing-inset-lg, 16px) + var(--_icon-size) / 2)) - var(--_icon-size) / 2);padding-block:0;inline-size:fit-content;min-block-size:max(48px, calc(56px + var(--md-sys-density-scale, 0) * 4px));border-radius:var(--_indicator-shape)}:host(.md-navigation-rail-tab--expanded) .md-navigation-rail-tab__indicator{position:absolute;inset:0;transform:none;inline-size:auto;block-size:auto;border-radius:var(--_indicator-shape)}:host(.md-navigation-rail-tab--expanded) .md-navigation-rail-tab__icon-wrapper{inline-size:var(--_icon-size);block-size:var(--_icon-size);flex:0 0 auto}:host(.md-navigation-rail-tab--expanded) .md-navigation-rail-tab__label{text-align:start;flex:1 1 auto;min-inline-size:0;display:inline-block;font-family:var(--md-sys-typescale-label-large-font-family, Roboto, sans-serif);font-size:var(--md-sys-typescale-label-large-font-size, 14px);font-weight:var(--md-sys-typescale-label-large-font-weight, 500);line-height:var(--md-sys-typescale-label-large-line-height, 20px);letter-spacing:var(--md-sys-typescale-label-large-letter-spacing, 0.1px)}:host(.md-navigation-rail-tab--expanded.md-navigation-rail-tab--active) .md-navigation-rail-tab__label{font-weight:var(--md-sys-typescale-label-large-prominent-font-weight, 700)}:host(.md-navigation-rail-tab--expanded.md-navigation-rail-tab--labels-none) .md-navigation-rail-tab__label{display:none}.md-navigation-rail-tab__badge{position:absolute;background-color:var(--_badge-color);color:var(--_badge-content-color);border-radius:var(--md-sys-shape-corner-full, 9999px);line-height:1;box-sizing:border-box;pointer-events:none;z-index:2}.md-navigation-rail-tab__badge--dot{inline-size:6px;block-size:6px;inset-block-start:0;inset-inline-end:0;transform:translate(50%, -50%)}.md-navigation-rail-tab__badge--large{min-inline-size:16px;block-size:16px;padding-inline:4px;inset-block-start:0;inset-inline-end:0;transform:translate(50%, -50%);font-family:var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif);font-size:11px;font-weight:500;display:flex;align-items:center;justify-content:center}.md-navigation-rail-tab__anchor{display:contents;color:inherit;text-decoration:none;border-radius:inherit}.md-navigation-rail-tab__anchor::after{content:'';position:absolute;inset:0;z-index:0}@media (prefers-reduced-motion: reduce){:host,.md-navigation-rail-tab__indicator,.md-navigation-rail-tab__state-layer,.md-navigation-rail-tab__icon,.md-navigation-rail-tab__label{transition:none}}@media (forced-colors: active){:host(.md-navigation-rail-tab--active) .md-navigation-rail-tab__indicator{background-color:Highlight;forced-color-adjust:none}:host(.md-navigation-rail-tab--active){color:HighlightText}:host(:focus-visible) .md-navigation-rail-tab__indicator{outline:3px solid CanvasText}}:host([density='-1']){--md-sys-density-scale:-1}:host([density='-2']){--md-sys-density-scale:-2}:host([density='-3']){--md-sys-density-scale:-3}:host([density='-4']){--md-sys-density-scale:-4}:host([data-orientation='horizontal']){block-size:100%}:host([data-orientation='horizontal']) .md-navigation-rail-tab__indicator,:host([data-orientation='horizontal']) .md-navigation-rail-tab__state-layer{display:none}:host([data-orientation='horizontal']) .md-navigation-rail-tab__icon-wrapper{border-radius:var(--_indicator-shape);background-color:transparent;transition:background-color var(--_motion-duration) var(--_motion-easing)}:host([data-orientation='horizontal'].md-navigation-rail-tab--active) .md-navigation-rail-tab__icon-wrapper{background-color:var(--_indicator-color)}:host([data-orientation='horizontal']) .md-navigation-rail-tab__icon-wrapper::after{content:'';position:absolute;inset:0;border-radius:inherit;background-color:var(--_state-layer-color);opacity:0;pointer-events:none;transition:opacity var(--_motion-duration) var(--_motion-easing)}:host([data-orientation='horizontal']:hover:not(.md-navigation-rail-tab--disabled)) .md-navigation-rail-tab__icon-wrapper::after{opacity:var(--_hover-opacity)}:host([data-orientation='horizontal']:active:not(.md-navigation-rail-tab--disabled)) .md-navigation-rail-tab__icon-wrapper::after{opacity:var(--_press-opacity)}:host([data-orientation='horizontal']:focus-visible) .md-navigation-rail-tab__icon-wrapper{outline:3px solid var(--_focus-ring-color);outline-offset:2px}.md-navigation-rail-tab__caret{font-family:var(--md-sys-icon-font-family, 'Material Symbols Outlined', 'Material Icons');font-size:max(14px, calc(18px + var(--md-sys-density-scale, 0) * 1px));line-height:1;vertical-align:middle;margin-inline-start:2px;transition:transform var(--md-navigation-rail-tab-caret-duration, var(--md-sys-motion-duration-medium2, 300ms)) var( --md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1) )}:host([aria-expanded='true']) .md-navigation-rail-tab__caret{transform:rotate(180deg)}@media (prefers-reduced-motion: reduce){.md-navigation-rail-tab__caret{transition-duration:1ms}}:host(.md-navigation-rail-tab--child-selected) .md-navigation-rail-tab__indicator{background-color:var(--_indicator-color)}:host(.md-navigation-rail-tab--child-selected[data-orientation='horizontal']) .md-navigation-rail-tab__icon-wrapper{background-color:var(--_indicator-color)}:host(.md-navigation-rail-tab--child-selected) .md-navigation-rail-tab__icon,:host(.md-navigation-rail-tab--child-selected) .md-navigation-rail-tab__label{color:var(--_active-icon-color)}:host([hidden]){display:none !important}`;const b=class{constructor(t){i(this,t);this.mdTabClick=a(this,"mdTabClick",7);this.mdSubmenuToggle=a(this,"mdSubmenuToggle",7);this.icon="";this.label="";this.active=false;this.disabled=false;this.badge=false;this.badgeValue="";this.href="";this.target="";this.value="";this.labelVisibility="all";this.expanded=false;this.density=0;this.iconFirst=null;this.indicatorFirst=null;this.labelFirst=null;this.pendingTransition=false;this.transitionPrepared=false;this.submenuOpen=false;this.hasSubmenu=false;this.submenuHasSelection=false;this.handleSubmenuClick=i=>{const a=i.target?.closest?.("md-menu-item");const t=this.submenu;if(!a||!t||!t.contains(a))return;t.querySelectorAll("md-menu-item[selected]").forEach((i=>{if(i!==a)i.removeAttribute("selected")}));a.setAttribute("selected","");this.syncSubmenuSelection();this.mdTabClick.emit({value:this.value})};this.handleClick=i=>{if(this.disabled){i.preventDefault();i.stopImmediatePropagation();return}if(this.submenu){i.preventDefault();this.toggleSubmenu();return}this.mdTabClick.emit({value:this.value})};this.handleKeyDown=i=>{if(this.disabled)return;if(i.key==="Enter"||i.key===" "){i.preventDefault();e(this.el);if(this.submenu){this.toggleSubmenu();return}this.mdTabClick.emit({value:this.value});if(this.href){const i=this.el.shadowRoot?.querySelector("a.md-navigation-rail-tab__anchor");i?.click()}}}}connectedCallback(){this.unregisterTransition=s(this.el,(()=>{this.captureTransition();this.transitionPrepared=true}))}disconnectedCallback(){this.unregisterTransition?.();this.cancelAnimations();this.iconFirst=null;this.indicatorFirst=null;this.labelFirst=null;this.pendingTransition=false;this.transitionPrepared=false}componentDidLoad(){if(typeof window!=="undefined"&&window.__STENCIL_DEV_MODE__!==false){this.warnMissingAccessibleName()}this.ensureSubmenuAnchor();const i=this.submenu;this.hasSubmenu=!!i;if(i){i.addEventListener("mdOpen",(()=>{this.submenuOpen=true;this.mdSubmenuToggle.emit({open:true})}));i.addEventListener("mdClose",(()=>{this.submenuOpen=false;this.syncSubmenuSelection();this.mdSubmenuToggle.emit({open:false})}));i.addEventListener("mdClick",(i=>this.handleSubmenuClick(i)));this.syncSubmenuSelection()}}onExpandedChange(){if(!this.transitionPrepared)this.captureTransition();this.transitionPrepared=false}captureTransition(){const i=this.el.shadowRoot;const a=i?.querySelector('[part="indicator"]');const t=i?.querySelector('[part="label"]');this.iconFirst=this.iconCentre();this.indicatorFirst=a?.getBoundingClientRect()??null;const n=t?getComputedStyle(t):null;this.labelFirst=t&&n?{rect:t.getBoundingClientRect(),opacity:Number.parseFloat(n.opacity)||0,visible:n.display!=="none"&&n.visibility!=="hidden",fontFamily:n.fontFamily,fontSize:n.fontSize,fontWeight:n.fontWeight,lineHeight:n.lineHeight,letterSpacing:n.letterSpacing,paddingTop:n.paddingTop,paddingRight:n.paddingRight,paddingBottom:n.paddingBottom,paddingLeft:n.paddingLeft,textAlign:n.textAlign,boxSizing:n.boxSizing}:null;this.cancelAnimations();this.pendingTransition=!this.prefersReducedMotion();if(!this.pendingTransition){this.iconFirst=null;this.indicatorFirst=null;this.labelFirst=null}}cancelAnimations(){this.iconAnimation?.cancel();this.indicatorAnimation?.cancel();this.labelAnimation?.cancel();this.iconAnimation=undefined;this.indicatorAnimation=undefined;this.labelAnimation=undefined;this.restoreLabelOverlay()}restoreLabelOverlay(){if(!this.labelOverlay)return;const{element:i,styles:a}=this.labelOverlay;for(const[t,n]of a){if(n.value)i.style.setProperty(t,n.value,n.priority);else i.style.removeProperty(t)}this.labelOverlay=undefined}retainOutgoingLabel(i,a){const t=this.el.getBoundingClientRect();const n=new Map;const o={display:"inline-block",position:"absolute",left:`${a.rect.left-t.left-this.el.clientLeft+this.el.scrollLeft}px`,top:`${a.rect.top-t.top-this.el.clientTop+this.el.scrollTop}px`,width:`${a.rect.width}px`,height:`${a.rect.height}px`,"max-inline-size":"none","max-block-size":"none","margin-top":"0","margin-right":"0","margin-bottom":"0","margin-left":"0",transform:"none",opacity:String(a.opacity),visibility:"visible","pointer-events":"none","transition-property":"none","font-family":a.fontFamily,"font-size":a.fontSize,"font-weight":a.fontWeight,"line-height":a.lineHeight,"letter-spacing":a.letterSpacing,"padding-top":a.paddingTop,"padding-right":a.paddingRight,"padding-bottom":a.paddingBottom,"padding-left":a.paddingLeft,"text-align":a.textAlign,"box-sizing":a.boxSizing};for(const[a,t]of Object.entries(o)){if(!t)continue;n.set(a,{value:i.style.getPropertyValue(a),priority:i.style.getPropertyPriority(a)});i.style.setProperty(a,t)}this.labelOverlay={element:i,styles:n}}componentDidRender(){if(!this.pendingTransition)return;this.pendingTransition=false;this.playTransition()}prefersReducedMotion(){return typeof window!=="undefined"&&!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches}iconCentre(){const i=this.el.shadowRoot?.querySelector(".md-navigation-rail-tab__icon-wrapper");if(!i)return null;const a=i.getBoundingClientRect();return{cx:a.left+a.width/2,cy:a.top+a.height/2}}motionDuration(){const i=getComputedStyle(this.el).getPropertyValue("--md-sys-motion-duration-short4").trim();return r(i)}playTransition(){const i=this.el.shadowRoot;if(!i)return;const a=getComputedStyle(this.el).getPropertyValue("--md-sys-motion-easing-standard").trim()||"cubic-bezier(0.2, 0, 0, 1)";const{duration:t,easing:n,source:o}=l(this.el,{duration:this.motionDuration(),easing:a});if(t===0){this.iconFirst=null;this.indicatorFirst=null;this.labelFirst=null;return}const e={duration:t,easing:n,fill:"none"};const s=i.querySelector('[part="icon-wrapper"]');if(s&&this.iconFirst){const i=s.getBoundingClientRect();const a=this.iconFirst.cx-(i.left+i.width/2);const t=this.iconFirst.cy-(i.top+i.height/2);if(Math.abs(a)>.5||Math.abs(t)>.5){this.iconAnimation=s.animate([{transform:`translate(${a}px, ${t}px)`},{transform:"translate(0, 0)"}],e);const i=this.iconAnimation;d(i,o,(()=>this.iconAnimation===i))}}this.iconFirst=null;const r=i.querySelector('[part="indicator"]');if(r&&this.indicatorFirst){const i=this.indicatorFirst;const a=r.getBoundingClientRect();if(i.width>0&&i.height>0&&a.width>0&&a.height>0){this.indicatorAnimation=r.animate([{transform:`translate(${i.left-a.left}px, ${i.top-a.top}px) scale(${i.width/a.width}, ${i.height/a.height})`,transformOrigin:"top left"},{transform:"translate(0, 0) scale(1, 1)",transformOrigin:"top left"}],e);const t=this.indicatorAnimation;d(t,o,(()=>this.indicatorAnimation===t))}}this.indicatorFirst=null;const c=i.querySelector('[part="label"]');const m=this.labelFirst;this.labelFirst=null;if(c&&m){const i=getComputedStyle(c);const a=Number.parseFloat(i.opacity)||0;const t=i.display!=="none"&&i.visibility!=="hidden"&&a>0;if(!t&&m.visible&&m.opacity>0&&m.rect.width>0&&m.rect.height>0){this.retainOutgoingLabel(c,m);this.labelAnimation=c.animate([{opacity:m.opacity},{opacity:0}],{...e,fill:"forwards"});const i=this.labelAnimation;d(i,o,(()=>this.labelAnimation===i));void i.finished.then((()=>{if(this.labelAnimation!==i)return;this.restoreLabelOverlay();this.labelAnimation=undefined;i.cancel()}),(()=>undefined))}else if(t){const i=c.getBoundingClientRect();const t=m.visible?m.rect.left-i.left:0;const n=m.visible?m.rect.top-i.top:0;const s=m.visible?m.opacity:0;if(Math.abs(t)>.5||Math.abs(n)>.5||Math.abs(s-a)>.01){this.labelAnimation=c.animate([{transform:`translate(${t}px, ${n}px)`,opacity:s},{transform:"translate(0, 0)",opacity:a}],e);const i=this.labelAnimation;d(i,o,(()=>this.labelAnimation===i))}}}}warnMissingAccessibleName(){const i=this.el.hasAttribute("aria-label")||this.el.hasAttribute("aria-labelledby");if(!this.label&&!i){console.warn("[md-navigation-rail-tab] WCAG 1.1.1 / 2.4.4: destination is missing a label. "+"Add a `label` attribute or aria-label.",this.el)}}get submenu(){return this.el.querySelector('[slot="submenu"]')}ensureSubmenuAnchor(){const i=this.submenu;if(!i)return;if(!this.el.id){this.generatedId=this.generatedId??`md-rail-tab-${Math.random().toString(36).slice(2,9)}`;this.el.id=this.generatedId}if(i.getAttribute("anchor")!==this.el.id)i.setAttribute("anchor",this.el.id);if(!i.hasAttribute("placement"))i.setAttribute("placement","bottom-start")}async clearSubmenuSelection(){const i=this.submenu;i?.querySelectorAll("md-menu-item[selected]").forEach((i=>{i.removeAttribute("selected")}));this.submenuHasSelection=false}syncSubmenuSelection(){const i=this.submenu;this.submenuHasSelection=!!i?.querySelector('md-menu-item[selected], md-menu-item[aria-checked="true"]')}toggleSubmenu(){const i=this.submenu;if(!i)return;if(i.open)void i.close();else void i.show()}get displayBadgeValue(){if(!this.badgeValue)return"";const i=Number(this.badgeValue);if(Number.isFinite(i)&&i>999)return"999+";return this.badgeValue}renderIcon(){const i=!!this.icon;return t("slot",{name:"icon"},i&&t("span",{class:"md-navigation-rail-tab__icon material-symbols-outlined",part:"icon","aria-hidden":"true"},this.icon))}renderBadge(){const i=!!this.badgeValue;const a=this.badge&&!i;if(!i&&!a)return null;return t("span",{class:{"md-navigation-rail-tab__badge":true,"md-navigation-rail-tab__badge--dot":a,"md-navigation-rail-tab__badge--large":i},part:a?"badge badge-dot":"badge badge-large",role:"status","aria-label":i?`${this.displayBadgeValue} new notifications`:"new notifications"},i&&this.displayBadgeValue)}renderInner(){return[t("span",{class:"md-navigation-rail-tab__indicator",part:"indicator","aria-hidden":"true"},t("span",{class:"md-navigation-rail-tab__state-layer",part:"state-layer","aria-hidden":"true"})),t("md-ripple",{disabled:this.disabled}),t("span",{class:"md-navigation-rail-tab__icon-wrapper",part:"icon-wrapper"},t("span",{class:"md-navigation-rail-tab__icon-box"},this.renderIcon(),this.renderBadge())),this.label&&t("span",{class:"md-navigation-rail-tab__label",part:"label"},this.label,this.hasSubmenu&&t("span",{class:"md-navigation-rail-tab__caret material-symbols-outlined",part:"caret","aria-hidden":"true"},"arrow_drop_down")),t("slot",{name:"submenu"})]}render(){const i=c(this.href);const a=!!i&&!this.disabled;const o=this.disabled?"true":null;const e=this.active&&a?"page":null;const s=a?null:this.active?"true":"false";const r=a?"link":"tab";const l=this.el.getAttribute("aria-label")??undefined;const d=a?this.label||l:!this.label?l:undefined;return t(n,{key:"8b029c97fbf564f9faf7926965bce751f1161ff5",class:{"md-navigation-rail-tab":true,"md-navigation-rail-tab--active":this.active,"md-navigation-rail-tab--child-selected":this.submenuHasSelection&&!this.active,"md-navigation-rail-tab--disabled":this.disabled,"md-navigation-rail-tab--has-label":!!this.label,[`md-navigation-rail-tab--labels-${this.labelVisibility}`]:true,"md-navigation-rail-tab--expanded":this.expanded},role:r,"aria-selected":s,"aria-current":e,"aria-disabled":o,"aria-label":d,tabindex:this.disabled?"-1":this.active?"0":"-1","aria-haspopup":this.submenu?"menu":undefined,"aria-expanded":this.submenu?this.submenuOpen?"true":"false":undefined,onClick:this.handleClick,onKeyDown:this.handleKeyDown},a?t("a",{class:"md-navigation-rail-tab__anchor",href:i,target:this.target||undefined,rel:this.target?m:undefined,tabIndex:-1,"aria-hidden":"true",part:"anchor"},this.renderInner()):this.renderInner())}get el(){return o(this)}static get watchers(){return{expanded:[{onExpandedChange:0}]}}};b.style=h();export{b as md_navigation_rail_tab};
2
+ //# sourceMappingURL=p-c38e1473.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["mdNavigationRailTabCss","MdNavigationRailTab","constructor","hostRef","this","icon","label","active","disabled","badge","badgeValue","href","target","value","labelVisibility","expanded","density","iconFirst","indicatorFirst","labelFirst","pendingTransition","transitionPrepared","submenuOpen","hasSubmenu","submenuHasSelection","handleSubmenuClick","e","row","closest","menu","submenu","contains","querySelectorAll","forEach","other","removeAttribute","setAttribute","syncSubmenuSelection","mdTabClick","emit","handleClick","preventDefault","stopImmediatePropagation","toggleSubmenu","handleKeyDown","key","triggerRipple","el","anchor","shadowRoot","querySelector","click","connectedCallback","unregisterTransition","registerRailTabTransition","captureTransition","disconnectedCallback","cancelAnimations","componentDidLoad","window","__STENCIL_DEV_MODE__","warnMissingAccessibleName","ensureSubmenuAnchor","addEventListener","mdSubmenuToggle","open","onExpandedChange","sr","indicator","iconCentre","getBoundingClientRect","labelCss","getComputedStyle","rect","opacity","Number","parseFloat","visible","display","visibility","fontFamily","fontSize","fontWeight","lineHeight","letterSpacing","paddingTop","paddingRight","paddingBottom","paddingLeft","textAlign","boxSizing","prefersReducedMotion","iconAnimation","cancel","indicatorAnimation","labelAnimation","undefined","restoreLabelOverlay","labelOverlay","element","styles","name","previous","style","setProperty","priority","removeProperty","retainOutgoingLabel","first","host","Map","overlay","position","left","clientLeft","scrollLeft","top","clientTop","scrollTop","width","height","transform","String","Object","entries","set","getPropertyValue","getPropertyPriority","componentDidRender","playTransition","matchMedia","matches","r","cx","cy","motionDuration","raw","trim","parseRailMotionDuration","fallbackEasing","duration","easing","source","getRailTransitionTiming","timing","fill","dx","dy","Math","abs","animate","animation","synchronizeRailAnimation","last","transformOrigin","css","targetOpacity","finished","then","hasAriaLabel","hasAttribute","console","warn","id","generatedId","random","toString","slice","getAttribute","clearSubmenuSelection","close","show","displayBadgeValue","num","isFinite","renderIcon","hasIcon","h","class","part","renderBadge","hasLargeBadge","hasDotBadge","role","renderInner","render","sanitizeHref","isLink","ariaDisabled","ariaCurrent","ariaSelected","authorAriaLabel","hostAriaLabel","Host","tabindex","onClick","onKeyDown","rel","SAFE_LINK_REL","tabIndex"],"sources":["../sources/67e302a0ddf9f68ba82638d32533a0e69408184931f9f1268243f7246c714ae8/md-navigation-rail-tab.css_tag_md-navigation-rail-tab_encapsulation_shadow","../sources/b3d606320b653bcbde553e6d61569edd0fc6cbdb1cb179f4d36ad796e76b133c/md-navigation-rail-tab.tsx"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,7 @@ import {
11
11
  Listen,
12
12
  Method,
13
13
  } from '@stencil/core';
14
+ import { prepareRailTabTransition } from '../../utils/navigation-rail-motion';
14
15
 
15
16
  /**
16
17
  * Material Design 3 — Navigation Rail
@@ -141,11 +142,9 @@ export class MdNavigationRail {
141
142
  @State() private submenuOpen = false;
142
143
 
143
144
  /**
144
- * Drives the *destination layout* (stacked vs. inline) independently of the
145
- * rail's own width. On expand it flips with the width so labels reveal as the
146
- * rail grows; on collapse it lingers in the inline layout until the width
147
- * animation has finished, then drops to the stacked resting layout — keeping
148
- * the label reveal/conceal in sync with the width instead of snapping.
145
+ * Destination target layout, synchronized with the variant before rendering.
146
+ * Tabs capture their current geometry before this changes, then animate to the
147
+ * new layout while the rail changes width.
149
148
  */
150
149
  @State() private tabsExpanded = false;
151
150
 
@@ -231,17 +230,18 @@ export class MdNavigationRail {
231
230
  @Watch('variant')
232
231
  onVariantChange(newVal: 'standard' | 'expanded', oldVal: 'standard' | 'expanded') {
233
232
  if (newVal === oldVal) return;
234
- if (newVal === 'expanded') this.mdExpand.emit();
235
- else this.mdCollapse.emit();
236
233
 
237
- // Switch the destination layout immediately in both directions (modal and
238
- // standard alike). Each tab glides its icon + label to the new layout, the
239
- // FAB morphs, and — for modal — the overlay container grows/shrinks and the
240
- // scrim fades, all driven by CSS transitions on the same spring (see the
241
- // modal section of the stylesheet). No JS deferral needed.
234
+ // Capture destinations before the rail's padding or target layout changes.
235
+ // A child watcher alone can run after the parent has already moved its icon.
236
+ this.getTabs().forEach(prepareRailTabTransition);
242
237
  this.tabsExpanded = newVal === 'expanded';
243
238
  this.syncTabs();
244
239
  this.syncFab();
240
+
241
+ // Consumers can synchronously update label visibility in these listeners;
242
+ // publish only after every destination and the FAB have the target state.
243
+ if (newVal === 'expanded') this.mdExpand.emit();
244
+ else this.mdCollapse.emit();
245
245
  }
246
246
 
247
247
  /**
@@ -54,9 +54,8 @@
54
54
  );
55
55
  /* Spec: collapsed container = 80px (the collapsed-rail maximum width). */
56
56
  --_container-width: var(--md-navigation-rail-container-width, max(56px, calc(80px + var(--md-sys-density-scale, 0) * 4px)));
57
- /* The collapsed footprint of the slotted FAB, used to centre it on the rail's
58
- icon axis. 56px is the M3 FAB and what an extended FAB collapses to; raise
59
- it for a `size="medium"` / `size="large"` icon-only FAB. */
57
+ /* Reserved collapsed footprint for a labelled FAB. Icon-only FABs use their
58
+ actual rendered size, including the component's size and density props. */
60
59
  --_fab-size: var(--md-navigation-rail-fab-size, 56px);
61
60
  /* Spec: expanded container = 220px minimum, 360px maximum. */
62
61
  --_expanded-width: var(--md-navigation-rail-expanded-width, max(140px, calc(220px + var(--md-sys-density-scale, 0) * 20px)));
@@ -65,6 +64,11 @@
65
64
  --_container-elevation: var(--md-navigation-rail-container-elevation, none);
66
65
  --_padding-block: var(--md-navigation-rail-padding-block, max(24px, calc(44px + var(--md-sys-density-scale, 0) * 4px)));
67
66
  --_padding-inline: var(--md-navigation-rail-padding-inline, 0px);
67
+ /* Resolve on the rail before inheritance: slotted controls can define their
68
+ own --_container-width, so they must consume this computed coordinate. */
69
+ --_rail-slot-axis: calc(var(--_container-width) / 2 - var(--_padding-inline));
70
+ --_rail-slot-center-shift: -50%;
71
+ --_rail-fab-size: var(--_fab-size);
68
72
  --_gap: var(--md-navigation-rail-gap, var(--md-sys-spacing-gap-md, 12px));
69
73
  --_header-space: var(--md-navigation-rail-header-space, max(20px, calc(40px + var(--md-sys-density-scale, 0) * 4px)));
70
74
  --_destinations-gap: var(--md-navigation-rail-destinations-gap, max(0px, calc(8px + var(--md-sys-density-scale, 0) * 2px)));
@@ -129,6 +133,10 @@
129
133
  font-family: var(--md-sys-typescale-label-medium-font-family, Roboto, sans-serif);
130
134
  }
131
135
 
136
+ :host(:dir(rtl)) {
137
+ --_rail-slot-center-shift: 50%;
138
+ }
139
+
132
140
  /* ---------- Full-height (opt-in via `full-height`) ----------
133
141
  Span the whole viewport instead of just the parent. `dvh` tracks the dynamic
134
142
  viewport (mobile browser chrome show/hide); `vh` is the fallback for engines
@@ -143,12 +151,8 @@
143
151
  inline-size: var(--_expanded-width);
144
152
  min-inline-size: var(--_expanded-width);
145
153
  max-inline-size: var(--_expanded-max-width);
146
- /* Leading inset for expanded content. Spec is 16px, but we use 12px so each
147
- control's icon lands back on the rail's centre axis (x=40) exactly where
148
- it sits while collapsed — giving ZERO horizontal icon movement during the
149
- expand/collapse spring. A 24px icon centred in the 80px collapsed rail is at
150
- x=28; with this 12px inset the expanded icons (toggle 12+8 button inset,
151
- destinations 12+16 pill inset, etc.) also resolve to x=28. */
154
+ /* Expanded content gains an inset. Controls compensate this value against
155
+ the collapsed width, so their icon axis also holds at compact densities. */
152
156
  --_padding-inline: var(--md-sys-spacing-inset-md, 12px);
153
157
  }
154
158
 
@@ -303,19 +307,12 @@
303
307
  justify-content: flex-start;
304
308
  /* Anchor the leading glyph on the rail's centre axis (x=40 in the 80px rail).
305
309
  This padding is leading-edge based (NOT justify-content: center, which would
306
- track the animating host width and drift). Identical in both states — the
307
- expanded rule below cancels the host padding — so the logo NEVER moves. */
310
+ track the animating host width and drift). The margin compensates the
311
+ current host inset in both states, preserving the same leading position. */
308
312
  padding-inline-start: calc((var(--_container-width) - var(--_logo-icon-size)) / 2);
309
- transition: opacity var(--_motion-effects-duration) var(--_motion-effects-easing);
310
- }
311
-
312
- /* Expanded: the in-flow logo wrapper is pushed right by the host's expanded
313
- padding. Cancel exactly that, so the glyph stays on the same centre axis
314
- (x=40) it holds while collapsed — zero horizontal movement. Both variants get
315
- it, so the cross-fade happens perfectly in place. */
316
- :host(.md-navigation-rail--expanded) .md-navigation-rail__logo-contracted,
317
- :host(.md-navigation-rail--expanded) .md-navigation-rail__logo-expanded {
313
+ /* Compensate in both states, including a custom collapsed rail inset. */
318
314
  margin-inline-start: calc(-1 * var(--_padding-inline));
315
+ transition: opacity var(--_motion-duration) var(--_motion-easing);
319
316
  }
320
317
 
321
318
  .md-navigation-rail__logo-contracted {
@@ -359,15 +356,13 @@
359
356
  so the button never drifts during the spring transition. NOT transitioned on
360
357
  purpose: gliding it reads as an in-place drift, the rail-width spring
361
358
  carries the motion instead. */
362
- padding-inline-start: calc((var(--_container-width) - 40px) / 2);
363
- }
364
-
365
- :host(.md-navigation-rail--expanded) .md-navigation-rail__toggle {
366
- padding-inline-start: var(--md-sys-spacing-inset-sm, 8px);
359
+ padding-inline-start: calc((var(--_container-width) - 40px) / 2 - var(--_padding-inline));
367
360
  }
368
361
 
369
362
  /* ---------- Header (top group) ---------- */
370
363
  .md-navigation-rail__header {
364
+ --_header-padding-inline: 0px;
365
+ --_rail-slot-axis: calc(var(--_container-width) / 2 - var(--_padding-inline) - var(--_header-padding-inline));
371
366
  display: flex;
372
367
  flex-direction: column;
373
368
  align-items: center;
@@ -378,8 +373,9 @@
378
373
  }
379
374
 
380
375
  :host(.md-navigation-rail--expanded) .md-navigation-rail__header {
376
+ --_header-padding-inline: var(--md-sys-spacing-inset-sm, 8px);
381
377
  align-items: flex-start;
382
- padding-inline: var(--md-sys-spacing-inset-sm, 8px);
378
+ padding-inline: var(--_header-padding-inline);
383
379
  }
384
380
 
385
381
  .md-navigation-rail__header[hidden] {
@@ -387,65 +383,53 @@
387
383
  }
388
384
 
389
385
  /* ---------- FAB region ----------
390
- LEADING-ANCHORED IN BOTH STATES, so the FAB's leading edge and with it its
391
- icon never moves. This is the same idiom the logo and the toggle above use,
392
- and it is here for the same reason plus a sharper one.
393
-
394
- Centring was the problem. `justify-content: center` resolves against the
395
- ANIMATING host width, and on collapse the state flips instantly while the rail
396
- narrows 220→80 over 200ms and the FAB runs its own 500ms morph spring. The
397
- three timelines are unrelated, so the centred FAB was dragged past its target:
398
- measured, the icon left x=28, dipped to 16.67 — about 11px BELOW its resting
399
- 27.5 — and sprang back. A visible rubber-band on every collapse.
400
-
401
- Anchoring removes the moving target entirely. Collapsed, the leading inset is
402
- whatever centres the FAB, `(rail - fab) / 2` = (80 - 56) / 2 = 12px; expanded,
403
- the host's own `--_padding-inline` is already 12px and the wrapper adds
404
- nothing. Both put the leading edge at 12 and the icon at 28 — the rail's
405
- documented axis — so across the whole transition the FAB only CHANGES WIDTH.
406
- Nothing translates, in either direction.
407
-
408
- The `- var(--_fab-size)` term is the one assumption, and it is exposed rather
409
- than hidden: 56px is the M3 FAB and what an extended FAB collapses to, so it
410
- is right for `size="standard"`, for a labelled FAB, and for every FAB in this
411
- component's own stories. A consumer slotting a `size="medium"` or
412
- `size="large"` icon-only FAB must set `--md-navigation-rail-fab-size` to that
413
- width, or its icon lands off the axis by half the difference. `max(0px, …)`
414
- keeps a FAB wider than the rail from producing a negative inset. */
386
+ A labelled FAB expands from a fixed icon axis. Its own label width, opacity,
387
+ and padding transitions use the rail's width clock instead of a second
388
+ spatial spring. Icon-only FABs are centred using their actual footprint. */
415
389
  .md-navigation-rail__fab {
390
+ /* Preserve the slot's legacy inset for wrappers and other custom content.
391
+ Direct FABs compensate it through the computed axis below. */
392
+ --_fab-padding-inline: max(0px, calc((var(--_container-width) - var(--_fab-size)) / 2));
393
+ --_rail-slot-axis: calc(var(--_container-width) / 2 - var(--_padding-inline) - var(--_fab-padding-inline));
394
+ --md-sys-motion-spring-spatial-default-duration: var(--_motion-duration);
395
+ --md-sys-motion-spring-spatial-default-easing: var(--_motion-easing);
396
+ --md-sys-motion-spring-effects-default-duration: var(--_motion-duration);
397
+ --md-sys-motion-spring-effects-default-easing: var(--_motion-easing);
416
398
  display: flex;
417
399
  align-items: center;
418
400
  justify-content: flex-start;
419
401
  inline-size: 100%;
420
- padding-inline-start: max(0px, calc((var(--_container-width) - var(--_fab-size)) / 2));
402
+ padding-inline-start: var(--_fab-padding-inline);
421
403
  padding-block-end: var(--md-sys-spacing-inset-sm, 8px);
422
404
  }
423
405
 
424
- /*
425
- * NO extra leading padding here — the host's `--_padding-inline` has already
426
- * applied it, and a second copy double-counted it.
427
- *
428
- * The rail's whole expand promise is the x=28 icon axis documented at the top
429
- * of this file: a 24px icon centred in the 80px collapsed rail sits at 28, and
430
- * the 12px expanded inset is chosen so every expanded control lands back on 28
431
- * too — "ZERO horizontal icon movement". Every other control keeps that
432
- * promise; measured, a destination tab's glyph is at x=28.00 in BOTH states.
433
- * The FAB was the sole violator: host inset 12 + this padding 12 put its
434
- * leading edge at 24, and with the FAB's own 16px icon inset the "+" landed at
435
- * x=40 expanded against x=27.5 collapsed. It did not even glide — it jumped the
436
- * full 12.5px in one frame and then held while only the width animated, which
437
- * is what made it read as a jerk rather than a movement.
438
- *
439
- * `justify-content: flex-start` still earns its place: it anchors the FAB to
440
- * the leading edge instead of centring it, the same idiom the logo and toggle
441
- * above already use, and for the reason recorded there — centring resolves
442
- * against the ANIMATING host width and drifts.
443
- */
444
406
  :host(.md-navigation-rail--expanded) .md-navigation-rail__fab {
445
- /* The host's `--_padding-inline` already puts the content box at 12px, so the
446
- wrapper contributes nothing — adding its own copy on top is what used to
447
- double-count it and shove the icon from x=28 to x=40. */
448
- padding-inline-start: 0;
407
+ --_fab-padding-inline: 0px;
408
+ }
409
+
410
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab) {
411
+ position: relative;
412
+ inset-inline-start: var(--_rail-slot-axis);
413
+ translate: var(--_rail-slot-center-shift) 0;
414
+ }
415
+
416
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab.md-fab--extended),
417
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab.md-fab--collapsed) {
418
+ inset-inline-start: calc(var(--_rail-slot-axis) - var(--_rail-fab-size) / 2);
419
+ translate: none;
420
+ }
421
+
422
+ /* A labelled FAB's collapsed footprint is fixed, while its icon size and
423
+ inset tokens can change with density. Reserve half of that footprint before
424
+ the icon in both states so the shrinking label cannot displace it. */
425
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab.md-fab--extended.md-fab--with-icon),
426
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab.md-fab--collapsed.md-fab--with-icon) {
427
+ justify-content: flex-start;
428
+ padding-inline-start: calc((var(--_rail-fab-size) - var(--_icon-size)) / 2);
429
+ }
430
+
431
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__fab ::slotted(md-fab.md-fab--collapsed.md-fab--with-icon) {
432
+ padding-inline-end: calc((var(--_rail-fab-size) - var(--_icon-size)) / 2);
449
433
  }
450
434
 
451
435
  .md-navigation-rail__fab[hidden] {
@@ -498,6 +482,7 @@
498
482
  flex-shrink: 0;
499
483
  box-sizing: border-box;
500
484
  --_footer-padding-inline: 0px;
485
+ --_rail-slot-axis: calc(var(--_container-width) / 2 - var(--_padding-inline) - var(--_footer-padding-inline));
501
486
  --_footer-leading-size: var(--md-navigation-rail-footer-leading-size, 32px);
502
487
  display: flex;
503
488
  flex-direction: column;
@@ -511,15 +496,7 @@
511
496
  margin-block-start: auto; /* push to bottom even with align=top */
512
497
  }
513
498
 
514
- /* Legacy footer content keeps its existing alignment. For an account that
515
- stays anchored during expansion, use footer-leading + footer-content. */
516
- /* Centred with `align-self`, NOT a margin. A margin here has to be written
517
- through `::slotted()`, and document-tree rules out-rank `::slotted()` at any
518
- specificity — so a consumer's `* { margin: 0 }` reset (Starlight, Tailwind
519
- preflight, any normalise) silently pushed the button to the rail's leading
520
- edge. `align-self` is not a margin, so the reset cannot reach it, and the
521
- expanded offset moves to padding on the footer itself (a shadow element the
522
- reset never matches). */
499
+ /* Preserve the existing alignment of horizontal and profile-slot controls. */
523
500
  .md-navigation-rail__footer ::slotted(md-icon-button) {
524
501
  align-self: center;
525
502
  }
@@ -528,6 +505,17 @@
528
505
  align-self: flex-start;
529
506
  }
530
507
 
508
+ /* Known icon controls use their own rendered width instead of a fixed button
509
+ size. Relative logical positioning avoids margins that document resets can
510
+ override. Other custom header/footer content retains its existing layout. */
511
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__header ::slotted(md-icon-button[slot='header']),
512
+ :host(:not(.md-navigation-rail--horizontal)) .md-navigation-rail__footer ::slotted(md-icon-button[slot='footer']) {
513
+ align-self: flex-start;
514
+ position: relative;
515
+ inset-inline-start: var(--_rail-slot-axis);
516
+ translate: var(--_rail-slot-center-shift) 0;
517
+ }
518
+
531
519
  :host(.md-navigation-rail--expanded) .md-navigation-rail__footer {
532
520
  --_footer-padding-inline: var(--md-sys-spacing-inset-sm, 8px);
533
521
  padding-inline-start: var(--_footer-padding-inline);
@@ -588,6 +576,15 @@
588
576
  inline-size: var(--_container-width);
589
577
  }
590
578
 
579
+ :host(:not(.md-navigation-rail--horizontal)) ::slotted(md-navigation-rail-tab) {
580
+ /* Share the collapsed centre axis with the expanded destination. Density
581
+ changes both the rail width and glyph size; a fixed 16px leading inset
582
+ only aligns the two layouts at the default density. Subtract the rail's
583
+ insets from collapsed items so custom padding preserves the same axis. */
584
+ --_rail-icon-axis: calc(var(--_container-width) / 2 - var(--_padding-inline));
585
+ inline-size: calc(var(--_container-width) - 2 * var(--_padding-inline));
586
+ }
587
+
591
588
  /* Expanded items hug their content (left-aligned pill per the spec's
592
589
  "Expanded layout" figure) instead of stretching the full rail width. */
593
590
  :host(.md-navigation-rail--tabs-expanded) ::slotted(md-navigation-rail-tab) {
@@ -636,11 +633,18 @@
636
633
  :host,
637
634
  .md-navigation-rail__toggle,
638
635
  .md-navigation-rail__fab,
636
+ .md-navigation-rail__logo-contracted,
637
+ .md-navigation-rail__logo-expanded,
639
638
  .md-navigation-rail__footer-content,
640
639
  .md-navigation-rail__scrim,
641
640
  :host(.md-navigation-rail--modal) .md-navigation-rail__container {
642
641
  transition: none;
643
642
  }
643
+
644
+ .md-navigation-rail__fab {
645
+ --md-sys-motion-spring-spatial-default-duration: 0ms;
646
+ --md-sys-motion-spring-effects-default-duration: 0ms;
647
+ }
644
648
  }
645
649
 
646
650
  /* ---------- Dark theme is fully covered by --md-sys-* tokens ---------- */
@@ -750,6 +754,7 @@
750
754
  :host(.md-navigation-rail--horizontal) .md-navigation-rail__logo-expanded {
751
755
  position: static;
752
756
  padding-inline: var(--md-sys-spacing-inset-sm, 8px);
757
+ margin-inline-start: 0;
753
758
  }
754
759
 
755
760
  :host(.md-navigation-rail--horizontal) .md-navigation-rail__logo-expanded {
@@ -89,19 +89,13 @@
89
89
  --md-navigation-rail-tab-state-layer-color,
90
90
  var(--md-sys-color-on-secondary-container, #4A4458)
91
91
  );
92
- /* M3 Expressive motion. Effects spring (fast) for color / opacity / icon-fill
93
- micro-interactions; spatial spring (fast) for the active-indicator pill
94
- size/shape morph. */
92
+ /* Effects motion for color, opacity and icon fill. Layout motion is owned
93
+ by the component so it can reverse from the currently rendered geometry. */
95
94
  --_motion-duration: var(--md-sys-motion-spring-effects-fast-duration, 150ms);
96
95
  --_motion-easing: var(
97
96
  --md-sys-motion-spring-effects-fast-easing,
98
97
  cubic-bezier(0.31, 0.94, 0.34, 1)
99
98
  );
100
- --_motion-spatial-duration: var(--md-sys-motion-spring-spatial-fast-duration, 350ms);
101
- --_motion-spatial-easing: var(
102
- --md-sys-motion-spring-spatial-fast-easing,
103
- cubic-bezier(0.42, 1.67, 0.21, 0.9)
104
- );
105
99
  --_hover-opacity: var(--md-sys-state-hover-state-layer-opacity, 0.08);
106
100
  /* Spec: focused and pressed state layer opacity = 0.10 for nav rail items. */
107
101
  --_focus-opacity: var(--md-navigation-rail-tab-focus-state-layer-opacity, 0.10);
@@ -194,9 +188,9 @@ md-ripple {
194
188
  background-color: transparent;
195
189
  pointer-events: none;
196
190
  overflow: hidden;
197
- transition:
198
- background-color var(--_motion-duration) var(--_motion-easing),
199
- inline-size var(--_motion-spatial-duration) var(--_motion-spatial-easing);
191
+ /* Geometry is animated from measured bounds by the component: auto-sized
192
+ expanded pills cannot transition to fixed collapsed dimensions in CSS. */
193
+ transition: background-color var(--_motion-duration) var(--_motion-easing);
200
194
  z-index: 0;
201
195
  }
202
196
 
@@ -377,6 +371,9 @@ md-ripple {
377
371
  justify-content: flex-start;
378
372
  gap: var(--md-sys-spacing-gap-sm, 8px);
379
373
  padding-inline: var(--md-sys-spacing-inset-lg, 16px);
374
+ /* Keep the glyph on the rail's centre axis at every density, including when
375
+ a destination has a local icon-size override. Logical padding mirrors RTL. */
376
+ padding-inline-start: calc(var(--_rail-icon-axis, calc(var(--md-sys-spacing-inset-lg, 16px) + var(--_icon-size) / 2)) - var(--_icon-size) / 2);
380
377
  padding-block: 0;
381
378
  inline-size: fit-content;
382
379
  min-block-size: max(48px, calc(56px + var(--md-sys-density-scale, 0) * 4px));