@ds-mo/ui 0.6.0 → 0.7.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 (37) hide show
  1. package/dist/components/ds-checkbox.js +1 -1
  2. package/dist/components/ds-field.js +1 -1
  3. package/dist/components/ds-icon.d.ts +11 -0
  4. package/dist/components/ds-icon.js +2 -0
  5. package/dist/components/ds-icon.js.map +1 -0
  6. package/dist/components/ds-input.js +1 -1
  7. package/dist/components/ds-input.js.map +1 -1
  8. package/dist/components/ds-modal.js +1 -1
  9. package/dist/components/ds-panel-nav.d.ts +11 -0
  10. package/dist/components/ds-panel-nav.js +2 -0
  11. package/dist/components/ds-panel-nav.js.map +1 -0
  12. package/dist/components/ds-radio-group.js +1 -1
  13. package/dist/components/ds-radio-group.js.map +1 -1
  14. package/dist/components/ds-scrollbar.js +1 -1
  15. package/dist/components/ds-slider.js +1 -1
  16. package/dist/components/ds-surface.js +1 -1
  17. package/dist/components/ds-tab-group.js +1 -1
  18. package/dist/components/ds-table.js +1 -1
  19. package/dist/components/ds-table.js.map +1 -1
  20. package/dist/components/ds-tag.js +1 -1
  21. package/dist/components/ds-text.js +1 -1
  22. package/dist/components/ds-text.js.map +1 -1
  23. package/dist/components/ds-toast-provider.js +1 -1
  24. package/dist/components/ds-toggle.js +1 -1
  25. package/dist/components/ds-tooltip.js +1 -1
  26. package/dist/components/p-Bi2mMcOi.js +2 -0
  27. package/dist/components/p-Bi2mMcOi.js.map +1 -0
  28. package/dist/components/p-DNEqvbOR.js +2 -0
  29. package/dist/components/p-DNEqvbOR.js.map +1 -0
  30. package/dist/types/.stencil/Icon/Icon.d.ts +22 -0
  31. package/dist/types/.stencil/Icon/index.d.ts +2 -0
  32. package/dist/types/.stencil/PanelNav/PanelNav.d.ts +48 -0
  33. package/dist/types/.stencil/PanelNav/index.d.ts +2 -0
  34. package/dist/types/components.d.ts +180 -0
  35. package/package.json +2 -1
  36. package/src/angular/index.ts +2 -0
  37. package/src/angular/proxies.ts +63 -0
@@ -0,0 +1,2 @@
1
+ import{p as t,H as e,h as o,a as r,t as s}from"./index.js";const i=()=>`.text.sc-ds-text{margin:0}.text--truncate-1.sc-ds-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--truncate-2.sc-ds-text,.text--truncate-3.sc-ds-text,.text--truncate-4.sc-ds-text,.text--truncate-5.sc-ds-text{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;text-overflow:ellipsis;word-break:break-word}.text--truncate-2.sc-ds-text{-webkit-line-clamp:2}.text--truncate-3.sc-ds-text{-webkit-line-clamp:3}.text--truncate-4.sc-ds-text{-webkit-line-clamp:4}.text--truncate-5.sc-ds-text{-webkit-line-clamp:5}.text--nowrap.sc-ds-text{white-space:nowrap;word-break:normal;overflow:hidden;text-overflow:ellipsis;min-width:0}.text--balance.sc-ds-text{text-wrap:balance}.text--pretty.sc-ds-text{text-wrap:pretty}.text--color-primary.sc-ds-text{color:var(--color-foreground-primary)}.text--color-secondary.sc-ds-text{color:var(--color-foreground-secondary)}.text--color-tertiary.sc-ds-text{color:var(--color-foreground-tertiary)}.text--color-brand.sc-ds-text{color:var(--color-foreground-bold-brand)}.text--color-negative.sc-ds-text{color:var(--color-foreground-bold-negative)}.text--color-positive.sc-ds-text{color:var(--color-foreground-bold-positive)}.text--color-warning.sc-ds-text{color:var(--color-foreground-bold-warning)}.text--color-caution.sc-ds-text{color:var(--color-foreground-bold-caution)}.text--color-ai.sc-ds-text{color:var(--color-foreground-bold-ai)}.text--color-on-strong.sc-ds-text{color:var(--color-foreground-on-strong-background-primary)}.text--color-on-bold.sc-ds-text{color:var(--color-foreground-on-bold-background-primary)}.text--color-inherit.sc-ds-text{color:inherit}.text--decoration-underline.sc-ds-text{text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}.text--decoration-dotted-underline.sc-ds-text{text-decoration:underline dotted;text-underline-offset:2px;text-decoration-thickness:1px}.text--italic.sc-ds-text{font-style:italic}.text--align-left.sc-ds-text{text-align:left}.text--align-center.sc-ds-text{text-align:center}.text--align-right.sc-ds-text{text-align:right}`;const n=t(class t extends e{constructor(t){super();if(t!==false){this.__registerHost()}this.variant="text-body-medium";this.italic=false;this.lineTruncation="none";this.as="p"}render(){const t=this.as;const e=t=>typeof t==="string"&&t.startsWith("var(--");const s={[this.variant]:true,text:true,"text--nowrap":this.wrap==="nowrap","text--balance":this.wrap==="balance","text--pretty":this.wrap==="pretty","text--truncate-1":this.lineTruncation===1&&this.wrap!=="nowrap","text--truncate-2":this.lineTruncation===2&&this.wrap!=="nowrap","text--truncate-3":this.lineTruncation===3&&this.wrap!=="nowrap","text--truncate-4":this.lineTruncation===4&&this.wrap!=="nowrap","text--truncate-5":this.lineTruncation===5&&this.wrap!=="nowrap","text--color-primary":this.color==="primary","text--color-secondary":this.color==="secondary","text--color-tertiary":this.color==="tertiary","text--color-brand":this.color==="brand","text--color-negative":this.color==="negative","text--color-positive":this.color==="positive","text--color-warning":this.color==="warning","text--color-caution":this.color==="caution","text--color-ai":this.color==="ai","text--color-on-strong":this.color==="on-strong","text--color-on-bold":this.color==="on-bold","text--color-inherit":this.color==="inherit","text--decoration-underline":this.decoration==="underline","text--decoration-dotted-underline":this.decoration==="dotted-underline","text--italic":this.italic,"text--align-left":this.align==="left","text--align-center":this.align==="center","text--align-right":this.align==="right"};const i=this.color&&e(this.color)?{color:this.color}:undefined;const n={};if(this.as==="label"&&this.for)n["for"]=this.for;return o(r,{key:"2a96246adf5d1f90ae9fcb4ab4c642d152ada571",style:{display:"contents"}},o(t,{key:"123f40f87c819c15a74da08cd4825b21839299e7",class:s,style:i,...n},o("slot",{key:"d2738dfb791cd34cdfd99434eaa0c931662f6217"})))}static get style(){return i()}},[262,"ds-text",{variant:[1],color:[1],decoration:[1],italic:[4],align:[1],lineTruncation:[8,"line-truncation"],wrap:[1],as:[1],for:[1]}]);function c(){if(typeof customElements==="undefined"){return}const t=["ds-text"];t.forEach((t=>{switch(t){case"ds-text":if(!customElements.get(s(t))){customElements.define(s(t),n)}break}}))}c();export{n as T,c as d};
2
+ //# sourceMappingURL=p-DNEqvbOR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["textCss","Text","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","italic","lineTruncation","as","render","Tag","isCustomColor","c","startsWith","cls","text","wrap","color","decoration","align","style","undefined","extraProps","for","h","Host","key","display","class"],"sources":["src/wc/components/Text/Text.css?tag=ds-text&encapsulation=scoped","src/wc/components/Text/Text.tsx"],"sourcesContent":[".text {\n margin: 0;\n}\n\n/* ── Truncation ─────────────────────────────────────────────────────────── */\n\n.text--truncate-1 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text--truncate-2,\n.text--truncate-3,\n.text--truncate-4,\n.text--truncate-5 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.text--truncate-2 { -webkit-line-clamp: 2; }\n.text--truncate-3 { -webkit-line-clamp: 3; }\n.text--truncate-4 { -webkit-line-clamp: 4; }\n.text--truncate-5 { -webkit-line-clamp: 5; }\n\n/* ── Wrap ───────────────────────────────────────────────────────────────── */\n\n.text--nowrap {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.text--balance { text-wrap: balance; }\n.text--pretty { text-wrap: pretty; }\n\n/* ── Color ──────────────────────────────────────────────────────────────── */\n\n.text--color-primary { color: var(--color-foreground-primary); }\n.text--color-secondary { color: var(--color-foreground-secondary); }\n.text--color-tertiary { color: var(--color-foreground-tertiary); }\n.text--color-brand { color: var(--color-foreground-bold-brand); }\n.text--color-negative { color: var(--color-foreground-bold-negative); }\n.text--color-positive { color: var(--color-foreground-bold-positive); }\n.text--color-warning { color: var(--color-foreground-bold-warning); }\n.text--color-caution { color: var(--color-foreground-bold-caution); }\n.text--color-ai { color: var(--color-foreground-bold-ai); }\n.text--color-on-strong { color: var(--color-foreground-on-strong-background-primary); }\n.text--color-on-bold { color: var(--color-foreground-on-bold-background-primary); }\n.text--color-inherit { color: inherit; }\n\n/* ── Decoration ─────────────────────────────────────────────────────────── */\n\n.text--decoration-underline {\n text-decoration: underline;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n.text--decoration-dotted-underline {\n text-decoration: underline dotted;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ── Style ──────────────────────────────────────────────────────────────── */\n\n.text--italic { font-style: italic; }\n\n/* ── Align ──────────────────────────────────────────────────────────────── */\n\n.text--align-left { text-align: left; }\n.text--align-center { text-align: center; }\n.text--align-right { text-align: right; }\n","import { Component, Prop, h, Host } from '@stencil/core';\n\nexport type TextVariant =\n | 'text-display-medium'\n | 'text-display-small'\n | 'text-title-large'\n | 'text-title-medium'\n | 'text-title-small'\n | 'text-body-large'\n | 'text-body-large-emphasis'\n | 'text-body-medium'\n | 'text-body-medium-emphasis'\n | 'text-body-small'\n | 'text-body-small-emphasis'\n | 'text-caption'\n | 'text-caption-emphasis';\n\nexport type TextColorToken =\n | 'primary' | 'secondary' | 'tertiary'\n | 'brand' | 'negative' | 'positive' | 'warning' | 'caution' | 'ai'\n | 'on-strong' | 'on-bold' | 'inherit';\n\nexport type TextColor = TextColorToken | `var(--${string})`;\nexport type TextDecoration = 'none' | 'underline' | 'dotted-underline';\nexport type TextAlign = 'left' | 'center' | 'right';\nexport type LineTruncation = 1 | 2 | 3 | 4 | 5 | 'none';\nexport type TextWrap = 'wrap' | 'nowrap' | 'balance' | 'pretty';\nexport type TextElement = 'p' | 'span' | 'div' | 'label' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n@Component({\n tag: 'ds-text',\n styleUrl: 'Text.css',\n scoped: true,\n})\nexport class Text {\n @Prop() variant: TextVariant = 'text-body-medium';\n @Prop() color: TextColor | undefined;\n @Prop() decoration: TextDecoration | undefined;\n @Prop() italic: boolean = false;\n @Prop() align: TextAlign | undefined;\n @Prop() lineTruncation: LineTruncation = 'none';\n @Prop() wrap: TextWrap | undefined;\n @Prop() as: TextElement = 'p';\n /** Maps to `for` attribute on <label> elements. */\n @Prop() for: string | undefined;\n\n render() {\n const Tag = this.as as any;\n const isCustomColor = (c: TextColor) => typeof c === 'string' && c.startsWith('var(--');\n\n const cls: Record<string, boolean> = {\n [this.variant]: true,\n 'text': true,\n 'text--nowrap': this.wrap === 'nowrap',\n 'text--balance': this.wrap === 'balance',\n 'text--pretty': this.wrap === 'pretty',\n 'text--truncate-1': this.lineTruncation === 1 && this.wrap !== 'nowrap',\n 'text--truncate-2': this.lineTruncation === 2 && this.wrap !== 'nowrap',\n 'text--truncate-3': this.lineTruncation === 3 && this.wrap !== 'nowrap',\n 'text--truncate-4': this.lineTruncation === 4 && this.wrap !== 'nowrap',\n 'text--truncate-5': this.lineTruncation === 5 && this.wrap !== 'nowrap',\n 'text--color-primary': this.color === 'primary',\n 'text--color-secondary': this.color === 'secondary',\n 'text--color-tertiary': this.color === 'tertiary',\n 'text--color-brand': this.color === 'brand',\n 'text--color-negative': this.color === 'negative',\n 'text--color-positive': this.color === 'positive',\n 'text--color-warning': this.color === 'warning',\n 'text--color-caution': this.color === 'caution',\n 'text--color-ai': this.color === 'ai',\n 'text--color-on-strong': this.color === 'on-strong',\n 'text--color-on-bold': this.color === 'on-bold',\n 'text--color-inherit': this.color === 'inherit',\n 'text--decoration-underline': this.decoration === 'underline',\n 'text--decoration-dotted-underline': this.decoration === 'dotted-underline',\n 'text--italic': this.italic,\n 'text--align-left': this.align === 'left',\n 'text--align-center': this.align === 'center',\n 'text--align-right': this.align === 'right',\n };\n\n const style = this.color && isCustomColor(this.color)\n ? { color: this.color as string }\n : undefined;\n\n const extraProps: Record<string, string> = {};\n if (this.as === 'label' && this.for) extraProps['for'] = this.for;\n\n return (\n <Host style={{ display: 'contents' }}>\n <Tag class={cls} style={style} {...extraProps}>\n <slot />\n </Tag>\n </Host>\n );\n }\n}\n"],"mappings":"2DAAA,MAAMA,EAAU,IAAM,ghE,MCkCTC,EAAIC,EAAA,MAAAD,UAAAE,EALjB,WAAAC,CAAAC,G,4CAMUC,KAAAC,QAAuB,mBAGvBD,KAAAE,OAAkB,MAElBF,KAAAG,eAAiC,OAEjCH,KAAAI,GAAkB,GAsD3B,CAlDC,MAAAC,GACE,MAAMC,EAAMN,KAAKI,GACjB,MAAMG,EAAiBC,UAAwBA,IAAM,UAAYA,EAAEC,WAAW,UAE9E,MAAMC,EAA+B,CACnC,CAACV,KAAKC,SAAU,KAChBU,KAAQ,KACR,eAAgBX,KAAKY,OAAS,SAC9B,gBAAiBZ,KAAKY,OAAS,UAC/B,eAAgBZ,KAAKY,OAAS,SAC9B,mBAAoBZ,KAAKG,iBAAmB,GAAKH,KAAKY,OAAS,SAC/D,mBAAoBZ,KAAKG,iBAAmB,GAAKH,KAAKY,OAAS,SAC/D,mBAAoBZ,KAAKG,iBAAmB,GAAKH,KAAKY,OAAS,SAC/D,mBAAoBZ,KAAKG,iBAAmB,GAAKH,KAAKY,OAAS,SAC/D,mBAAoBZ,KAAKG,iBAAmB,GAAKH,KAAKY,OAAS,SAC/D,sBAAyBZ,KAAKa,QAAU,UACxC,wBAAyBb,KAAKa,QAAU,YACxC,uBAAyBb,KAAKa,QAAU,WACxC,oBAAyBb,KAAKa,QAAU,QACxC,uBAAyBb,KAAKa,QAAU,WACxC,uBAAyBb,KAAKa,QAAU,WACxC,sBAAyBb,KAAKa,QAAU,UACxC,sBAAyBb,KAAKa,QAAU,UACxC,iBAAyBb,KAAKa,QAAU,KACxC,wBAAyBb,KAAKa,QAAU,YACxC,sBAAyBb,KAAKa,QAAU,UACxC,sBAAyBb,KAAKa,QAAU,UACxC,6BAAqCb,KAAKc,aAAe,YACzD,oCAAqCd,KAAKc,aAAe,mBACzD,eAAgBd,KAAKE,OACrB,mBAAsBF,KAAKe,QAAU,OACrC,qBAAsBf,KAAKe,QAAU,SACrC,oBAAsBf,KAAKe,QAAU,SAGvC,MAAMC,EAAQhB,KAAKa,OAASN,EAAcP,KAAKa,OAC3C,CAAEA,MAAOb,KAAKa,OACdI,UAEJ,MAAMC,EAAqC,GAC3C,GAAIlB,KAAKI,KAAO,SAAWJ,KAAKmB,IAAKD,EAAW,OAASlB,KAAKmB,IAE9D,OACEC,EAACC,EAAI,CAAAC,IAAA,2CAACN,MAAO,CAAEO,QAAS,aACtBH,EAACd,EAAG,CAAAgB,IAAA,2CAACE,MAAOd,EAAKM,MAAOA,KAAWE,GACjCE,EAAA,QAAAE,IAAA,8C","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
2
+ export type IconColorToken = 'primary' | 'secondary' | 'tertiary' | 'quaternary' | 'brand' | 'negative' | 'positive' | 'warning' | 'caution' | 'ai' | 'guide' | 'neutral' | 'faint-brand' | 'faint-negative' | 'faint-positive' | 'faint-warning' | 'faint-caution' | 'faint-ai' | 'faint-neutral' | 'medium-brand' | 'medium-negative' | 'medium-positive' | 'medium-warning' | 'medium-caution' | 'medium-ai' | 'medium-neutral' | 'bold-brand' | 'bold-negative' | 'bold-positive' | 'bold-warning' | 'bold-caution' | 'bold-ai' | 'bold-neutral' | 'strong-brand' | 'strong-negative' | 'strong-positive' | 'strong-warning' | 'strong-caution' | 'strong-ai' | 'strong-neutral' | 'on-strong' | 'on-bold' | 'inherit';
3
+ export type IconColor = IconColorToken | `var(--${string})`;
4
+ export declare class Icon {
5
+ el: HTMLElement;
6
+ /** Name of the system icon (e.g. `"Gear"`, `"ArrowRight"`) or flag (e.g. `"US"`) */
7
+ name: string;
8
+ /** Iconography size token. Maps to `--dimension-iconography-{size}`. Default `md` = 20 px. */
9
+ size: IconSize;
10
+ /** Semantic foreground color token, or a raw CSS var reference. */
11
+ color: IconColor | undefined;
12
+ /** Accessible label. Sets `role="img"` and `aria-label`. Omit for decorative icons. */
13
+ label: string | undefined;
14
+ /** Set `true` to look up from the flag icon set instead of the system icon set. */
15
+ flag: boolean;
16
+ private get svgString();
17
+ private updateSvg;
18
+ onIconChange(): void;
19
+ componentDidRender(): void;
20
+ render(): any;
21
+ }
22
+ //# sourceMappingURL=Icon.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { IconSize, IconColorToken, IconColor } from './Icon';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,48 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ export type PanelNavVariant = 'dashboard' | 'settings';
3
+ export interface PanelNavItem {
4
+ id: string;
5
+ icon: string;
6
+ label: string;
7
+ /** Show a notification dot badge on the item */
8
+ dot?: boolean;
9
+ flag?: boolean;
10
+ }
11
+ export interface PanelNavGroup {
12
+ id?: string;
13
+ label?: string;
14
+ items: PanelNavItem[];
15
+ }
16
+ export declare class PanelNav {
17
+ /** Visual variant: `dashboard` = always-dark surface, `settings` = light surface */
18
+ variant: PanelNavVariant;
19
+ /** JSON string of `PanelNavGroup[]` */
20
+ groups: string;
21
+ /** ID of the currently active/selected nav item */
22
+ activeId: string;
23
+ /** Whether the nav is in collapsed (icon-only) state */
24
+ collapsed: boolean;
25
+ /** Display name for the footer user section */
26
+ userName: string;
27
+ /** Single character shown in the collapsed avatar */
28
+ userInitial: string;
29
+ /** Emitted when a nav item is clicked. Detail = the item's `id`. */
30
+ dsNavSelect: EventEmitter<string>;
31
+ /** Emitted when the collapse toggle is clicked. Detail = new collapsed state. */
32
+ dsNavToggle: EventEmitter<boolean>;
33
+ /** Emitted when the footer left button (gear / dashboard) is clicked. */
34
+ dsNavFooterAction: EventEmitter<void>;
35
+ el: HTMLElement;
36
+ private parsedGroups;
37
+ private atBottom;
38
+ onGroupsChange(val: string): void;
39
+ componentWillLoad(): void;
40
+ componentDidLoad(): void;
41
+ private checkScroll;
42
+ private handleBodyScroll;
43
+ private handleItemClick;
44
+ private handleToggle;
45
+ private handleFooterAction;
46
+ render(): any;
47
+ }
48
+ //# sourceMappingURL=PanelNav.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { PanelNavVariant, PanelNavItem, PanelNavGroup } from './PanelNav';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -14,9 +14,11 @@ import { DividerOrientation } from "./components/Divider/Divider";
14
14
  import { EmptyStateType } from "./components/EmptyState/EmptyState";
15
15
  import { FadeSide } from "./components/Fade/Fade";
16
16
  import { HeaderBackground } from "./components/Header/Header";
17
+ import { IconColor, IconSize } from "./components/Icon/Icon";
17
18
  import { InputType } from "./components/Input/Input";
18
19
  import { MenuAlign, MenuItemData, MenuSection, MenuSide } from "./components/Menu/Menu";
19
20
  import { ModalWidth } from "./components/Modal/Modal";
21
+ import { PanelNavVariant } from "./components/PanelNav/PanelNav";
20
22
  import { RadioOption } from "./components/RadioGroup/RadioGroup";
21
23
  import { ScrollbarVariant } from "./components/Scrollbar/Scrollbar";
22
24
  import { SidebarWidth } from "./components/Sidebar/Sidebar";
@@ -37,9 +39,11 @@ export { DividerOrientation } from "./components/Divider/Divider";
37
39
  export { EmptyStateType } from "./components/EmptyState/EmptyState";
38
40
  export { FadeSide } from "./components/Fade/Fade";
39
41
  export { HeaderBackground } from "./components/Header/Header";
42
+ export { IconColor, IconSize } from "./components/Icon/Icon";
40
43
  export { InputType } from "./components/Input/Input";
41
44
  export { MenuAlign, MenuItemData, MenuSection, MenuSide } from "./components/Menu/Menu";
42
45
  export { ModalWidth } from "./components/Modal/Modal";
46
+ export { PanelNavVariant } from "./components/PanelNav/PanelNav";
43
47
  export { RadioOption } from "./components/RadioGroup/RadioGroup";
44
48
  export { ScrollbarVariant } from "./components/Scrollbar/Scrollbar";
45
49
  export { SidebarWidth } from "./components/Sidebar/Sidebar";
@@ -239,6 +243,31 @@ export namespace Components {
239
243
  "background": HeaderBackground;
240
244
  "heading": string | undefined;
241
245
  }
246
+ interface DsIcon {
247
+ /**
248
+ * Semantic foreground color token, or a raw CSS var reference.
249
+ */
250
+ "color": IconColor | undefined;
251
+ /**
252
+ * Set `true` to look up from the flag icon set instead of the system icon set.
253
+ * @default false
254
+ */
255
+ "flag": boolean;
256
+ /**
257
+ * Accessible label. Sets `role="img"` and `aria-label`. Omit for decorative icons.
258
+ */
259
+ "label": string | undefined;
260
+ /**
261
+ * Name of the system icon (e.g. `"Gear"`, `"ArrowRight"`) or flag (e.g. `"US"`)
262
+ * @default ''
263
+ */
264
+ "name": string;
265
+ /**
266
+ * Iconography size token. Maps to `--dimension-iconography-{size}`. Default `md` = 20 px.
267
+ * @default 'md'
268
+ */
269
+ "size": IconSize;
270
+ }
242
271
  interface DsInput {
243
272
  "ariaDescribedby": string | undefined;
244
273
  "ariaLabel": string | undefined;
@@ -352,6 +381,38 @@ export namespace Components {
352
381
  */
353
382
  "totalPages": number;
354
383
  }
384
+ interface DsPanelNav {
385
+ /**
386
+ * ID of the currently active/selected nav item
387
+ * @default ''
388
+ */
389
+ "activeId": string;
390
+ /**
391
+ * Whether the nav is in collapsed (icon-only) state
392
+ * @default false
393
+ */
394
+ "collapsed": boolean;
395
+ /**
396
+ * JSON string of `PanelNavGroup[]`
397
+ * @default '[]'
398
+ */
399
+ "groups": string;
400
+ /**
401
+ * Single character shown in the collapsed avatar
402
+ * @default ''
403
+ */
404
+ "userInitial": string;
405
+ /**
406
+ * Display name for the footer user section
407
+ * @default ''
408
+ */
409
+ "userName": string;
410
+ /**
411
+ * Visual variant: `dashboard` = always-dark surface, `settings` = light surface
412
+ * @default 'dashboard'
413
+ */
414
+ "variant": PanelNavVariant;
415
+ }
355
416
  interface DsRadioGroup {
356
417
  "ariaLabel": string | undefined;
357
418
  "ariaLabelledby": string | undefined;
@@ -682,6 +743,10 @@ export interface DsPaginationCustomEvent<T> extends CustomEvent<T> {
682
743
  detail: T;
683
744
  target: HTMLDsPaginationElement;
684
745
  }
746
+ export interface DsPanelNavCustomEvent<T> extends CustomEvent<T> {
747
+ detail: T;
748
+ target: HTMLDsPanelNavElement;
749
+ }
685
750
  export interface DsRadioGroupCustomEvent<T> extends CustomEvent<T> {
686
751
  detail: T;
687
752
  target: HTMLDsRadioGroupElement;
@@ -840,6 +905,12 @@ declare global {
840
905
  prototype: HTMLDsHeaderElement;
841
906
  new (): HTMLDsHeaderElement;
842
907
  };
908
+ interface HTMLDsIconElement extends Components.DsIcon, HTMLStencilElement {
909
+ }
910
+ var HTMLDsIconElement: {
911
+ prototype: HTMLDsIconElement;
912
+ new (): HTMLDsIconElement;
913
+ };
843
914
  interface HTMLDsInputElementEventMap {
844
915
  "dsChange": string;
845
916
  "dsClear": void;
@@ -916,6 +987,25 @@ declare global {
916
987
  prototype: HTMLDsPaginationElement;
917
988
  new (): HTMLDsPaginationElement;
918
989
  };
990
+ interface HTMLDsPanelNavElementEventMap {
991
+ "dsNavSelect": string;
992
+ "dsNavToggle": boolean;
993
+ "dsNavFooterAction": void;
994
+ }
995
+ interface HTMLDsPanelNavElement extends Components.DsPanelNav, HTMLStencilElement {
996
+ addEventListener<K extends keyof HTMLDsPanelNavElementEventMap>(type: K, listener: (this: HTMLDsPanelNavElement, ev: DsPanelNavCustomEvent<HTMLDsPanelNavElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
997
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
998
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
999
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1000
+ removeEventListener<K extends keyof HTMLDsPanelNavElementEventMap>(type: K, listener: (this: HTMLDsPanelNavElement, ev: DsPanelNavCustomEvent<HTMLDsPanelNavElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1001
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1002
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1003
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1004
+ }
1005
+ var HTMLDsPanelNavElement: {
1006
+ prototype: HTMLDsPanelNavElement;
1007
+ new (): HTMLDsPanelNavElement;
1008
+ };
919
1009
  interface HTMLDsRadioGroupElementEventMap {
920
1010
  "dsChange": string;
921
1011
  }
@@ -1089,11 +1179,13 @@ declare global {
1089
1179
  "ds-fade": HTMLDsFadeElement;
1090
1180
  "ds-field": HTMLDsFieldElement;
1091
1181
  "ds-header": HTMLDsHeaderElement;
1182
+ "ds-icon": HTMLDsIconElement;
1092
1183
  "ds-input": HTMLDsInputElement;
1093
1184
  "ds-loader": HTMLDsLoaderElement;
1094
1185
  "ds-menu": HTMLDsMenuElement;
1095
1186
  "ds-modal": HTMLDsModalElement;
1096
1187
  "ds-pagination": HTMLDsPaginationElement;
1188
+ "ds-panel-nav": HTMLDsPanelNavElement;
1097
1189
  "ds-radio-group": HTMLDsRadioGroupElement;
1098
1190
  "ds-scrollbar": HTMLDsScrollbarElement;
1099
1191
  "ds-sidebar": HTMLDsSidebarElement;
@@ -1306,6 +1398,31 @@ declare namespace LocalJSX {
1306
1398
  "background"?: HeaderBackground;
1307
1399
  "heading"?: string | undefined;
1308
1400
  }
1401
+ interface DsIcon {
1402
+ /**
1403
+ * Semantic foreground color token, or a raw CSS var reference.
1404
+ */
1405
+ "color"?: IconColor | undefined;
1406
+ /**
1407
+ * Set `true` to look up from the flag icon set instead of the system icon set.
1408
+ * @default false
1409
+ */
1410
+ "flag"?: boolean;
1411
+ /**
1412
+ * Accessible label. Sets `role="img"` and `aria-label`. Omit for decorative icons.
1413
+ */
1414
+ "label"?: string | undefined;
1415
+ /**
1416
+ * Name of the system icon (e.g. `"Gear"`, `"ArrowRight"`) or flag (e.g. `"US"`)
1417
+ * @default ''
1418
+ */
1419
+ "name"?: string;
1420
+ /**
1421
+ * Iconography size token. Maps to `--dimension-iconography-{size}`. Default `md` = 20 px.
1422
+ * @default 'md'
1423
+ */
1424
+ "size"?: IconSize;
1425
+ }
1309
1426
  interface DsInput {
1310
1427
  "ariaDescribedby"?: string | undefined;
1311
1428
  "ariaLabel"?: string | undefined;
@@ -1424,6 +1541,50 @@ declare namespace LocalJSX {
1424
1541
  */
1425
1542
  "totalPages"?: number;
1426
1543
  }
1544
+ interface DsPanelNav {
1545
+ /**
1546
+ * ID of the currently active/selected nav item
1547
+ * @default ''
1548
+ */
1549
+ "activeId"?: string;
1550
+ /**
1551
+ * Whether the nav is in collapsed (icon-only) state
1552
+ * @default false
1553
+ */
1554
+ "collapsed"?: boolean;
1555
+ /**
1556
+ * JSON string of `PanelNavGroup[]`
1557
+ * @default '[]'
1558
+ */
1559
+ "groups"?: string;
1560
+ /**
1561
+ * Emitted when the footer left button (gear / dashboard) is clicked.
1562
+ */
1563
+ "onDsNavFooterAction"?: (event: DsPanelNavCustomEvent<void>) => void;
1564
+ /**
1565
+ * Emitted when a nav item is clicked. Detail = the item's `id`.
1566
+ */
1567
+ "onDsNavSelect"?: (event: DsPanelNavCustomEvent<string>) => void;
1568
+ /**
1569
+ * Emitted when the collapse toggle is clicked. Detail = new collapsed state.
1570
+ */
1571
+ "onDsNavToggle"?: (event: DsPanelNavCustomEvent<boolean>) => void;
1572
+ /**
1573
+ * Single character shown in the collapsed avatar
1574
+ * @default ''
1575
+ */
1576
+ "userInitial"?: string;
1577
+ /**
1578
+ * Display name for the footer user section
1579
+ * @default ''
1580
+ */
1581
+ "userName"?: string;
1582
+ /**
1583
+ * Visual variant: `dashboard` = always-dark surface, `settings` = light surface
1584
+ * @default 'dashboard'
1585
+ */
1586
+ "variant"?: PanelNavVariant;
1587
+ }
1427
1588
  interface DsRadioGroup {
1428
1589
  "ariaLabel"?: string | undefined;
1429
1590
  "ariaLabelledby"?: string | undefined;
@@ -1811,6 +1972,13 @@ declare namespace LocalJSX {
1811
1972
  "heading": string | undefined;
1812
1973
  "background": HeaderBackground;
1813
1974
  }
1975
+ interface DsIconAttributes {
1976
+ "name": string;
1977
+ "size": IconSize;
1978
+ "color": IconColor | undefined;
1979
+ "label": string | undefined;
1980
+ "flag": boolean;
1981
+ }
1814
1982
  interface DsInputAttributes {
1815
1983
  "value": string;
1816
1984
  "placeholder": string | undefined;
@@ -1850,6 +2018,14 @@ declare namespace LocalJSX {
1850
2018
  "siblingCount": number;
1851
2019
  "inactive": boolean;
1852
2020
  }
2021
+ interface DsPanelNavAttributes {
2022
+ "variant": PanelNavVariant;
2023
+ "groups": string;
2024
+ "activeId": string;
2025
+ "collapsed": boolean;
2026
+ "userName": string;
2027
+ "userInitial": string;
2028
+ }
1853
2029
  interface DsRadioGroupAttributes {
1854
2030
  "value": string;
1855
2031
  "direction": 'vertical' | 'horizontal';
@@ -1965,11 +2141,13 @@ declare namespace LocalJSX {
1965
2141
  "ds-fade": Omit<DsFade, keyof DsFadeAttributes> & { [K in keyof DsFade & keyof DsFadeAttributes]?: DsFade[K] } & { [K in keyof DsFade & keyof DsFadeAttributes as `attr:${K}`]?: DsFadeAttributes[K] } & { [K in keyof DsFade & keyof DsFadeAttributes as `prop:${K}`]?: DsFade[K] } & OneOf<"side", DsFade["side"], DsFadeAttributes["side"]>;
1966
2142
  "ds-field": Omit<DsField, keyof DsFieldAttributes> & { [K in keyof DsField & keyof DsFieldAttributes]?: DsField[K] } & { [K in keyof DsField & keyof DsFieldAttributes as `attr:${K}`]?: DsFieldAttributes[K] } & { [K in keyof DsField & keyof DsFieldAttributes as `prop:${K}`]?: DsField[K] } & OneOf<"label", DsField["label"], DsFieldAttributes["label"]>;
1967
2143
  "ds-header": Omit<DsHeader, keyof DsHeaderAttributes> & { [K in keyof DsHeader & keyof DsHeaderAttributes]?: DsHeader[K] } & { [K in keyof DsHeader & keyof DsHeaderAttributes as `attr:${K}`]?: DsHeaderAttributes[K] } & { [K in keyof DsHeader & keyof DsHeaderAttributes as `prop:${K}`]?: DsHeader[K] };
2144
+ "ds-icon": Omit<DsIcon, keyof DsIconAttributes> & { [K in keyof DsIcon & keyof DsIconAttributes]?: DsIcon[K] } & { [K in keyof DsIcon & keyof DsIconAttributes as `attr:${K}`]?: DsIconAttributes[K] } & { [K in keyof DsIcon & keyof DsIconAttributes as `prop:${K}`]?: DsIcon[K] };
1968
2145
  "ds-input": Omit<DsInput, keyof DsInputAttributes> & { [K in keyof DsInput & keyof DsInputAttributes]?: DsInput[K] } & { [K in keyof DsInput & keyof DsInputAttributes as `attr:${K}`]?: DsInputAttributes[K] } & { [K in keyof DsInput & keyof DsInputAttributes as `prop:${K}`]?: DsInput[K] };
1969
2146
  "ds-loader": Omit<DsLoader, keyof DsLoaderAttributes> & { [K in keyof DsLoader & keyof DsLoaderAttributes]?: DsLoader[K] } & { [K in keyof DsLoader & keyof DsLoaderAttributes as `attr:${K}`]?: DsLoaderAttributes[K] } & { [K in keyof DsLoader & keyof DsLoaderAttributes as `prop:${K}`]?: DsLoader[K] };
1970
2147
  "ds-menu": Omit<DsMenu, keyof DsMenuAttributes> & { [K in keyof DsMenu & keyof DsMenuAttributes]?: DsMenu[K] } & { [K in keyof DsMenu & keyof DsMenuAttributes as `attr:${K}`]?: DsMenuAttributes[K] } & { [K in keyof DsMenu & keyof DsMenuAttributes as `prop:${K}`]?: DsMenu[K] };
1971
2148
  "ds-modal": Omit<DsModal, keyof DsModalAttributes> & { [K in keyof DsModal & keyof DsModalAttributes]?: DsModal[K] } & { [K in keyof DsModal & keyof DsModalAttributes as `attr:${K}`]?: DsModalAttributes[K] } & { [K in keyof DsModal & keyof DsModalAttributes as `prop:${K}`]?: DsModal[K] } & OneOf<"heading", DsModal["heading"], DsModalAttributes["heading"]>;
1972
2149
  "ds-pagination": Omit<DsPagination, keyof DsPaginationAttributes> & { [K in keyof DsPagination & keyof DsPaginationAttributes]?: DsPagination[K] } & { [K in keyof DsPagination & keyof DsPaginationAttributes as `attr:${K}`]?: DsPaginationAttributes[K] } & { [K in keyof DsPagination & keyof DsPaginationAttributes as `prop:${K}`]?: DsPagination[K] };
2150
+ "ds-panel-nav": Omit<DsPanelNav, keyof DsPanelNavAttributes> & { [K in keyof DsPanelNav & keyof DsPanelNavAttributes]?: DsPanelNav[K] } & { [K in keyof DsPanelNav & keyof DsPanelNavAttributes as `attr:${K}`]?: DsPanelNavAttributes[K] } & { [K in keyof DsPanelNav & keyof DsPanelNavAttributes as `prop:${K}`]?: DsPanelNav[K] };
1973
2151
  "ds-radio-group": Omit<DsRadioGroup, keyof DsRadioGroupAttributes> & { [K in keyof DsRadioGroup & keyof DsRadioGroupAttributes]?: DsRadioGroup[K] } & { [K in keyof DsRadioGroup & keyof DsRadioGroupAttributes as `attr:${K}`]?: DsRadioGroupAttributes[K] } & { [K in keyof DsRadioGroup & keyof DsRadioGroupAttributes as `prop:${K}`]?: DsRadioGroup[K] };
1974
2152
  "ds-scrollbar": Omit<DsScrollbar, keyof DsScrollbarAttributes> & { [K in keyof DsScrollbar & keyof DsScrollbarAttributes]?: DsScrollbar[K] } & { [K in keyof DsScrollbar & keyof DsScrollbarAttributes as `attr:${K}`]?: DsScrollbarAttributes[K] } & { [K in keyof DsScrollbar & keyof DsScrollbarAttributes as `prop:${K}`]?: DsScrollbar[K] };
1975
2153
  "ds-sidebar": Omit<DsSidebar, keyof DsSidebarAttributes> & { [K in keyof DsSidebar & keyof DsSidebarAttributes]?: DsSidebar[K] } & { [K in keyof DsSidebar & keyof DsSidebarAttributes as `attr:${K}`]?: DsSidebarAttributes[K] } & { [K in keyof DsSidebar & keyof DsSidebarAttributes as `prop:${K}`]?: DsSidebar[K] };
@@ -2001,11 +2179,13 @@ declare module "@stencil/core" {
2001
2179
  "ds-fade": LocalJSX.IntrinsicElements["ds-fade"] & JSXBase.HTMLAttributes<HTMLDsFadeElement>;
2002
2180
  "ds-field": LocalJSX.IntrinsicElements["ds-field"] & JSXBase.HTMLAttributes<HTMLDsFieldElement>;
2003
2181
  "ds-header": LocalJSX.IntrinsicElements["ds-header"] & JSXBase.HTMLAttributes<HTMLDsHeaderElement>;
2182
+ "ds-icon": LocalJSX.IntrinsicElements["ds-icon"] & JSXBase.HTMLAttributes<HTMLDsIconElement>;
2004
2183
  "ds-input": LocalJSX.IntrinsicElements["ds-input"] & JSXBase.HTMLAttributes<HTMLDsInputElement>;
2005
2184
  "ds-loader": LocalJSX.IntrinsicElements["ds-loader"] & JSXBase.HTMLAttributes<HTMLDsLoaderElement>;
2006
2185
  "ds-menu": LocalJSX.IntrinsicElements["ds-menu"] & JSXBase.HTMLAttributes<HTMLDsMenuElement>;
2007
2186
  "ds-modal": LocalJSX.IntrinsicElements["ds-modal"] & JSXBase.HTMLAttributes<HTMLDsModalElement>;
2008
2187
  "ds-pagination": LocalJSX.IntrinsicElements["ds-pagination"] & JSXBase.HTMLAttributes<HTMLDsPaginationElement>;
2188
+ "ds-panel-nav": LocalJSX.IntrinsicElements["ds-panel-nav"] & JSXBase.HTMLAttributes<HTMLDsPanelNavElement>;
2009
2189
  "ds-radio-group": LocalJSX.IntrinsicElements["ds-radio-group"] & JSXBase.HTMLAttributes<HTMLDsRadioGroupElement>;
2010
2190
  "ds-scrollbar": LocalJSX.IntrinsicElements["ds-scrollbar"] & JSXBase.HTMLAttributes<HTMLDsScrollbarElement>;
2011
2191
  "ds-sidebar": LocalJSX.IntrinsicElements["ds-sidebar"] & JSXBase.HTMLAttributes<HTMLDsSidebarElement>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",
@@ -66,6 +66,7 @@
66
66
  "@storybook/addon-docs": "^8.6.18",
67
67
  "@storybook/web-components": "^8.6.18",
68
68
  "@storybook/web-components-vite": "^8.6.18",
69
+ "concurrently": "^9.2.1",
69
70
  "eslint": "^9.39.4",
70
71
  "globals": "^17.6.0",
71
72
  "lit": "^3.3.3",
@@ -14,11 +14,13 @@ export const DIRECTIVES = [
14
14
  d.DsFade,
15
15
  d.DsField,
16
16
  d.DsHeader,
17
+ d.DsIcon,
17
18
  d.DsInput,
18
19
  d.DsLoader,
19
20
  d.DsMenu,
20
21
  d.DsModal,
21
22
  d.DsPagination,
23
+ d.DsPanelNav,
22
24
  d.DsRadioGroup,
23
25
  d.DsScrollbar,
24
26
  d.DsSidebar,
@@ -316,6 +316,29 @@ export class DsHeader {
316
316
  export declare interface DsHeader extends Components.DsHeader {}
317
317
 
318
318
 
319
+ @ProxyCmp({
320
+ inputs: ['color', 'flag', 'label', 'name', 'size']
321
+ })
322
+ @Component({
323
+ selector: 'ds-icon',
324
+ changeDetection: ChangeDetectionStrategy.OnPush,
325
+ template: '<ng-content></ng-content>',
326
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
327
+ inputs: ['color', 'flag', 'label', 'name', 'size'],
328
+ standalone: false
329
+ })
330
+ export class DsIcon {
331
+ protected el: HTMLDsIconElement;
332
+ constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
333
+ c.detach();
334
+ this.el = r.nativeElement;
335
+ }
336
+ }
337
+
338
+
339
+ export declare interface DsIcon extends Components.DsIcon {}
340
+
341
+
319
342
  @ProxyCmp({
320
343
  inputs: ['ariaDescribedby', 'ariaLabel', 'ariaLabelledby', 'autoFocus', 'error', 'errorMessage', 'inactive', 'inputId', 'placeholder', 'type', 'value'],
321
344
  methods: ['setFocus']
@@ -460,6 +483,46 @@ export declare interface DsPagination extends Components.DsPagination {
460
483
  }
461
484
 
462
485
 
486
+ @ProxyCmp({
487
+ inputs: ['activeId', 'collapsed', 'groups', 'userInitial', 'userName', 'variant']
488
+ })
489
+ @Component({
490
+ selector: 'ds-panel-nav',
491
+ changeDetection: ChangeDetectionStrategy.OnPush,
492
+ template: '<ng-content></ng-content>',
493
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
494
+ inputs: ['activeId', 'collapsed', 'groups', 'userInitial', 'userName', 'variant'],
495
+ outputs: ['dsNavSelect', 'dsNavToggle', 'dsNavFooterAction'],
496
+ standalone: false
497
+ })
498
+ export class DsPanelNav {
499
+ protected el: HTMLDsPanelNavElement;
500
+ @Output() dsNavSelect = new EventEmitter<CustomEvent<string>>();
501
+ @Output() dsNavToggle = new EventEmitter<CustomEvent<boolean>>();
502
+ @Output() dsNavFooterAction = new EventEmitter<CustomEvent<void>>();
503
+ constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
504
+ c.detach();
505
+ this.el = r.nativeElement;
506
+ }
507
+ }
508
+
509
+
510
+ export declare interface DsPanelNav extends Components.DsPanelNav {
511
+ /**
512
+ * Emitted when a nav item is clicked. Detail = the item's `id`.
513
+ */
514
+ dsNavSelect: EventEmitter<CustomEvent<string>>;
515
+ /**
516
+ * Emitted when the collapse toggle is clicked. Detail = new collapsed state.
517
+ */
518
+ dsNavToggle: EventEmitter<CustomEvent<boolean>>;
519
+ /**
520
+ * Emitted when the footer left button (gear / dashboard) is clicked.
521
+ */
522
+ dsNavFooterAction: EventEmitter<CustomEvent<void>>;
523
+ }
524
+
525
+
463
526
  @ProxyCmp({
464
527
  inputs: ['ariaLabel', 'ariaLabelledby', 'direction', 'inactive', 'options', 'value']
465
528
  })