@ds-mo/ui 0.9.4 → 0.10.1

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 (62) hide show
  1. package/dist/components/ds-bar-nav-action.d.ts +11 -0
  2. package/dist/components/ds-bar-nav-action.js +2 -0
  3. package/dist/components/ds-bar-nav-action.js.map +1 -0
  4. package/dist/components/ds-bar-nav.d.ts +11 -0
  5. package/dist/components/ds-bar-nav.js +2 -0
  6. package/dist/components/ds-bar-nav.js.map +1 -0
  7. package/dist/components/ds-breadcrumb.js +1 -1
  8. package/dist/components/ds-button-group.js +1 -1
  9. package/dist/components/ds-button-group.js.map +1 -1
  10. package/dist/components/ds-button.js +1 -1
  11. package/dist/components/ds-card.js +1 -1
  12. package/dist/components/ds-card.js.map +1 -1
  13. package/dist/components/ds-checkbox.js +1 -1
  14. package/dist/components/ds-divider.js +1 -1
  15. package/dist/components/ds-empty-state.js +1 -1
  16. package/dist/components/ds-empty-state.js.map +1 -1
  17. package/dist/components/ds-fade.js +1 -1
  18. package/dist/components/ds-field.js +1 -1
  19. package/dist/components/ds-header.js +1 -1
  20. package/dist/components/ds-header.js.map +1 -1
  21. package/dist/components/ds-icon.js +1 -1
  22. package/dist/components/ds-input.js +1 -1
  23. package/dist/components/ds-label-wrap.js +1 -1
  24. package/dist/components/ds-modal.js +1 -1
  25. package/dist/components/ds-panel-nav.js +1 -1
  26. package/dist/components/ds-radio-group.js +1 -1
  27. package/dist/components/ds-scrollbar.js +1 -1
  28. package/dist/components/ds-select.js +1 -1
  29. package/dist/components/ds-slider.js +1 -1
  30. package/dist/components/ds-surface.js +1 -1
  31. package/dist/components/ds-tab-group.js +1 -1
  32. package/dist/components/ds-tab-group.js.map +1 -1
  33. package/dist/components/ds-table.js +1 -1
  34. package/dist/components/ds-table.js.map +1 -1
  35. package/dist/components/ds-tag.js +1 -1
  36. package/dist/components/ds-text.js +1 -1
  37. package/dist/components/ds-toast-provider.js +1 -1
  38. package/dist/components/ds-toggle-button-group.js +1 -1
  39. package/dist/components/ds-toggle-button.js +1 -1
  40. package/dist/components/ds-toggle.js +1 -1
  41. package/dist/components/ds-tooltip.js +1 -1
  42. package/dist/components/{p-DdN6WnFs.js → p-B51N5kiy.js} +2 -2
  43. package/dist/components/{p-Leo9RPok.js → p-C_mk7BoY.js} +2 -2
  44. package/dist/components/p-CdSPCP4g.js +2 -0
  45. package/dist/components/p-CdSPCP4g.js.map +1 -0
  46. package/dist/components/{p-CGuwZUFk.js → p-CkBXHj0e.js} +2 -2
  47. package/dist/components/p-D1cpKdRU.js +2 -0
  48. package/dist/components/p-D1cpKdRU.js.map +1 -0
  49. package/dist/components/{p-DRuXu8Ql.js → p-M_LSU5Uu.js} +2 -2
  50. package/dist/types/.stencil/BarNav/BarNav.d.ts +52 -0
  51. package/dist/types/.stencil/BarNav/index.d.ts +2 -0
  52. package/dist/types/.stencil/BarNavAction/BarNavAction.d.ts +20 -0
  53. package/dist/types/.stencil/BarNavAction/index.d.ts +2 -0
  54. package/dist/types/.stencil/TabGroup/TabGroup.d.ts +2 -11
  55. package/dist/types/components.d.ts +190 -0
  56. package/package.json +2 -2
  57. package/src/angular/index.ts +2 -0
  58. package/src/angular/proxies.ts +65 -0
  59. /package/dist/components/{p-DdN6WnFs.js.map → p-B51N5kiy.js.map} +0 -0
  60. /package/dist/components/{p-Leo9RPok.js.map → p-C_mk7BoY.js.map} +0 -0
  61. /package/dist/components/{p-CGuwZUFk.js.map → p-CkBXHj0e.js.map} +0 -0
  62. /package/dist/components/{p-DRuXu8Ql.js.map → p-M_LSU5Uu.js.map} +0 -0
@@ -0,0 +1,2 @@
1
+ import{p as r,H as o,c as e,h as t,a,t as s}from"./index.js";const n=()=>`.sc-ds-tab-group-h{display:block}.tab-list.sc-ds-tab-group{display:flex;align-items:center;gap:var(--dimension-space-050);position:relative}.tab-list--vertical.sc-ds-tab-group{flex-direction:column;align-items:stretch}.tab.sc-ds-tab-group{display:flex;align-items:center;justify-content:center;gap:var(--dimension-space-050);padding:var(--dimension-space-075);background-color:transparent;border:none;border-radius:var(--dimension-radius-025);cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--color-foreground-secondary);position:relative;transition:color var(--effect-motion-short-2);flex-shrink:0;height:var(--dimension-size-400);min-width:var(--dimension-size-400);box-sizing:border-box;--_hover-bg:var(--color-interaction-hover);--_pressed-bg:var(--color-interaction-pressed);--_dot:var(--color-foreground-bold-brand)}.tab.sc-ds-tab-group::after{content:'';position:absolute;inset:0;border-radius:var(--dimension-radius-025, 2px);background:transparent;pointer-events:none;transition:background var(--effect-animation-duration-short-3, 200ms) var(--effect-animation-easing-ease-out, ease)}.tab.sc-ds-tab-group:hover::after{background:var(--_hover-bg);transition:none}.tab.sc-ds-tab-group:active::after{background:var(--_pressed-bg);transition:none}.tab--selected.sc-ds-tab-group{color:var(--color-foreground-primary)}.tab.sc-ds-tab-group:focus-visible{outline:var(--dimension-stroke-width-025) solid var(--color-interaction-focus);outline-offset:var(--dimension-space-025)}.tab.sc-ds-tab-group:disabled,.tab[aria-disabled="true"].sc-ds-tab-group{opacity:0.5;cursor:not-allowed;pointer-events:none}.tab-list--vertical.sc-ds-tab-group .tab.sc-ds-tab-group{justify-content:flex-start}.tab__label.sc-ds-tab-group{position:relative;padding:0 var(--dimension-space-025);white-space:nowrap}.tab__dot-wrap.sc-ds-tab-group{position:relative;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0}.tab__dot.sc-ds-tab-group{width:var(--dimension-space-075);height:var(--dimension-space-075);border-radius:var(--dimension-radius-full, 9999px);background:var(--_dot)}.on-medium.sc-ds-tab-group{--_hover-bg:var(--color-interaction-on-medium-background-hover);--_pressed-bg:var(--color-interaction-on-medium-background-pressed)}.on-bold.sc-ds-tab-group{--_hover-bg:var(--color-interaction-on-bold-background-hover);--_pressed-bg:var(--color-interaction-on-bold-background-pressed);color:var(--color-foreground-on-bold-background-secondary)}.on-bold.tab--selected.sc-ds-tab-group{color:var(--color-foreground-on-bold-background-primary)}.on-strong.sc-ds-tab-group{--_hover-bg:var(--color-interaction-on-strong-background-hover);--_pressed-bg:var(--color-interaction-on-strong-background-pressed);color:var(--color-foreground-on-bold-background-secondary)}.on-strong.tab--selected.sc-ds-tab-group{color:var(--color-foreground-on-bold-background-primary)}.on-always-dark.sc-ds-tab-group{--_hover-bg:var(--color-always-dark-interaction-hover);--_pressed-bg:var(--color-always-dark-interaction-pressed);color:var(--color-always-dark-foreground-secondary)}.on-always-dark.tab--selected.sc-ds-tab-group{color:var(--color-always-dark-foreground-primary)}`;const i=r(class r extends o{constructor(r){super();if(r!==false){this.__registerHost()}this.dsChange=e(this,"dsChange");this.value="";this.tabs=[];this.orientation="horizontal"}selectTab(r){this.value=r;this.dsChange.emit(r)}findEnabled(r,o){const e=this.tabs.length;for(let t=0;t<e;t++){const a=(r+o*(t+1)+e*(t+1))%e;if(!this.tabs[a]?.disabled)return a}return r}handleKeyDown(r){if(!this.tabs.length)return;const o=this.tabs.findIndex((r=>r.id===this.value));const e=this.orientation==="vertical";let t=null;if(!e){if(r.key==="ArrowRight"){t=this.findEnabled(o,1)}else if(r.key==="ArrowLeft"){t=this.findEnabled(o,-1)}}else{if(r.key==="ArrowDown"){t=this.findEnabled(o,1)}else if(r.key==="ArrowUp"){t=this.findEnabled(o,-1)}}if(r.key==="Home"){const r=this.tabs.findIndex((r=>!r.disabled));t=r===-1?null:r}else if(r.key==="End"){const r=[...this.tabs].reverse().findIndex((r=>!r.disabled));t=r===-1?null:this.tabs.length-1-r}if(t!==null){r.preventDefault();const o=this.tabs[t];this.selectTab(o.id);const e=this.el.querySelector(`[data-tab-id="${o.id}"]`);e?.focus()}}getBgClass(){if(!this.background||this.background==="faint")return"";if(this.background==="always-dark")return"on-always-dark";return`on-${this.background}`}render(){const r=this.getBgClass();const o=this.orientation==="vertical";return t(a,{key:"eb385dcf5e03e68f92c6d310a13fe754af8258d0",class:"tab-group-host"},t("div",{key:"62cbb809e40f92dbf503a76438666411eabba2df",role:"tablist",class:{"tab-list":true,"tab-list--vertical":o},"aria-label":this.ariaLabel,"aria-labelledby":this.ariaLabelledby,"aria-orientation":o?"vertical":undefined},this.tabs.map((o=>{const e=o.id===this.value;return t("button",{key:o.id,type:"button",role:"tab","data-tab-id":o.id,class:{tab:true,"tab--selected":e,[r]:!!r},"aria-selected":e,"aria-disabled":o.disabled||undefined,"aria-controls":o.panelId??undefined,disabled:o.disabled,tabIndex:e?0:-1,onClick:()=>!o.disabled&&this.selectTab(o.id)},t("span",{class:`tab__label ${e?"text-body-medium-emphasis":"text-body-medium"}`},o.label),o.dot&&t("span",{class:"tab__dot-wrap","aria-hidden":"true"},t("span",{class:"tab__dot"})))}))))}get el(){return this}static get style(){return n()}},[2,"ds-tab-group",{value:[1025],tabs:[16],background:[1],ariaLabel:[1,"aria-label"],ariaLabelledby:[1,"aria-labelledby"],orientation:[1]},[[0,"keydown","handleKeyDown"]]]);function d(){if(typeof customElements==="undefined"){return}const r=["ds-tab-group"];r.forEach((r=>{switch(r){case"ds-tab-group":if(!customElements.get(s(r))){customElements.define(s(r),i)}break}}))}d();export{i as T,d};
2
+ //# sourceMappingURL=p-D1cpKdRU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["tabGroupCss","TabGroup","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","value","tabs","orientation","selectTab","id","dsChange","emit","findEnabled","from","step","len","length","n","i","disabled","handleKeyDown","e","currentIdx","findIndex","t","isVertical","nextIdx","key","first","lastEnabled","reverse","preventDefault","next","btn","el","querySelector","focus","getBgClass","background","render","bgClass","h","Host","class","role","ariaLabel","ariaLabelledby","undefined","map","tab","isSelected","type","panelId","tabIndex","onClick","label","dot"],"sources":["src/wc/components/TabGroup/TabGroup.css?tag=ds-tab-group&encapsulation=scoped","src/wc/components/TabGroup/TabGroup.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.tab-list {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n position: relative;\n}\n\n/* Vertical orientation */\n.tab-list--vertical {\n flex-direction: column;\n align-items: stretch;\n}\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-075);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-025);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n position: relative;\n /* Only transition color — hover bg is instant (see ::after below) */\n transition: color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--dimension-size-400);\n min-width: var(--dimension-size-400);\n box-sizing: border-box;\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n --_dot: var(--color-foreground-bold-brand);\n}\n\n/* Interaction layer — same pattern as PanelNav */\n.tab::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--dimension-radius-025, 2px);\n background: transparent;\n pointer-events: none;\n transition: background var(--effect-animation-duration-short-3, 200ms) var(--effect-animation-easing-ease-out, ease);\n}\n\n.tab:hover::after { background: var(--_hover-bg); transition: none; }\n.tab:active::after { background: var(--_pressed-bg); transition: none; }\n\n.tab--selected { color: var(--color-foreground-primary); }\n\n.tab:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n.tab:disabled,\n.tab[aria-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* Vertical tabs read as a list — left-align the label */\n.tab-list--vertical .tab { justify-content: flex-start; }\n\n/* Label — 2px inset matches the Figma text-label frame */\n.tab__label {\n position: relative;\n padding: 0 var(--dimension-space-025);\n white-space: nowrap;\n}\n\n/* Notification dot — 20×20 icon-slot wrapper, dot circle inside */\n.tab__dot-wrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n}\n\n.tab__dot {\n width: var(--dimension-space-075);\n height: var(--dimension-space-075);\n border-radius: var(--dimension-radius-full, 9999px);\n background: var(--_dot);\n}\n\n/* Background context */\n.on-medium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n}\n\n.on-bold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-bold.tab--selected { color: var(--color-foreground-on-bold-background-primary); }\n\n.on-strong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-strong.tab--selected { color: var(--color-foreground-on-bold-background-primary); }\n\n.on-always-dark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.on-always-dark.tab--selected { color: var(--color-always-dark-foreground-primary); }\n","import { Component, Prop, Event, EventEmitter, Element, Listen, h, Host } from '@stencil/core';\n\nexport type TabBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface TabItem {\n id: string;\n label: string;\n disabled?: boolean;\n /** id of the tabpanel this tab controls */\n panelId?: string;\n /** Show a notification dot (brand) on the tab — no count, matching panel-nav. */\n dot?: boolean;\n}\n\n@Component({\n tag: 'ds-tab-group',\n styleUrl: 'TabGroup.css',\n scoped: true,\n})\nexport class TabGroup {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop() tabs: TabItem[] = [];\n @Prop() background: TabBackground | undefined;\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | undefined;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n @Prop() orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n @Event() dsChange!: EventEmitter<string>;\n\n private selectTab(id: string) {\n this.value = id;\n this.dsChange.emit(id);\n }\n\n /**\n * Find the next non-disabled tab index relative to `from`, stepping by `step`.\n * Returns `from` unchanged if no other enabled tab exists.\n */\n private findEnabled(from: number, step: 1 | -1): number {\n const len = this.tabs.length;\n for (let n = 0; n < len; n++) {\n const i = (from + step * (n + 1) + len * (n + 1)) % len;\n if (!this.tabs[i]?.disabled) return i;\n }\n return from;\n }\n\n @Listen('keydown')\n handleKeyDown(e: KeyboardEvent) {\n if (!this.tabs.length) return;\n\n const currentIdx = this.tabs.findIndex(t => t.id === this.value);\n const isVertical = this.orientation === 'vertical';\n\n let nextIdx: number | null = null;\n\n if (!isVertical) {\n if (e.key === 'ArrowRight') {\n nextIdx = this.findEnabled(currentIdx, 1);\n } else if (e.key === 'ArrowLeft') {\n nextIdx = this.findEnabled(currentIdx, -1);\n }\n } else {\n if (e.key === 'ArrowDown') {\n nextIdx = this.findEnabled(currentIdx, 1);\n } else if (e.key === 'ArrowUp') {\n nextIdx = this.findEnabled(currentIdx, -1);\n }\n }\n\n if (e.key === 'Home') {\n const first = this.tabs.findIndex(t => !t.disabled);\n nextIdx = first === -1 ? null : first;\n } else if (e.key === 'End') {\n const lastEnabled = [...this.tabs].reverse().findIndex(t => !t.disabled);\n nextIdx = lastEnabled === -1 ? null : this.tabs.length - 1 - lastEnabled;\n }\n\n if (nextIdx !== null) {\n e.preventDefault();\n const next = this.tabs[nextIdx];\n this.selectTab(next.id);\n const btn = this.el.querySelector(`[data-tab-id=\"${next.id}\"]`) as HTMLElement | null;\n btn?.focus();\n }\n }\n\n private getBgClass(): string {\n if (!this.background || this.background === 'faint') return '';\n if (this.background === 'always-dark') return 'on-always-dark';\n return `on-${this.background}`;\n }\n\n render() {\n const bgClass = this.getBgClass();\n const isVertical = this.orientation === 'vertical';\n\n return (\n <Host class=\"tab-group-host\">\n <div\n role=\"tablist\"\n class={{ 'tab-list': true, 'tab-list--vertical': isVertical }}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-orientation={isVertical ? 'vertical' : undefined}\n >\n {this.tabs.map(tab => {\n const isSelected = tab.id === this.value;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n data-tab-id={tab.id}\n class={{\n tab: true,\n 'tab--selected': isSelected,\n [bgClass]: !!bgClass,\n }}\n aria-selected={isSelected}\n aria-disabled={tab.disabled || undefined}\n aria-controls={tab.panelId ?? undefined}\n disabled={tab.disabled}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => !tab.disabled && this.selectTab(tab.id)}\n >\n <span class={`tab__label ${isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'}`}>\n {tab.label}\n </span>\n {tab.dot && (\n <span class=\"tab__dot-wrap\" aria-hidden=\"true\">\n <span class=\"tab__dot\" />\n </span>\n )}\n </button>\n );\n })}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"6DAAA,MAAMA,EAAc,IAAM,ioG,MCmBbC,EAAQC,EAAA,MAAAD,UAAAE,EALrB,WAAAC,CAAAC,G,6EAQ2BC,KAAAC,MAAgB,GACjCD,KAAAE,KAAkB,GAIlBF,KAAAG,YAAyC,YAoHlD,CAhHS,SAAAC,CAAUC,GAChBL,KAAKC,MAAQI,EACbL,KAAKM,SAASC,KAAKF,E,CAOb,WAAAG,CAAYC,EAAcC,GAChC,MAAMC,EAAMX,KAAKE,KAAKU,OACtB,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAKE,IAAK,CAC5B,MAAMC,GAAKL,EAAOC,GAAQG,EAAI,GAAKF,GAAOE,EAAI,IAAMF,EACpD,IAAKX,KAAKE,KAAKY,IAAIC,SAAU,OAAOD,C,CAEtC,OAAOL,C,CAIT,aAAAO,CAAcC,GACZ,IAAKjB,KAAKE,KAAKU,OAAQ,OAEvB,MAAMM,EAAalB,KAAKE,KAAKiB,WAAUC,GAAKA,EAAEf,KAAOL,KAAKC,QAC1D,MAAMoB,EAAarB,KAAKG,cAAgB,WAExC,IAAImB,EAAyB,KAE7B,IAAKD,EAAY,CACf,GAAIJ,EAAEM,MAAQ,aAAc,CAC1BD,EAAUtB,KAAKQ,YAAYU,EAAY,E,MAClC,GAAID,EAAEM,MAAQ,YAAa,CAChCD,EAAUtB,KAAKQ,YAAYU,GAAY,E,MAEpC,CACL,GAAID,EAAEM,MAAQ,YAAa,CACzBD,EAAUtB,KAAKQ,YAAYU,EAAY,E,MAClC,GAAID,EAAEM,MAAQ,UAAW,CAC9BD,EAAUtB,KAAKQ,YAAYU,GAAY,E,EAI3C,GAAID,EAAEM,MAAQ,OAAQ,CACpB,MAAMC,EAAQxB,KAAKE,KAAKiB,WAAUC,IAAMA,EAAEL,WAC1CO,EAAUE,KAAU,EAAK,KAAOA,C,MAC3B,GAAIP,EAAEM,MAAQ,MAAO,CAC1B,MAAME,EAAc,IAAIzB,KAAKE,MAAMwB,UAAUP,WAAUC,IAAMA,EAAEL,WAC/DO,EAAUG,KAAgB,EAAK,KAAOzB,KAAKE,KAAKU,OAAS,EAAIa,C,CAG/D,GAAIH,IAAY,KAAM,CACpBL,EAAEU,iBACF,MAAMC,EAAO5B,KAAKE,KAAKoB,GACvBtB,KAAKI,UAAUwB,EAAKvB,IACpB,MAAMwB,EAAM7B,KAAK8B,GAAGC,cAAc,iBAAiBH,EAAKvB,QACxDwB,GAAKG,O,EAID,UAAAC,GACN,IAAKjC,KAAKkC,YAAclC,KAAKkC,aAAe,QAAS,MAAO,GAC5D,GAAIlC,KAAKkC,aAAe,cAAe,MAAO,iBAC9C,MAAO,MAAMlC,KAAKkC,Y,CAGpB,MAAAC,GACE,MAAMC,EAAUpC,KAAKiC,aACrB,MAAMZ,EAAarB,KAAKG,cAAgB,WAExC,OACEkC,EAACC,EAAI,CAAAf,IAAA,2CAACgB,MAAM,kBACVF,EAAA,OAAAd,IAAA,2CACEiB,KAAK,UACLD,MAAO,CAAE,WAAY,KAAM,qBAAsBlB,GAAY,aACjDrB,KAAKyC,UAAS,kBACTzC,KAAK0C,eAAc,mBAClBrB,EAAa,WAAasB,WAE3C3C,KAAKE,KAAK0C,KAAIC,IACb,MAAMC,EAAaD,EAAIxC,KAAOL,KAAKC,MACnC,OACEoC,EAAA,UACEd,IAAKsB,EAAIxC,GACT0C,KAAK,SACLP,KAAK,MAAK,cACGK,EAAIxC,GACjBkC,MAAO,CACLM,IAAK,KACL,gBAAiBC,EACjBV,CAACA,KAAYA,GACd,gBACcU,EAAU,gBACVD,EAAI9B,UAAY4B,UAAS,gBACzBE,EAAIG,SAAWL,UAC9B5B,SAAU8B,EAAI9B,SACdkC,SAAUH,EAAa,GAAI,EAC3BI,QAAS,KAAOL,EAAI9B,UAAYf,KAAKI,UAAUyC,EAAIxC,KAEnDgC,EAAA,QAAME,MAAO,cAAcO,EAAa,4BAA8B,sBACnED,EAAIM,OAENN,EAAIO,KACHf,EAAA,QAAME,MAAM,gBAAe,cAAa,QACtCF,EAAA,QAAME,MAAM,cAGT,K","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{p as o,H as e,c as n,h as s,a as t,t as r}from"./index.js";import{d as i}from"./p-CGuwZUFk.js";const a=()=>`.toggle-btn.sc-ds-toggle-button{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--dimension-radius-050);cursor:pointer;position:relative;transition:transform var(--effect-motion-short-2);height:var(--dimension-size-400);font-family:inherit;background:transparent;box-sizing:border-box;-webkit-user-select:none;user-select:none;--_hover-bg:var(--color-interaction-hover);--_pressed-bg:var(--color-interaction-pressed);--_border:var(--color-border-tertiary)}.toggle-btn.sc-ds-toggle-button:focus-visible{outline:var(--dimension-stroke-width-025) solid var(--color-interaction-focus);outline-offset:var(--dimension-space-025)}.toggle-btn.sc-ds-toggle-button:hover:not(.inactive){background-color:var(--_hover-bg)}.toggle-btn.sc-ds-toggle-button:active:not(.inactive){background-color:var(--_pressed-bg);transform:scale(var(--dimension-scale-subtle))}.onMedium.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-medium-background-hover);--_pressed-bg:var(--color-interaction-on-medium-background-pressed);--_border:var(--color-border-on-medium-background-tertiary)}.onBold.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-bold-background-hover);--_pressed-bg:var(--color-interaction-on-bold-background-pressed);--_border:var(--color-border-on-bold-background-tertiary)}.onStrong.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-strong-background-hover);--_pressed-bg:var(--color-interaction-on-strong-background-pressed);--_border:var(--color-border-on-strong-background-tertiary)}.onAlwaysDark.sc-ds-toggle-button{--_hover-bg:var(--color-always-dark-interaction-hover);--_pressed-bg:var(--color-always-dark-interaction-pressed);--_border:var(--color-always-dark-border-tertiary)}.elevationElevated.sc-ds-toggle-button{background-color:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-sm);color:var(--color-foreground-secondary);--_hover-bg:color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));--_pressed-bg:color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary))}.elevationFlat.sc-ds-toggle-button{box-shadow:inset 0 0 0 1px var(--_border);color:var(--color-foreground-secondary)}.elevationNone.sc-ds-toggle-button{color:var(--color-foreground-secondary)}.elevationFloating.sc-ds-toggle-button{background-color:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-floating);color:var(--color-foreground-secondary);--_hover-bg:color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));--_pressed-bg:color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary))}.onBold.elevationNone.sc-ds-toggle-button,.onBold.elevationFlat.sc-ds-toggle-button,.onStrong.elevationNone.sc-ds-toggle-button,.onStrong.elevationFlat.sc-ds-toggle-button{color:var(--color-foreground-on-bold-background-secondary)}.onAlwaysDark.elevationNone.sc-ds-toggle-button,.onAlwaysDark.elevationFlat.sc-ds-toggle-button{color:var(--color-always-dark-foreground-secondary)}.pressed.sc-ds-toggle-button{background-color:var(--color-background-faint-brand);color:var(--color-foreground-bold-brand)}.iconOnly.sc-ds-toggle-button{padding:0;width:var(--dimension-size-400);min-width:var(--dimension-size-400)}.labelOnly.sc-ds-toggle-button{padding:0 var(--dimension-space-100)}.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-100) 0 var(--dimension-space-075);gap:var(--dimension-space-025)}.sizeSM.sc-ds-toggle-button{height:var(--dimension-size-300)}.sizeSM.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-300);min-width:var(--dimension-size-300)}.sizeSM.labelOnly.sc-ds-toggle-button{padding:0 var(--dimension-space-075)}.sizeSM.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-075) 0 var(--dimension-space-050);gap:0}.sizeXS.sc-ds-toggle-button{height:var(--dimension-size-200)}.sizeXS.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-200);min-width:var(--dimension-size-200)}.sizeXS.labelOnly.sc-ds-toggle-button,.sizeXS.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-025);gap:0}.rounded.sc-ds-toggle-button{border-radius:var(--dimension-radius-half)}.rounded.labelOnly.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-100) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-100) + var(--dimension-space-050))}.rounded.iconAndLabel.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-075) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-100) + var(--dimension-space-050))}.rounded.sizeSM.labelOnly.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-075) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-075) + var(--dimension-space-050))}.rounded.sizeSM.iconAndLabel.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-050) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-075) + var(--dimension-space-050))}.rounded.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-400);min-width:var(--dimension-size-400);padding:0}.rounded.sizeSM.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-300);min-width:var(--dimension-size-300)}.rounded.sizeXS.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-200);min-width:var(--dimension-size-200)}.inactive.sc-ds-toggle-button{opacity:0.5;cursor:not-allowed;pointer-events:none}.toggle-btn__icon.sc-ds-toggle-button{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.toggle-btn__label.sc-ds-toggle-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}`;const d={md:"md",sm:"sm",xs:"xs"};const c={md:20,sm:16,xs:12};const l={md:"text-body-medium-emphasis",sm:"text-body-small-emphasis",xs:"text-caption-emphasis"};const g=o(class o extends e{constructor(o){super();if(o!==false){this.__registerHost()}this.dsChange=n(this,"dsChange");this.elevation="elevated";this.size="md";this.rounded=false;this.pressed=false;this.inactive=false;this.handleClick=()=>{if(this.inactive)return;this.dsChange.emit(!this.pressed)}}render(){const o=this.size;const e=d[o];const n=c[o];const r=l[o];const i=!!this.icon;const a=!!this.label;const g=i&&!a;const b=a&&!i;const u=i&&a;const v=this.background;const m=this.elevation.charAt(0).toUpperCase()+this.elevation.slice(1);const p={"toggle-btn":true,[`elevation${m}`]:true,sizeSM:o==="sm",sizeXS:o==="xs",rounded:this.rounded,inactive:this.inactive,pressed:this.pressed,iconOnly:g,labelOnly:b,iconAndLabel:u,onMedium:v==="medium",onBold:v==="bold",onStrong:v==="strong",onAlwaysDark:v==="always-dark"};return s(t,{key:"11e12dc0b911922a917b33fe9cbdf78d4d270a52"},s("button",{key:"85e3201280671eb8e3b87235f17a126f914f9f50",type:"button",class:p,disabled:this.inactive,"aria-label":this.ariaLabel??this.label??"toggle","aria-pressed":this.pressed,onClick:this.handleClick},i&&s("span",{key:"fe52df526735c840f9206bb1b7cf3b4eef6c76ed",class:"toggle-btn__icon",style:{fontSize:`${n}px`}},s("ds-icon",{key:"55d1ed578a297ff164fea3ed5dad7e3e9db83bc1",name:this.icon,size:e})),a&&s("span",{key:"a15a139ef10a91e35a1702e8f9e6a5ac8a762566",class:`toggle-btn__label ${r}`},this.label)))}static get style(){return a()}},[2,"ds-toggle-button",{elevation:[1],label:[1],icon:[1],size:[1],rounded:[4],background:[1],pressed:[1028],inactive:[4],ariaLabel:[1,"aria-label"]}]);function b(){if(typeof customElements==="undefined"){return}const o=["ds-toggle-button","ds-icon"];o.forEach((o=>{switch(o){case"ds-toggle-button":if(!customElements.get(r(o))){customElements.define(r(o),g)}break;case"ds-icon":if(!customElements.get(r(o))){i()}break}}))}b();export{g as T,b as d};
2
- //# sourceMappingURL=p-DRuXu8Ql.js.map
1
+ import{p as o,H as e,c as n,h as s,a as t,t as r}from"./index.js";import{d as i}from"./p-CkBXHj0e.js";const a=()=>`.toggle-btn.sc-ds-toggle-button{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--dimension-radius-050);cursor:pointer;position:relative;transition:transform var(--effect-motion-short-2);height:var(--dimension-size-400);font-family:inherit;background:transparent;box-sizing:border-box;-webkit-user-select:none;user-select:none;--_hover-bg:var(--color-interaction-hover);--_pressed-bg:var(--color-interaction-pressed);--_border:var(--color-border-tertiary)}.toggle-btn.sc-ds-toggle-button:focus-visible{outline:var(--dimension-stroke-width-025) solid var(--color-interaction-focus);outline-offset:var(--dimension-space-025)}.toggle-btn.sc-ds-toggle-button:hover:not(.inactive){background-color:var(--_hover-bg)}.toggle-btn.sc-ds-toggle-button:active:not(.inactive){background-color:var(--_pressed-bg);transform:scale(var(--dimension-scale-subtle))}.onMedium.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-medium-background-hover);--_pressed-bg:var(--color-interaction-on-medium-background-pressed);--_border:var(--color-border-on-medium-background-tertiary)}.onBold.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-bold-background-hover);--_pressed-bg:var(--color-interaction-on-bold-background-pressed);--_border:var(--color-border-on-bold-background-tertiary)}.onStrong.sc-ds-toggle-button{--_hover-bg:var(--color-interaction-on-strong-background-hover);--_pressed-bg:var(--color-interaction-on-strong-background-pressed);--_border:var(--color-border-on-strong-background-tertiary)}.onAlwaysDark.sc-ds-toggle-button{--_hover-bg:var(--color-always-dark-interaction-hover);--_pressed-bg:var(--color-always-dark-interaction-pressed);--_border:var(--color-always-dark-border-tertiary)}.elevationElevated.sc-ds-toggle-button{background-color:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-sm);color:var(--color-foreground-secondary);--_hover-bg:color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));--_pressed-bg:color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary))}.elevationFlat.sc-ds-toggle-button{box-shadow:inset 0 0 0 1px var(--_border);color:var(--color-foreground-secondary)}.elevationNone.sc-ds-toggle-button{color:var(--color-foreground-secondary)}.elevationFloating.sc-ds-toggle-button{background-color:var(--color-background-primary);box-shadow:var(--effect-elevation-elevated-floating);color:var(--color-foreground-secondary);--_hover-bg:color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));--_pressed-bg:color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary))}.onBold.elevationNone.sc-ds-toggle-button,.onBold.elevationFlat.sc-ds-toggle-button,.onStrong.elevationNone.sc-ds-toggle-button,.onStrong.elevationFlat.sc-ds-toggle-button{color:var(--color-foreground-on-bold-background-secondary)}.onAlwaysDark.elevationNone.sc-ds-toggle-button,.onAlwaysDark.elevationFlat.sc-ds-toggle-button{color:var(--color-always-dark-foreground-secondary)}.pressed.sc-ds-toggle-button{background-color:var(--color-background-faint-brand);color:var(--color-foreground-bold-brand)}.iconOnly.sc-ds-toggle-button{padding:0;width:var(--dimension-size-400);min-width:var(--dimension-size-400)}.labelOnly.sc-ds-toggle-button{padding:0 var(--dimension-space-100)}.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-100) 0 var(--dimension-space-075);gap:var(--dimension-space-025)}.sizeSM.sc-ds-toggle-button{height:var(--dimension-size-300)}.sizeSM.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-300);min-width:var(--dimension-size-300)}.sizeSM.labelOnly.sc-ds-toggle-button{padding:0 var(--dimension-space-075)}.sizeSM.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-075) 0 var(--dimension-space-050);gap:0}.sizeXS.sc-ds-toggle-button{height:var(--dimension-size-200)}.sizeXS.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-200);min-width:var(--dimension-size-200)}.sizeXS.labelOnly.sc-ds-toggle-button,.sizeXS.iconAndLabel.sc-ds-toggle-button{padding:0 var(--dimension-space-025);gap:0}.rounded.sc-ds-toggle-button{border-radius:var(--dimension-radius-half)}.rounded.labelOnly.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-100) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-100) + var(--dimension-space-050))}.rounded.iconAndLabel.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-075) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-100) + var(--dimension-space-050))}.rounded.sizeSM.labelOnly.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-075) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-075) + var(--dimension-space-050))}.rounded.sizeSM.iconAndLabel.sc-ds-toggle-button{padding-left:calc(var(--dimension-space-050) + var(--dimension-space-050));padding-right:calc(var(--dimension-space-075) + var(--dimension-space-050))}.rounded.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-400);min-width:var(--dimension-size-400);padding:0}.rounded.sizeSM.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-300);min-width:var(--dimension-size-300)}.rounded.sizeXS.iconOnly.sc-ds-toggle-button{width:var(--dimension-size-200);min-width:var(--dimension-size-200)}.inactive.sc-ds-toggle-button{opacity:0.5;cursor:not-allowed;pointer-events:none}.toggle-btn__icon.sc-ds-toggle-button{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.toggle-btn__label.sc-ds-toggle-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}`;const d={md:"md",sm:"sm",xs:"xs"};const c={md:20,sm:16,xs:12};const l={md:"text-body-medium-emphasis",sm:"text-body-small-emphasis",xs:"text-caption-emphasis"};const g=o(class o extends e{constructor(o){super();if(o!==false){this.__registerHost()}this.dsChange=n(this,"dsChange");this.elevation="elevated";this.size="md";this.rounded=false;this.pressed=false;this.inactive=false;this.handleClick=()=>{if(this.inactive)return;this.dsChange.emit(!this.pressed)}}render(){const o=this.size;const e=d[o];const n=c[o];const r=l[o];const i=!!this.icon;const a=!!this.label;const g=i&&!a;const b=a&&!i;const u=i&&a;const v=this.background;const m=this.elevation.charAt(0).toUpperCase()+this.elevation.slice(1);const p={"toggle-btn":true,[`elevation${m}`]:true,sizeSM:o==="sm",sizeXS:o==="xs",rounded:this.rounded,inactive:this.inactive,pressed:this.pressed,iconOnly:g,labelOnly:b,iconAndLabel:u,onMedium:v==="medium",onBold:v==="bold",onStrong:v==="strong",onAlwaysDark:v==="always-dark"};return s(t,{key:"f7b99f3dc5230052f69a6381f17b3737f2a6ee54"},s("button",{key:"92b9964ed2828871a6e7c27f36177c2418b01cd6",type:"button",class:p,disabled:this.inactive,"aria-label":this.ariaLabel??this.label??"toggle","aria-pressed":this.pressed,onClick:this.handleClick},i&&s("span",{key:"138b709f8b2d1e77e92a8dd5692804a4f1bc5b46",class:"toggle-btn__icon",style:{fontSize:`${n}px`}},s("ds-icon",{key:"656c9a0892e1cd2c69212657a198ba72a9c06dd3",name:this.icon,size:e})),a&&s("span",{key:"5cc2448462e7d03747723b20d4159f23ede404b0",class:`toggle-btn__label ${r}`},this.label)))}static get style(){return a()}},[2,"ds-toggle-button",{elevation:[1],label:[1],icon:[1],size:[1],rounded:[4],background:[1],pressed:[1028],inactive:[4],ariaLabel:[1,"aria-label"]}]);function b(){if(typeof customElements==="undefined"){return}const o=["ds-toggle-button","ds-icon"];o.forEach((o=>{switch(o){case"ds-toggle-button":if(!customElements.get(r(o))){customElements.define(r(o),g)}break;case"ds-icon":if(!customElements.get(r(o))){i()}break}}))}b();export{g as T,b as d};
2
+ //# sourceMappingURL=p-M_LSU5Uu.js.map
@@ -0,0 +1,52 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ export type BarNavBackground = 'primary' | 'secondary' | 'transparent' | 'translucent';
3
+ export interface BarNavTab {
4
+ id: string;
5
+ label: string;
6
+ disabled?: boolean;
7
+ /** Notification dot on this tab. */
8
+ dot?: boolean;
9
+ }
10
+ export interface BarNavActionItem {
11
+ id: string;
12
+ /** Icon name for <ds-icon>. */
13
+ icon: string;
14
+ /** Whether this action button is currently pressed/active. */
15
+ selected?: boolean;
16
+ /** Show a notification dot. */
17
+ dot?: boolean;
18
+ inactive?: boolean;
19
+ ariaLabel?: string;
20
+ }
21
+ export declare class BarNav {
22
+ /**
23
+ * Tab items for the left section.
24
+ * Set via JS property: `el.tabs = [...]`
25
+ */
26
+ tabs: BarNavTab[];
27
+ /** ID of the currently active tab. */
28
+ value: string;
29
+ /**
30
+ * Action items rendered in the right section.
31
+ * Set via JS property: `el.actions = [...]`
32
+ */
33
+ actions: BarNavActionItem[];
34
+ /**
35
+ * Fallback heading shown when no tabs are provided.
36
+ * When tabs are present the heading is hidden.
37
+ */
38
+ heading: string | undefined;
39
+ /** Surface background variant. */
40
+ background: BarNavBackground;
41
+ /** Emitted when the active tab changes. Detail = tab id. */
42
+ dsTabChange: EventEmitter<string>;
43
+ /** Emitted when an action button is toggled. Detail = { id, selected }. */
44
+ dsActionChange: EventEmitter<{
45
+ id: string;
46
+ selected: boolean;
47
+ }>;
48
+ private handleTabChange;
49
+ private handleActionChange;
50
+ render(): any;
51
+ }
52
+ //# sourceMappingURL=BarNav.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { BarNavBackground, BarNavTab, BarNavActionItem } from './BarNav';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,20 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ export type BarNavActionBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';
3
+ export declare class BarNavAction {
4
+ /** Icon name passed to <ds-icon>. */
5
+ icon: string;
6
+ /** Controlled toggle/selected state. */
7
+ selected: boolean;
8
+ /** Show a notification dot (brand colour) at the top-right of the icon. */
9
+ dot: boolean;
10
+ /** Disables interaction. */
11
+ inactive: boolean;
12
+ ariaLabel: string;
13
+ /** Parent surface context — adjusts hover/press colours for coloured backgrounds. */
14
+ background: BarNavActionBackground | undefined;
15
+ /** Emits the new selected value (!selected) on click. */
16
+ dsChange: EventEmitter<boolean>;
17
+ private handleClick;
18
+ render(): any;
19
+ }
20
+ //# sourceMappingURL=BarNavAction.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { BarNavActionBackground } from './BarNavAction';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -6,8 +6,8 @@ export interface TabItem {
6
6
  disabled?: boolean;
7
7
  /** id of the tabpanel this tab controls */
8
8
  panelId?: string;
9
- /** optional badge count shown as a pill next to label */
10
- count?: number;
9
+ /** Show a notification dot (brand) on the tab no count, matching panel-nav. */
10
+ dot?: boolean;
11
11
  }
12
12
  export declare class TabGroup {
13
13
  el: HTMLElement;
@@ -17,16 +17,7 @@ export declare class TabGroup {
17
17
  ariaLabel: string | undefined;
18
18
  ariaLabelledby: string | undefined;
19
19
  orientation: 'horizontal' | 'vertical';
20
- private indicatorOffset;
21
- private indicatorSize;
22
20
  dsChange: EventEmitter<string>;
23
- private resizeObserver;
24
- componentDidLoad(): void;
25
- disconnectedCallback(): void;
26
- onValueChange(): void;
27
- onTabsChange(): void;
28
- onOrientationChange(): void;
29
- private updateIndicator;
30
21
  private selectTab;
31
22
  /**
32
23
  * Find the next non-disabled tab index relative to `from`, stepping by `step`.
@@ -7,6 +7,8 @@
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
8
  import { AccordionItemData } from "./components/Accordion/Accordion";
9
9
  import { BannerContrast, BannerIntent } from "./components/Banner/Banner";
10
+ import { BarNavActionItem, BarNavBackground, BarNavTab } from "./components/BarNav/BarNav";
11
+ import { BarNavActionBackground } from "./components/BarNavAction/BarNavAction";
10
12
  import { BreadcrumbItem } from "./components/Breadcrumb/Breadcrumb";
11
13
  import { ButtonBackground, ButtonContrast, ButtonElevation, ButtonIntent, ButtonSize, ButtonVariant } from "./components/Button/Button";
12
14
  import { ButtonGroupElevation, ButtonGroupItem, ButtonGroupSize } from "./components/ButtonGroup/ButtonGroup";
@@ -37,6 +39,8 @@ import { ToggleGroupBackground, ToggleGroupElevation, ToggleGroupItem, ToggleGro
37
39
  import { TooltipAlign, TooltipSide } from "./components/Tooltip/Tooltip";
38
40
  export { AccordionItemData } from "./components/Accordion/Accordion";
39
41
  export { BannerContrast, BannerIntent } from "./components/Banner/Banner";
42
+ export { BarNavActionItem, BarNavBackground, BarNavTab } from "./components/BarNav/BarNav";
43
+ export { BarNavActionBackground } from "./components/BarNavAction/BarNavAction";
40
44
  export { BreadcrumbItem } from "./components/Breadcrumb/Breadcrumb";
41
45
  export { ButtonBackground, ButtonContrast, ButtonElevation, ButtonIntent, ButtonSize, ButtonVariant } from "./components/Button/Button";
42
46
  export { ButtonGroupElevation, ButtonGroupItem, ButtonGroupSize } from "./components/ButtonGroup/ButtonGroup";
@@ -127,6 +131,62 @@ export namespace Components {
127
131
  */
128
132
  "showDismiss": boolean;
129
133
  }
134
+ interface DsBarNav {
135
+ /**
136
+ * Action items rendered in the right section. Set via JS property: `el.actions = [...]`
137
+ * @default []
138
+ */
139
+ "actions": BarNavActionItem[];
140
+ /**
141
+ * Surface background variant.
142
+ * @default 'secondary'
143
+ */
144
+ "background": BarNavBackground;
145
+ /**
146
+ * Fallback heading shown when no tabs are provided. When tabs are present the heading is hidden.
147
+ */
148
+ "heading": string | undefined;
149
+ /**
150
+ * Tab items for the left section. Set via JS property: `el.tabs = [...]`
151
+ * @default []
152
+ */
153
+ "tabs": BarNavTab[];
154
+ /**
155
+ * ID of the currently active tab.
156
+ * @default ''
157
+ */
158
+ "value": string;
159
+ }
160
+ interface DsBarNavAction {
161
+ /**
162
+ * @default 'action'
163
+ */
164
+ "ariaLabel": string;
165
+ /**
166
+ * Parent surface context — adjusts hover/press colours for coloured backgrounds.
167
+ */
168
+ "background": BarNavActionBackground | undefined;
169
+ /**
170
+ * Show a notification dot (brand colour) at the top-right of the icon.
171
+ * @default false
172
+ */
173
+ "dot": boolean;
174
+ /**
175
+ * Icon name passed to <ds-icon>.
176
+ * @default ''
177
+ */
178
+ "icon": string;
179
+ /**
180
+ * Disables interaction.
181
+ * @default false
182
+ */
183
+ "inactive": boolean;
184
+ /**
185
+ * Controlled toggle/selected state.
186
+ * @default false
187
+ */
188
+ "selected": boolean;
189
+ }
130
190
  interface DsBreadcrumb {
131
191
  /**
132
192
  * @default []
@@ -887,6 +947,14 @@ export interface DsBannerCustomEvent<T> extends CustomEvent<T> {
887
947
  detail: T;
888
948
  target: HTMLDsBannerElement;
889
949
  }
950
+ export interface DsBarNavCustomEvent<T> extends CustomEvent<T> {
951
+ detail: T;
952
+ target: HTMLDsBarNavElement;
953
+ }
954
+ export interface DsBarNavActionCustomEvent<T> extends CustomEvent<T> {
955
+ detail: T;
956
+ target: HTMLDsBarNavActionElement;
957
+ }
890
958
  export interface DsBreadcrumbCustomEvent<T> extends CustomEvent<T> {
891
959
  detail: T;
892
960
  target: HTMLDsBreadcrumbElement;
@@ -1004,6 +1072,41 @@ declare global {
1004
1072
  prototype: HTMLDsBannerElement;
1005
1073
  new (): HTMLDsBannerElement;
1006
1074
  };
1075
+ interface HTMLDsBarNavElementEventMap {
1076
+ "dsTabChange": string;
1077
+ "dsActionChange": { id: string; selected: boolean };
1078
+ }
1079
+ interface HTMLDsBarNavElement extends Components.DsBarNav, HTMLStencilElement {
1080
+ addEventListener<K extends keyof HTMLDsBarNavElementEventMap>(type: K, listener: (this: HTMLDsBarNavElement, ev: DsBarNavCustomEvent<HTMLDsBarNavElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
1081
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1082
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1083
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1084
+ removeEventListener<K extends keyof HTMLDsBarNavElementEventMap>(type: K, listener: (this: HTMLDsBarNavElement, ev: DsBarNavCustomEvent<HTMLDsBarNavElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1085
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1086
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1087
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1088
+ }
1089
+ var HTMLDsBarNavElement: {
1090
+ prototype: HTMLDsBarNavElement;
1091
+ new (): HTMLDsBarNavElement;
1092
+ };
1093
+ interface HTMLDsBarNavActionElementEventMap {
1094
+ "dsChange": boolean;
1095
+ }
1096
+ interface HTMLDsBarNavActionElement extends Components.DsBarNavAction, HTMLStencilElement {
1097
+ addEventListener<K extends keyof HTMLDsBarNavActionElementEventMap>(type: K, listener: (this: HTMLDsBarNavActionElement, ev: DsBarNavActionCustomEvent<HTMLDsBarNavActionElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
1098
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1099
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1100
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1101
+ removeEventListener<K extends keyof HTMLDsBarNavActionElementEventMap>(type: K, listener: (this: HTMLDsBarNavActionElement, ev: DsBarNavActionCustomEvent<HTMLDsBarNavActionElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1102
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1103
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1104
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1105
+ }
1106
+ var HTMLDsBarNavActionElement: {
1107
+ prototype: HTMLDsBarNavActionElement;
1108
+ new (): HTMLDsBarNavActionElement;
1109
+ };
1007
1110
  interface HTMLDsBreadcrumbElementEventMap {
1008
1111
  "dsNavigate": { item: BreadcrumbItem; index: number };
1009
1112
  }
@@ -1437,6 +1540,8 @@ declare global {
1437
1540
  "ds-accordion": HTMLDsAccordionElement;
1438
1541
  "ds-badge": HTMLDsBadgeElement;
1439
1542
  "ds-banner": HTMLDsBannerElement;
1543
+ "ds-bar-nav": HTMLDsBarNavElement;
1544
+ "ds-bar-nav-action": HTMLDsBarNavActionElement;
1440
1545
  "ds-breadcrumb": HTMLDsBreadcrumbElement;
1441
1546
  "ds-button": HTMLDsButtonElement;
1442
1547
  "ds-button-group": HTMLDsButtonGroupElement;
@@ -1539,6 +1644,74 @@ declare namespace LocalJSX {
1539
1644
  */
1540
1645
  "showDismiss"?: boolean;
1541
1646
  }
1647
+ interface DsBarNav {
1648
+ /**
1649
+ * Action items rendered in the right section. Set via JS property: `el.actions = [...]`
1650
+ * @default []
1651
+ */
1652
+ "actions"?: BarNavActionItem[];
1653
+ /**
1654
+ * Surface background variant.
1655
+ * @default 'secondary'
1656
+ */
1657
+ "background"?: BarNavBackground;
1658
+ /**
1659
+ * Fallback heading shown when no tabs are provided. When tabs are present the heading is hidden.
1660
+ */
1661
+ "heading"?: string | undefined;
1662
+ /**
1663
+ * Emitted when an action button is toggled. Detail = { id, selected }.
1664
+ */
1665
+ "onDsActionChange"?: (event: DsBarNavCustomEvent<{ id: string; selected: boolean }>) => void;
1666
+ /**
1667
+ * Emitted when the active tab changes. Detail = tab id.
1668
+ */
1669
+ "onDsTabChange"?: (event: DsBarNavCustomEvent<string>) => void;
1670
+ /**
1671
+ * Tab items for the left section. Set via JS property: `el.tabs = [...]`
1672
+ * @default []
1673
+ */
1674
+ "tabs"?: BarNavTab[];
1675
+ /**
1676
+ * ID of the currently active tab.
1677
+ * @default ''
1678
+ */
1679
+ "value"?: string;
1680
+ }
1681
+ interface DsBarNavAction {
1682
+ /**
1683
+ * @default 'action'
1684
+ */
1685
+ "ariaLabel"?: string;
1686
+ /**
1687
+ * Parent surface context — adjusts hover/press colours for coloured backgrounds.
1688
+ */
1689
+ "background"?: BarNavActionBackground | undefined;
1690
+ /**
1691
+ * Show a notification dot (brand colour) at the top-right of the icon.
1692
+ * @default false
1693
+ */
1694
+ "dot"?: boolean;
1695
+ /**
1696
+ * Icon name passed to <ds-icon>.
1697
+ * @default ''
1698
+ */
1699
+ "icon"?: string;
1700
+ /**
1701
+ * Disables interaction.
1702
+ * @default false
1703
+ */
1704
+ "inactive"?: boolean;
1705
+ /**
1706
+ * Emits the new selected value (!selected) on click.
1707
+ */
1708
+ "onDsChange"?: (event: DsBarNavActionCustomEvent<boolean>) => void;
1709
+ /**
1710
+ * Controlled toggle/selected state.
1711
+ * @default false
1712
+ */
1713
+ "selected"?: boolean;
1714
+ }
1542
1715
  interface DsBreadcrumb {
1543
1716
  /**
1544
1717
  * @default []
@@ -2368,6 +2541,19 @@ declare namespace LocalJSX {
2368
2541
  "showDismiss": boolean;
2369
2542
  "dismissLabel": string;
2370
2543
  }
2544
+ interface DsBarNavAttributes {
2545
+ "value": string;
2546
+ "heading": string | undefined;
2547
+ "background": BarNavBackground;
2548
+ }
2549
+ interface DsBarNavActionAttributes {
2550
+ "icon": string;
2551
+ "selected": boolean;
2552
+ "dot": boolean;
2553
+ "inactive": boolean;
2554
+ "ariaLabel": string;
2555
+ "background": BarNavActionBackground | undefined;
2556
+ }
2371
2557
  interface DsBreadcrumbAttributes {
2372
2558
  "separator": string;
2373
2559
  }
@@ -2621,6 +2807,8 @@ declare namespace LocalJSX {
2621
2807
  "ds-accordion": Omit<DsAccordion, keyof DsAccordionAttributes> & { [K in keyof DsAccordion & keyof DsAccordionAttributes]?: DsAccordion[K] } & { [K in keyof DsAccordion & keyof DsAccordionAttributes as `attr:${K}`]?: DsAccordionAttributes[K] } & { [K in keyof DsAccordion & keyof DsAccordionAttributes as `prop:${K}`]?: DsAccordion[K] };
2622
2808
  "ds-badge": Omit<DsBadge, keyof DsBadgeAttributes> & { [K in keyof DsBadge & keyof DsBadgeAttributes]?: DsBadge[K] } & { [K in keyof DsBadge & keyof DsBadgeAttributes as `attr:${K}`]?: DsBadgeAttributes[K] } & { [K in keyof DsBadge & keyof DsBadgeAttributes as `prop:${K}`]?: DsBadge[K] };
2623
2809
  "ds-banner": Omit<DsBanner, keyof DsBannerAttributes> & { [K in keyof DsBanner & keyof DsBannerAttributes]?: DsBanner[K] } & { [K in keyof DsBanner & keyof DsBannerAttributes as `attr:${K}`]?: DsBannerAttributes[K] } & { [K in keyof DsBanner & keyof DsBannerAttributes as `prop:${K}`]?: DsBanner[K] };
2810
+ "ds-bar-nav": Omit<DsBarNav, keyof DsBarNavAttributes> & { [K in keyof DsBarNav & keyof DsBarNavAttributes]?: DsBarNav[K] } & { [K in keyof DsBarNav & keyof DsBarNavAttributes as `attr:${K}`]?: DsBarNavAttributes[K] } & { [K in keyof DsBarNav & keyof DsBarNavAttributes as `prop:${K}`]?: DsBarNav[K] };
2811
+ "ds-bar-nav-action": Omit<DsBarNavAction, keyof DsBarNavActionAttributes> & { [K in keyof DsBarNavAction & keyof DsBarNavActionAttributes]?: DsBarNavAction[K] } & { [K in keyof DsBarNavAction & keyof DsBarNavActionAttributes as `attr:${K}`]?: DsBarNavActionAttributes[K] } & { [K in keyof DsBarNavAction & keyof DsBarNavActionAttributes as `prop:${K}`]?: DsBarNavAction[K] };
2624
2812
  "ds-breadcrumb": Omit<DsBreadcrumb, keyof DsBreadcrumbAttributes> & { [K in keyof DsBreadcrumb & keyof DsBreadcrumbAttributes]?: DsBreadcrumb[K] } & { [K in keyof DsBreadcrumb & keyof DsBreadcrumbAttributes as `attr:${K}`]?: DsBreadcrumbAttributes[K] } & { [K in keyof DsBreadcrumb & keyof DsBreadcrumbAttributes as `prop:${K}`]?: DsBreadcrumb[K] };
2625
2813
  "ds-button": Omit<DsButton, keyof DsButtonAttributes> & { [K in keyof DsButton & keyof DsButtonAttributes]?: DsButton[K] } & { [K in keyof DsButton & keyof DsButtonAttributes as `attr:${K}`]?: DsButtonAttributes[K] } & { [K in keyof DsButton & keyof DsButtonAttributes as `prop:${K}`]?: DsButton[K] };
2626
2814
  "ds-button-group": Omit<DsButtonGroup, keyof DsButtonGroupAttributes> & { [K in keyof DsButtonGroup & keyof DsButtonGroupAttributes]?: DsButtonGroup[K] } & { [K in keyof DsButtonGroup & keyof DsButtonGroupAttributes as `attr:${K}`]?: DsButtonGroupAttributes[K] } & { [K in keyof DsButtonGroup & keyof DsButtonGroupAttributes as `prop:${K}`]?: DsButtonGroup[K] };
@@ -2664,6 +2852,8 @@ declare module "@stencil/core" {
2664
2852
  "ds-accordion": LocalJSX.IntrinsicElements["ds-accordion"] & JSXBase.HTMLAttributes<HTMLDsAccordionElement>;
2665
2853
  "ds-badge": LocalJSX.IntrinsicElements["ds-badge"] & JSXBase.HTMLAttributes<HTMLDsBadgeElement>;
2666
2854
  "ds-banner": LocalJSX.IntrinsicElements["ds-banner"] & JSXBase.HTMLAttributes<HTMLDsBannerElement>;
2855
+ "ds-bar-nav": LocalJSX.IntrinsicElements["ds-bar-nav"] & JSXBase.HTMLAttributes<HTMLDsBarNavElement>;
2856
+ "ds-bar-nav-action": LocalJSX.IntrinsicElements["ds-bar-nav-action"] & JSXBase.HTMLAttributes<HTMLDsBarNavActionElement>;
2667
2857
  "ds-breadcrumb": LocalJSX.IntrinsicElements["ds-breadcrumb"] & JSXBase.HTMLAttributes<HTMLDsBreadcrumbElement>;
2668
2858
  "ds-button": LocalJSX.IntrinsicElements["ds-button"] & JSXBase.HTMLAttributes<HTMLDsButtonElement>;
2669
2859
  "ds-button-group": LocalJSX.IntrinsicElements["ds-button-group"] & JSXBase.HTMLAttributes<HTMLDsButtonGroupElement>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "0.9.4",
3
+ "version": "0.10.1",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",
@@ -80,7 +80,7 @@
80
80
  "zod": "^4.4.3"
81
81
  },
82
82
  "engines": {
83
- "node": ">=18.0.0"
83
+ "node": "^20.19.0 || >=22.12.0"
84
84
  },
85
85
  "sideEffects": [
86
86
  "**/*.css",
@@ -5,6 +5,8 @@ export const DIRECTIVES = [
5
5
  d.DsAccordion,
6
6
  d.DsBadge,
7
7
  d.DsBanner,
8
+ d.DsBarNav,
9
+ d.DsBarNavAction,
8
10
  d.DsBreadcrumb,
9
11
  d.DsButton,
10
12
  d.DsButtonGroup,
@@ -86,6 +86,71 @@ export declare interface DsBanner extends Components.DsBanner {
86
86
  }
87
87
 
88
88
 
89
+ @ProxyCmp({
90
+ inputs: ['actions', 'background', 'heading', 'tabs', 'value']
91
+ })
92
+ @Component({
93
+ selector: 'ds-bar-nav',
94
+ changeDetection: ChangeDetectionStrategy.OnPush,
95
+ template: '<ng-content></ng-content>',
96
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
97
+ inputs: ['actions', 'background', 'heading', 'tabs', 'value'],
98
+ outputs: ['dsTabChange', 'dsActionChange'],
99
+ standalone: false
100
+ })
101
+ export class DsBarNav {
102
+ protected el: HTMLDsBarNavElement;
103
+ @Output() dsTabChange = new EventEmitter<CustomEvent<string>>();
104
+ @Output() dsActionChange = new EventEmitter<CustomEvent<{ id: string; selected: boolean }>>();
105
+ constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
106
+ c.detach();
107
+ this.el = r.nativeElement;
108
+ }
109
+ }
110
+
111
+
112
+ export declare interface DsBarNav extends Components.DsBarNav {
113
+ /**
114
+ * Emitted when the active tab changes. Detail = tab id.
115
+ */
116
+ dsTabChange: EventEmitter<CustomEvent<string>>;
117
+ /**
118
+ * Emitted when an action button is toggled. Detail = { id, selected }.
119
+ */
120
+ dsActionChange: EventEmitter<CustomEvent<{ id: string; selected: boolean }>>;
121
+ }
122
+
123
+
124
+ @ProxyCmp({
125
+ inputs: ['ariaLabel', 'background', 'dot', 'icon', 'inactive', 'selected']
126
+ })
127
+ @Component({
128
+ selector: 'ds-bar-nav-action',
129
+ changeDetection: ChangeDetectionStrategy.OnPush,
130
+ template: '<ng-content></ng-content>',
131
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
132
+ inputs: ['ariaLabel', 'background', 'dot', 'icon', 'inactive', 'selected'],
133
+ outputs: ['dsChange'],
134
+ standalone: false
135
+ })
136
+ export class DsBarNavAction {
137
+ protected el: HTMLDsBarNavActionElement;
138
+ @Output() dsChange = new EventEmitter<CustomEvent<boolean>>();
139
+ constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
140
+ c.detach();
141
+ this.el = r.nativeElement;
142
+ }
143
+ }
144
+
145
+
146
+ export declare interface DsBarNavAction extends Components.DsBarNavAction {
147
+ /**
148
+ * Emits the new selected value (!selected) on click.
149
+ */
150
+ dsChange: EventEmitter<CustomEvent<boolean>>;
151
+ }
152
+
153
+
89
154
  @ProxyCmp({
90
155
  inputs: ['items', 'separator']
91
156
  })