@ds-mo/ui 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +8 -9
  2. package/dist/.build-stamp +1 -1
  3. package/dist/components/ds-app-shell.js +1 -1
  4. package/dist/components/ds-banner.js +1 -1
  5. package/dist/components/ds-bar-nav.js +1 -1
  6. package/dist/components/{ds-toggle-button.d.ts → ds-button-filled.d.ts} +4 -4
  7. package/dist/components/ds-button-filled.js +2 -0
  8. package/dist/components/ds-button-unfilled-icon.js +1 -1
  9. package/dist/components/{ds-button-group.d.ts → ds-card-setting.d.ts} +4 -4
  10. package/dist/components/ds-card-setting.js +2 -0
  11. package/dist/components/ds-card-setting.js.map +1 -0
  12. package/dist/components/ds-card.js +1 -1
  13. package/dist/components/ds-checkbox.js +1 -1
  14. package/dist/components/ds-chip.js +1 -1
  15. package/dist/components/ds-divider.js +1 -1
  16. package/dist/components/ds-empty-state.js +1 -1
  17. package/dist/components/ds-empty-state.js.map +1 -1
  18. package/dist/components/ds-fade.js +1 -1
  19. package/dist/components/ds-field.js +1 -1
  20. package/dist/components/ds-field.js.map +1 -1
  21. package/dist/components/ds-header.js +1 -1
  22. package/dist/components/ds-icon.js +1 -1
  23. package/dist/components/ds-input.js +1 -1
  24. package/dist/components/ds-loader.js +1 -1
  25. package/dist/components/ds-loader.js.map +1 -1
  26. package/dist/components/ds-menu.js +1 -1
  27. package/dist/components/ds-modal.js +1 -1
  28. package/dist/components/ds-panel-nav.js +1 -1
  29. package/dist/components/ds-panel-tools.js +1 -1
  30. package/dist/components/ds-panel-tools.js.map +1 -1
  31. package/dist/components/ds-radio-group.js +1 -1
  32. package/dist/components/ds-scrollbar.js +1 -1
  33. package/dist/components/ds-select.js +1 -1
  34. package/dist/components/ds-shell-gradient-picker.js +1 -1
  35. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  36. package/dist/components/ds-slider.js +1 -1
  37. package/dist/components/ds-surface.js +1 -1
  38. package/dist/components/ds-tab-group-nav.js +1 -1
  39. package/dist/components/ds-tab-group.js +1 -1
  40. package/dist/components/ds-table.js +1 -1
  41. package/dist/components/ds-table.js.map +1 -1
  42. package/dist/components/ds-tag.js +1 -1
  43. package/dist/components/ds-text.js +1 -1
  44. package/dist/components/ds-toast-provider.js +1 -1
  45. package/dist/components/ds-toggle.js +1 -1
  46. package/dist/components/ds-tooltip.js +1 -1
  47. package/dist/components/ds-tooltip.js.map +1 -1
  48. package/dist/components/{p-D4zKc1RW.js → p-BA6a6P0b.js} +2 -2
  49. package/dist/components/{p-DvBrQuie.js → p-CDNVPM2x.js} +2 -2
  50. package/dist/components/{p-DqBCQRRd.js → p-CF4avTQw.js} +2 -2
  51. package/dist/components/{p-C9za7IDu.js → p-CJubWt1F.js} +2 -2
  52. package/dist/components/{p-DDEAcGac.js → p-CKCBqwIw.js} +2 -2
  53. package/dist/components/{p-DDEAcGac.js.map → p-CKCBqwIw.js.map} +1 -1
  54. package/dist/components/p-C_hgdYcC.js +2 -0
  55. package/dist/components/p-C_hgdYcC.js.map +1 -0
  56. package/dist/components/p-Cv5NDZug.js +2 -0
  57. package/dist/components/p-Cv5NDZug.js.map +1 -0
  58. package/dist/components/{p-B3ua1NkM.js → p-DnGr8qtq.js} +2 -2
  59. package/dist/components/p-jjfqrXnP.js +2 -0
  60. package/dist/components/p-jjfqrXnP.js.map +1 -0
  61. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +26 -0
  62. package/dist/types/components/ButtonFilled/index.d.ts +2 -0
  63. package/dist/types/components/ButtonUnfilledIcon/ButtonUnfilledIcon.d.ts +9 -2
  64. package/dist/types/components/ButtonUnfilledIcon/index.d.ts +1 -1
  65. package/dist/types/components/CardSetting/CardSetting.d.ts +16 -0
  66. package/dist/types/components/CardSetting/index.d.ts +2 -0
  67. package/dist/types/components.d.ts +127 -412
  68. package/package.json +1 -1
  69. package/src/angular/index.ts +2 -4
  70. package/src/angular/proxies.ts +40 -105
  71. package/src/react/components.ts +2 -4
  72. package/src/react/ds-button-filled.ts +27 -0
  73. package/src/react/ds-card-setting.ts +27 -0
  74. package/src/wc/components/ButtonFilled/ButtonFilled.tsx +86 -0
  75. package/src/wc/components/ButtonFilled/index.ts +1 -0
  76. package/src/wc/components/ButtonUnfilledIcon/ButtonUnfilledIcon.tsx +19 -11
  77. package/src/wc/components/ButtonUnfilledIcon/index.ts +1 -1
  78. package/src/wc/components/CardSetting/CardSetting.tsx +96 -0
  79. package/src/wc/components/CardSetting/index.ts +1 -0
  80. package/src/wc/components.d.ts +127 -412
  81. package/dist/components/ds-button-group.js +0 -2
  82. package/dist/components/ds-button-group.js.map +0 -1
  83. package/dist/components/ds-button.d.ts +0 -11
  84. package/dist/components/ds-button.js +0 -2
  85. package/dist/components/ds-toggle-button-group.d.ts +0 -11
  86. package/dist/components/ds-toggle-button-group.js +0 -2
  87. package/dist/components/ds-toggle-button-group.js.map +0 -1
  88. package/dist/components/ds-toggle-button.js +0 -2
  89. package/dist/components/ds-toggle-button.js.map +0 -1
  90. package/dist/components/p-BPMJx63I.js +0 -2
  91. package/dist/components/p-BPMJx63I.js.map +0 -1
  92. package/dist/components/p-BTndnbR_.js +0 -2
  93. package/dist/components/p-BTndnbR_.js.map +0 -1
  94. package/dist/components/p-C0CUGiLm.js +0 -2
  95. package/dist/components/p-C0CUGiLm.js.map +0 -1
  96. package/dist/components/p-DUDppafq.js +0 -2
  97. package/dist/components/p-DUDppafq.js.map +0 -1
  98. package/dist/components/p-DgDSRPSP.js +0 -2
  99. package/dist/components/p-DgDSRPSP.js.map +0 -1
  100. package/dist/types/components/Button/Button.d.ts +0 -38
  101. package/dist/types/components/Button/index.d.ts +0 -2
  102. package/dist/types/components/ButtonGroup/ButtonGroup.d.ts +0 -29
  103. package/dist/types/components/ToggleButton/ToggleButton.d.ts +0 -37
  104. package/dist/types/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +0 -33
  105. package/src/react/ds-button-group.ts +0 -27
  106. package/src/react/ds-button.ts +0 -35
  107. package/src/react/ds-toggle-button-group.ts +0 -27
  108. package/src/react/ds-toggle-button.ts +0 -27
  109. package/src/wc/components/Button/Button.tsx +0 -158
  110. package/src/wc/components/Button/index.ts +0 -1
  111. package/src/wc/components/ButtonGroup/ButtonGroup.tsx +0 -110
  112. package/src/wc/components/ToggleButton/ToggleButton.tsx +0 -124
  113. package/src/wc/components/ToggleButtonGroup/ToggleButtonGroup.tsx +0 -118
  114. /package/dist/components/{ds-button.js.map → ds-button-filled.js.map} +0 -0
  115. /package/dist/components/{p-D4zKc1RW.js.map → p-BA6a6P0b.js.map} +0 -0
  116. /package/dist/components/{p-DvBrQuie.js.map → p-CDNVPM2x.js.map} +0 -0
  117. /package/dist/components/{p-DqBCQRRd.js.map → p-CF4avTQw.js.map} +0 -0
  118. /package/dist/components/{p-C9za7IDu.js.map → p-CJubWt1F.js.map} +0 -0
  119. /package/dist/components/{p-B3ua1NkM.js.map → p-DnGr8qtq.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["buttonCss","ICON_SIZE","xs","sm","md","lg","TEXT_CLASS","Button","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","intent","size","rounded","fullWidth","contrast","dropdown","loading","inactive","type","hasIcon","handleClick","e","dsClick","emit","componentWillLoad","el","querySelector","effectiveElevation","elevation","render","Tag","href","iconSize","textClass","elev","hasLabel","label","showLeading","isIconOnly","isLabelOnly","isIconAndLabel","bg","background","btnCls","btn","cap","toUpperCase","iconOnly","labelOnly","iconAndLabel","onMedium","onBold","onStrong","onAlwaysDark","extraProps","disabled","target","h","Host","key","class","style","width","undefined","ariaLabel","ariaLabelledby","onClick","onMouseEnter","dsMouseEnter","onMouseLeave","dsMouseLeave","fontSize","display","name","height","viewBox","fill","d","stroke","badgeCount","s","charAt","slice"],"sources":["src/wc/components/Button/Button.css?tag=ds-button&encapsulation=scoped","src/wc/components/Button/Button.tsx"],"sourcesContent":["/* ── Host wrapper ─────────────────────────────────────────────────────────── */\n\n.btn-host {\n display: inline-block;\n}\n\n.btn-host--full {\n display: block;\n width: 100%;\n}\n\n/* ── Base button ──────────────────────────────────────────────────────────── */\n\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--dimension-radius-050);\n cursor: pointer;\n position: relative;\n transition: transform var(--effect-motion-short-2);\n height: var(--dimension-size-400);\n font-family: inherit;\n color: var(--color-foreground-primary);\n background: transparent;\n box-sizing: border-box;\n text-decoration: none;\n user-select: none;\n outline: none;\n width: 100%;\n\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n --_border: var(--color-border-tertiary);\n}\n\n.btn:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n.btn:hover:not(.inactive) {\n background-color: var(--_hover-bg);\n}\n\n.btn:active:not(.inactive) {\n background-color: var(--_pressed-bg);\n transform: scale(var(--dimension-scale-subtle));\n}\n\n/* ── Background context ───────────────────────────────────────────────────── */\n\n.onMedium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n --_border: var(--color-border-on-medium-background-tertiary);\n}\n\n.onBold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n --_border: var(--color-border-on-bold-background-tertiary);\n}\n\n.onStrong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n --_border: var(--color-border-on-strong-background-tertiary);\n}\n\n.onAlwaysDark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n --_border: var(--color-always-dark-border-tertiary);\n}\n\n/* ── Primary variant ──────────────────────────────────────────────────────── */\n\n.primary {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.primary.intentNone {\n background-color: var(--color-inverted-background);\n color: var(--color-inverted-foreground-primary);\n --_hover-bg: color-mix(in oklch, var(--color-inverted-background) 90%, var(--color-inverted-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-inverted-background) 85%, var(--color-inverted-foreground-primary));\n --_border: var(--color-inverted-border-tertiary);\n}\n\n.primary:not(.intentNone) {\n background-color: var(--_bg);\n --_hover-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-on-bold-background-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 80%, var(--color-foreground-on-bold-background-primary));\n}\n\n/* Bold contrast (default) */\n.primary.intentBrand { --_bg: var(--color-background-bold-brand); color: var(--color-foreground-faint-brand); }\n.primary.intentNeutral { --_bg: var(--color-background-bold-neutral); color: var(--color-foreground-faint-neutral); }\n.primary.intentPositive { --_bg: var(--color-background-bold-positive); color: var(--color-foreground-faint-positive); }\n.primary.intentNegative { --_bg: var(--color-background-bold-negative); color: var(--color-foreground-faint-negative); }\n.primary.intentWarning { --_bg: var(--color-background-bold-warning); color: var(--color-foreground-faint-warning); }\n.primary.intentCaution { --_bg: var(--color-background-bold-caution); color: var(--color-foreground-faint-caution); }\n.primary.intentAi { --_bg: var(--color-background-bold-ai); color: var(--color-foreground-faint-ai); }\n\n/* Medium contrast */\n.primary.contrastMedium {\n --_hover-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 80%, var(--color-foreground-primary));\n}\n.primary.contrastMedium.intentBrand { --_bg: var(--color-background-medium-brand); color: var(--color-foreground-strong-brand); }\n.primary.contrastMedium.intentNeutral { --_bg: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n.primary.contrastMedium.intentPositive { --_bg: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n.primary.contrastMedium.intentNegative { --_bg: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n.primary.contrastMedium.intentWarning { --_bg: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n.primary.contrastMedium.intentCaution { --_bg: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n.primary.contrastMedium.intentAi { --_bg: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n\n/* Strong contrast */\n.primary.contrastStrong {\n --_hover-bg: color-mix(in oklch, var(--_bg) 90%, var(--color-foreground-on-bold-background-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-on-bold-background-primary));\n}\n.primary.contrastStrong.intentBrand { --_bg: var(--color-background-strong-brand); color: var(--color-foreground-medium-brand); }\n.primary.contrastStrong.intentNeutral { --_bg: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n.primary.contrastStrong.intentPositive { --_bg: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n.primary.contrastStrong.intentNegative { --_bg: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n.primary.contrastStrong.intentWarning { --_bg: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n.primary.contrastStrong.intentCaution { --_bg: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n.primary.contrastStrong.intentAi { --_bg: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n\n/* Faint contrast */\n.primary.contrastFaint {\n --_hover-bg: color-mix(in oklch, var(--_bg) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-primary));\n}\n.primary.contrastFaint.intentBrand { --_bg: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n.primary.contrastFaint.intentNeutral { --_bg: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n.primary.contrastFaint.intentPositive { --_bg: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n.primary.contrastFaint.intentNegative { --_bg: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n.primary.contrastFaint.intentWarning { --_bg: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n.primary.contrastFaint.intentCaution { --_bg: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n.primary.contrastFaint.intentAi { --_bg: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n\n/* intentNone on strong/always-dark */\n.primary.intentNone.onStrong,\n.primary.intentNone.onAlwaysDark {\n background-color: var(--color-background-primary);\n color: var(--color-foreground-primary);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n --_border: var(--color-border-tertiary);\n}\n\n/* ── Secondary variant ────────────────────────────────────────────────────── */\n\n.secondary {\n background-color: transparent;\n color: var(--color-foreground-secondary);\n}\n\n.secondary.intentBrand { color: var(--color-foreground-bold-brand); }\n.secondary.intentNeutral { color: var(--color-foreground-bold-neutral); }\n.secondary.intentPositive { color: var(--color-foreground-bold-positive); }\n.secondary.intentNegative { color: var(--color-foreground-bold-negative); }\n.secondary.intentWarning { color: var(--color-foreground-bold-warning); }\n.secondary.intentCaution { color: var(--color-foreground-bold-caution); }\n.secondary.intentAi { color: var(--color-foreground-bold-ai); }\n\n.secondary.onMedium { color: var(--color-foreground-primary); }\n.secondary.onMedium.intentBrand { color: var(--color-foreground-strong-brand); }\n.secondary.onMedium.intentNeutral { color: var(--color-foreground-strong-neutral); }\n.secondary.onMedium.intentPositive { color: var(--color-foreground-strong-positive); }\n.secondary.onMedium.intentNegative { color: var(--color-foreground-strong-negative); }\n.secondary.onMedium.intentWarning { color: var(--color-foreground-strong-warning); }\n.secondary.onMedium.intentCaution { color: var(--color-foreground-strong-caution); }\n.secondary.onMedium.intentAi { color: var(--color-foreground-strong-ai); }\n\n.secondary.onBold { color: var(--color-foreground-on-bold-background-secondary); }\n.secondary.onBold.intentBrand { color: var(--color-foreground-faint-brand); }\n.secondary.onBold.intentNeutral { color: var(--color-foreground-faint-neutral); }\n.secondary.onBold.intentPositive { color: var(--color-foreground-faint-positive); }\n.secondary.onBold.intentNegative { color: var(--color-foreground-faint-negative); }\n.secondary.onBold.intentWarning { color: var(--color-foreground-faint-warning); }\n.secondary.onBold.intentCaution { color: var(--color-foreground-faint-caution); }\n.secondary.onBold.intentAi { color: var(--color-foreground-faint-ai); }\n\n.secondary.onAlwaysDark { color: var(--color-always-dark-foreground-secondary); }\n.secondary.onAlwaysDark.intentBrand { color: var(--color-always-dark-foreground-brand); }\n.secondary.onAlwaysDark.intentNeutral { color: var(--color-always-dark-foreground-neutral); }\n.secondary.onAlwaysDark.intentPositive { color: var(--color-always-dark-foreground-positive); }\n.secondary.onAlwaysDark.intentNegative { color: var(--color-always-dark-foreground-negative); }\n.secondary.onAlwaysDark.intentWarning { color: var(--color-always-dark-foreground-warning); }\n.secondary.onAlwaysDark.intentCaution { color: var(--color-always-dark-foreground-caution); }\n.secondary.onAlwaysDark.intentAi { color: var(--color-always-dark-foreground-ai); }\n\n.secondary.onStrong { color: var(--color-foreground-on-bold-background-secondary); }\n.secondary.onStrong.intentBrand { color: var(--color-foreground-faint-brand); }\n.secondary.onStrong.intentNeutral { color: var(--color-foreground-faint-neutral); }\n.secondary.onStrong.intentPositive { color: var(--color-foreground-faint-positive); }\n.secondary.onStrong.intentNegative { color: var(--color-foreground-faint-negative); }\n.secondary.onStrong.intentWarning { color: var(--color-foreground-faint-warning); }\n.secondary.onStrong.intentCaution { color: var(--color-foreground-faint-caution); }\n.secondary.onStrong.intentAi { color: var(--color-foreground-faint-ai); }\n\n/* ── Elevation ────────────────────────────────────────────────────────────── */\n\n.secondary.elevationFlat {\n box-shadow: inset 0 0 0 1px var(--_border);\n}\n\n.secondary.elevationElevated {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n.secondary.elevationFloating {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-floating);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n.primary.elevationElevated { box-shadow: var(--effect-elevation-elevated-sm); }\n.primary.elevationNone { box-shadow: none; }\n.primary.elevationFlat { box-shadow: inset 0 0 0 1px var(--_border); }\n.primary.intentNone.elevationFlat { --_border: var(--color-border-tertiary); }\n.primary.elevationFloating { box-shadow: var(--effect-elevation-elevated-floating) !important; }\n\n/* ── Layout modes ─────────────────────────────────────────────────────────── */\n\n.iconOnly { padding: 0; width: var(--dimension-size-400); min-width: var(--dimension-size-400); }\n.labelOnly { padding: 0 var(--dimension-space-100); }\n.iconAndLabel { padding: 0 var(--dimension-space-100) 0 var(--dimension-space-075); gap: var(--dimension-space-025); }\n.dropdown { gap: var(--dimension-space-050); }\n\n/* ── Sizes ────────────────────────────────────────────────────────────────── */\n\n.sizeSM { height: var(--dimension-size-300); }\n.sizeSM.iconOnly { width: var(--dimension-size-300); min-width: var(--dimension-size-300); }\n.sizeSM.labelOnly { padding: 0 var(--dimension-space-075); }\n.sizeSM.iconAndLabel { padding: 0 var(--dimension-space-075) 0 var(--dimension-space-050); gap: 1px; }\n\n.sizeXS { height: var(--dimension-size-200); }\n.sizeXS.iconOnly { width: var(--dimension-size-200); min-width: var(--dimension-size-200); }\n.sizeXS.labelOnly, .sizeXS.iconAndLabel { padding: 0 var(--dimension-space-025); gap: 0; }\n\n.sizeLG { height: var(--dimension-size-500); }\n.sizeLG.iconOnly { width: var(--dimension-size-500); min-width: var(--dimension-size-500); }\n.sizeLG.labelOnly { padding: 0 var(--dimension-space-150); }\n.sizeLG.iconAndLabel { padding: 0 var(--dimension-space-150) 0 var(--dimension-space-100); gap: var(--dimension-space-075); }\n\n/* ── Rounded ──────────────────────────────────────────────────────────────── */\n\n.rounded { border-radius: var(--dimension-radius-half); }\n.rounded.labelOnly { padding-left: calc(var(--dimension-space-100) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.iconAndLabel { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.sizeSM.labelOnly { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.sizeSM.iconAndLabel { padding-left: calc(var(--dimension-space-050) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.sizeLG.labelOnly { padding-left: calc(var(--dimension-space-150) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-150) + var(--dimension-space-050)); }\n.rounded.sizeLG.iconAndLabel { padding-left: calc(var(--dimension-space-100) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-150) + var(--dimension-space-050)); }\n\n/* ── Disabled ─────────────────────────────────────────────────────────────── */\n\n.inactive { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n\n/* ── Full width ───────────────────────────────────────────────────────────── */\n\n.fullWidth { display: flex; width: 100%; }\n\n/* ── Inner slots ──────────────────────────────────────────────────────────── */\n\n.btn__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n line-height: 0;\n}\n\n.btn__label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.btn__chevron {\n flex-shrink: 0;\n}\n\n.btn__badge {\n position: absolute;\n top: var(--dimension-space-025);\n right: var(--dimension-space-025);\n font-size: var(--typography-fontsize-xs);\n font-weight: var(--typography-weight-semibold);\n line-height: var(--typography-lineheight-xs);\n color: var(--color-foreground-secondary);\n pointer-events: none;\n z-index: 10;\n}\n","import { Component, Prop, Event, EventEmitter, Element, State, h, Host } from '@stencil/core';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';\nexport type ButtonIntent = 'none' | 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type ButtonContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type ButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nconst ICON_SIZE: Record<ButtonSize, number> = { xs: 12, sm: 16, md: 20, lg: 24 };\nconst TEXT_CLASS: Record<ButtonSize, string> = {\n xs: 'text-caption-emphasis',\n sm: 'text-body-small-emphasis',\n md: 'text-body-medium-emphasis',\n lg: 'text-body-large-emphasis',\n};\n\n@Component({\n tag: 'ds-button',\n styleUrl: 'Button.css',\n scoped: true,\n})\nexport class Button {\n @Element() el!: HTMLElement;\n\n @Prop() variant: ButtonVariant = 'primary';\n @Prop() intent: ButtonIntent = 'brand';\n @Prop() size: ButtonSize = 'md';\n @Prop() label: string | undefined;\n @Prop() rounded: boolean = false;\n @Prop() fullWidth: boolean = false;\n @Prop() width: string | undefined;\n @Prop() contrast: ButtonContrast = 'bold';\n @Prop() background: ButtonBackground | undefined;\n @Prop() dropdown: boolean = false;\n @Prop() badgeCount: number | undefined;\n @Prop() elevation: ButtonElevation | undefined;\n @Prop() loading: boolean = false;\n @Prop() inactive: boolean = false;\n @Prop() href: string | undefined;\n @Prop() target: string | undefined;\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | undefined;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n\n @State() private hasIcon: boolean = false;\n\n @Event() dsClick!: EventEmitter<MouseEvent>;\n @Event() dsMouseEnter!: EventEmitter<MouseEvent>;\n @Event() dsMouseLeave!: EventEmitter<MouseEvent>;\n\n componentWillLoad() {\n this.hasIcon = !!this.el.querySelector('[slot=\"icon\"]');\n }\n\n private handleClick = (e: MouseEvent) => {\n if (this.inactive || this.loading) return;\n this.dsClick.emit(e);\n };\n\n private get effectiveElevation(): ButtonElevation {\n return this.elevation ?? (this.variant === 'primary' ? 'none' : 'flat');\n }\n\n render() {\n const Tag = this.href ? 'a' : 'button';\n const size = this.size;\n const iconSize = ICON_SIZE[size];\n const textClass = TEXT_CLASS[size];\n const elev = this.effectiveElevation;\n const hasLabel = !!this.label;\n const showLeading = this.hasIcon || this.loading;\n const isIconOnly = showLeading && !hasLabel;\n const isLabelOnly = hasLabel && !showLeading;\n const isIconAndLabel = showLeading && hasLabel;\n const bg = this.background;\n\n const btnCls: Record<string, boolean> = {\n btn: true,\n [this.variant]: true,\n [`intent${cap(this.intent)}`]: true,\n [`size${size.toUpperCase()}`]: size !== 'md',\n rounded: this.rounded,\n inactive: this.inactive || this.loading,\n iconOnly: isIconOnly,\n labelOnly: isLabelOnly,\n iconAndLabel: isIconAndLabel,\n dropdown: this.dropdown,\n [`contrast${cap(this.contrast)}`]: this.variant === 'primary' && this.intent !== 'none' && this.contrast !== 'bold',\n [`elevation${cap(elev)}`]: true,\n onMedium: bg === 'medium',\n onBold: bg === 'bold',\n onStrong: bg === 'strong',\n onAlwaysDark: bg === 'always-dark',\n fullWidth: this.fullWidth,\n };\n\n const extraProps: Record<string, unknown> = {};\n if (Tag === 'button') {\n extraProps.type = this.type;\n extraProps.disabled = this.inactive || this.loading;\n }\n if (this.href) extraProps.href = this.href;\n if (this.target) extraProps.target = this.target;\n\n return (\n <Host class={{ 'btn-host': true, 'btn-host--full': this.fullWidth }}>\n <Tag\n class={btnCls}\n style={this.width ? { width: this.width } : undefined}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-disabled={this.inactive || this.loading || undefined}\n aria-busy={this.loading || undefined}\n onClick={this.handleClick}\n onMouseEnter={(e: MouseEvent) => !this.inactive && !this.loading && this.dsMouseEnter.emit(e)}\n onMouseLeave={(e: MouseEvent) => !this.inactive && !this.loading && this.dsMouseLeave.emit(e)}\n {...extraProps}\n >\n {/* Leading icon / loader */}\n <span class=\"btn__icon\" style={{ fontSize: `${iconSize}px`, display: showLeading ? undefined : 'none' }}>\n {this.loading\n ? <ds-loader size={iconSize} />\n : <slot name=\"icon\" />\n }\n </span>\n {/* Label */}\n {hasLabel && (\n <span class={`btn__label ${textClass}`}>{this.label}</span>\n )}\n {/* Trailing chevron */}\n {this.dropdown && (\n <svg\n class=\"btn__chevron\"\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n )}\n {/* Badge */}\n {this.badgeCount != null && this.badgeCount > 0 && (\n <span class=\"btn__badge\">\n {this.badgeCount > 9 ? '+' : this.badgeCount}\n </span>\n )}\n </Tag>\n </Host>\n );\n }\n}\n\nfunction cap(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as s,H as e,h as t,t as i}from"./index.js";import{T as r}from"./p-BPMJx63I.js";import{r as n}from"./p-BWUTr_XN.js";const a=()=>`: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 o=s(class s extends e{constructor(s){super();if(s!==false){this.__registerHost()}this.__attachShadow();this.size=r.iconographyMd}get sizePx(){return n(this.size,r.iconographyMd)}render(){const s=`${this.sizePx}px`;const e=t("svg",{style:{width:s,height:s},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 e;return t("span",{role:"status","aria-live":"polite",class:"status"},e,t("span",{class:"visually-hidden"},this.label))}static get style(){return a()}},[1,"ds-loader",{size:[8],label:[1]}]);function l(){if(typeof customElements==="undefined"){return}const s=["ds-loader"];s.forEach((s=>{switch(s){case"ds-loader":if(!customElements.get(i(s))){customElements.define(i(s),o)}break}}))}l();export{o as L,l as d};
2
- //# sourceMappingURL=p-DgDSRPSP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["loaderCss","Loader","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","size","TOKEN_DEFAULTS","iconographyMd","sizePx","resolveCssLengthPx","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';\nimport { resolveCssLengthPx, TOKEN_DEFAULTS } from '../../utils';\n\n@Component({\n tag: 'ds-loader',\n styleUrl: 'Loader.css',\n shadow: true,\n})\nexport class Loader {\n /** Render size — number (px) or TokoMo length (`var(--dimension-iconography-md)`, etc.). */\n @Prop() size: number | string = TOKEN_DEFAULTS.iconographyMd;\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 private get sizePx(): number {\n return resolveCssLengthPx(this.size, TOKEN_DEFAULTS.iconographyMd);\n }\n\n render() {\n const px = `${this.sizePx}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":"4HAAA,MAAMA,EAAY,IAAM,kY,MCQXC,EAAMC,EAAA,MAAAD,UAAAE,EALnB,WAAAC,CAAAC,G,kEAOUC,KAAAC,KAAwBC,EAAeC,aAyChD,CAjCC,UAAYC,GACV,OAAOC,EAAmBL,KAAKC,KAAMC,EAAeC,c,CAGtD,MAAAG,GACE,MAAMC,EAAK,GAAGP,KAAKI,WACnB,MAAMI,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,IAAKnB,KAAKoB,MAAO,OAAOZ,EAExB,OACEC,EAAA,QAAMY,KAAK,SAAQ,YAAW,SAASN,MAAM,UAC1CP,EACDC,EAAA,QAAMM,MAAM,mBAAmBf,KAAKoB,O","ignoreList":[]}
@@ -1,38 +0,0 @@
1
- import { EventEmitter } from '../../stencil-public-runtime';
2
- export type ButtonVariant = 'primary' | 'secondary';
3
- export type ButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';
4
- export type ButtonIntent = 'none' | 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';
5
- export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
6
- export type ButtonContrast = 'strong' | 'bold' | 'medium' | 'faint';
7
- export type ButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';
8
- export declare class Button {
9
- el: HTMLElement;
10
- variant: ButtonVariant;
11
- intent: ButtonIntent;
12
- size: ButtonSize;
13
- label: string | undefined;
14
- rounded: boolean;
15
- fullWidth: boolean;
16
- width: string | undefined;
17
- contrast: ButtonContrast;
18
- background: ButtonBackground | undefined;
19
- dropdown: boolean;
20
- badgeCount: number | undefined;
21
- elevation: ButtonElevation | undefined;
22
- loading: boolean;
23
- inactive: boolean;
24
- href: string | undefined;
25
- target: string | undefined;
26
- type: 'button' | 'submit' | 'reset';
27
- ariaLabel: string | undefined;
28
- ariaLabelledby: string | undefined;
29
- private hasIcon;
30
- dsClick: EventEmitter<MouseEvent>;
31
- dsMouseEnter: EventEmitter<MouseEvent>;
32
- dsMouseLeave: EventEmitter<MouseEvent>;
33
- componentWillLoad(): void;
34
- private handleClick;
35
- private get effectiveElevation();
36
- render(): any;
37
- }
38
- //# sourceMappingURL=Button.d.ts.map
@@ -1,2 +0,0 @@
1
- export type { ButtonVariant, ButtonElevation, ButtonIntent, ButtonSize, ButtonContrast, ButtonBackground } from './Button';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1,29 +0,0 @@
1
- import { EventEmitter } from '../../stencil-public-runtime';
2
- export type ButtonGroupElevation = 'none' | 'flat' | 'elevated' | 'floating';
3
- export type ButtonGroupSize = 'xs' | 'sm' | 'md' | 'lg';
4
- export interface ButtonGroupItem {
5
- label?: string;
6
- /** Icon name for <ds-icon>. Set via JS property. */
7
- icon?: string;
8
- variant?: 'primary' | 'secondary';
9
- intent?: 'none' | 'neutral' | 'brand' | 'negative' | 'warning' | 'positive';
10
- inactive?: boolean;
11
- href?: string;
12
- }
13
- export declare class ButtonGroup {
14
- /**
15
- * Array of button descriptors. Set via JS property.
16
- * @example el.items = [{ label: 'Filter', icon: 'Filter' }, { label: 'Sort' }];
17
- */
18
- items: ButtonGroupItem[];
19
- /** Chrome level for the group container. */
20
- elevation: ButtonGroupElevation;
21
- /** Size passed to each ds-button. */
22
- size: ButtonGroupSize;
23
- /** Pill shape for group + buttons. */
24
- rounded: boolean;
25
- /** Emits the index of the clicked item. */
26
- dsClick: EventEmitter<number>;
27
- render(): any;
28
- }
29
- //# sourceMappingURL=ButtonGroup.d.ts.map
@@ -1,37 +0,0 @@
1
- import { EventEmitter } from '../../stencil-public-runtime';
2
- export type ToggleButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';
3
- export type ToggleButtonSize = 'md' | 'sm' | 'xs';
4
- export type ToggleButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';
5
- export declare class ToggleButton {
6
- /**
7
- * Chrome level.
8
- * none — ghost (transparent, no border, no shadow)
9
- * flat — border only, transparent bg
10
- * elevated — bg-primary + shadow [default]
11
- * floating — bg-primary + FAB-strength shadow
12
- */
13
- elevation: ToggleButtonElevation;
14
- /** Label text. */
15
- label: string | undefined;
16
- /**
17
- * Icon name for <ds-icon>. Set via JS property.
18
- * @example el.icon = 'GridView';
19
- */
20
- icon: string | undefined;
21
- /** Size: md (32px), sm (24px), xs (16px). */
22
- size: ToggleButtonSize;
23
- /** Pill shape. */
24
- rounded: boolean;
25
- /** Parent surface context — adjusts hover tokens for colored backgrounds. */
26
- background: ToggleButtonBackground | undefined;
27
- /** Controlled pressed state. */
28
- pressed: boolean;
29
- /** Disables interaction. */
30
- inactive: boolean;
31
- ariaLabel: string | undefined;
32
- /** Emits the new pressed value (!pressed) on click. */
33
- dsChange: EventEmitter<boolean>;
34
- private handleClick;
35
- render(): any;
36
- }
37
- //# sourceMappingURL=ToggleButton.d.ts.map
@@ -1,33 +0,0 @@
1
- import { EventEmitter } from '../../stencil-public-runtime';
2
- export type ToggleGroupElevation = 'none' | 'flat' | 'elevated' | 'floating';
3
- export type ToggleGroupSize = 'md' | 'sm' | 'xs';
4
- export type ToggleGroupBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';
5
- export interface ToggleGroupItem {
6
- id: string;
7
- label?: string;
8
- /** Icon name for <ds-icon>. */
9
- icon?: string;
10
- inactive?: boolean;
11
- }
12
- export declare class ToggleButtonGroup {
13
- /**
14
- * Array of item descriptors. Set via JS property.
15
- * @example el.items = [{ id: 'list', label: 'List' }, { id: 'grid', icon: 'GridView' }];
16
- */
17
- items: ToggleGroupItem[];
18
- /** ID of the currently selected / pressed item. */
19
- value: string;
20
- /** Chrome level for the group container. */
21
- elevation: ToggleGroupElevation;
22
- /** Size passed to each ds-toggle-button. */
23
- size: ToggleGroupSize;
24
- /** Pill shape for group + buttons. */
25
- rounded: boolean;
26
- /** Parent surface context. */
27
- background: ToggleGroupBackground | undefined;
28
- /** Emits the id of the newly selected item. */
29
- dsChange: EventEmitter<string>;
30
- private handleItemChange;
31
- render(): any;
32
- }
33
- //# sourceMappingURL=ToggleButtonGroup.d.ts.map
@@ -1,27 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * This file was automatically generated by the Stencil React Output Target.
5
- * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
6
- */
7
-
8
- /* eslint-disable */
9
-
10
- import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
11
- import { createComponent } from '@stencil/react-output-target/runtime';
12
- import React from 'react';
13
-
14
- import { type DsButtonGroupCustomEvent } from "@ds-mo/ui";
15
- import type { Components } from "@ds-mo/ui/dist/components";
16
- import { DsButtonGroup as DsButtonGroupElement, defineCustomElement as defineDsButtonGroup } from "@ds-mo/ui/dist/components/ds-button-group.js";
17
-
18
- export type DsButtonGroupEvents = { onDsClick: EventName<DsButtonGroupCustomEvent<number>> };
19
-
20
- export const DsButtonGroup: StencilReactComponent<DsButtonGroupElement, DsButtonGroupEvents, Components.DsButtonGroup> = /*@__PURE__*/ createComponent<DsButtonGroupElement, DsButtonGroupEvents, Components.DsButtonGroup>({
21
- tagName: 'ds-button-group',
22
- elementClass: DsButtonGroupElement,
23
- // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
24
- react: React,
25
- events: { onDsClick: 'dsClick' } as DsButtonGroupEvents,
26
- defineCustomElement: defineDsButtonGroup
27
- });
@@ -1,35 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * This file was automatically generated by the Stencil React Output Target.
5
- * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
6
- */
7
-
8
- /* eslint-disable */
9
-
10
- import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
11
- import { createComponent } from '@stencil/react-output-target/runtime';
12
- import React from 'react';
13
-
14
- import { type DsButtonCustomEvent } from "@ds-mo/ui";
15
- import type { Components } from "@ds-mo/ui/dist/components";
16
- import { DsButton as DsButtonElement, defineCustomElement as defineDsButton } from "@ds-mo/ui/dist/components/ds-button.js";
17
-
18
- export type DsButtonEvents = {
19
- onDsClick: EventName<DsButtonCustomEvent<MouseEvent>>,
20
- onDsMouseEnter: EventName<DsButtonCustomEvent<MouseEvent>>,
21
- onDsMouseLeave: EventName<DsButtonCustomEvent<MouseEvent>>
22
- };
23
-
24
- export const DsButton: StencilReactComponent<DsButtonElement, DsButtonEvents, Components.DsButton> = /*@__PURE__*/ createComponent<DsButtonElement, DsButtonEvents, Components.DsButton>({
25
- tagName: 'ds-button',
26
- elementClass: DsButtonElement,
27
- // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
28
- react: React,
29
- events: {
30
- onDsClick: 'dsClick',
31
- onDsMouseEnter: 'dsMouseEnter',
32
- onDsMouseLeave: 'dsMouseLeave'
33
- } as DsButtonEvents,
34
- defineCustomElement: defineDsButton
35
- });
@@ -1,27 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * This file was automatically generated by the Stencil React Output Target.
5
- * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
6
- */
7
-
8
- /* eslint-disable */
9
-
10
- import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
11
- import { createComponent } from '@stencil/react-output-target/runtime';
12
- import React from 'react';
13
-
14
- import { type DsToggleButtonGroupCustomEvent } from "@ds-mo/ui";
15
- import type { Components } from "@ds-mo/ui/dist/components";
16
- import { DsToggleButtonGroup as DsToggleButtonGroupElement, defineCustomElement as defineDsToggleButtonGroup } from "@ds-mo/ui/dist/components/ds-toggle-button-group.js";
17
-
18
- export type DsToggleButtonGroupEvents = { onDsChange: EventName<DsToggleButtonGroupCustomEvent<string>> };
19
-
20
- export const DsToggleButtonGroup: StencilReactComponent<DsToggleButtonGroupElement, DsToggleButtonGroupEvents, Components.DsToggleButtonGroup> = /*@__PURE__*/ createComponent<DsToggleButtonGroupElement, DsToggleButtonGroupEvents, Components.DsToggleButtonGroup>({
21
- tagName: 'ds-toggle-button-group',
22
- elementClass: DsToggleButtonGroupElement,
23
- // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
24
- react: React,
25
- events: { onDsChange: 'dsChange' } as DsToggleButtonGroupEvents,
26
- defineCustomElement: defineDsToggleButtonGroup
27
- });
@@ -1,27 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * This file was automatically generated by the Stencil React Output Target.
5
- * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
6
- */
7
-
8
- /* eslint-disable */
9
-
10
- import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
11
- import { createComponent } from '@stencil/react-output-target/runtime';
12
- import React from 'react';
13
-
14
- import { type DsToggleButtonCustomEvent } from "@ds-mo/ui";
15
- import type { Components } from "@ds-mo/ui/dist/components";
16
- import { DsToggleButton as DsToggleButtonElement, defineCustomElement as defineDsToggleButton } from "@ds-mo/ui/dist/components/ds-toggle-button.js";
17
-
18
- export type DsToggleButtonEvents = { onDsChange: EventName<DsToggleButtonCustomEvent<boolean>> };
19
-
20
- export const DsToggleButton: StencilReactComponent<DsToggleButtonElement, DsToggleButtonEvents, Components.DsToggleButton> = /*@__PURE__*/ createComponent<DsToggleButtonElement, DsToggleButtonEvents, Components.DsToggleButton>({
21
- tagName: 'ds-toggle-button',
22
- elementClass: DsToggleButtonElement,
23
- // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
24
- react: React,
25
- events: { onDsChange: 'dsChange' } as DsToggleButtonEvents,
26
- defineCustomElement: defineDsToggleButton
27
- });
@@ -1,158 +0,0 @@
1
- import { Component, Prop, Event, EventEmitter, Element, State, h, Host } from '@stencil/core';
2
-
3
- export type ButtonVariant = 'primary' | 'secondary';
4
- export type ButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';
5
- export type ButtonIntent = 'none' | 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';
6
- export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
7
- export type ButtonContrast = 'strong' | 'bold' | 'medium' | 'faint';
8
- export type ButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';
9
-
10
- const ICON_SIZE: Record<ButtonSize, number> = { xs: 12, sm: 16, md: 20, lg: 24 };
11
- const TEXT_CLASS: Record<ButtonSize, string> = {
12
- xs: 'text-caption-emphasis',
13
- sm: 'text-body-small-emphasis',
14
- md: 'text-body-medium-emphasis',
15
- lg: 'text-body-large-emphasis',
16
- };
17
-
18
- @Component({
19
- tag: 'ds-button',
20
- styleUrl: 'Button.css',
21
- scoped: true,
22
- })
23
- export class Button {
24
- @Element() el!: HTMLElement;
25
-
26
- @Prop() variant: ButtonVariant = 'primary';
27
- @Prop() intent: ButtonIntent = 'brand';
28
- @Prop() size: ButtonSize = 'md';
29
- @Prop() label: string | undefined;
30
- @Prop() rounded: boolean = false;
31
- @Prop() fullWidth: boolean = false;
32
- @Prop() width: string | undefined;
33
- @Prop() contrast: ButtonContrast = 'bold';
34
- @Prop() background: ButtonBackground | undefined;
35
- @Prop() dropdown: boolean = false;
36
- @Prop() badgeCount: number | undefined;
37
- @Prop() elevation: ButtonElevation | undefined;
38
- @Prop() loading: boolean = false;
39
- @Prop() inactive: boolean = false;
40
- @Prop() href: string | undefined;
41
- @Prop() target: string | undefined;
42
- @Prop() type: 'button' | 'submit' | 'reset' = 'button';
43
- @Prop({ attribute: 'aria-label' }) ariaLabel: string | undefined;
44
- @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;
45
-
46
- @State() private hasIcon: boolean = false;
47
-
48
- @Event() dsClick!: EventEmitter<MouseEvent>;
49
- @Event() dsMouseEnter!: EventEmitter<MouseEvent>;
50
- @Event() dsMouseLeave!: EventEmitter<MouseEvent>;
51
-
52
- componentWillLoad() {
53
- this.hasIcon = !!this.el.querySelector('[slot="icon"]');
54
- }
55
-
56
- private handleClick = (e: MouseEvent) => {
57
- if (this.inactive || this.loading) return;
58
- this.dsClick.emit(e);
59
- };
60
-
61
- private get effectiveElevation(): ButtonElevation {
62
- return this.elevation ?? (this.variant === 'primary' ? 'none' : 'flat');
63
- }
64
-
65
- render() {
66
- const Tag = this.href ? 'a' : 'button';
67
- const size = this.size;
68
- const iconSize = ICON_SIZE[size];
69
- const textClass = TEXT_CLASS[size];
70
- const elev = this.effectiveElevation;
71
- const hasLabel = !!this.label;
72
- const showLeading = this.hasIcon || this.loading;
73
- const isIconOnly = showLeading && !hasLabel;
74
- const isLabelOnly = hasLabel && !showLeading;
75
- const isIconAndLabel = showLeading && hasLabel;
76
- const bg = this.background;
77
-
78
- const btnCls: Record<string, boolean> = {
79
- btn: true,
80
- [this.variant]: true,
81
- [`intent${cap(this.intent)}`]: true,
82
- [`size${size.toUpperCase()}`]: size !== 'md',
83
- rounded: this.rounded,
84
- inactive: this.inactive || this.loading,
85
- iconOnly: isIconOnly,
86
- labelOnly: isLabelOnly,
87
- iconAndLabel: isIconAndLabel,
88
- dropdown: this.dropdown,
89
- [`contrast${cap(this.contrast)}`]: this.variant === 'primary' && this.intent !== 'none' && this.contrast !== 'bold',
90
- [`elevation${cap(elev)}`]: true,
91
- onMedium: bg === 'medium',
92
- onBold: bg === 'bold',
93
- onStrong: bg === 'strong',
94
- onAlwaysDark: bg === 'always-dark',
95
- fullWidth: this.fullWidth,
96
- };
97
-
98
- const extraProps: Record<string, unknown> = {};
99
- if (Tag === 'button') {
100
- extraProps.type = this.type;
101
- extraProps.disabled = this.inactive || this.loading;
102
- }
103
- if (this.href) extraProps.href = this.href;
104
- if (this.target) extraProps.target = this.target;
105
-
106
- return (
107
- <Host class={{ 'btn-host': true, 'btn-host--full': this.fullWidth }}>
108
- <Tag
109
- class={btnCls}
110
- style={this.width ? { width: this.width } : undefined}
111
- aria-label={this.ariaLabel}
112
- aria-labelledby={this.ariaLabelledby}
113
- aria-disabled={this.inactive || this.loading || undefined}
114
- aria-busy={this.loading || undefined}
115
- onClick={this.handleClick}
116
- onMouseEnter={(e: MouseEvent) => !this.inactive && !this.loading && this.dsMouseEnter.emit(e)}
117
- onMouseLeave={(e: MouseEvent) => !this.inactive && !this.loading && this.dsMouseLeave.emit(e)}
118
- {...extraProps}
119
- >
120
- {/* Leading icon / loader */}
121
- <span class="btn__icon" style={{ fontSize: `${iconSize}px`, display: showLeading ? undefined : 'none' }}>
122
- {this.loading
123
- ? <ds-loader size={iconSize} />
124
- : <slot name="icon" />
125
- }
126
- </span>
127
- {/* Label */}
128
- {hasLabel && (
129
- <span class={`btn__label ${textClass}`}>{this.label}</span>
130
- )}
131
- {/* Trailing chevron */}
132
- {this.dropdown && (
133
- <svg
134
- class="btn__chevron"
135
- width={iconSize}
136
- height={iconSize}
137
- viewBox="0 0 20 20"
138
- fill="none"
139
- aria-hidden="true"
140
- >
141
- <path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
142
- </svg>
143
- )}
144
- {/* Badge */}
145
- {this.badgeCount != null && this.badgeCount > 0 && (
146
- <span class="btn__badge">
147
- {this.badgeCount > 9 ? '+' : this.badgeCount}
148
- </span>
149
- )}
150
- </Tag>
151
- </Host>
152
- );
153
- }
154
- }
155
-
156
- function cap(s: string) {
157
- return s.charAt(0).toUpperCase() + s.slice(1);
158
- }
@@ -1 +0,0 @@
1
- export type { ButtonVariant, ButtonElevation, ButtonIntent, ButtonSize, ButtonContrast, ButtonBackground } from './Button';
@@ -1,110 +0,0 @@
1
- import { Component, Prop, Event, EventEmitter, h, Host } from '@stencil/core';
2
-
3
- export type ButtonGroupElevation = 'none' | 'flat' | 'elevated' | 'floating';
4
- export type ButtonGroupSize = 'xs' | 'sm' | 'md' | 'lg';
5
-
6
- export interface ButtonGroupItem {
7
- label?: string;
8
- /** Icon name for <ds-icon>. Set via JS property. */
9
- icon?: string;
10
- variant?: 'primary' | 'secondary';
11
- intent?: 'none' | 'neutral' | 'brand' | 'negative' | 'warning' | 'positive';
12
- inactive?: boolean;
13
- href?: string;
14
- }
15
-
16
- @Component({
17
- tag: 'ds-button-group',
18
- styleUrl: 'ButtonGroup.css',
19
- scoped: true,
20
- })
21
- export class ButtonGroup {
22
- /**
23
- * Array of button descriptors. Set via JS property.
24
- * @example el.items = [{ label: 'Filter', icon: 'Filter' }, { label: 'Sort' }];
25
- */
26
- @Prop() items: ButtonGroupItem[] = [];
27
-
28
- /** Chrome level for the group container. */
29
- @Prop() elevation: ButtonGroupElevation = 'flat';
30
-
31
- /** Size passed to each ds-button. */
32
- @Prop() size: ButtonGroupSize = 'md';
33
-
34
- /** Pill shape for group + buttons. */
35
- @Prop() rounded: boolean = false;
36
-
37
- /** Emits the index of the clicked item. */
38
- @Event() dsClick!: EventEmitter<number>;
39
-
40
- render() {
41
- const items = this.items;
42
- const count = items.length;
43
- const elev = this.elevation;
44
- const elevKey = elev.charAt(0).toUpperCase() + elev.slice(1);
45
- const isGhost = elev === 'none';
46
-
47
- const groupCls: Record<string, boolean> = {
48
- group: true,
49
- [`group${elevKey}`]: true,
50
- groupRounded: this.rounded,
51
- };
52
-
53
- return (
54
- <Host>
55
- <div class={groupCls} role="group">
56
- {items.map((item, i) => {
57
- const isFirst = i === 0;
58
- const isLast = i === count - 1;
59
- const isMid = !isFirst && !isLast;
60
- const variant = item.variant ?? 'secondary';
61
- const isIconOnly = !!item.icon && !item.label;
62
- const needsRoundedCorrection = this.rounded && !isIconOnly && this.size !== 'xs';
63
- const sizeKey = this.size.toUpperCase() as 'MD' | 'SM' | 'LG' | 'XS';
64
-
65
- const itemCls: Record<string, boolean> = {
66
- item: true,
67
- first: isFirst,
68
- last: isLast,
69
- middle: isMid,
70
- itemShort: isGhost && variant === 'secondary',
71
- [`roundedFirst${sizeKey}`]: !!(needsRoundedCorrection && isFirst),
72
- [`roundedLast${sizeKey}`]: !!(needsRoundedCorrection && isLast),
73
- [`roundedMid${sizeKey}`]: !!(needsRoundedCorrection && isMid),
74
- };
75
-
76
- const dividerCls: Record<string, boolean> = {
77
- divider: true,
78
- dividerGhost: isGhost,
79
- dividerGhostXS: isGhost && this.size === 'xs',
80
- dividerGhostSM: isGhost && this.size === 'sm',
81
- dividerGhostLG: isGhost && this.size === 'lg',
82
- };
83
-
84
- return [
85
- i > 0 && (
86
- <div class={dividerCls} aria-hidden="true" />
87
- ),
88
- <ds-button
89
- class={itemCls}
90
- variant={variant}
91
- intent={item.intent ?? 'none'}
92
- elevation={elev}
93
- size={this.size}
94
- label={item.label}
95
- rounded={this.rounded}
96
- inactive={item.inactive}
97
- href={item.href}
98
- onDsClick={() => this.dsClick.emit(i)}
99
- >
100
- {item.icon && (
101
- <ds-icon slot="icon" name={item.icon} />
102
- )}
103
- </ds-button>,
104
- ];
105
- })}
106
- </div>
107
- </Host>
108
- );
109
- }
110
- }