@taprootio/espalier 4.2.0 → 4.4.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.
Files changed (60) hide show
  1. package/css/fonts/font-fallback-profiles.json +1 -0
  2. package/custom-elements.json +7705 -6706
  3. package/dist/action-menu/esp-action-menu-item.js +7 -4
  4. package/dist/avatar/esp-avatar.js +14 -8
  5. package/dist/avatar/esp-profile-chip.js +4 -1
  6. package/dist/badge/esp-badge.js +7 -4
  7. package/dist/box/esp-box.d.ts +1 -1
  8. package/dist/checkbox/esp-checkbox.js +6 -3
  9. package/dist/cli/theme-check.js +2 -2
  10. package/dist/color-picker/esp-color-picker.js +1 -1
  11. package/dist/data-cell/esp-data-cell.js +6 -3
  12. package/dist/date-picker/helpers/styles.js +10 -4
  13. package/dist/details/esp-details.d.ts +4 -4
  14. package/dist/details/esp-details.js +11 -5
  15. package/dist/empty-state/esp-empty-state.js +16 -7
  16. package/dist/flyout/esp-flyout.js +5 -2
  17. package/dist/font-picker/esp-font-picker.d.ts +1 -0
  18. package/dist/font-picker/esp-font-picker.js +4 -4
  19. package/dist/footer/esp-footer-link-group.js +12 -6
  20. package/dist/footer/esp-footer.js +21 -6
  21. package/dist/form-item/esp-form-item.js +4 -1
  22. package/dist/header/esp-header.d.ts +2 -1
  23. package/dist/header/esp-header.js +24 -6
  24. package/dist/help/esp-help-button.d.ts +1 -1
  25. package/dist/help/help-document.js +4 -4
  26. package/dist/index.d.ts +5 -4
  27. package/dist/index.js +1 -1
  28. package/dist/lightbox/esp-lightbox.d.ts +1 -1
  29. package/dist/page/esp-page.js +4 -1
  30. package/dist/pickers/esp-picker-menu.js +6 -6
  31. package/dist/progress/esp-progress.js +11 -5
  32. package/dist/radio-button/esp-radio-button.js +6 -3
  33. package/dist/root/esp-root.d.ts +8 -0
  34. package/dist/root/esp-root.js +13 -7
  35. package/dist/root/helpers/compute-theme-properties.js +1 -1
  36. package/dist/search/esp-search.js +10 -4
  37. package/dist/shared/data-colors.d.ts +14 -0
  38. package/dist/shared/data-colors.js +1 -1
  39. package/dist/shared/esp-element-base.js +20 -4
  40. package/dist/shared/font-helpers.d.ts +26 -0
  41. package/dist/shared/font-helpers.js +1 -1
  42. package/dist/shared/font-plan.d.ts +90 -0
  43. package/dist/shared/font-plan.js +5 -0
  44. package/dist/shared/scale-engine.js +1 -1
  45. package/dist/shared/theme-fit-report.d.ts +59 -0
  46. package/dist/shared/theme-fit-report.js +1 -1
  47. package/dist/shared/theme.d.ts +32 -4
  48. package/dist/shared/theme.js +1 -1
  49. package/dist/slider/esp-slider.js +8 -5
  50. package/dist/status-indicator/esp-status-indicator.d.ts +1 -1
  51. package/dist/switch/esp-switch.js +11 -5
  52. package/dist/tabs/esp-tab-group.js +6 -3
  53. package/dist/tabs/esp-tab.js +6 -3
  54. package/dist/tree/esp-tree.js +4 -1
  55. package/espalier.css-data.json +9 -5
  56. package/espalier.token-manifest.json +13 -5
  57. package/licenses/ASSET_PROVENANCE.md +2 -1
  58. package/licenses/THIRD_PARTY_NOTICES.md +35 -0
  59. package/licenses/asset-provenance.json +26 -2
  60. package/package.json +8 -2
@@ -1,4 +1,4 @@
1
- var o=function(d,t,e,i){var a=arguments.length,r=a<3?t:i===null?i=Object.getOwnPropertyDescriptor(t,e):i,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(d,t,e,i);else for(var h=d.length-1;h>=0;h--)(l=d[h])&&(r=(a<3?l(r):a>3?l(t,e,r):l(t,e))||r);return a>3&&r&&Object.defineProperty(t,e,r),r},p;import{css as v,html as c}from"lit";import{customElement as y,property as n,state as f}from"lit/decorators.js";import{createRef as m,ref as u}from"lit/directives/ref.js";import{classMap as w}from"lit/directives/class-map.js";import{styleMap as _}from"lit/directives/style-map.js";import{ifDefined as g}from"lit/directives/if-defined.js";import{EspalierElementBase as b}from"../shared/esp-element-base.js";import{FormFieldController as S}from"../shared/form-field-controller.js";import{FormFieldDescriptionController as k}from"../shared/form-field-description-controller.js";import{disabledControl as x,focusRing as C}from"../shared/style-fragments.js";import{slotHasContent as $}from"../shared/slot-content.js";let s=p=class extends b{constructor(){super(...arguments),this.internals=this.attachInternals(),this.formCtrl=new S({host:this,internals:this.internals,getFormValue:()=>this.value||null,getValidity:()=>null,onReset:()=>{this.value=String(this._low)},onRestore:t=>{this.value=t},onDisabled:t=>{this.disabled=t}}),this.formItemDescription=new k({host:this,getTarget:()=>this._thumbRef.value}),this.min=0,this.max=100,this.step=1,this.value="0",this.name="",this.disabled=!1,this.label="",this._dragging=!1,this._hasSlotContent=!1,this._trackRef=m(),this._thumbRef=m(),this._slotRef=m(),this._labelId=`esp-slider-label-${p._nextId++}`}get _safeStep(){return Number.isFinite(this.step)&&this.step>0?this.step:1}get _safeMin(){return Number.isFinite(this.min)?this.min:0}get _safeMax(){return Number.isFinite(this.max)?this.max:100}get _stepPrecision(){const t=String(this._safeStep),e=/^(\d+\.?(\d*))e-(\d+)$/.exec(t);if(e){const a=e[2].length,r=Number(e[3]);return a+r}const i=t.indexOf(".");return i===-1?0:t.length-i-1}get _low(){return Math.min(this._safeMin,this._safeMax)}get _high(){return Math.max(this._safeMin,this._safeMax)}_snapToStep(t){const e=this._safeStep,i=this._low,a=this._high,r=Math.round((t-i)/e)*e+i,l=Math.max(i,Math.min(a,r)),h=10**this._stepPrecision;return Math.round(l*h)/h}get numericValue(){const t=Number(this.value);return Number.isNaN(t)?this._snapToStep(this._low):this._snapToStep(t)}get percentage(){const t=this._high-this._low;return t<=0?0:(this.numericValue-this._low)/t*100}_normalizeValue(){const t=String(this.numericValue);t!==this.value&&(this.value=t),this.formCtrl.syncValueSilently()}willUpdate(t){super.willUpdate(t),(t.has("value")||t.has("min")||t.has("max")||t.has("step"))&&this._normalizeValue()}firstUpdated(t){super.firstUpdated(t),this._syncSlotContent()}focus(t){this.focusResolvedElementAfterUpdate(()=>this._thumbRef.value,t)}setFormItemDescription(t){this.formItemDescription.setDescription(t)}validate(){this.formCtrl.validate()}checkValidity(){return this.formCtrl.checkValidity()}_setValueAndNotify(t){const e=String(this._snapToStep(t));e!==this.value&&(this.value=e,this.formCtrl.syncValue(),this.emitValueChanged(e))}_handleKeyDown(t){if(this.disabled)return;const e=this._safeStep;let i=0;switch(t.key){case"ArrowRight":case"ArrowUp":i=e;break;case"ArrowLeft":case"ArrowDown":i=-e;break;case"Home":this._setValueAndNotify(this._low),t.preventDefault();return;case"End":this._setValueAndNotify(this._high),t.preventDefault();return;case"PageUp":i=e*10;break;case"PageDown":i=-e*10;break;default:return}t.preventDefault(),this._setValueAndNotify(this.numericValue+i)}_handlePointerDown(t){if(this.disabled)return;const e=this._thumbRef.value,i=this._trackRef.value;if(!e||!i)return;const a=t.composedPath().includes(e);t.pointerType==="touch"&&!a||(t.preventDefault(),this._dragging=!0,e.setPointerCapture(t.pointerId),e.focus({preventScroll:!0}),this._updateValueFromPointer(t))}_handlePointerMove(t){this._dragging&&this._updateValueFromPointer(t)}_handlePointerUp(){this._endDrag()}_handleLostPointerCapture(){this._endDrag()}_endDrag(){this._dragging&&(this._dragging=!1)}_updateValueFromPointer(t){const e=this._trackRef.value;if(!e)return;const i=e.getBoundingClientRect();if(i.width<=0)return;const a=Math.max(0,Math.min(1,(t.clientX-i.left)/i.width)),r=this._low+a*(this._high-this._low);this._setValueAndNotify(r)}_handleSlotChange(){this._syncSlotContent()}_syncSlotContent(){const t=this._slotRef.value;t&&(this._hasSlotContent=$(t))}formResetCallback(){this.formCtrl.handleFormReset()}formStateRestoreCallback(t){this.formCtrl.handleFormStateRestore(t)}formDisabledCallback(t){this.formCtrl.handleFormDisabled(t)}render(){const t=this.percentage,e=this._hasSlotContent?this._labelId:void 0,i=this._hasSlotContent?void 0:this.label||void 0;return c`
1
+ var o=function(d,t,e,i){var a=arguments.length,r=a<3?t:i===null?i=Object.getOwnPropertyDescriptor(t,e):i,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(d,t,e,i);else for(var h=d.length-1;h>=0;h--)(l=d[h])&&(r=(a<3?l(r):a>3?l(t,e,r):l(t,e))||r);return a>3&&r&&Object.defineProperty(t,e,r),r},p;import{css as v,html as c}from"lit";import{customElement as y,property as n,state as f}from"lit/decorators.js";import{createRef as m,ref as u}from"lit/directives/ref.js";import{classMap as w}from"lit/directives/class-map.js";import{styleMap as _}from"lit/directives/style-map.js";import{ifDefined as b}from"lit/directives/if-defined.js";import{EspalierElementBase as g}from"../shared/esp-element-base.js";import{FormFieldController as S}from"../shared/form-field-controller.js";import{FormFieldDescriptionController as k}from"../shared/form-field-description-controller.js";import{disabledControl as x,focusRing as C}from"../shared/style-fragments.js";import{slotHasContent as $}from"../shared/slot-content.js";let s=p=class extends g{constructor(){super(...arguments),this.internals=this.attachInternals(),this.formCtrl=new S({host:this,internals:this.internals,getFormValue:()=>this.value||null,getValidity:()=>null,onReset:()=>{this.value=String(this._low)},onRestore:t=>{this.value=t},onDisabled:t=>{this.disabled=t}}),this.formItemDescription=new k({host:this,getTarget:()=>this._thumbRef.value}),this.min=0,this.max=100,this.step=1,this.value="0",this.name="",this.disabled=!1,this.label="",this._dragging=!1,this._hasSlotContent=!1,this._trackRef=m(),this._thumbRef=m(),this._slotRef=m(),this._labelId=`esp-slider-label-${p._nextId++}`}get _safeStep(){return Number.isFinite(this.step)&&this.step>0?this.step:1}get _safeMin(){return Number.isFinite(this.min)?this.min:0}get _safeMax(){return Number.isFinite(this.max)?this.max:100}get _stepPrecision(){const t=String(this._safeStep),e=/^(\d+\.?(\d*))e-(\d+)$/.exec(t);if(e){const a=e[2].length,r=Number(e[3]);return a+r}const i=t.indexOf(".");return i===-1?0:t.length-i-1}get _low(){return Math.min(this._safeMin,this._safeMax)}get _high(){return Math.max(this._safeMin,this._safeMax)}_snapToStep(t){const e=this._safeStep,i=this._low,a=this._high,r=Math.round((t-i)/e)*e+i,l=Math.max(i,Math.min(a,r)),h=10**this._stepPrecision;return Math.round(l*h)/h}get numericValue(){const t=Number(this.value);return Number.isNaN(t)?this._snapToStep(this._low):this._snapToStep(t)}get percentage(){const t=this._high-this._low;return t<=0?0:(this.numericValue-this._low)/t*100}_normalizeValue(){const t=String(this.numericValue);t!==this.value&&(this.value=t),this.formCtrl.syncValueSilently()}willUpdate(t){super.willUpdate(t),(t.has("value")||t.has("min")||t.has("max")||t.has("step"))&&this._normalizeValue()}firstUpdated(t){super.firstUpdated(t),this._syncSlotContent()}focus(t){this.focusResolvedElementAfterUpdate(()=>this._thumbRef.value,t)}setFormItemDescription(t){this.formItemDescription.setDescription(t)}validate(){this.formCtrl.validate()}checkValidity(){return this.formCtrl.checkValidity()}_setValueAndNotify(t){const e=String(this._snapToStep(t));e!==this.value&&(this.value=e,this.formCtrl.syncValue(),this.emitValueChanged(e))}_handleKeyDown(t){if(this.disabled)return;const e=this._safeStep;let i=0;switch(t.key){case"ArrowRight":case"ArrowUp":i=e;break;case"ArrowLeft":case"ArrowDown":i=-e;break;case"Home":this._setValueAndNotify(this._low),t.preventDefault();return;case"End":this._setValueAndNotify(this._high),t.preventDefault();return;case"PageUp":i=e*10;break;case"PageDown":i=-e*10;break;default:return}t.preventDefault(),this._setValueAndNotify(this.numericValue+i)}_handlePointerDown(t){if(this.disabled)return;const e=this._thumbRef.value,i=this._trackRef.value;if(!e||!i)return;const a=t.composedPath().includes(e);t.pointerType==="touch"&&!a||(t.preventDefault(),this._dragging=!0,e.setPointerCapture(t.pointerId),e.focus({preventScroll:!0}),this._updateValueFromPointer(t))}_handlePointerMove(t){this._dragging&&this._updateValueFromPointer(t)}_handlePointerUp(){this._endDrag()}_handleLostPointerCapture(){this._endDrag()}_endDrag(){this._dragging&&(this._dragging=!1)}_updateValueFromPointer(t){const e=this._trackRef.value;if(!e)return;const i=e.getBoundingClientRect();if(i.width<=0)return;const a=Math.max(0,Math.min(1,(t.clientX-i.left)/i.width)),r=this._low+a*(this._high-this._low);this._setValueAndNotify(r)}_handleSlotChange(){this._syncSlotContent()}_syncSlotContent(){const t=this._slotRef.value;t&&(this._hasSlotContent=$(t))}formResetCallback(){this.formCtrl.handleFormReset()}formStateRestoreCallback(t){this.formCtrl.handleFormStateRestore(t)}formDisabledCallback(t){this.formCtrl.handleFormDisabled(t)}render(){const t=this.percentage,e=this._hasSlotContent?this._labelId:void 0,i=this._hasSlotContent?void 0:this.label||void 0;return c`
2
2
  <div
3
3
  class=${w({"slider-container":!0,dragging:this._dragging})}
4
4
  @pointerdown=${this._handlePointerDown}
@@ -19,8 +19,8 @@ var o=function(d,t,e,i){var a=arguments.length,r=a<3?t:i===null?i=Object.getOwnP
19
19
  aria-valuenow=${this.numericValue}
20
20
  aria-valuetext=${String(this.numericValue)}
21
21
  aria-orientation="horizontal"
22
- aria-labelledby=${g(e)}
23
- aria-label=${g(i)}
22
+ aria-labelledby=${b(e)}
23
+ aria-label=${b(i)}
24
24
  aria-disabled=${String(this.disabled)}
25
25
  @keydown=${this._handleKeyDown}
26
26
  style=${_({left:`${t}%`})}
@@ -29,7 +29,7 @@ var o=function(d,t,e,i){var a=arguments.length,r=a<3?t:i===null?i=Object.getOwnP
29
29
  ${this._hasSlotContent?c`<span class="label" id=${this._labelId}>
30
30
  <slot ${u(this._slotRef)} @slotchange=${this._handleSlotChange}></slot>
31
31
  </span>`:c`<slot ${u(this._slotRef)} @slotchange=${this._handleSlotChange} hidden></slot>`}
32
- `}};s.formAssociated=!0,s._nextId=0,s.styles=[...b.styles,C(".thumb:focus-visible","--esp-slider-focus-shadow","0 0 0 3px","var(--esp-slider-thumb-shadow, 0 1px 3px oklch(0 0 0 / 0.2)),"),x(".slider-container"),v`
32
+ `}};s.formAssociated=!0,s._nextId=0,s.styles=[...g.styles,C(".thumb:focus-visible","--esp-slider-focus-shadow","0 0 0 3px","var(--esp-slider-thumb-shadow, 0 1px 3px oklch(0 0 0 / 0.2)),"),x(".slider-container"),v`
33
33
  :host {
34
34
  display: block;
35
35
  }
@@ -91,7 +91,10 @@ var o=function(d,t,e,i){var a=arguments.length,r=a<3?t:i===null?i=Object.getOwnP
91
91
 
92
92
  .label {
93
93
  display: block;
94
- font-family: var(--esp-font-body);
94
+ font-family: var(
95
+ --_esp-font-body-effective,
96
+ var(--esp-font-body, var(--_esp-font-body-fallback))
97
+ );
95
98
  font-size: var(--esp-size-font);
96
99
  color: var(--esp-color-text);
97
100
  line-height: 1.3;
@@ -70,7 +70,7 @@ export type EspalierStatusIndicatorChrome = "pill" | "outline" | "none";
70
70
  *
71
71
  * .file-type-indicator svg text {
72
72
  * fill: var(--esp-color-background);
73
- * font-family: var(--esp-font-body);
73
+ * font-family: var(--esp-font-body, system-ui, sans-serif);
74
74
  * font-size: 14px;
75
75
  * font-weight: 600;
76
76
  * text-anchor: middle;
@@ -1,4 +1,4 @@
1
- var i=function(a,e,s,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnPropertyDescriptor(e,s):l,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(a,e,s,l);else for(var h=a.length-1;h>=0;h--)(n=a[h])&&(o=(c<3?n(o):c>3?n(e,s,o):n(e,s))||o);return c>3&&o&&Object.defineProperty(e,s,o),o};import{css as f,html as d}from"lit";import{customElement as v,property as r}from"lit/decorators.js";import{classMap as p}from"lit/directives/class-map.js";import{EspalierElementBase as u}from"../shared/esp-element-base.js";import{FormFieldController as b}from"../shared/form-field-controller.js";import{FormFieldDescriptionController as g}from"../shared/form-field-description-controller.js";import{disabledControl as w,focusRing as m,srOnly as x}from"../shared/style-fragments.js";let t=class extends u{constructor(){super(...arguments),this.internals=this.attachInternals(),this.formCtrl=new b({host:this,internals:this.internals,getFormValue:()=>this.checked?this.value||"on":null,getValidity:()=>this.required&&!this.checked?{flags:{valueMissing:!0},message:this.requiredMessage||"Please toggle this switch to continue."}:null,onReset:()=>{this.checked=!1},onRestore:e=>{this.checked=e==="on"||e===this.value},onDisabled:e=>{this.disabled=e}}),this.formItemDescription=new g({host:this,getTarget:()=>this.shadowRoot?.querySelector(".switch-control")}),this.mode="switch",this.offLabel="",this.onLabel="",this.checked=!1,this.value="",this.name="",this.required=!1,this.requiredMessage="",this.disabled=!1}focus(e){this.focusShadowElementAfterUpdate(".switch-control",e)}setFormItemDescription(e){this.formItemDescription.setDescription(e)}validate(){this.formCtrl.validate()}checkValidity(){return this.formCtrl.checkValidity()}toggle(){this.disabled||(this.checked=!this.checked,this.formCtrl.syncValue(),this.emitValueChanged({checked:this.checked,value:this.value}))}handleKeyDown(e){(e.key===" "||e.key==="Enter")&&(e.preventDefault(),this.toggle())}handleLabelSlotChange(){this.requestUpdate()}getCurrentTextModeLabel(){return(this.checked?this.onLabel:this.offLabel).trim()}getTextModeAriaLabel(){const e=this.textContent?.replace(/\s+/g," ").trim()??"",s=this.getCurrentTextModeLabel();return e&&s?`${e}: ${s}`:e||s}formResetCallback(){this.formCtrl.handleFormReset()}formStateRestoreCallback(e){this.formCtrl.handleFormStateRestore(e)}formDisabledCallback(e){this.formCtrl.handleFormDisabled(e)}render(){return this.mode==="text"?d`
1
+ var s=function(a,e,i,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnPropertyDescriptor(e,i):l,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(a,e,i,l);else for(var h=a.length-1;h>=0;h--)(n=a[h])&&(o=(c<3?n(o):c>3?n(e,i,o):n(e,i))||o);return c>3&&o&&Object.defineProperty(e,i,o),o};import{css as m,html as d}from"lit";import{customElement as v,property as r}from"lit/decorators.js";import{classMap as p}from"lit/directives/class-map.js";import{EspalierElementBase as u}from"../shared/esp-element-base.js";import{FormFieldController as b}from"../shared/form-field-controller.js";import{FormFieldDescriptionController as g}from"../shared/form-field-description-controller.js";import{disabledControl as w,focusRing as f,srOnly as y}from"../shared/style-fragments.js";let t=class extends u{constructor(){super(...arguments),this.internals=this.attachInternals(),this.formCtrl=new b({host:this,internals:this.internals,getFormValue:()=>this.checked?this.value||"on":null,getValidity:()=>this.required&&!this.checked?{flags:{valueMissing:!0},message:this.requiredMessage||"Please toggle this switch to continue."}:null,onReset:()=>{this.checked=!1},onRestore:e=>{this.checked=e==="on"||e===this.value},onDisabled:e=>{this.disabled=e}}),this.formItemDescription=new g({host:this,getTarget:()=>this.shadowRoot?.querySelector(".switch-control")}),this.mode="switch",this.offLabel="",this.onLabel="",this.checked=!1,this.value="",this.name="",this.required=!1,this.requiredMessage="",this.disabled=!1}focus(e){this.focusShadowElementAfterUpdate(".switch-control",e)}setFormItemDescription(e){this.formItemDescription.setDescription(e)}validate(){this.formCtrl.validate()}checkValidity(){return this.formCtrl.checkValidity()}toggle(){this.disabled||(this.checked=!this.checked,this.formCtrl.syncValue(),this.emitValueChanged({checked:this.checked,value:this.value}))}handleKeyDown(e){(e.key===" "||e.key==="Enter")&&(e.preventDefault(),this.toggle())}handleLabelSlotChange(){this.requestUpdate()}getCurrentTextModeLabel(){return(this.checked?this.onLabel:this.offLabel).trim()}getTextModeAriaLabel(){const e=this.textContent?.replace(/\s+/g," ").trim()??"",i=this.getCurrentTextModeLabel();return e&&i?`${e}: ${i}`:e||i}formResetCallback(){this.formCtrl.handleFormReset()}formStateRestoreCallback(e){this.formCtrl.handleFormStateRestore(e)}formDisabledCallback(e){this.formCtrl.handleFormDisabled(e)}render(){return this.mode==="text"?d`
2
2
  <div
3
3
  class="switch-control text-control"
4
4
  role="switch"
@@ -34,7 +34,7 @@ var i=function(a,e,s,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnP
34
34
  </div>
35
35
  <span class="label"><slot></slot></span>
36
36
  </div>
37
- `}};t.formAssociated=!0,t.styles=[...u.styles,x,m(".switch-control:focus-visible","--esp-switch-focus-shadow"),m(".text-control:focus-visible","--esp-switch-focus-shadow"),w(".switch-control"),f`
37
+ `}};t.formAssociated=!0,t.styles=[...u.styles,y,f(".switch-control:focus-visible","--esp-switch-focus-shadow"),f(".text-control:focus-visible","--esp-switch-focus-shadow"),w(".switch-control"),m`
38
38
  :host {
39
39
  display: block;
40
40
  }
@@ -45,7 +45,10 @@ var i=function(a,e,s,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnP
45
45
  align-items: center;
46
46
  gap: var(--esp-size-tiny);
47
47
  cursor: pointer;
48
- font-family: var(--esp-font-body);
48
+ font-family: var(
49
+ --_esp-font-body-effective,
50
+ var(--esp-font-body, var(--_esp-font-body-fallback))
51
+ );
49
52
  font-size: var(--esp-size-font);
50
53
  color: var(--esp-color-text);
51
54
  outline: none;
@@ -110,7 +113,10 @@ var i=function(a,e,s,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnP
110
113
  border-radius: calc(var(--esp-size-border-radius) + 2px);
111
114
  padding: 2px;
112
115
  gap: 0;
113
- font-family: var(--esp-font-body);
116
+ font-family: var(
117
+ --_esp-font-body-effective,
118
+ var(--esp-font-body, var(--_esp-font-body-fallback))
119
+ );
114
120
  font-size: var(--esp-switch-text-font-size, var(--esp-size-font));
115
121
  user-select: none;
116
122
  cursor: pointer;
@@ -147,4 +153,4 @@ var i=function(a,e,s,l){var c=arguments.length,o=c<3?e:l===null?l=Object.getOwnP
147
153
  .text-option.active {
148
154
  color: var(--esp-switch-text-active-color, var(--esp-color-action-text));
149
155
  }
150
- `],i([r({type:String,reflect:!0})],t.prototype,"mode",void 0),i([r({attribute:"off-label"})],t.prototype,"offLabel",void 0),i([r({attribute:"on-label"})],t.prototype,"onLabel",void 0),i([r({type:Boolean,reflect:!0})],t.prototype,"checked",void 0),i([r({type:String})],t.prototype,"value",void 0),i([r({type:String,reflect:!0})],t.prototype,"name",void 0),i([r({type:Boolean,reflect:!0})],t.prototype,"required",void 0),i([r({attribute:"required-message"})],t.prototype,"requiredMessage",void 0),i([r({type:Boolean,reflect:!0})],t.prototype,"disabled",void 0),t=i([v("esp-switch")],t);export{t as EspalierSwitch};
156
+ `],s([r({type:String,reflect:!0})],t.prototype,"mode",void 0),s([r({attribute:"off-label"})],t.prototype,"offLabel",void 0),s([r({attribute:"on-label"})],t.prototype,"onLabel",void 0),s([r({type:Boolean,reflect:!0})],t.prototype,"checked",void 0),s([r({type:String})],t.prototype,"value",void 0),s([r({type:String,reflect:!0})],t.prototype,"name",void 0),s([r({type:Boolean,reflect:!0})],t.prototype,"required",void 0),s([r({attribute:"required-message"})],t.prototype,"requiredMessage",void 0),s([r({type:Boolean,reflect:!0})],t.prototype,"disabled",void 0),t=s([v("esp-switch")],t);export{t as EspalierSwitch};
@@ -1,4 +1,4 @@
1
- var b=function(i,t,a,e){var s=arguments.length,o=s<3?t:e===null?e=Object.getOwnPropertyDescriptor(t,a):e,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(i,t,a,e);else for(var l=i.length-1;l>=0;l--)(r=i[l])&&(o=(s<3?r(o):s>3?r(t,a,o):r(t,a))||o);return s>3&&o&&Object.defineProperty(t,a,o),o};import{css as u,html as d,nothing as f}from"lit";import{customElement as v,property as m,state as g}from"lit/decorators.js";import{createRef as y,ref as w}from"lit/directives/ref.js";import{EspalierElementBase as c}from"../shared/esp-element-base.js";import{ESP_EVENTS as T}from"../shared/events.js";import{EspalierTab as p}from"./esp-tab.js";import{disabledControl as k}from"../shared/style-fragments.js";let n=class extends c{constructor(){super(...arguments),this.panelsSlot=y(),this.disabled=!1,this.tabData=[]}getTabs(){const t=this.panelsSlot.value?Array.from(this.panelsSlot.value.assignedElements()).filter(a=>a instanceof p):[];return t.length>0?t:Array.from(this.children).filter(a=>a instanceof p)}syncTabData(){const t=this.getTabs();if(t.length===0){this.tabData=[];return}const a=t.find(e=>e.active&&!e.disabled);if(a)for(const e of t)e!==a&&(e.active=!1);else{const e=t.find(s=>!s.disabled);e?e.active=!0:t[0].active=!0}this.tabData=t.map((e,s)=>{const o=`esp-tab-btn-${this.correlationId}-${s}`,r=`esp-tab-panel-${this.correlationId}-${s}`;return e.panelId=r,e.ariaLabelledBy=o,{label:e.label,active:e.active,disabled:this.disabled||e.disabled,buttonId:o,panelId:r}})}activateTab(t){const a=this.getTabs(),e=a[t];if(!(!e||e.disabled||this.disabled)){for(const s of a)s.active=s===e;this.syncTabData(),this.dispatchEvent(new CustomEvent(T.TAB_GROUP_CHANGED,{detail:{index:t,label:e.label},bubbles:!0,composed:!0}))}}handleTabClick(t){this.activateTab(t),this.updateComplete.then(()=>{this.shadowRoot?.getElementById(this.tabData[t]?.buttonId)?.focus()})}handleKeyDown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;t.preventDefault();const e=this.tabData.map((l,h)=>({td:l,i:h})).filter(({td:l})=>!l.disabled).map(({i:l})=>l);if(e.length===0)return;const s=this.tabData.findIndex(l=>l.active),o=e.indexOf(s);let r;switch(t.key){case"ArrowRight":o===-1?r=e[0]:r=e[(o+1)%e.length];break;case"ArrowLeft":o===-1?r=e[e.length-1]:r=e[(o-1+e.length)%e.length];break;case"Home":r=e[0];break;case"End":r=e[e.length-1];break;default:return}this.activateTab(r),this.updateComplete.then(()=>{this.shadowRoot?.getElementById(this.tabData[r]?.buttonId)?.focus()})}handleChildUpdated(){this.syncTabData()}handleSlotChange(){this.syncTabData()}connectedCallback(){super.connectedCallback(),this.syncTabData()}willUpdate(t){super.willUpdate(t),t.has("disabled")&&this.syncTabData()}render(){return d`
1
+ var b=function(i,t,a,e){var s=arguments.length,o=s<3?t:e===null?e=Object.getOwnPropertyDescriptor(t,a):e,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(i,t,a,e);else for(var l=i.length-1;l>=0;l--)(r=i[l])&&(o=(s<3?r(o):s>3?r(t,a,o):r(t,a))||o);return s>3&&o&&Object.defineProperty(t,a,o),o};import{css as u,html as d,nothing as f}from"lit";import{customElement as v,property as m,state as g}from"lit/decorators.js";import{createRef as y,ref as w}from"lit/directives/ref.js";import{EspalierElementBase as c}from"../shared/esp-element-base.js";import{ESP_EVENTS as k}from"../shared/events.js";import{EspalierTab as p}from"./esp-tab.js";import{disabledControl as T}from"../shared/style-fragments.js";let n=class extends c{constructor(){super(...arguments),this.panelsSlot=y(),this.disabled=!1,this.tabData=[]}getTabs(){const t=this.panelsSlot.value?Array.from(this.panelsSlot.value.assignedElements()).filter(a=>a instanceof p):[];return t.length>0?t:Array.from(this.children).filter(a=>a instanceof p)}syncTabData(){const t=this.getTabs();if(t.length===0){this.tabData=[];return}const a=t.find(e=>e.active&&!e.disabled);if(a)for(const e of t)e!==a&&(e.active=!1);else{const e=t.find(s=>!s.disabled);e?e.active=!0:t[0].active=!0}this.tabData=t.map((e,s)=>{const o=`esp-tab-btn-${this.correlationId}-${s}`,r=`esp-tab-panel-${this.correlationId}-${s}`;return e.panelId=r,e.ariaLabelledBy=o,{label:e.label,active:e.active,disabled:this.disabled||e.disabled,buttonId:o,panelId:r}})}activateTab(t){const a=this.getTabs(),e=a[t];if(!(!e||e.disabled||this.disabled)){for(const s of a)s.active=s===e;this.syncTabData(),this.dispatchEvent(new CustomEvent(k.TAB_GROUP_CHANGED,{detail:{index:t,label:e.label},bubbles:!0,composed:!0}))}}handleTabClick(t){this.activateTab(t),this.updateComplete.then(()=>{this.shadowRoot?.getElementById(this.tabData[t]?.buttonId)?.focus()})}handleKeyDown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;t.preventDefault();const e=this.tabData.map((l,h)=>({td:l,i:h})).filter(({td:l})=>!l.disabled).map(({i:l})=>l);if(e.length===0)return;const s=this.tabData.findIndex(l=>l.active),o=e.indexOf(s);let r;switch(t.key){case"ArrowRight":o===-1?r=e[0]:r=e[(o+1)%e.length];break;case"ArrowLeft":o===-1?r=e[e.length-1]:r=e[(o-1+e.length)%e.length];break;case"Home":r=e[0];break;case"End":r=e[e.length-1];break;default:return}this.activateTab(r),this.updateComplete.then(()=>{this.shadowRoot?.getElementById(this.tabData[r]?.buttonId)?.focus()})}handleChildUpdated(){this.syncTabData()}handleSlotChange(){this.syncTabData()}connectedCallback(){super.connectedCallback(),this.syncTabData()}willUpdate(t){super.willUpdate(t),t.has("disabled")&&this.syncTabData()}render(){return d`
2
2
  <div class="tab-container">
3
3
  <div class="tab-list" role="tablist" part="tab-list" @keydown=${this.handleKeyDown}>
4
4
  ${this.tabData.map((t,a)=>d`
@@ -26,7 +26,7 @@ var b=function(i,t,a,e){var s=arguments.length,o=s<3?t:e===null?e=Object.getOwnP
26
26
  ></slot>
27
27
  </div>
28
28
  </div>
29
- `}};n.styles=[...c.styles,k(".tab-button[disabled]"),u`
29
+ `}};n.styles=[...c.styles,T(".tab-button[disabled]"),u`
30
30
  :host {
31
31
  display: block;
32
32
  --_esp-tab-resolved-button-hover: var(
@@ -58,7 +58,10 @@ var b=function(i,t,a,e){var s=arguments.length,o=s<3?t:e===null?e=Object.getOwnP
58
58
  }
59
59
 
60
60
  .tab-button {
61
- font-family: var(--esp-font-body);
61
+ font-family: var(
62
+ --_esp-font-body-effective,
63
+ var(--esp-font-body, var(--_esp-font-body-fallback))
64
+ );
62
65
  font-size: var(--esp-size-font);
63
66
  font-weight: 600;
64
67
  color: var(--esp-tab-color-text, var(--esp-color-headings));
@@ -1,4 +1,4 @@
1
- var l=function(s,e,o,r){var p=arguments.length,a=p<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,o):r,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")a=Reflect.decorate(s,e,o,r);else for(var d=s.length-1;d>=0;d--)(n=s[d])&&(a=(p<3?n(a):p>3?n(e,o,a):n(e,o))||a);return p>3&&a&&Object.defineProperty(e,o,a),a};import{css as f,html as u}from"lit";import{customElement as c,property as i}from"lit/decorators.js";import{EspalierElementBase as b}from"../shared/esp-element-base.js";let t=class extends b{constructor(){super(...arguments),this.label="",this.active=!1,this.disabled=!1,this.panelId="",this.ariaLabelledBy=""}updated(e){super.updated(e),(e.has("label")||e.has("active")||e.has("disabled"))&&this.dispatchEvent(new CustomEvent("esp-internal-tab-updated",{bubbles:!0,composed:!0}))}render(){return u`
1
+ var l=function(i,e,o,r){var p=arguments.length,a=p<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,o):r,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")a=Reflect.decorate(i,e,o,r);else for(var d=i.length-1;d>=0;d--)(n=i[d])&&(a=(p<3?n(a):p>3?n(e,o,a):n(e,o))||a);return p>3&&a&&Object.defineProperty(e,o,a),a};import{css as f,html as c}from"lit";import{customElement as v,property as s}from"lit/decorators.js";import{EspalierElementBase as b}from"../shared/esp-element-base.js";let t=class extends b{constructor(){super(...arguments),this.label="",this.active=!1,this.disabled=!1,this.panelId="",this.ariaLabelledBy=""}updated(e){super.updated(e),(e.has("label")||e.has("active")||e.has("disabled"))&&this.dispatchEvent(new CustomEvent("esp-internal-tab-updated",{bubbles:!0,composed:!0}))}render(){return c`
2
2
  <div
3
3
  part="panel"
4
4
  role="tabpanel"
@@ -19,9 +19,12 @@ var l=function(s,e,o,r){var p=arguments.length,a=p<3?e:r===null?r=Object.getOwnP
19
19
 
20
20
  [part="panel"] {
21
21
  padding: var(--esp-tab-size-padding, var(--esp-size-padding));
22
- font-family: var(--esp-font-body);
22
+ font-family: var(
23
+ --_esp-font-body-effective,
24
+ var(--esp-font-body, var(--_esp-font-body-fallback))
25
+ );
23
26
  font-size: var(--esp-size-font);
24
27
  color: var(--esp-color-text);
25
28
  outline: none;
26
29
  }
27
- `],l([i({type:String})],t.prototype,"label",void 0),l([i({type:Boolean,reflect:!0})],t.prototype,"active",void 0),l([i({type:Boolean,reflect:!0})],t.prototype,"disabled",void 0),l([i({attribute:!1})],t.prototype,"panelId",void 0),l([i({attribute:!1})],t.prototype,"ariaLabelledBy",void 0),t=l([c("esp-tab")],t);export{t as EspalierTab};
30
+ `],l([s({type:String})],t.prototype,"label",void 0),l([s({type:Boolean,reflect:!0})],t.prototype,"active",void 0),l([s({type:Boolean,reflect:!0})],t.prototype,"disabled",void 0),l([s({attribute:!1})],t.prototype,"panelId",void 0),l([s({attribute:!1})],t.prototype,"ariaLabelledBy",void 0),t=l([v("esp-tab")],t);export{t as EspalierTab};
@@ -264,7 +264,10 @@ var d=function(c,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnP
264
264
  }
265
265
 
266
266
  .tree {
267
- font-family: var(--esp-font-body);
267
+ font-family: var(
268
+ --_esp-font-body-effective,
269
+ var(--esp-font-body, var(--_esp-font-body-fallback))
270
+ );
268
271
  font-size: var(--esp-size-font);
269
272
  color: var(--esp-color-text);
270
273
  display: grid;
@@ -543,19 +543,19 @@
543
543
  },
544
544
  {
545
545
  "name": "--esp-font-body",
546
- "description": ""
546
+ "description": "Always-emitted family for body and UI text. Defaults to `system-ui, sans-serif` when `fontBody` is omitted or empty."
547
547
  },
548
548
  {
549
549
  "name": "--esp-font-brand",
550
- "description": ""
550
+ "description": "Consumer-authored brand family. Emitted only when configured; brand recipes otherwise fall back through headings to `--esp-font-body`."
551
551
  },
552
552
  {
553
553
  "name": "--esp-font-headings",
554
- "description": ""
554
+ "description": "Consumer-authored heading family. Emitted only when configured; heading recipes otherwise fall back to `--esp-font-body`."
555
555
  },
556
556
  {
557
557
  "name": "--esp-font-monospace",
558
- "description": ""
558
+ "description": "Family for code and monospace text. Defaults to `monospace`."
559
559
  },
560
560
  {
561
561
  "name": "--esp-font-weight-body",
@@ -807,7 +807,7 @@
807
807
  },
808
808
  {
809
809
  "name": "--esp-header-brand-font-family",
810
- "description": "The configured brand font family. Defaults to `var(--esp-font-brand, var(--esp-font-headings))`."
810
+ "description": "The configured brand font family. Defaults through `--esp-font-brand` and `--esp-font-headings` to `--esp-font-body`."
811
811
  },
812
812
  {
813
813
  "name": "--esp-header-brand-font-size",
@@ -833,6 +833,10 @@
833
833
  "name": "--esp-header-brand-hover-decoration",
834
834
  "description": "The configured brand hover text decoration. Defaults to `none`."
835
835
  },
836
+ {
837
+ "name": "--esp-header-brand-hover-transform",
838
+ "description": "The configured brand hover transform. Defaults to `none`."
839
+ },
836
840
  {
837
841
  "name": "--esp-header-brand-inline-placement",
838
842
  "description": "The CSS `justify-content` value for the brand container. Defaults to `start`."
@@ -737,22 +737,24 @@
737
737
  {
738
738
  "name": "--esp-font-body",
739
739
  "category": "root-theme",
740
- "description": ""
740
+ "description": "Always-emitted family for body and UI text. Defaults to `system-ui, sans-serif` when `fontBody` is omitted or empty.",
741
+ "default": "system-ui, sans-serif"
741
742
  },
742
743
  {
743
744
  "name": "--esp-font-brand",
744
745
  "category": "root-theme",
745
- "description": ""
746
+ "description": "Consumer-authored brand family. Emitted only when configured; brand recipes otherwise fall back through headings to `--esp-font-body`."
746
747
  },
747
748
  {
748
749
  "name": "--esp-font-headings",
749
750
  "category": "root-theme",
750
- "description": ""
751
+ "description": "Consumer-authored heading family. Emitted only when configured; heading recipes otherwise fall back to `--esp-font-body`."
751
752
  },
752
753
  {
753
754
  "name": "--esp-font-monospace",
754
755
  "category": "root-theme",
755
- "description": ""
756
+ "description": "Family for code and monospace text. Defaults to `monospace`.",
757
+ "default": "monospace"
756
758
  },
757
759
  {
758
760
  "name": "--esp-font-weight-body",
@@ -1126,7 +1128,7 @@
1126
1128
  "name": "--esp-header-brand-font-family",
1127
1129
  "category": "component",
1128
1130
  "component": "esp-header",
1129
- "description": "The configured brand font family. Defaults to `var(--esp-font-brand, var(--esp-font-headings))`."
1131
+ "description": "The configured brand font family. Defaults through `--esp-font-brand` and `--esp-font-headings` to `--esp-font-body`."
1130
1132
  },
1131
1133
  {
1132
1134
  "name": "--esp-header-brand-font-size",
@@ -1164,6 +1166,12 @@
1164
1166
  "component": "esp-header",
1165
1167
  "description": "The configured brand hover text decoration. Defaults to `none`."
1166
1168
  },
1169
+ {
1170
+ "name": "--esp-header-brand-hover-transform",
1171
+ "category": "component",
1172
+ "component": "esp-header",
1173
+ "description": "The configured brand hover transform. Defaults to `none`."
1174
+ },
1167
1175
  {
1168
1176
  "name": "--esp-header-brand-inline-placement",
1169
1177
  "category": "component",
@@ -8,7 +8,8 @@ removing, or replacing non-code assets.
8
8
 
9
9
  | Asset area | Provenance | Notice |
10
10
  |------------|------------|--------|
11
- | `css/fonts/**` | Generated Google Fonts preview CSS with per-family notices generated from upstream Google Fonts metadata links. | `licenses/GOOGLE_FONTS_NOTICES.md` |
11
+ | `css/fonts/*.css`, `css/fonts/font-definitions.json` | Generated Google Fonts preview CSS and catalog with per-family notices generated from upstream Google Fonts metadata links. | `licenses/GOOGLE_FONTS_NOTICES.md` |
12
+ | `css/fonts/font-fallback-profiles.json` | Variant metrics derived from `@capsizecss/metrics` with `@capsizecss/core`, serialized by Taproot's deterministic maintainer generator. | `licenses/THIRD_PARTY_NOTICES.md` |
12
13
  | `assets/shell-fonts.css`, `assets/shell-fonts/**` | Docs-only self-hosted Quicksand, Oswald, and Sometype Mono WOFF2 subsets under OFL 1.1, downloaded once from the Google Fonts css2 endpoint and checked in so the documentation shell never calls Google at runtime. | `licenses/THIRD_PARTY_NOTICES.md` |
13
14
  | `assets/icons.svg` | Tabler-derived SVG symbols plus Taproot-owned logo symbol. | `licenses/THIRD_PARTY_NOTICES.md` |
14
15
  | `*.ts` | Inline Tabler-style SVG templates and Taproot rendering helpers. | `licenses/THIRD_PARTY_NOTICES.md` |
@@ -76,6 +76,41 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
76
76
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
77
77
  SOFTWARE.
78
78
 
79
+ ## Capsize Font Metrics
80
+
81
+ `css/fonts/font-fallback-profiles.json` is generated from the Google and system
82
+ font metrics distributed by `@capsizecss/metrics`, using the calculations in
83
+ `@capsizecss/core`. The packages are maintainer-only dependencies; their
84
+ derived variant metrics are included in the published profile catalog.
85
+
86
+ - Project: Capsize
87
+ - Upstream: https://github.com/seek-oss/capsize
88
+ - Packages: `@capsizecss/metrics` 4.2.0 and `@capsizecss/core` 4.1.3
89
+ - License: MIT License
90
+ - Copyright: Copyright (c) 2021 SEEK
91
+
92
+ MIT License
93
+
94
+ Copyright (c) 2021 SEEK
95
+
96
+ Permission is hereby granted, free of charge, to any person obtaining a copy
97
+ of this software and associated documentation files (the "Software"), to deal
98
+ in the Software without restriction, including without limitation the rights
99
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
100
+ copies of the Software, and to permit persons to whom the Software is
101
+ furnished to do so, subject to the following conditions:
102
+
103
+ The above copyright notice and this permission notice shall be included in all
104
+ copies or substantial portions of the Software.
105
+
106
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
107
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
108
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
109
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
110
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
111
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
112
+ SOFTWARE.
113
+
79
114
  ## Documentation Shell Fonts
80
115
 
81
116
  The Espalier documentation site self-hosts the three faces its theme names, so
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "updatedAt": "2026-08-22",
3
+ "updatedAt": "2026-08-28",
4
4
  "entries": [
5
5
  {
6
6
  "id": "google-font-preview-assets",
7
7
  "paths": [
8
- "css/fonts/**"
8
+ "css/fonts/*.css",
9
+ "css/fonts/font-definitions.json"
9
10
  ],
10
11
  "assetType": "generated font preview assets",
11
12
  "classification": "third-party-generated",
@@ -25,6 +26,29 @@
25
26
  ],
26
27
  "reviewStatus": "manifest-gated"
27
28
  },
29
+ {
30
+ "id": "capsize-font-fallback-profiles",
31
+ "paths": [
32
+ "css/fonts/font-fallback-profiles.json"
33
+ ],
34
+ "assetType": "generated font metric profile catalog",
35
+ "classification": "third-party-derived",
36
+ "owner": "SEEK for Capsize metrics and calculations; Taproot for catalog serialization",
37
+ "source": "@capsizecss/metrics 4.2.0 and @capsizecss/core 4.1.3",
38
+ "license": "MIT License",
39
+ "transformations": [
40
+ "Join the committed Google Fonts catalog to Capsize family, variant, and system fallback metrics",
41
+ "Calculate subset-specific size-adjust and vertical metric overrides",
42
+ "Encode the selected fallback variants and bounded-precision percentages as deterministic JSON"
43
+ ],
44
+ "packageInclusion": "included in npm package for host build tooling; never required by the browser runtime",
45
+ "docsInclusion": "documented as the build-time source for site-specific inline font plans",
46
+ "noticeRequirement": "required",
47
+ "noticePaths": [
48
+ "licenses/THIRD_PARTY_NOTICES.md"
49
+ ],
50
+ "reviewStatus": "manifest-gated"
51
+ },
28
52
  {
29
53
  "id": "tabler-svg-sprite",
30
54
  "paths": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taprootio/espalier",
3
- "version": "4.2.0",
3
+ "version": "4.4.0",
4
4
  "packageManager": "bun@1.3.12",
5
5
  "description": "Espalier — a themeable, accessible, framework-agnostic, enterprise-grade design system built on web standards and love.",
6
6
  "customElements": "custom-elements.json",
@@ -313,6 +313,10 @@
313
313
  "types": "./dist/shared/font-helpers.d.ts",
314
314
  "import": "./dist/shared/font-helpers.js"
315
315
  },
316
+ "./shared/font-plan": {
317
+ "types": "./dist/shared/font-plan.d.ts",
318
+ "import": "./dist/shared/font-plan.js"
319
+ },
316
320
  "./shared/cursor-pagination": {
317
321
  "types": "./dist/shared/cursor-pagination.d.ts",
318
322
  "import": "./dist/shared/cursor-pagination.js"
@@ -338,6 +342,8 @@
338
342
  "import": "./dist/shared/bus-events.js"
339
343
  },
340
344
  "./espalier.token-manifest.json": "./espalier.token-manifest.json",
345
+ "./css/fonts/font-definitions.json": "./css/fonts/font-definitions.json",
346
+ "./css/fonts/font-fallback-profiles.json": "./css/fonts/font-fallback-profiles.json",
341
347
  "./textures/banner-textures.css": "./css/textures/banner-textures.css",
342
348
  "./textures/espalier-paper.png": "./css/textures/espalier-paper.png",
343
349
  "./textures/espalier-grain.png": "./css/textures/espalier-grain.png",
@@ -345,7 +351,6 @@
345
351
  "./custom-elements.json": "./custom-elements.json",
346
352
  "./espalier.css-data.json": "./espalier.css-data.json",
347
353
  "./css/esp-reset.css": "./css/esp-reset.css",
348
- "./css/fonts/font-definitions.json": "./css/fonts/font-definitions.json",
349
354
  "./css/fonts/*.css": "./css/fonts/*.css"
350
355
  },
351
356
  "sideEffects": [
@@ -362,6 +367,7 @@
362
367
  "css/esp-reset.css",
363
368
  "css/fonts/**/*.css",
364
369
  "css/fonts/font-definitions.json",
370
+ "css/fonts/font-fallback-profiles.json",
365
371
  "css/textures/banner-textures.css",
366
372
  "css/textures/*.png",
367
373
  "custom-elements.json",