@ds-mo/ui 1.5.0 → 1.6.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 (82) hide show
  1. package/README.md +1 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/components/ds-banner.js +1 -1
  4. package/dist/components/ds-banner.js.map +1 -1
  5. package/dist/components/ds-bar-nav.js +1 -1
  6. package/dist/components/ds-button-group.js +1 -1
  7. package/dist/components/ds-button.js +1 -1
  8. package/dist/components/ds-loader.js +1 -1
  9. package/dist/components/ds-menu.js +1 -1
  10. package/dist/components/ds-modal.js +1 -1
  11. package/dist/components/ds-modal.js.map +1 -1
  12. package/dist/components/ds-panel-nav.js +1 -1
  13. package/dist/components/ds-panel-nav.js.map +1 -1
  14. package/dist/components/ds-select.js +1 -1
  15. package/dist/components/ds-toast-provider.js +1 -1
  16. package/dist/components/ds-toast-provider.js.map +1 -1
  17. package/dist/components/ds-toggle-button-group.js +1 -1
  18. package/dist/components/ds-toggle-button.js +1 -1
  19. package/dist/components/ds-tooltip.js +1 -1
  20. package/dist/components/ds-tooltip.js.map +1 -1
  21. package/dist/components/p-BRju0sEC.js +2 -0
  22. package/dist/components/p-BRju0sEC.js.map +1 -0
  23. package/dist/components/p-BvmooLHV.js +2 -0
  24. package/dist/components/p-BvmooLHV.js.map +1 -0
  25. package/dist/components/p-C4WbCXBj.js +2 -0
  26. package/dist/components/p-C4WbCXBj.js.map +1 -0
  27. package/dist/components/p-CYJ-de0u.js +2 -0
  28. package/dist/components/p-CYJ-de0u.js.map +1 -0
  29. package/dist/components/{p--YDw8Q4o.js → p-CsO880L-.js} +2 -2
  30. package/dist/components/p-DTjpgYJV.js +2 -0
  31. package/dist/components/p-DTjpgYJV.js.map +1 -0
  32. package/dist/components/p-DfL2MOso.js +2 -0
  33. package/dist/components/p-DfL2MOso.js.map +1 -0
  34. package/dist/components/p-DiWQFROF.js +2 -0
  35. package/dist/components/p-DiWQFROF.js.map +1 -0
  36. package/dist/types/components/Banner/Banner.d.ts +2 -0
  37. package/dist/types/components/Loader/Loader.d.ts +3 -2
  38. package/dist/types/components/Menu/Menu.d.ts +11 -2
  39. package/dist/types/components/Modal/Modal.d.ts +1 -0
  40. package/dist/types/components/PanelNav/PanelNav.d.ts +3 -6
  41. package/dist/types/components/Toast/Toast.d.ts +1 -0
  42. package/dist/types/components/Tooltip/Tooltip.d.ts +14 -3
  43. package/dist/types/components.d.ts +42 -103
  44. package/dist/types/nav/shell-view-transition.d.ts +2 -2
  45. package/dist/types/utils/index.d.ts +5 -0
  46. package/dist/types/utils/resolve-css-length-px.d.ts +8 -0
  47. package/dist/types/utils/resolve-css-time-ms.d.ts +8 -0
  48. package/dist/types/utils/token-defaults.d.ts +27 -0
  49. package/package.json +8 -2
  50. package/src/angular/index.ts +0 -1
  51. package/src/angular/proxies.ts +0 -33
  52. package/src/react/components.ts +0 -1
  53. package/src/wc/components/Banner/Banner.tsx +11 -5
  54. package/src/wc/components/Loader/Loader.tsx +8 -3
  55. package/src/wc/components/Menu/Menu.tsx +61 -26
  56. package/src/wc/components/Modal/Modal.tsx +10 -7
  57. package/src/wc/components/PanelNav/PanelNav.tsx +5 -8
  58. package/src/wc/components/Toast/Toast.tsx +7 -2
  59. package/src/wc/components/Toast/toast-service.ts +8 -1
  60. package/src/wc/components/ToggleButton/ToggleButton.tsx +7 -3
  61. package/src/wc/components/Tooltip/Tooltip.tsx +70 -31
  62. package/src/wc/components.d.ts +42 -103
  63. package/src/wc/nav/shell-view-transition.ts +4 -10
  64. package/src/wc/utils/index.ts +4 -0
  65. package/src/wc/utils/resolve-css-length-px.ts +64 -0
  66. package/src/wc/utils/resolve-css-time-ms.ts +46 -0
  67. package/src/wc/utils/token-defaults.ts +48 -0
  68. package/dist/components/ds-sidebar.d.ts +0 -11
  69. package/dist/components/ds-sidebar.js +0 -2
  70. package/dist/components/ds-sidebar.js.map +0 -1
  71. package/dist/components/p-BcuUR5Ao.js +0 -2
  72. package/dist/components/p-BcuUR5Ao.js.map +0 -1
  73. package/dist/components/p-CpbnmEu1.js +0 -2
  74. package/dist/components/p-CpbnmEu1.js.map +0 -1
  75. package/dist/components/p-DznbYg1m.js +0 -2
  76. package/dist/components/p-DznbYg1m.js.map +0 -1
  77. package/dist/components/p-uMN1Ppw2.js +0 -2
  78. package/dist/components/p-uMN1Ppw2.js.map +0 -1
  79. package/dist/types/components/Sidebar/Sidebar.d.ts +0 -29
  80. package/src/react/ds-sidebar.ts +0 -33
  81. package/src/wc/components/Sidebar/Sidebar.tsx +0 -245
  82. /package/dist/components/{p--YDw8Q4o.js.map → p-CsO880L-.js.map} +0 -0
@@ -28,7 +28,6 @@ import { PanelNavGroup, PanelNavRouterMode } from "./components/PanelNav/panel-n
28
28
  import { RadioOption } from "./components/RadioGroup/RadioGroup";
29
29
  import { ScrollbarVariant } from "./components/Scrollbar/Scrollbar";
30
30
  import { SelectOption } from "./components/Select/Select";
31
- import { SidebarWidth } from "./components/Sidebar/Sidebar";
32
31
  import { SkeletonVariant } from "./components/Skeleton/Skeleton";
33
32
  import { SurfaceBackground, SurfaceContrast, SurfaceElement, SurfaceElevation, SurfaceIntent, SurfaceRadius } from "./components/Surface/Surface";
34
33
  import { TabItem } from "./components/TabGroup/tab-item-utils";
@@ -64,7 +63,6 @@ export { PanelNavGroup, PanelNavRouterMode } from "./components/PanelNav/panel-n
64
63
  export { RadioOption } from "./components/RadioGroup/RadioGroup";
65
64
  export { ScrollbarVariant } from "./components/Scrollbar/Scrollbar";
66
65
  export { SelectOption } from "./components/Select/Select";
67
- export { SidebarWidth } from "./components/Sidebar/Sidebar";
68
66
  export { SkeletonVariant } from "./components/Skeleton/Skeleton";
69
67
  export { SurfaceBackground, SurfaceContrast, SurfaceElement, SurfaceElevation, SurfaceIntent, SurfaceRadius } from "./components/Surface/Surface";
70
68
  export { TabItem } from "./components/TabGroup/tab-item-utils";
@@ -541,10 +539,10 @@ export namespace Components {
541
539
  */
542
540
  "label": string | undefined;
543
541
  /**
544
- * Render size in px. Designed on a 16×16 viewBox; stroke scales proportionally.
545
- * @default 20
542
+ * Render size number (px) or TokoMo length (`var(--dimension-iconography-md)`, etc.).
543
+ * @default TOKEN_DEFAULTS.iconographyMd
546
544
  */
547
- "size": number;
545
+ "size": number | string;
548
546
  }
549
547
  interface DsMenu {
550
548
  /**
@@ -552,9 +550,10 @@ export namespace Components {
552
550
  */
553
551
  "align": MenuAlign;
554
552
  /**
553
+ * Cross-axis offset — number (px) or TokoMo length.
555
554
  * @default 0
556
555
  */
557
- "alignOffset": number;
556
+ "alignOffset": number | string;
558
557
  /**
559
558
  * External trigger element to position against. Set via JS: menuEl.anchor = buttonEl
560
559
  */
@@ -582,9 +581,10 @@ export namespace Components {
582
581
  */
583
582
  "side": MenuSide;
584
583
  /**
585
- * @default 4
584
+ * Gap between anchor and menu — number (px) or TokoMo length (`var(--dimension-space-050)`, etc.).
585
+ * @default TOKEN_DEFAULTS.space050
586
586
  */
587
- "sideOffset": number;
587
+ "sideOffset": number | string;
588
588
  }
589
589
  interface DsModal {
590
590
  "heading": string;
@@ -628,7 +628,7 @@ export namespace Components {
628
628
  */
629
629
  "breakpoint": number;
630
630
  /**
631
- * Whether the nav is in collapsed (icon-only) state. When `storageKey` is set the component manages this internally do not also bind it from outside in that mode.
631
+ * Whether the nav is in collapsed (icon-only) state. Set `storageKey` to persist across reloads. `dsNavToggle` still fires on change.
632
632
  * @default false
633
633
  */
634
634
  "collapsed": boolean;
@@ -658,7 +658,7 @@ export namespace Components {
658
658
  */
659
659
  "routerMode": PanelNavRouterMode;
660
660
  /**
661
- * `localStorage` key used to persist the collapsed state across page loads. When set the component is self-managing for collapsed state; `dsNavToggle` still fires for consumers that want to observe the change.
661
+ * `localStorage` key used to persist the collapsed state across page loads. When set, collapsed state is restored on mount and written on each toggle.
662
662
  * @default ''
663
663
  */
664
664
  "storageKey": string;
@@ -728,24 +728,6 @@ export namespace Components {
728
728
  */
729
729
  "value": string;
730
730
  }
731
- interface DsSidebar {
732
- /**
733
- * @default false
734
- */
735
- "collapsed": boolean;
736
- /**
737
- * @default false
738
- */
739
- "mobile": boolean;
740
- /**
741
- * @default true
742
- */
743
- "resizable": boolean;
744
- /**
745
- * @default 'default'
746
- */
747
- "width": SidebarWidth;
748
- }
749
731
  interface DsSkeleton {
750
732
  /**
751
733
  * Height as a CSS value string or number (px).
@@ -1049,13 +1031,15 @@ export namespace Components {
1049
1031
  */
1050
1032
  "align": TooltipAlign;
1051
1033
  /**
1034
+ * Cross-axis offset — number (px) or TokoMo length.
1052
1035
  * @default 0
1053
1036
  */
1054
- "alignOffset": number;
1037
+ "alignOffset": number | string;
1055
1038
  /**
1056
- * @default HOVER_DELAY_MS
1039
+ * Show delay — number (ms) or TokoMo time token / `var(--effect-animation-delay-*)`.
1040
+ * @default TOKEN_DEFAULTS.animationDelayMedium1
1057
1041
  */
1058
- "delay": number;
1042
+ "delay": number | string;
1059
1043
  "label": string;
1060
1044
  "shortcutKey": string | undefined;
1061
1045
  /**
@@ -1067,9 +1051,10 @@ export namespace Components {
1067
1051
  */
1068
1052
  "side": TooltipSide;
1069
1053
  /**
1070
- * @default 4
1054
+ * Gap between anchor and tooltip — number (px) or TokoMo length.
1055
+ * @default TOKEN_DEFAULTS.space050
1071
1056
  */
1072
- "sideOffset": number;
1057
+ "sideOffset": number | string;
1073
1058
  }
1074
1059
  }
1075
1060
  export interface DsAccordionCustomEvent<T> extends CustomEvent<T> {
@@ -1136,10 +1121,6 @@ export interface DsSelectCustomEvent<T> extends CustomEvent<T> {
1136
1121
  detail: T;
1137
1122
  target: HTMLDsSelectElement;
1138
1123
  }
1139
- export interface DsSidebarCustomEvent<T> extends CustomEvent<T> {
1140
- detail: T;
1141
- target: HTMLDsSidebarElement;
1142
- }
1143
1124
  export interface DsSliderCustomEvent<T> extends CustomEvent<T> {
1144
1125
  detail: T;
1145
1126
  target: HTMLDsSliderElement;
@@ -1517,24 +1498,6 @@ declare global {
1517
1498
  prototype: HTMLDsSelectElement;
1518
1499
  new (): HTMLDsSelectElement;
1519
1500
  };
1520
- interface HTMLDsSidebarElementEventMap {
1521
- "dsToggle": void;
1522
- "dsWidthChange": SidebarWidth;
1523
- }
1524
- interface HTMLDsSidebarElement extends Components.DsSidebar, HTMLStencilElement {
1525
- addEventListener<K extends keyof HTMLDsSidebarElementEventMap>(type: K, listener: (this: HTMLDsSidebarElement, ev: DsSidebarCustomEvent<HTMLDsSidebarElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
1526
- addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1527
- addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1528
- addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1529
- removeEventListener<K extends keyof HTMLDsSidebarElementEventMap>(type: K, listener: (this: HTMLDsSidebarElement, ev: DsSidebarCustomEvent<HTMLDsSidebarElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1530
- removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1531
- removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1532
- removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1533
- }
1534
- var HTMLDsSidebarElement: {
1535
- prototype: HTMLDsSidebarElement;
1536
- new (): HTMLDsSidebarElement;
1537
- };
1538
1501
  interface HTMLDsSkeletonElement extends Components.DsSkeleton, HTMLStencilElement {
1539
1502
  }
1540
1503
  var HTMLDsSkeletonElement: {
@@ -1720,7 +1683,6 @@ declare global {
1720
1683
  "ds-radio-group": HTMLDsRadioGroupElement;
1721
1684
  "ds-scrollbar": HTMLDsScrollbarElement;
1722
1685
  "ds-select": HTMLDsSelectElement;
1723
- "ds-sidebar": HTMLDsSidebarElement;
1724
1686
  "ds-skeleton": HTMLDsSkeletonElement;
1725
1687
  "ds-slider": HTMLDsSliderElement;
1726
1688
  "ds-surface": HTMLDsSurfaceElement;
@@ -2238,10 +2200,10 @@ declare namespace LocalJSX {
2238
2200
  */
2239
2201
  "label"?: string | undefined;
2240
2202
  /**
2241
- * Render size in px. Designed on a 16×16 viewBox; stroke scales proportionally.
2242
- * @default 20
2203
+ * Render size number (px) or TokoMo length (`var(--dimension-iconography-md)`, etc.).
2204
+ * @default TOKEN_DEFAULTS.iconographyMd
2243
2205
  */
2244
- "size"?: number;
2206
+ "size"?: number | string;
2245
2207
  }
2246
2208
  interface DsMenu {
2247
2209
  /**
@@ -2249,9 +2211,10 @@ declare namespace LocalJSX {
2249
2211
  */
2250
2212
  "align"?: MenuAlign;
2251
2213
  /**
2214
+ * Cross-axis offset — number (px) or TokoMo length.
2252
2215
  * @default 0
2253
2216
  */
2254
- "alignOffset"?: number;
2217
+ "alignOffset"?: number | string;
2255
2218
  /**
2256
2219
  * External trigger element to position against. Set via JS: menuEl.anchor = buttonEl
2257
2220
  */
@@ -2281,9 +2244,10 @@ declare namespace LocalJSX {
2281
2244
  */
2282
2245
  "side"?: MenuSide;
2283
2246
  /**
2284
- * @default 4
2247
+ * Gap between anchor and menu — number (px) or TokoMo length (`var(--dimension-space-050)`, etc.).
2248
+ * @default TOKEN_DEFAULTS.space050
2285
2249
  */
2286
- "sideOffset"?: number;
2250
+ "sideOffset"?: number | string;
2287
2251
  }
2288
2252
  interface DsModal {
2289
2253
  "heading": string;
@@ -2329,7 +2293,7 @@ declare namespace LocalJSX {
2329
2293
  */
2330
2294
  "breakpoint"?: number;
2331
2295
  /**
2332
- * Whether the nav is in collapsed (icon-only) state. When `storageKey` is set the component manages this internally do not also bind it from outside in that mode.
2296
+ * Whether the nav is in collapsed (icon-only) state. Set `storageKey` to persist across reloads. `dsNavToggle` still fires on change.
2333
2297
  * @default false
2334
2298
  */
2335
2299
  "collapsed"?: boolean;
@@ -2375,7 +2339,7 @@ declare namespace LocalJSX {
2375
2339
  */
2376
2340
  "routerMode"?: PanelNavRouterMode;
2377
2341
  /**
2378
- * `localStorage` key used to persist the collapsed state across page loads. When set the component is self-managing for collapsed state; `dsNavToggle` still fires for consumers that want to observe the change.
2342
+ * `localStorage` key used to persist the collapsed state across page loads. When set, collapsed state is restored on mount and written on each toggle.
2379
2343
  * @default ''
2380
2344
  */
2381
2345
  "storageKey"?: string;
@@ -2450,26 +2414,6 @@ declare namespace LocalJSX {
2450
2414
  */
2451
2415
  "value"?: string;
2452
2416
  }
2453
- interface DsSidebar {
2454
- /**
2455
- * @default false
2456
- */
2457
- "collapsed"?: boolean;
2458
- /**
2459
- * @default false
2460
- */
2461
- "mobile"?: boolean;
2462
- "onDsToggle"?: (event: DsSidebarCustomEvent<void>) => void;
2463
- "onDsWidthChange"?: (event: DsSidebarCustomEvent<SidebarWidth>) => void;
2464
- /**
2465
- * @default true
2466
- */
2467
- "resizable"?: boolean;
2468
- /**
2469
- * @default 'default'
2470
- */
2471
- "width"?: SidebarWidth;
2472
- }
2473
2417
  interface DsSkeleton {
2474
2418
  /**
2475
2419
  * Height as a CSS value string or number (px).
@@ -2788,13 +2732,15 @@ declare namespace LocalJSX {
2788
2732
  */
2789
2733
  "align"?: TooltipAlign;
2790
2734
  /**
2735
+ * Cross-axis offset — number (px) or TokoMo length.
2791
2736
  * @default 0
2792
2737
  */
2793
- "alignOffset"?: number;
2738
+ "alignOffset"?: number | string;
2794
2739
  /**
2795
- * @default HOVER_DELAY_MS
2740
+ * Show delay — number (ms) or TokoMo time token / `var(--effect-animation-delay-*)`.
2741
+ * @default TOKEN_DEFAULTS.animationDelayMedium1
2796
2742
  */
2797
- "delay"?: number;
2743
+ "delay"?: number | string;
2798
2744
  "label": string;
2799
2745
  "shortcutKey"?: string | undefined;
2800
2746
  /**
@@ -2806,9 +2752,10 @@ declare namespace LocalJSX {
2806
2752
  */
2807
2753
  "side"?: TooltipSide;
2808
2754
  /**
2809
- * @default 4
2755
+ * Gap between anchor and tooltip — number (px) or TokoMo length.
2756
+ * @default TOKEN_DEFAULTS.space050
2810
2757
  */
2811
- "sideOffset"?: number;
2758
+ "sideOffset"?: number | string;
2812
2759
  }
2813
2760
 
2814
2761
  interface DsAccordionAttributes {
@@ -2955,15 +2902,15 @@ declare namespace LocalJSX {
2955
2902
  "ariaDescribedby": string | undefined;
2956
2903
  }
2957
2904
  interface DsLoaderAttributes {
2958
- "size": number;
2905
+ "size": string;
2959
2906
  "label": string | undefined;
2960
2907
  }
2961
2908
  interface DsMenuAttributes {
2962
2909
  "open": boolean;
2963
2910
  "side": MenuSide;
2964
2911
  "align": MenuAlign;
2965
- "sideOffset": number;
2966
- "alignOffset": number;
2912
+ "sideOffset": string;
2913
+ "alignOffset": string;
2967
2914
  "menuWidth": string | undefined;
2968
2915
  "minWidth": string | undefined;
2969
2916
  "anchorId": string | undefined;
@@ -3011,12 +2958,6 @@ declare namespace LocalJSX {
3011
2958
  "ariaLabel": string | undefined;
3012
2959
  "ariaLabelledby": string | undefined;
3013
2960
  }
3014
- interface DsSidebarAttributes {
3015
- "collapsed": boolean;
3016
- "width": string;
3017
- "resizable": boolean;
3018
- "mobile": boolean;
3019
- }
3020
2961
  interface DsSkeletonAttributes {
3021
2962
  "variant": SkeletonVariant;
3022
2963
  "width": string;
@@ -3117,9 +3058,9 @@ declare namespace LocalJSX {
3117
3058
  "label": string;
3118
3059
  "side": TooltipSide;
3119
3060
  "align": TooltipAlign;
3120
- "sideOffset": number;
3121
- "alignOffset": number;
3122
- "delay": number;
3061
+ "sideOffset": string;
3062
+ "alignOffset": string;
3063
+ "delay": string;
3123
3064
  "shortcutKey": string | undefined;
3124
3065
  "shortcutKeyPosition": 'start' | 'end';
3125
3066
  }
@@ -3152,7 +3093,6 @@ declare namespace LocalJSX {
3152
3093
  "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] };
3153
3094
  "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] };
3154
3095
  "ds-select": Omit<DsSelect, keyof DsSelectAttributes> & { [K in keyof DsSelect & keyof DsSelectAttributes]?: DsSelect[K] } & { [K in keyof DsSelect & keyof DsSelectAttributes as `attr:${K}`]?: DsSelectAttributes[K] } & { [K in keyof DsSelect & keyof DsSelectAttributes as `prop:${K}`]?: DsSelect[K] };
3155
- "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] };
3156
3096
  "ds-skeleton": Omit<DsSkeleton, keyof DsSkeletonAttributes> & { [K in keyof DsSkeleton & keyof DsSkeletonAttributes]?: DsSkeleton[K] } & { [K in keyof DsSkeleton & keyof DsSkeletonAttributes as `attr:${K}`]?: DsSkeletonAttributes[K] } & { [K in keyof DsSkeleton & keyof DsSkeletonAttributes as `prop:${K}`]?: DsSkeleton[K] };
3157
3097
  "ds-slider": Omit<DsSlider, keyof DsSliderAttributes> & { [K in keyof DsSlider & keyof DsSliderAttributes]?: DsSlider[K] } & { [K in keyof DsSlider & keyof DsSliderAttributes as `attr:${K}`]?: DsSliderAttributes[K] } & { [K in keyof DsSlider & keyof DsSliderAttributes as `prop:${K}`]?: DsSlider[K] } & OneOf<"label", DsSlider["label"], DsSliderAttributes["label"]>;
3158
3098
  "ds-surface": Omit<DsSurface, keyof DsSurfaceAttributes> & { [K in keyof DsSurface & keyof DsSurfaceAttributes]?: DsSurface[K] } & { [K in keyof DsSurface & keyof DsSurfaceAttributes as `attr:${K}`]?: DsSurfaceAttributes[K] } & { [K in keyof DsSurface & keyof DsSurfaceAttributes as `prop:${K}`]?: DsSurface[K] };
@@ -3199,7 +3139,6 @@ declare module "@stencil/core" {
3199
3139
  "ds-radio-group": LocalJSX.IntrinsicElements["ds-radio-group"] & JSXBase.HTMLAttributes<HTMLDsRadioGroupElement>;
3200
3140
  "ds-scrollbar": LocalJSX.IntrinsicElements["ds-scrollbar"] & JSXBase.HTMLAttributes<HTMLDsScrollbarElement>;
3201
3141
  "ds-select": LocalJSX.IntrinsicElements["ds-select"] & JSXBase.HTMLAttributes<HTMLDsSelectElement>;
3202
- "ds-sidebar": LocalJSX.IntrinsicElements["ds-sidebar"] & JSXBase.HTMLAttributes<HTMLDsSidebarElement>;
3203
3142
  "ds-skeleton": LocalJSX.IntrinsicElements["ds-skeleton"] & JSXBase.HTMLAttributes<HTMLDsSkeletonElement>;
3204
3143
  "ds-slider": LocalJSX.IntrinsicElements["ds-slider"] & JSXBase.HTMLAttributes<HTMLDsSliderElement>;
3205
3144
  "ds-surface": LocalJSX.IntrinsicElements["ds-surface"] & JSXBase.HTMLAttributes<HTMLDsSurfaceElement>;
@@ -1,17 +1,11 @@
1
+ import { parseCssTimeMs } from '../utils/resolve-css-time-ms';
2
+
1
3
  /** `view-transition-name` on `ds-bar-nav` — pairs with root reveal in shell apps. */
2
4
  export const SHELL_BAR_NAV_VT_NAME = 'ds-shell-bar-nav';
3
5
 
4
- const VT_STYLE_ID = 'ds-shell-nav-vt-style';
6
+ export { parseCssTimeMs };
5
7
 
6
- /** Parse a CSS <time> value to milliseconds. */
7
- export function parseCssTimeMs(value: string, fallback: number): number {
8
- const v = value.trim();
9
- const num = parseFloat(v);
10
- if (Number.isNaN(num)) return fallback;
11
- if (/ms\s*$/.test(v)) return num;
12
- if (/s\s*$/.test(v)) return num * 1000;
13
- return num;
14
- }
8
+ const VT_STYLE_ID = 'ds-shell-nav-vt-style';
15
9
 
16
10
  /** Suppress default cross-fade and pin new snapshots to a 0px circle for WAAPI reveal. */
17
11
  export function ensureShellNavVtStyle(): void {
@@ -0,0 +1,4 @@
1
+ export { clearCssLengthPxCache, resolveCssLengthPx } from './resolve-css-length-px';
2
+ export { parseCssTimeMs, resolveCssTimeMs } from './resolve-css-time-ms';
3
+ export { TOKEN_DEFAULTS } from './token-defaults';
4
+ export type { TokenDefaultKey } from './token-defaults';
@@ -0,0 +1,64 @@
1
+ const lengthPxCache = new Map<string, number>();
2
+
3
+ let probeEl: HTMLElement | null = null;
4
+
5
+ function getProbeElement(): HTMLElement | null {
6
+ if (typeof document === 'undefined') return null;
7
+
8
+ if (!probeEl) {
9
+ probeEl = document.createElement('div');
10
+ probeEl.setAttribute('aria-hidden', 'true');
11
+ probeEl.style.cssText =
12
+ 'position:absolute;visibility:hidden;pointer-events:none;top:0;left:0;width:0;height:0;overflow:hidden;';
13
+ document.documentElement.appendChild(probeEl);
14
+ }
15
+
16
+ return probeEl;
17
+ }
18
+
19
+ /** Clear session cache (tests only). */
20
+ export function clearCssLengthPxCache(): void {
21
+ lengthPxCache.clear();
22
+ }
23
+
24
+ /**
25
+ * Resolve a CSS length to pixels for layout math.
26
+ * Numbers pass through; `var(--dimension-*)`, `calc(...)`, and `16px` resolve via a hidden probe.
27
+ */
28
+ export function resolveCssLengthPx(
29
+ value: number | string | undefined,
30
+ fallback: number | string,
31
+ ): number {
32
+ const resolved = value === undefined || value === null || value === '' ? fallback : value;
33
+ if (typeof resolved === 'number') return resolved;
34
+
35
+ const trimmed = resolved.trim();
36
+ if (!trimmed) return resolveCssLengthPx(fallback, 0);
37
+
38
+ const cached = lengthPxCache.get(trimmed);
39
+ if (cached !== undefined) return cached;
40
+
41
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
42
+ const n = Number(trimmed);
43
+ lengthPxCache.set(trimmed, n);
44
+ return n;
45
+ }
46
+
47
+ const pxMatch = trimmed.match(/^(-?\d+(\.\d+)?)px$/);
48
+ if (pxMatch) {
49
+ const px = parseFloat(pxMatch[1]);
50
+ lengthPxCache.set(trimmed, px);
51
+ return px;
52
+ }
53
+
54
+ const probe = getProbeElement();
55
+ if (!probe) {
56
+ return typeof fallback === 'number' ? fallback : 0;
57
+ }
58
+
59
+ probe.style.width = trimmed;
60
+ const px = probe.getBoundingClientRect().width;
61
+ probe.style.width = '';
62
+ lengthPxCache.set(trimmed, px);
63
+ return px;
64
+ }
@@ -0,0 +1,46 @@
1
+ /** Parse a CSS <time> value (or motion shorthand's first token) to milliseconds. */
2
+ export function parseCssTimeMs(value: string, fallback: number): number {
3
+ const firstToken = value.trim().split(/\s+/)[0] ?? '';
4
+ const num = parseFloat(firstToken);
5
+ if (Number.isNaN(num)) return fallback;
6
+ if (/ms\s*$/.test(firstToken)) return num;
7
+ if (/s\s*$/.test(firstToken)) return num * 1000;
8
+ return num;
9
+ }
10
+
11
+ function extractCssCustomProp(ref: string): string | null {
12
+ const varMatch = ref.match(/^var\(\s*(--[^),]+)/);
13
+ if (varMatch) return varMatch[1].trim();
14
+ if (ref.startsWith('--')) return ref.trim();
15
+ return null;
16
+ }
17
+
18
+ function readTokenTimeMs(token: string, fallback: number): number {
19
+ if (typeof document === 'undefined') return fallback;
20
+
21
+ const prop = extractCssCustomProp(token);
22
+ if (!prop) return parseCssTimeMs(token, fallback);
23
+
24
+ const raw = getComputedStyle(document.documentElement).getPropertyValue(prop).trim();
25
+ return parseCssTimeMs(raw, fallback);
26
+ }
27
+
28
+ /**
29
+ * Resolve a duration to milliseconds for JS timers aligned with CSS motion tokens.
30
+ * Accepts numbers (ms), raw times (`200ms`, `0.75s`), or `var(--effect-*)` references.
31
+ */
32
+ export function resolveCssTimeMs(
33
+ value: number | string | undefined,
34
+ fallbackToken: string,
35
+ ): number {
36
+ if (typeof value === 'number') return value;
37
+
38
+ const token = typeof value === 'string' && value.trim() ? value.trim() : fallbackToken;
39
+ const prop = extractCssCustomProp(token);
40
+
41
+ if (prop) {
42
+ return readTokenTimeMs(token, readTokenTimeMs(fallbackToken, 200));
43
+ }
44
+
45
+ return parseCssTimeMs(token, readTokenTimeMs(fallbackToken, 200));
46
+ }
@@ -0,0 +1,48 @@
1
+ import {
2
+ dimensionIconographyMd,
3
+ dimensionIconographySm,
4
+ dimensionIconographyXs,
5
+ dimensionMenuWidthXs,
6
+ dimensionPanelWidth2xs,
7
+ dimensionPanelWidthLg,
8
+ dimensionPanelWidthMd,
9
+ dimensionSize300,
10
+ dimensionSize600,
11
+ dimensionSize800,
12
+ dimensionSpace050,
13
+ dimensionSpace200,
14
+ effectAnimationDelayLong2,
15
+ effectAnimationDelayMedium1,
16
+ effectAnimationDelayShort2,
17
+ effectAnimationDurationMedium1,
18
+ effectAnimationDurationShort3,
19
+ effectMotionShort3,
20
+ } from '@ds-mo/tokens/ts';
21
+
22
+ /** TokoMo CSS custom-property names for shared component defaults (runtime resolution). */
23
+ export const TOKEN_DEFAULTS = {
24
+ space050: dimensionSpace050,
25
+ space200: dimensionSpace200,
26
+ size300: dimensionSize300,
27
+ size600: dimensionSize600,
28
+ size800: dimensionSize800,
29
+ iconographyMd: dimensionIconographyMd,
30
+ iconographySm: dimensionIconographySm,
31
+ iconographyXs: dimensionIconographyXs,
32
+ panelWidth2xs: dimensionPanelWidth2xs,
33
+ panelWidthMd: dimensionPanelWidthMd,
34
+ panelWidthLg: dimensionPanelWidthLg,
35
+ menuWidthXs: dimensionMenuWidthXs,
36
+ motionShort3: effectMotionShort3,
37
+ animationDurationShort3: effectAnimationDurationShort3,
38
+ animationDurationMedium1: effectAnimationDurationMedium1,
39
+ animationDelayMedium1: effectAnimationDelayMedium1,
40
+ animationDelayShort2: effectAnimationDelayShort2,
41
+ animationDelayLong2: effectAnimationDelayLong2,
42
+ /** Unmeasured menu height fallback: 20× base (160px at default scale). */
43
+ menuFallbackHeight: 'calc(var(--dimension-size-base) * 20)',
44
+ /** Unmeasured tooltip width fallback: size-800 + size-200 (80px). */
45
+ tooltipFallbackWidth: 'calc(var(--dimension-size-800) + var(--dimension-size-200))',
46
+ } as const;
47
+
48
+ export type TokenDefaultKey = keyof typeof TOKEN_DEFAULTS;
@@ -1,11 +0,0 @@
1
- import type { Components, JSX } from "../types/components";
2
-
3
- interface DsSidebar extends Components.DsSidebar, HTMLElement {}
4
- export const DsSidebar: {
5
- prototype: DsSidebar;
6
- new (): DsSidebar;
7
- };
8
- /**
9
- * Used to define this component and all nested components recursively.
10
- */
11
- export const defineCustomElement: () => void;
@@ -1,2 +0,0 @@
1
- import{p as s,H as i,c as e,h as t,a as o,t as r}from"./index.js";const a=()=>`.sc-ds-sidebar-h{display:contents}.backdrop.sc-ds-sidebar{position:fixed;inset:0;background-color:var(--color-background-shade);z-index:9996}.sidebar.sc-ds-sidebar{display:flex;flex-direction:column;height:100%;background-color:var(--color-background-secondary);border-right:var(--dimension-stroke-width-015) solid var(--color-border-primary);position:relative;flex-shrink:0;overflow:hidden;transition:width var(--effect-motion-short-2);box-sizing:border-box}.sidebar--resizing.sc-ds-sidebar{transition:none}.sidebar--collapsed.sc-ds-sidebar{width:0 !important;border-right:none}.sidebar--mobile.sc-ds-sidebar{position:fixed;top:0;left:0;bottom:0;z-index:9997}.sidebar--mini.sc-ds-sidebar-s>[data-sidebar-label],.sidebar--mini .sc-ds-sidebar-s>[data-sidebar-label],.sidebar--mini.sc-ds-sidebar-s>[data-sidebar-badge],.sidebar--mini .sc-ds-sidebar-s>[data-sidebar-badge],.sidebar--mini.sc-ds-sidebar-s>[data-sidebar-section-header],.sidebar--mini .sc-ds-sidebar-s>[data-sidebar-section-header]{display:none}.sidebar__content.sc-ds-sidebar{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--dimension-space-050);scrollbar-width:none}.sidebar__content.sc-ds-sidebar::-webkit-scrollbar{display:none}.sidebar__footer.sc-ds-sidebar{flex-shrink:0;padding:var(--dimension-space-050);border-top:var(--dimension-stroke-width-015) solid var(--color-border-primary)}.sidebar__footer.sc-ds-sidebar:empty{display:none}.sidebar__resize-handle.sc-ds-sidebar{position:absolute;top:0;right:-3px;bottom:0;width:6px;cursor:col-resize;z-index:10}.sidebar__resize-handle.sc-ds-sidebar:hover{background-color:var(--color-border-bold-brand);opacity:0.5}.sidebar__resize-handle.sc-ds-sidebar:focus-visible{outline:var(--dimension-stroke-width-025) solid var(--color-border-bold-brand);outline-offset:var(--dimension-stroke-width-015);background-color:var(--color-border-bold-brand);opacity:0.5}`;const d=56;const n=240;const l=480;const c=180;const h=140;const b=16;const u=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(",");const m=s(class s extends i{constructor(s){super();if(s!==false){this.__registerHost()}this.dsToggle=e(this,"dsToggle");this.dsWidthChange=e(this,"dsWidthChange");this.collapsed=false;this.width="default";this.resizable=true;this.mobile=false;this.isResizing=false;this.triggerEl=null;this.escapeHandler=null;this.tabHandler=null;this.mouseMoveHandler=null;this.mouseUpHandler=null}get resolvedWidth(){if(this.width==="mini")return d;if(this.width==="default")return n;return this.width}get isMobileOpen(){return this.mobile&&!this.collapsed}onCollapsedChange(){if(this.isMobileOpen){this.setupMobileFocusTrap()}else{this.teardownMobileFocusTrap()}}componentDidLoad(){if(this.isMobileOpen){this.setupMobileFocusTrap()}if(this.mobile){this.escapeHandler=s=>{if(s.key==="Escape"&&!this.collapsed){this.dsToggle.emit()}};document.addEventListener("keydown",this.escapeHandler)}}disconnectedCallback(){this.teardownMobileFocusTrap();if(this.escapeHandler){document.removeEventListener("keydown",this.escapeHandler);this.escapeHandler=null}this.cleanupMouseHandlers()}setupMobileFocusTrap(){this.triggerEl=document.activeElement;const s=()=>Array.from(this.el.querySelectorAll(u)).filter((s=>!s.hasAttribute("aria-hidden")&&s.offsetParent!==null));const i=s();(i[0]??this.el).focus();this.tabHandler=i=>{if(i.key!=="Tab")return;const e=s();if(!e.length){i.preventDefault();this.el.focus();return}const t=e[0];const o=e[e.length-1];const r=document.activeElement;if(i.shiftKey&&(r===t||!this.el.contains(r))){i.preventDefault();o.focus()}else if(!i.shiftKey&&(r===o||!this.el.contains(r))){i.preventDefault();t.focus()}};document.addEventListener("keydown",this.tabHandler)}teardownMobileFocusTrap(){if(this.tabHandler){document.removeEventListener("keydown",this.tabHandler);this.tabHandler=null}this.triggerEl?.focus?.();this.triggerEl=null}cleanupMouseHandlers(){if(this.mouseMoveHandler)document.removeEventListener("mousemove",this.mouseMoveHandler);if(this.mouseUpHandler)document.removeEventListener("mouseup",this.mouseUpHandler);this.mouseMoveHandler=null;this.mouseUpHandler=null;document.body.style.cursor="";document.body.style.userSelect=""}handleResizeMouseDown(s){if(!this.resizable)return;s.preventDefault();this.isResizing=true;this.mouseMoveHandler=s=>{const i=s.clientX;if(i<h){this.dsWidthChange.emit("mini")}else if(i<c){this.dsWidthChange.emit("default")}else{this.dsWidthChange.emit(i)}};this.mouseUpHandler=()=>{this.isResizing=false;this.cleanupMouseHandlers()};document.body.style.cursor="col-resize";document.body.style.userSelect="none";document.addEventListener("mousemove",this.mouseMoveHandler);document.addEventListener("mouseup",this.mouseUpHandler)}handleResizeKeyDown(s){if(!this.resizable)return;const i=this.width;const e=this.resolvedWidth;switch(s.key){case"ArrowLeft":{s.preventDefault();if(i==="mini")return;const t=e-b;this.dsWidthChange.emit(t<c?"mini":t);break}case"ArrowRight":{s.preventDefault();if(i==="mini"){this.dsWidthChange.emit("default");return}this.dsWidthChange.emit(Math.min(e+b,l));break}case"Home":s.preventDefault();this.dsWidthChange.emit("mini");break;case"End":s.preventDefault();this.dsWidthChange.emit(l);break}}render(){if(this.collapsed&&!this.mobile)return null;const s=this.width==="mini";const i=this.isMobileOpen;const e=this.collapsed?0:this.resolvedWidth;const r=i?{role:"dialog","aria-modal":"true",tabIndex:-1}:{role:"navigation"};return t(o,null,this.mobile&&!this.collapsed&&t("div",{class:"backdrop",onClick:()=>this.dsToggle.emit(),"aria-hidden":"true"}),t("aside",{class:{sidebar:true,"sidebar--mini":s,"sidebar--mobile":this.mobile,"sidebar--collapsed":this.collapsed,"sidebar--resizing":this.isResizing},style:{width:`${e}px`},"aria-label":"Sidebar",...r},t("div",{class:"sidebar__content"},t("slot",null)),t("div",{class:"sidebar__footer"},t("slot",{name:"footer"})),this.resizable&&!this.mobile&&t("div",{class:"sidebar__resize-handle",onMouseDown:s=>this.handleResizeMouseDown(s),onKeyDown:s=>this.handleResizeKeyDown(s),role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":this.resolvedWidth,"aria-valuemin":d,"aria-valuemax":l,tabIndex:0})))}get el(){return this}static get watchers(){return{collapsed:[{onCollapsedChange:0}]}}static get style(){return a()}},[262,"ds-sidebar",{collapsed:[1028],width:[8],resizable:[4],mobile:[4],isResizing:[32]},undefined,{collapsed:[{onCollapsedChange:0}]}]);function f(){if(typeof customElements==="undefined"){return}const s=["ds-sidebar"];s.forEach((s=>{switch(s){case"ds-sidebar":if(!customElements.get(r(s))){customElements.define(r(s),m)}break}}))}f();const p=m;const g=f;export{p as DsSidebar,g as defineCustomElement};
2
- //# sourceMappingURL=ds-sidebar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["sidebarCss","MINI_WIDTH","DEFAULT_WIDTH","MAX_WIDTH","MIN_DRAG_WIDTH","SNAP_THRESHOLD","KEYBOARD_STEP","FOCUSABLE_SEL","join","Sidebar","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","collapsed","width","resizable","mobile","isResizing","triggerEl","escapeHandler","tabHandler","mouseMoveHandler","mouseUpHandler","resolvedWidth","isMobileOpen","onCollapsedChange","setupMobileFocusTrap","teardownMobileFocusTrap","componentDidLoad","e","key","dsToggle","emit","document","addEventListener","disconnectedCallback","removeEventListener","cleanupMouseHandlers","activeElement","focusables","Array","from","el","querySelectorAll","filter","hasAttribute","offsetParent","initial","focus","items","length","preventDefault","first","last","active","shiftKey","contains","body","style","cursor","userSelect","handleResizeMouseDown","ev","newW","clientX","dsWidthChange","handleResizeKeyDown","w","resolved","next","Math","min","render","isMini","sidebarWidth","dialogProps","role","tabIndex","h","Host","class","onClick","sidebar","name","onMouseDown","onKeyDown"],"sources":["src/wc/components/Sidebar/Sidebar.css?tag=ds-sidebar&encapsulation=scoped","src/wc/components/Sidebar/Sidebar.tsx"],"sourcesContent":[":host {\n display: contents;\n}\n\n.backdrop {\n position: fixed;\n inset: 0;\n background-color: var(--color-background-shade);\n z-index: 9996;\n}\n\n.sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--color-background-secondary);\n border-right: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n position: relative;\n flex-shrink: 0;\n overflow: hidden;\n transition: width var(--effect-motion-short-2);\n box-sizing: border-box;\n}\n\n.sidebar--resizing { transition: none; }\n\n.sidebar--collapsed {\n width: 0 !important;\n border-right: none;\n}\n\n.sidebar--mobile {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 9997;\n}\n\n/* Hide labels/badges/section headers when mini */\n.sidebar--mini ::slotted([data-sidebar-label]),\n.sidebar--mini ::slotted([data-sidebar-badge]),\n.sidebar--mini ::slotted([data-sidebar-section-header]) {\n display: none;\n}\n\n.sidebar__content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: var(--dimension-space-050);\n scrollbar-width: none;\n}\n\n.sidebar__content::-webkit-scrollbar { display: none; }\n\n.sidebar__footer {\n flex-shrink: 0;\n padding: var(--dimension-space-050);\n border-top: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n\n.sidebar__footer:empty { display: none; }\n\n.sidebar__resize-handle {\n position: absolute;\n top: 0;\n right: -3px;\n bottom: 0;\n width: 6px;\n cursor: col-resize;\n z-index: 10;\n}\n\n.sidebar__resize-handle:hover {\n background-color: var(--color-border-bold-brand);\n opacity: 0.5;\n}\n\n.sidebar__resize-handle:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-border-bold-brand);\n outline-offset: var(--dimension-stroke-width-015);\n background-color: var(--color-border-bold-brand);\n opacity: 0.5;\n}\n","import { Component, Prop, State, Event, EventEmitter, Element, Watch, h, Host } from '@stencil/core';\n\nexport type SidebarWidth = 'mini' | 'default' | number;\n\nconst MINI_WIDTH = 56;\nconst DEFAULT_WIDTH = 240;\nconst MAX_WIDTH = 480;\nconst MIN_DRAG_WIDTH = 180;\nconst SNAP_THRESHOLD = 140;\nconst KEYBOARD_STEP = 16;\n\nconst FOCUSABLE_SEL = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n@Component({\n tag: 'ds-sidebar',\n styleUrl: 'Sidebar.css',\n scoped: true,\n})\nexport class Sidebar {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) collapsed: boolean = false;\n @Prop() width: SidebarWidth = 'default';\n @Prop() resizable: boolean = true;\n @Prop() mobile: boolean = false;\n\n @State() private isResizing: boolean = false;\n\n @Event() dsToggle!: EventEmitter<void>;\n @Event() dsWidthChange!: EventEmitter<SidebarWidth>;\n\n private triggerEl: HTMLElement | null = null;\n private escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n private tabHandler: ((e: KeyboardEvent) => void) | null = null;\n private mouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n private mouseUpHandler: (() => void) | null = null;\n\n private get resolvedWidth(): number {\n if (this.width === 'mini') return MINI_WIDTH;\n if (this.width === 'default') return DEFAULT_WIDTH;\n return this.width as number;\n }\n\n private get isMobileOpen(): boolean {\n return this.mobile && !this.collapsed;\n }\n\n @Watch('collapsed')\n onCollapsedChange() {\n if (this.isMobileOpen) {\n this.setupMobileFocusTrap();\n } else {\n this.teardownMobileFocusTrap();\n }\n }\n\n componentDidLoad() {\n if (this.isMobileOpen) {\n this.setupMobileFocusTrap();\n }\n if (this.mobile) {\n this.escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !this.collapsed) {\n this.dsToggle.emit();\n }\n };\n document.addEventListener('keydown', this.escapeHandler);\n }\n }\n\n disconnectedCallback() {\n this.teardownMobileFocusTrap();\n if (this.escapeHandler) {\n document.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = null;\n }\n this.cleanupMouseHandlers();\n }\n\n private setupMobileFocusTrap() {\n this.triggerEl = document.activeElement as HTMLElement | null;\n\n const focusables = () =>\n Array.from(this.el.querySelectorAll<HTMLElement>(FOCUSABLE_SEL)).filter(\n el => !el.hasAttribute('aria-hidden') && el.offsetParent !== null,\n );\n\n const initial = focusables();\n (initial[0] ?? this.el).focus();\n\n this.tabHandler = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const items = focusables();\n if (!items.length) { e.preventDefault(); this.el.focus(); return; }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !this.el.contains(active))) {\n e.preventDefault(); last.focus();\n } else if (!e.shiftKey && (active === last || !this.el.contains(active))) {\n e.preventDefault(); first.focus();\n }\n };\n document.addEventListener('keydown', this.tabHandler);\n }\n\n private teardownMobileFocusTrap() {\n if (this.tabHandler) {\n document.removeEventListener('keydown', this.tabHandler);\n this.tabHandler = null;\n }\n this.triggerEl?.focus?.();\n this.triggerEl = null;\n }\n\n private cleanupMouseHandlers() {\n if (this.mouseMoveHandler) document.removeEventListener('mousemove', this.mouseMoveHandler);\n if (this.mouseUpHandler) document.removeEventListener('mouseup', this.mouseUpHandler);\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n\n private handleResizeMouseDown(e: MouseEvent) {\n if (!this.resizable) return;\n e.preventDefault();\n this.isResizing = true;\n\n this.mouseMoveHandler = (ev: MouseEvent) => {\n const newW = ev.clientX;\n if (newW < SNAP_THRESHOLD) {\n this.dsWidthChange.emit('mini');\n } else if (newW < MIN_DRAG_WIDTH) {\n this.dsWidthChange.emit('default');\n } else {\n this.dsWidthChange.emit(newW);\n }\n };\n\n this.mouseUpHandler = () => {\n this.isResizing = false;\n this.cleanupMouseHandlers();\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', this.mouseMoveHandler);\n document.addEventListener('mouseup', this.mouseUpHandler);\n }\n\n private handleResizeKeyDown(e: KeyboardEvent) {\n if (!this.resizable) return;\n const w = this.width;\n const resolved = this.resolvedWidth;\n\n switch (e.key) {\n case 'ArrowLeft': {\n e.preventDefault();\n if (w === 'mini') return;\n const next = resolved - KEYBOARD_STEP;\n this.dsWidthChange.emit(next < MIN_DRAG_WIDTH ? 'mini' : next);\n break;\n }\n case 'ArrowRight': {\n e.preventDefault();\n if (w === 'mini') { this.dsWidthChange.emit('default'); return; }\n this.dsWidthChange.emit(Math.min(resolved + KEYBOARD_STEP, MAX_WIDTH));\n break;\n }\n case 'Home':\n e.preventDefault();\n this.dsWidthChange.emit('mini');\n break;\n case 'End':\n e.preventDefault();\n this.dsWidthChange.emit(MAX_WIDTH);\n break;\n }\n }\n\n render() {\n if (this.collapsed && !this.mobile) return null;\n\n const isMini = this.width === 'mini';\n const isMobileOpen = this.isMobileOpen;\n const sidebarWidth = this.collapsed ? 0 : this.resolvedWidth;\n\n const dialogProps = isMobileOpen\n ? { role: 'dialog', 'aria-modal': 'true', tabIndex: -1 }\n : { role: 'navigation' };\n\n return (\n <Host>\n {this.mobile && !this.collapsed && (\n <div\n class=\"backdrop\"\n onClick={() => this.dsToggle.emit()}\n aria-hidden=\"true\"\n />\n )}\n <aside\n class={{\n sidebar: true,\n 'sidebar--mini': isMini,\n 'sidebar--mobile': this.mobile,\n 'sidebar--collapsed': this.collapsed,\n 'sidebar--resizing': this.isResizing,\n }}\n style={{ width: `${sidebarWidth}px` }}\n aria-label=\"Sidebar\"\n {...dialogProps}\n >\n <div class=\"sidebar__content\">\n <slot />\n </div>\n <div class=\"sidebar__footer\">\n <slot name=\"footer\" />\n </div>\n {this.resizable && !this.mobile && (\n <div\n class=\"sidebar__resize-handle\"\n onMouseDown={(e: MouseEvent) => this.handleResizeMouseDown(e)}\n onKeyDown={(e: KeyboardEvent) => this.handleResizeKeyDown(e)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize sidebar\"\n aria-valuenow={this.resolvedWidth}\n aria-valuemin={MINI_WIDTH}\n aria-valuemax={MAX_WIDTH}\n tabIndex={0}\n />\n )}\n </aside>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as s,h as t,t as i}from"./index.js";const n=()=>`:host{display:inline-flex;align-items:center;flex-shrink:0}.spinner{flex-shrink:0;animation:spin 0.75s linear infinite}.status{display:inline-flex;align-items:center}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}`;const r=e(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow();this.size=20}render(){const e=`${this.size}px`;const s=t("svg",{style:{width:e,height:e},viewBox:"0 0 16 16",fill:"none",class:"spinner","aria-hidden":"true"},t("circle",{cx:"8",cy:"8",r:"5",stroke:"currentColor","stroke-width":"1","stroke-linecap":"round","stroke-dasharray":"23.6 7.9"}));if(!this.label)return s;return t("span",{role:"status","aria-live":"polite",class:"status"},s,t("span",{class:"visually-hidden"},this.label))}static get style(){return n()}},[1,"ds-loader",{size:[2],label:[1]}]);function a(){if(typeof customElements==="undefined"){return}const e=["ds-loader"];e.forEach((e=>{switch(e){case"ds-loader":if(!customElements.get(i(e))){customElements.define(i(e),r)}break}}))}a();export{r as L,a as d};
2
- //# sourceMappingURL=p-BcuUR5Ao.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["loaderCss","Loader","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","size","render","px","svg","h","style","width","height","viewBox","fill","class","cx","cy","r","stroke","label","role"],"sources":["src/wc/components/Loader/Loader.css?tag=ds-loader&encapsulation=shadow","src/wc/components/Loader/Loader.tsx"],"sourcesContent":[":host {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.spinner {\n flex-shrink: 0;\n animation: spin 0.75s linear infinite;\n}\n\n.status {\n display: inline-flex;\n align-items: center;\n}\n\n.visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'ds-loader',\n styleUrl: 'Loader.css',\n shadow: true,\n})\nexport class Loader {\n /** Render size in px. Designed on a 16×16 viewBox; stroke scales proportionally. */\n @Prop() size: number = 20;\n /**\n * Accessible label for standalone usage. Wraps the spinner in a live region\n * and renders the label visually-hidden. Omit when the host element already\n * conveys busy state via aria-busy.\n */\n @Prop() label: string | undefined;\n\n render() {\n const px = `${this.size}px`;\n const svg = (\n <svg\n style={{ width: px, height: px }}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"spinner\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"8\" cy=\"8\" r=\"5\"\n stroke=\"currentColor\"\n stroke-width=\"1\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"23.6 7.9\"\n />\n </svg>\n );\n\n if (!this.label) return svg;\n\n return (\n <span role=\"status\" aria-live=\"polite\" class=\"status\">\n {svg}\n <span class=\"visually-hidden\">{this.label}</span>\n </span>\n );\n }\n}\n"],"mappings":"oDAAA,MAAMA,EAAY,IAAM,kY,MCOXC,EAAMC,EAAA,MAAAD,UAAAE,EALnB,WAAAC,CAAAC,G,kEAOUC,KAAAC,KAAe,EAqCxB,CA7BC,MAAAC,GACE,MAAMC,EAAK,GAAGH,KAAKC,SACnB,MAAMG,EACJC,EAAA,OACEC,MAAO,CAAEC,MAAOJ,EAAIK,OAAQL,GAC5BM,QAAQ,YACRC,KAAK,OACLC,MAAM,UAAS,cACH,QAEZN,EAAA,UACEO,GAAG,IAAIC,GAAG,IAAIC,EAAE,IAChBC,OAAO,eAAc,eACR,IAAG,iBACD,QAAO,mBACL,cAKvB,IAAKf,KAAKgB,MAAO,OAAOZ,EAExB,OACEC,EAAA,QAAMY,KAAK,SAAQ,YAAW,SAASN,MAAM,UAC1CP,EACDC,EAAA,QAAMM,MAAM,mBAAmBX,KAAKgB,O","ignoreList":[]}