@hashicorp/design-system-components 5.1.1-rc-20251209143536 → 5.2.0-rc-20251216140614

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 (66) hide show
  1. package/declarations/components/hds/breadcrumb/item.d.ts +4 -8
  2. package/declarations/components/hds/dropdown/index.d.ts +2 -0
  3. package/declarations/components/hds/icon/index.d.ts +1 -1
  4. package/declarations/components/hds/interactive/index.d.ts +4 -9
  5. package/declarations/components/hds/popover-primitive/index.d.ts +2 -0
  6. package/declarations/components/hds/rich-tooltip/bubble.d.ts +2 -0
  7. package/declarations/components/hds/stepper/task/indicator.d.ts +1 -1
  8. package/declarations/components/hds/theme-context/index.d.ts +24 -0
  9. package/declarations/components/hds/theme-context/types.d.ts +19 -0
  10. package/declarations/components/hds/theme-switcher/index.d.ts +43 -0
  11. package/declarations/components.d.ts +2 -0
  12. package/declarations/modifiers/hds-anchored-position.d.ts +3 -1
  13. package/declarations/services/hds-theming.d.ts +57 -0
  14. package/declarations/services.d.ts +1 -0
  15. package/declarations/template-registry.d.ts +6 -0
  16. package/declarations/utils/hds-resolve-link-to-external.d.ts +12 -0
  17. package/dist/_app_/components/hds/theme-context.js +1 -0
  18. package/dist/_app_/components/hds/theme-switcher.js +1 -0
  19. package/dist/_app_/services/hds-theming.js +1 -0
  20. package/dist/components/hds/breadcrumb/item.js +17 -15
  21. package/dist/components/hds/breadcrumb/item.js.map +1 -1
  22. package/dist/components/hds/dropdown/index.js +3 -2
  23. package/dist/components/hds/dropdown/index.js.map +1 -1
  24. package/dist/components/hds/interactive/index.js +17 -19
  25. package/dist/components/hds/interactive/index.js.map +1 -1
  26. package/dist/components/hds/popover-primitive/index.js +1 -1
  27. package/dist/components/hds/popover-primitive/index.js.map +1 -1
  28. package/dist/components/hds/rich-tooltip/bubble.js +2 -1
  29. package/dist/components/hds/rich-tooltip/bubble.js.map +1 -1
  30. package/dist/components/hds/theme-context/index.js +45 -0
  31. package/dist/components/hds/theme-context/index.js.map +1 -0
  32. package/dist/components/hds/theme-context/types.js +27 -0
  33. package/dist/components/hds/theme-context/types.js.map +1 -0
  34. package/dist/components/hds/theme-switcher/index.js +100 -0
  35. package/dist/components/hds/theme-switcher/index.js.map +1 -0
  36. package/dist/components.js +2 -0
  37. package/dist/components.js.map +1 -1
  38. package/dist/modifiers/hds-anchored-position.js +42 -4
  39. package/dist/modifiers/hds-anchored-position.js.map +1 -1
  40. package/dist/services/hds-theming.js +214 -0
  41. package/dist/services/hds-theming.js.map +1 -0
  42. package/dist/services.js +1 -1
  43. package/dist/styles/@hashicorp/design-system-components-common.css +9584 -0
  44. package/dist/styles/@hashicorp/design-system-components-common.css.map +1 -0
  45. package/dist/styles/@hashicorp/design-system-components-common.scss +24 -0
  46. package/dist/styles/@hashicorp/design-system-components.css +544 -337
  47. package/dist/styles/@hashicorp/design-system-components.css.map +1 -0
  48. package/dist/styles/@hashicorp/design-system-components.scss +4 -62
  49. package/dist/styles/@hashicorp/design-system-power-select-overrides.css +229 -0
  50. package/dist/styles/@hashicorp/design-system-power-select-overrides.css.map +1 -0
  51. package/dist/styles/components/badge-count.scss +26 -76
  52. package/dist/styles/components/badge.scss +26 -131
  53. package/dist/styles/components/button.scss +5 -0
  54. package/dist/styles/components/dropdown.scss +3 -5
  55. package/dist/styles/components/form/file-input.scss +2 -2
  56. package/dist/styles/components/form/key-value-inputs.scss +2 -4
  57. package/dist/styles/components/form/super-select.scss +12 -4
  58. package/dist/styles/components/index.scss +52 -0
  59. package/dist/styles/components/theme-context.scss +12 -0
  60. package/dist/styles/mixins/_button.scss +82 -129
  61. package/dist/styles/mixins/_carbonization.scss +31 -0
  62. package/dist/styles/mixins/_interactive-dark-theme.scss +1 -1
  63. package/dist/utils/hds-resolve-link-to-external.js +33 -0
  64. package/dist/utils/hds-resolve-link-to-external.js.map +1 -0
  65. package/package.json +12 -4
  66. package/dist/styles/@hashicorp/design-system-components.scss.map +0 -1
@@ -6,7 +6,7 @@ import { precompileTemplate } from '@ember/template-compilation';
6
6
  import { n } from 'decorator-transforms/runtime';
7
7
  import { setComponentTemplate } from '@ember/component';
8
8
 
9
- var TEMPLATE = precompileTemplate("{{!\n Copyright IBM Corp. 2021, 2025\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::PopoverPrimitive @isOpen={{@isOpen}} @onClose={{@onClose}} @enableClickEvents={{true}} as |PP|>\n <div class={{this.classNames}} ...attributes {{PP.setupPrimitiveContainer}}>\n {{yield\n (hash\n ToggleButton=(component\n \"hds/dropdown/toggle/button\" isOpen=PP.isOpen setupPrimitiveToggle=PP.setupPrimitiveToggle\n )\n ToggleIcon=(component \"hds/dropdown/toggle/icon\" isOpen=PP.isOpen setupPrimitiveToggle=PP.setupPrimitiveToggle)\n close=PP.hidePopover\n )\n }}\n <div\n tabindex=\"-1\"\n class={{this.classNamesContent}}\n {{style width=@width max-height=@height}}\n {{PP.setupPrimitivePopover anchoredPositionOptions=this.anchoredPositionOptions}}\n >\n {{#if (or PP.isOpen @preserveContentInDom)}}\n {{yield (hash Header=(component \"hds/dropdown/header\") close=PP.hidePopover)}}\n <ul class=\"hds-dropdown__list\" {{did-insert this.didInsertList}}>\n {{yield\n (hash\n close=PP.hidePopover\n Checkbox=(component \"hds/dropdown/list-item/checkbox\")\n Checkmark=(component \"hds/dropdown/list-item/checkmark\")\n CopyItem=(component \"hds/dropdown/list-item/copy-item\")\n Description=(component \"hds/dropdown/list-item/description\")\n Generic=(component \"hds/dropdown/list-item/generic\")\n Interactive=(component \"hds/dropdown/list-item/interactive\")\n Radio=(component \"hds/dropdown/list-item/radio\")\n Separator=(component \"hds/dropdown/list-item/separator\")\n Title=(component \"hds/dropdown/list-item/title\")\n )\n }}\n </ul>\n {{yield (hash close=PP.hidePopover Footer=(component \"hds/dropdown/footer\"))}}\n {{/if}}\n </div>\n </div>\n</Hds::PopoverPrimitive>");
9
+ var TEMPLATE = precompileTemplate("{{!\n Copyright IBM Corp. 2021, 2025\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::PopoverPrimitive\n @isOpen={{@isOpen}}\n @onClose={{@onClose}}\n @boundary={{@boundary}}\n @enableClickEvents={{true}}\n as |PP|\n>\n <div class={{this.classNames}} ...attributes {{PP.setupPrimitiveContainer}}>\n {{yield\n (hash\n ToggleButton=(component\n \"hds/dropdown/toggle/button\" isOpen=PP.isOpen setupPrimitiveToggle=PP.setupPrimitiveToggle\n )\n ToggleIcon=(component \"hds/dropdown/toggle/icon\" isOpen=PP.isOpen setupPrimitiveToggle=PP.setupPrimitiveToggle)\n close=PP.hidePopover\n )\n }}\n <div\n tabindex=\"-1\"\n class={{this.classNamesContent}}\n {{style width=@width max-height=@height}}\n {{PP.setupPrimitivePopover anchoredPositionOptions=this.anchoredPositionOptions}}\n >\n {{#if (or PP.isOpen @preserveContentInDom)}}\n {{yield (hash Header=(component \"hds/dropdown/header\") close=PP.hidePopover)}}\n <ul class=\"hds-dropdown__list\" {{did-insert this.didInsertList}}>\n {{yield\n (hash\n close=PP.hidePopover\n Checkbox=(component \"hds/dropdown/list-item/checkbox\")\n Checkmark=(component \"hds/dropdown/list-item/checkmark\")\n CopyItem=(component \"hds/dropdown/list-item/copy-item\")\n Description=(component \"hds/dropdown/list-item/description\")\n Generic=(component \"hds/dropdown/list-item/generic\")\n Interactive=(component \"hds/dropdown/list-item/interactive\")\n Radio=(component \"hds/dropdown/list-item/radio\")\n Separator=(component \"hds/dropdown/list-item/separator\")\n Title=(component \"hds/dropdown/list-item/title\")\n )\n }}\n </ul>\n {{yield (hash close=PP.hidePopover Footer=(component \"hds/dropdown/footer\"))}}\n {{/if}}\n </div>\n </div>\n</Hds::PopoverPrimitive>");
10
10
 
11
11
  /**
12
12
  * Copyright IBM Corp. 2021, 2025
@@ -42,7 +42,8 @@ class HdsDropdown extends Component {
42
42
  placement: HdsDropdownPositionToPlacementValues[this.listPosition],
43
43
  offsetOptions: 4,
44
44
  enableCollisionDetection: this.enableCollisionDetection ? 'flip' : false,
45
- matchToggleWidth: this.matchToggleWidth
45
+ matchToggleWidth: this.matchToggleWidth,
46
+ boundary: this.args.boundary
46
47
  };
47
48
  }
48
49
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/dropdown/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nimport {\n // map Dropdown's `listPosition` values to PopoverPrimitive's `placement` values\n HdsDropdownPositionToPlacementValues,\n // Dropdown's `listPosition` values\n HdsDropdownPositionValues,\n} from './types.ts';\n\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsPopoverPrimitiveSignature } from '../popover-primitive/index.ts';\nimport type { HdsDropdownFooterSignature } from './footer';\nimport type { HdsDropdownHeaderSignature } from './header';\nimport type { HdsDropdownListItemCheckboxSignature } from './list-item/checkbox';\nimport type { HdsDropdownListItemCheckmarkSignature } from './list-item/checkmark';\nimport type { HdsDropdownListItemCopyItemSignature } from './list-item/copy-item';\nimport type { HdsDropdownListItemDescriptionSignature } from './list-item/description';\nimport type { HdsDropdownListItemGenericSignature } from './list-item/generic';\nimport type { HdsDropdownListItemInteractiveSignature } from './list-item/interactive';\nimport type { HdsDropdownListItemRadioSignature } from './list-item/radio';\nimport type { HdsDropdownListItemSeparatorSignature } from './list-item/separator';\nimport type { HdsDropdownListItemTitleSignature } from './list-item/title';\nimport type { HdsDropdownToggleButtonSignature } from './toggle/button';\nimport type { HdsDropdownToggleIconSignature } from './toggle/icon';\nimport type { HdsDropdownPositions } from './types';\n\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\n\nexport const DEFAULT_POSITION = HdsDropdownPositionValues.BottomRight;\nexport const POSITIONS: HdsDropdownPositions[] = Object.values(\n HdsDropdownPositionValues\n);\n\nexport interface HdsDropdownSignature {\n Args: {\n height?: string;\n isInline?: boolean;\n isOpen?: HdsPopoverPrimitiveSignature['Args']['isOpen'];\n listPosition?: HdsDropdownPositions;\n width?: string;\n enableCollisionDetection?: HdsAnchoredPositionOptions['enableCollisionDetection'];\n preserveContentInDom?: boolean;\n matchToggleWidth?: boolean;\n onClose?: HdsPopoverPrimitiveSignature['Args']['onClose'];\n };\n Blocks: {\n default: [\n {\n Footer?: ComponentLike<HdsDropdownFooterSignature>;\n Header?: ComponentLike<HdsDropdownHeaderSignature>;\n Checkbox?: ComponentLike<HdsDropdownListItemCheckboxSignature>;\n Checkmark?: ComponentLike<HdsDropdownListItemCheckmarkSignature>;\n CopyItem?: ComponentLike<HdsDropdownListItemCopyItemSignature>;\n Description?: ComponentLike<HdsDropdownListItemDescriptionSignature>;\n Generic?: ComponentLike<HdsDropdownListItemGenericSignature>;\n Interactive?: ComponentLike<HdsDropdownListItemInteractiveSignature>;\n Radio?: ComponentLike<HdsDropdownListItemRadioSignature>;\n Separator?: ComponentLike<HdsDropdownListItemSeparatorSignature>;\n Title?: ComponentLike<HdsDropdownListItemTitleSignature>;\n ToggleButton?: ComponentLike<HdsDropdownToggleButtonSignature>;\n ToggleIcon?: ComponentLike<HdsDropdownToggleIconSignature>;\n close: (event?: Event) => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsDropdown extends Component<HdsDropdownSignature> {\n /**\n * @param listPosition\n * @type {string}\n * @default bottom-right\n * @description Determines the position of the \"list\"\n */\n get listPosition(): HdsDropdownPositions {\n const { listPosition = DEFAULT_POSITION } = this.args;\n\n assert(\n `@listPosition for \"Hds::Dropdown::Index\" must be one of the following: ${POSITIONS.join(\n ', '\n )}; received: ${listPosition}`,\n POSITIONS.includes(listPosition)\n );\n\n return listPosition;\n }\n\n get enableCollisionDetection(): HdsAnchoredPositionOptions['enableCollisionDetection'] {\n return this.args.enableCollisionDetection ?? false;\n }\n\n get matchToggleWidth(): HdsAnchoredPositionOptions['matchToggleWidth'] {\n return this.args.matchToggleWidth ?? false;\n }\n\n get anchoredPositionOptions(): {\n placement: HdsAnchoredPositionOptions['placement'];\n offsetOptions: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection: HdsAnchoredPositionOptions['enableCollisionDetection'];\n matchToggleWidth: HdsAnchoredPositionOptions['matchToggleWidth'];\n } {\n // custom options specific for the `RichTooltip` component\n // for details see the `hds-anchored-position` modifier\n return {\n placement: HdsDropdownPositionToPlacementValues[this.listPosition],\n offsetOptions: 4,\n enableCollisionDetection: this.enableCollisionDetection ? 'flip' : false,\n matchToggleWidth: this.matchToggleWidth,\n };\n }\n\n /**\n * Get the class names to apply to the element\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the root element\n */\n get classNames(): string {\n const classes = ['hds-dropdown'];\n\n // add a class based on the @isInline argument\n if (this.args.isInline) {\n classes.push('hds-dropdown--is-inline');\n }\n\n return classes.join(' ');\n }\n\n /**\n * Get the class names to apply to the content\n * @method classNamesContent\n * @return {string} The \"class\" attribute to apply to the disclosed content\n */\n get classNamesContent(): string {\n const classes = ['hds-dropdown__content'];\n\n // add a class based on the @listPosition argument\n // TODO: we preserved these classes to avoid introducing breaking changes for consumers who rely on these classes for tests, but we aim to remove them in the next major release\n // context: https://github.com/hashicorp/design-system/pull/2309#discussion_r1706941892\n classes.push(`hds-dropdown__content--position-${this.listPosition}`);\n\n // add a class based on the @width or @matchToggleWidth arguments\n if (this.args.width || this.args.matchToggleWidth) {\n classes.push('hds-dropdown__content--fixed-width');\n }\n\n return classes.join(' ');\n }\n\n @action\n didInsertList(element: HTMLUListElement): void {\n const checkmarkItems = element.querySelectorAll(`[role=\"option\"]`);\n if (checkmarkItems.length) {\n const toggleButtonId = element\n .closest('.hds-dropdown')\n ?.querySelector('.hds-dropdown-toggle-button')\n ?.getAttribute('id');\n\n element.setAttribute('role', 'listbox');\n\n if (toggleButtonId) {\n element.setAttribute('aria-labelledby', toggleButtonId);\n }\n }\n }\n}\n"],"names":["DEFAULT_POSITION","HdsDropdownPositionValues","BottomRight","POSITIONS","Object","values","HdsDropdown","Component","listPosition","args","assert","join","includes","enableCollisionDetection","matchToggleWidth","anchoredPositionOptions","placement","HdsDropdownPositionToPlacementValues","offsetOptions","classNames","classes","isInline","push","classNamesContent","width","didInsertList","element","checkmarkItems","querySelectorAll","length","toggleButtonId","closest","querySelector","getAttribute","setAttribute","n","prototype","action","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/dropdown/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nimport {\n // map Dropdown's `listPosition` values to PopoverPrimitive's `placement` values\n HdsDropdownPositionToPlacementValues,\n // Dropdown's `listPosition` values\n HdsDropdownPositionValues,\n} from './types.ts';\n\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsPopoverPrimitiveSignature } from '../popover-primitive/index.ts';\nimport type { HdsDropdownFooterSignature } from './footer';\nimport type { HdsDropdownHeaderSignature } from './header';\nimport type { HdsDropdownListItemCheckboxSignature } from './list-item/checkbox';\nimport type { HdsDropdownListItemCheckmarkSignature } from './list-item/checkmark';\nimport type { HdsDropdownListItemCopyItemSignature } from './list-item/copy-item';\nimport type { HdsDropdownListItemDescriptionSignature } from './list-item/description';\nimport type { HdsDropdownListItemGenericSignature } from './list-item/generic';\nimport type { HdsDropdownListItemInteractiveSignature } from './list-item/interactive';\nimport type { HdsDropdownListItemRadioSignature } from './list-item/radio';\nimport type { HdsDropdownListItemSeparatorSignature } from './list-item/separator';\nimport type { HdsDropdownListItemTitleSignature } from './list-item/title';\nimport type { HdsDropdownToggleButtonSignature } from './toggle/button';\nimport type { HdsDropdownToggleIconSignature } from './toggle/icon';\nimport type { HdsDropdownPositions } from './types';\n\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\n\nexport const DEFAULT_POSITION = HdsDropdownPositionValues.BottomRight;\nexport const POSITIONS: HdsDropdownPositions[] = Object.values(\n HdsDropdownPositionValues\n);\n\nexport interface HdsDropdownSignature {\n Args: {\n height?: string;\n isInline?: boolean;\n isOpen?: HdsPopoverPrimitiveSignature['Args']['isOpen'];\n listPosition?: HdsDropdownPositions;\n width?: string;\n enableCollisionDetection?: HdsAnchoredPositionOptions['enableCollisionDetection'];\n preserveContentInDom?: boolean;\n matchToggleWidth?: boolean;\n onClose?: HdsPopoverPrimitiveSignature['Args']['onClose'];\n boundary?: HdsAnchoredPositionOptions['boundary'];\n };\n Blocks: {\n default: [\n {\n Footer?: ComponentLike<HdsDropdownFooterSignature>;\n Header?: ComponentLike<HdsDropdownHeaderSignature>;\n Checkbox?: ComponentLike<HdsDropdownListItemCheckboxSignature>;\n Checkmark?: ComponentLike<HdsDropdownListItemCheckmarkSignature>;\n CopyItem?: ComponentLike<HdsDropdownListItemCopyItemSignature>;\n Description?: ComponentLike<HdsDropdownListItemDescriptionSignature>;\n Generic?: ComponentLike<HdsDropdownListItemGenericSignature>;\n Interactive?: ComponentLike<HdsDropdownListItemInteractiveSignature>;\n Radio?: ComponentLike<HdsDropdownListItemRadioSignature>;\n Separator?: ComponentLike<HdsDropdownListItemSeparatorSignature>;\n Title?: ComponentLike<HdsDropdownListItemTitleSignature>;\n ToggleButton?: ComponentLike<HdsDropdownToggleButtonSignature>;\n ToggleIcon?: ComponentLike<HdsDropdownToggleIconSignature>;\n close: (event?: Event) => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsDropdown extends Component<HdsDropdownSignature> {\n /**\n * @param listPosition\n * @type {string}\n * @default bottom-right\n * @description Determines the position of the \"list\"\n */\n get listPosition(): HdsDropdownPositions {\n const { listPosition = DEFAULT_POSITION } = this.args;\n\n assert(\n `@listPosition for \"Hds::Dropdown::Index\" must be one of the following: ${POSITIONS.join(\n ', '\n )}; received: ${listPosition}`,\n POSITIONS.includes(listPosition)\n );\n\n return listPosition;\n }\n\n get enableCollisionDetection(): HdsAnchoredPositionOptions['enableCollisionDetection'] {\n return this.args.enableCollisionDetection ?? false;\n }\n\n get matchToggleWidth(): HdsAnchoredPositionOptions['matchToggleWidth'] {\n return this.args.matchToggleWidth ?? false;\n }\n\n get anchoredPositionOptions(): {\n placement: HdsAnchoredPositionOptions['placement'];\n offsetOptions: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection: HdsAnchoredPositionOptions['enableCollisionDetection'];\n matchToggleWidth: HdsAnchoredPositionOptions['matchToggleWidth'];\n boundary: HdsAnchoredPositionOptions['boundary'];\n } {\n // custom options specific for the `RichTooltip` component\n // for details see the `hds-anchored-position` modifier\n return {\n placement: HdsDropdownPositionToPlacementValues[this.listPosition],\n offsetOptions: 4,\n enableCollisionDetection: this.enableCollisionDetection ? 'flip' : false,\n matchToggleWidth: this.matchToggleWidth,\n boundary: this.args.boundary,\n };\n }\n\n /**\n * Get the class names to apply to the element\n * @method classNames\n * @return {string} The \"class\" attribute to apply to the root element\n */\n get classNames(): string {\n const classes = ['hds-dropdown'];\n\n // add a class based on the @isInline argument\n if (this.args.isInline) {\n classes.push('hds-dropdown--is-inline');\n }\n\n return classes.join(' ');\n }\n\n /**\n * Get the class names to apply to the content\n * @method classNamesContent\n * @return {string} The \"class\" attribute to apply to the disclosed content\n */\n get classNamesContent(): string {\n const classes = ['hds-dropdown__content'];\n\n // add a class based on the @listPosition argument\n // TODO: we preserved these classes to avoid introducing breaking changes for consumers who rely on these classes for tests, but we aim to remove them in the next major release\n // context: https://github.com/hashicorp/design-system/pull/2309#discussion_r1706941892\n classes.push(`hds-dropdown__content--position-${this.listPosition}`);\n\n // add a class based on the @width or @matchToggleWidth arguments\n if (this.args.width || this.args.matchToggleWidth) {\n classes.push('hds-dropdown__content--fixed-width');\n }\n\n return classes.join(' ');\n }\n\n @action\n didInsertList(element: HTMLUListElement): void {\n const checkmarkItems = element.querySelectorAll(`[role=\"option\"]`);\n if (checkmarkItems.length) {\n const toggleButtonId = element\n .closest('.hds-dropdown')\n ?.querySelector('.hds-dropdown-toggle-button')\n ?.getAttribute('id');\n\n element.setAttribute('role', 'listbox');\n\n if (toggleButtonId) {\n element.setAttribute('aria-labelledby', toggleButtonId);\n }\n }\n }\n}\n"],"names":["DEFAULT_POSITION","HdsDropdownPositionValues","BottomRight","POSITIONS","Object","values","HdsDropdown","Component","listPosition","args","assert","join","includes","enableCollisionDetection","matchToggleWidth","anchoredPositionOptions","placement","HdsDropdownPositionToPlacementValues","offsetOptions","boundary","classNames","classes","isInline","push","classNamesContent","width","didInsertList","element","checkmarkItems","querySelectorAll","length","toggleButtonId","closest","querySelector","getAttribute","setAttribute","n","prototype","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;;AAgCO,MAAMA,gBAAgB,GAAGC,yBAAyB,CAACC;AACnD,MAAMC,SAAiC,GAAGC,MAAM,CAACC,MAAM,CAC5DJ,yBACF;AAsCe,MAAMK,WAAW,SAASC,SAAS,CAAuB;AACvE;AACF;AACA;AACA;AACA;AACA;EACE,IAAIC,YAAYA,GAAyB;IACvC,MAAM;AAAEA,MAAAA,YAAY,GAAGR;KAAkB,GAAG,IAAI,CAACS,IAAI;AAErDC,IAAAA,MAAM,CACJ,CAAA,uEAAA,EAA0EP,SAAS,CAACQ,IAAI,CACtF,IACF,CAAC,CAAA,YAAA,EAAeH,YAAY,CAAA,CAAE,EAC9BL,SAAS,CAACS,QAAQ,CAACJ,YAAY,CACjC,CAAC;AAED,IAAA,OAAOA,YAAY;AACrB,EAAA;EAEA,IAAIK,wBAAwBA,GAA2D;AACrF,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,wBAAwB,IAAI,KAAK;AACpD,EAAA;EAEA,IAAIC,gBAAgBA,GAAmD;AACrE,IAAA,OAAO,IAAI,CAACL,IAAI,CAACK,gBAAgB,IAAI,KAAK;AAC5C,EAAA;EAEA,IAAIC,uBAAuBA,GAMzB;AACA;AACA;IACA,OAAO;AACLC,MAAAA,SAAS,EAAEC,oCAAoC,CAAC,IAAI,CAACT,YAAY,CAAC;AAClEU,MAAAA,aAAa,EAAE,CAAC;AAChBL,MAAAA,wBAAwB,EAAE,IAAI,CAACA,wBAAwB,GAAG,MAAM,GAAG,KAAK;MACxEC,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;AACvCK,MAAAA,QAAQ,EAAE,IAAI,CAACV,IAAI,CAACU;KACrB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIC,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,cAAc,CAAC;;AAEhC;AACA,IAAA,IAAI,IAAI,CAACZ,IAAI,CAACa,QAAQ,EAAE;AACtBD,MAAAA,OAAO,CAACE,IAAI,CAAC,yBAAyB,CAAC;AACzC,IAAA;AAEA,IAAA,OAAOF,OAAO,CAACV,IAAI,CAAC,GAAG,CAAC;AAC1B,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIa,iBAAiBA,GAAW;AAC9B,IAAA,MAAMH,OAAO,GAAG,CAAC,uBAAuB,CAAC;;AAEzC;AACA;AACA;IACAA,OAAO,CAACE,IAAI,CAAC,CAAA,gCAAA,EAAmC,IAAI,CAACf,YAAY,EAAE,CAAC;;AAEpE;IACA,IAAI,IAAI,CAACC,IAAI,CAACgB,KAAK,IAAI,IAAI,CAAChB,IAAI,CAACK,gBAAgB,EAAE;AACjDO,MAAAA,OAAO,CAACE,IAAI,CAAC,oCAAoC,CAAC;AACpD,IAAA;AAEA,IAAA,OAAOF,OAAO,CAACV,IAAI,CAAC,GAAG,CAAC;AAC1B,EAAA;EAGAe,aAAaA,CAACC,OAAyB,EAAQ;AAC7C,IAAA,MAAMC,cAAc,GAAGD,OAAO,CAACE,gBAAgB,CAAC,iBAAiB,CAAC;IAClE,IAAID,cAAc,CAACE,MAAM,EAAE;AACzB,MAAA,MAAMC,cAAc,GAAGJ,OAAO,CAC3BK,OAAO,CAAC,eAAe,CAAC,EACvBC,aAAa,CAAC,6BAA6B,CAAC,EAC5CC,YAAY,CAAC,IAAI,CAAC;AAEtBP,MAAAA,OAAO,CAACQ,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;AAEvC,MAAA,IAAIJ,cAAc,EAAE;AAClBJ,QAAAA,OAAO,CAACQ,YAAY,CAAC,iBAAiB,EAAEJ,cAAc,CAAC;AACzD,MAAA;AACF,IAAA;AACF,EAAA;AAAC,EAAA;IAAAK,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,eAAA,EAAA,CAfAC,MAAM,CAAA,CAAA;AAAA;AAgBT;AAACC,oBAAA,CAAAC,QAAA,EAnGoBlC,WAAW,CAAA;;;;"}
@@ -1,8 +1,9 @@
1
1
  import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
2
3
  import { action } from '@ember/object';
3
- import { assert } from '@ember/debug';
4
+ import { hdsResolveLinkToExternal } from '../../../utils/hds-resolve-link-to-external.js';
4
5
  import { precompileTemplate } from '@ember/template-compilation';
5
- import { n } from 'decorator-transforms/runtime';
6
+ import { g, i, n } from 'decorator-transforms/runtime';
6
7
  import { setComponentTemplate } from '@ember/component';
7
8
 
8
9
  var TEMPLATE = precompileTemplate("{{! IMPORTANT: we removed the newlines before/after the yield to reduce the issues with unexpected whitespaces (see https://github.com/hashicorp/design-system/pull/231#issuecomment-1123502499) }}\n{{! IMPORTANT: we need to add \"squishies\" here (~) because otherwise the whitespace added by Ember becomes visible in the link (being an inline element) - See https://handlebarsjs.com/guide/expressions.html#whitespace-control }}\n{{! NOTICE: we can\'t support the direct use of the \"href\" HTML attribute via ...attributes in the <a> elements, because we need to rely on the \"@href\" Ember argument to differentiate between different types of generated output }}\n{{~#if @route~}}\n {{~#if this.isRouteExternal~}}\n <this.linkToExternal\n @current-when={{@current-when}}\n @models={{hds-link-to-models @model @models}}\n @query={{hds-link-to-query @query}}\n @replace={{@replace}}\n @route={{@route}}\n ...attributes\n >{{yield}}</this.linkToExternal>\n {{~else~}}\n <LinkTo\n @current-when={{@current-when}}\n @models={{hds-link-to-models @model @models}}\n @query={{hds-link-to-query @query}}\n @replace={{@replace}}\n @route={{@route}}\n ...attributes\n >{{yield}}</LinkTo>\n {{~/if~}}\n{{~else if @href~}}\n {{~#if this.isHrefExternal~}}\n <a target=\"_blank\" rel=\"noopener noreferrer\" ...attributes href={{@href}} {{on \"keyup\" this.onKeyUp}}>{{yield}}</a>\n {{~else~}}\n <a ...attributes href={{@href}} {{on \"keyup\" this.onKeyUp}}>{{yield}}</a>\n {{~/if~}}\n{{~else~}}\n <button type=\"button\" ...attributes>{{yield}}</button>\n{{~/if~}}");
@@ -13,26 +14,23 @@ var TEMPLATE = precompileTemplate("{{! IMPORTANT: we removed the newlines before
13
14
  */
14
15
 
15
16
  class HdsInteractive extends Component {
16
- static linkToExternal = null;
17
-
18
- /**
19
- * Determines if a @href value is "external" (it adds target="_blank" rel="noopener noreferrer")
20
- *
21
- * @param linkToExternal
22
- * @type LinkTo | null
23
- * @default null
24
- */
25
- get linkToExternal() {
26
- const component = HdsInteractive.linkToExternal;
27
- if (component === null) {
28
- assert(`HdsInteractive: You attempted to use an external link without configuring HDS with an external component. Please add this in your app.js file:
17
+ static {
18
+ g(this.prototype, "linkToExternal", [tracked], function () {
19
+ return null;
20
+ });
21
+ }
22
+ #linkToExternal = (i(this, "linkToExternal"), void 0);
23
+ constructor(owner, args) {
24
+ super(owner, args);
29
25
 
30
- import { HdsInteractive } from '@hashicorp/design-system-components/components';
31
- HdsInteractive.linkToExternal = LinkToExternalComponent;`);
26
+ // we want to avoid resolving the component if it's not needed
27
+ if (args.isRouteExternal) {
28
+ void this.resolveLinkToExternal();
32
29
  }
33
- return component;
34
30
  }
35
-
31
+ async resolveLinkToExternal() {
32
+ this.linkToExternal = await hdsResolveLinkToExternal(this.args.isRouteExternal);
33
+ }
36
34
  /**
37
35
  * Determines if a @href value is "external" (it adds target="_blank" rel="noopener noreferrer")
38
36
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/interactive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nimport type { LinkTo } from '@ember/routing';\n\nexport interface HdsInteractiveSignature {\n Args: {\n href?: string;\n isHrefExternal?: boolean;\n isRouteExternal?: boolean;\n // the arguments and types below are mirroring the ones in LinkTo https://github.com/typed-ember/glint/blob/main/packages/environment-ember-loose/-private/intrinsics/link-to.d.ts#L9\n // because they're not exported we're unable to import them directly from glint\n route?: string;\n models?: unknown[];\n model?: unknown;\n query?: Record<string, unknown>;\n 'current-when'?: string | boolean;\n replace?: boolean;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLAnchorElement | HTMLButtonElement;\n}\n\nexport default class HdsInteractive extends Component<HdsInteractiveSignature> {\n static linkToExternal: LinkTo | null = null;\n\n /**\n * Determines if a @href value is \"external\" (it adds target=\"_blank\" rel=\"noopener noreferrer\")\n *\n * @param linkToExternal\n * @type LinkTo | null\n * @default null\n */\n get linkToExternal(): LinkTo | null {\n const component = HdsInteractive.linkToExternal;\n if (component === null) {\n assert(\n `HdsInteractive: You attempted to use an external link without configuring HDS with an external component. Please add this in your app.js file:\n\nimport { HdsInteractive } from '@hashicorp/design-system-components/components';\nHdsInteractive.linkToExternal = LinkToExternalComponent;`\n );\n }\n return component;\n }\n\n /**\n * Determines if a @href value is \"external\" (it adds target=\"_blank\" rel=\"noopener noreferrer\")\n *\n * @param isHrefExternal\n * @type boolean\n * @default true\n */\n get isHrefExternal(): boolean {\n return this.args.isHrefExternal ?? true;\n }\n\n /**\n * Determines if a @route value is \"external\" (uses the LinkToExternal component instead of LinkTo)\n *\n * @param isRouteExternal\n * @type boolean\n * @default false\n */\n get isRouteExternal(): boolean {\n return this.args.isRouteExternal ?? false;\n }\n\n @action\n onKeyUp(event: KeyboardEvent): void {\n if (event.key === ' ' || event.code === 'Space') {\n (event.target as HTMLElement).click();\n }\n }\n}\n"],"names":["HdsInteractive","Component","linkToExternal","component","assert","isHrefExternal","args","isRouteExternal","onKeyUp","event","key","code","target","click","n","prototype","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;;AA4Be,MAAMA,cAAc,SAASC,SAAS,CAA0B;EAC7E,OAAOC,cAAc,GAAkB,IAAI;;AAE3C;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAIA,cAAcA,GAAkB;AAClC,IAAA,MAAMC,SAAS,GAAGH,cAAc,CAACE,cAAc;IAC/C,IAAIC,SAAS,KAAK,IAAI,EAAE;AACtBC,MAAAA,MAAM,CACJ,CAAA;;AAER;AACA,wDAAA,CACM,CAAC;AACH,IAAA;AACA,IAAA,OAAOD,SAAS;AAClB,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAIE,cAAcA,GAAY;AAC5B,IAAA,OAAO,IAAI,CAACC,IAAI,CAACD,cAAc,IAAI,IAAI;AACzC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAIE,eAAeA,GAAY;AAC7B,IAAA,OAAO,IAAI,CAACD,IAAI,CAACC,eAAe,IAAI,KAAK;AAC3C,EAAA;EAGAC,OAAOA,CAACC,KAAoB,EAAQ;IAClC,IAAIA,KAAK,CAACC,GAAG,KAAK,GAAG,IAAID,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;AAC9CF,MAAAA,KAAK,CAACG,MAAM,CAAiBC,KAAK,EAAE;AACvC,IAAA;AACF,EAAA;AAAC,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CALAC,MAAM,CAAA,CAAA;AAAA;AAMT;AAACC,oBAAA,CAAAC,QAAA,EAnDoBlB,cAAc,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/interactive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nimport { hdsResolveLinkToExternal } from '../../../utils/hds-resolve-link-to-external.ts';\n\nimport type Owner from '@ember/owner';\nimport type { LinkTo } from '@ember/routing';\n\nexport interface HdsInteractiveSignature {\n Args: {\n href?: string;\n isHrefExternal?: boolean;\n isRouteExternal?: boolean;\n // the arguments and types below are mirroring the ones in LinkTo https://github.com/typed-ember/glint/blob/main/packages/environment-ember-loose/-private/intrinsics/link-to.d.ts#L9\n // because they're not exported we're unable to import them directly from glint\n route?: string;\n models?: unknown[];\n model?: unknown;\n query?: Record<string, unknown>;\n 'current-when'?: string | boolean;\n replace?: boolean;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLAnchorElement | HTMLButtonElement;\n}\n\nexport default class HdsInteractive extends Component<HdsInteractiveSignature> {\n @tracked linkToExternal: LinkTo | null = null;\n\n constructor(owner: Owner, args: HdsInteractiveSignature['Args']) {\n super(owner, args);\n\n // we want to avoid resolving the component if it's not needed\n if (args.isRouteExternal) {\n void this.resolveLinkToExternal();\n }\n }\n\n async resolveLinkToExternal() {\n this.linkToExternal = await hdsResolveLinkToExternal(\n this.args.isRouteExternal\n );\n }\n /**\n * Determines if a @href value is \"external\" (it adds target=\"_blank\" rel=\"noopener noreferrer\")\n *\n * @param isHrefExternal\n * @type boolean\n * @default true\n */\n get isHrefExternal(): boolean {\n return this.args.isHrefExternal ?? true;\n }\n\n /**\n * Determines if a @route value is \"external\" (uses the LinkToExternal component instead of LinkTo)\n *\n * @param isRouteExternal\n * @type boolean\n * @default false\n */\n get isRouteExternal(): boolean {\n return this.args.isRouteExternal ?? false;\n }\n\n @action\n onKeyUp(event: KeyboardEvent): void {\n if (event.key === ' ' || event.code === 'Space') {\n (event.target as HTMLElement).click();\n }\n }\n}\n"],"names":["HdsInteractive","Component","g","prototype","tracked","i","void 0","constructor","owner","args","isRouteExternal","resolveLinkToExternal","linkToExternal","hdsResolveLinkToExternal","isHrefExternal","onKeyUp","event","key","code","target","click","n","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;;AA+Be,MAAMA,cAAc,SAASC,SAAS,CAA0B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,gBAAA,EAAA,CAC5EC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAiC,IAAI;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,eAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,EAAAC,MAAA;AAE7CC,EAAAA,WAAWA,CAACC,KAAY,EAAEC,IAAqC,EAAE;AAC/D,IAAA,KAAK,CAACD,KAAK,EAAEC,IAAI,CAAC;;AAElB;IACA,IAAIA,IAAI,CAACC,eAAe,EAAE;AACxB,MAAA,KAAK,IAAI,CAACC,qBAAqB,EAAE;AACnC,IAAA;AACF,EAAA;EAEA,MAAMA,qBAAqBA,GAAG;IAC5B,IAAI,CAACC,cAAc,GAAG,MAAMC,wBAAwB,CAClD,IAAI,CAACJ,IAAI,CAACC,eACZ,CAAC;AACH,EAAA;AACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAII,cAAcA,GAAY;AAC5B,IAAA,OAAO,IAAI,CAACL,IAAI,CAACK,cAAc,IAAI,IAAI;AACzC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAIJ,eAAeA,GAAY;AAC7B,IAAA,OAAO,IAAI,CAACD,IAAI,CAACC,eAAe,IAAI,KAAK;AAC3C,EAAA;EAGAK,OAAOA,CAACC,KAAoB,EAAQ;IAClC,IAAIA,KAAK,CAACC,GAAG,KAAK,GAAG,IAAID,KAAK,CAACE,IAAI,KAAK,OAAO,EAAE;AAC9CF,MAAAA,KAAK,CAACG,MAAM,CAAiBC,KAAK,EAAE;AACvC,IAAA;AACF,EAAA;AAAC,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAlB,SAAA,EAAA,SAAA,EAAA,CALAmB,MAAM,CAAA,CAAA;AAAA;AAMT;AAACC,oBAAA,CAAAC,QAAA,EA7CoBxB,cAAc,CAAA;;;;"}
@@ -11,7 +11,7 @@ import { precompileTemplate } from '@ember/template-compilation';
11
11
  import { g, i, n } from 'decorator-transforms/runtime';
12
12
  import { setComponentTemplate } from '@ember/component';
13
13
 
14
- var TEMPLATE = precompileTemplate("{{!\n Copyright IBM Corp. 2021, 2025\n SPDX-License-Identifier: MPL-2.0\n}}\n{{yield\n (hash\n setupPrimitiveContainer=this.setupPrimitiveContainer\n setupPrimitiveToggle=this.setupPrimitiveToggle\n setupPrimitivePopover=this.setupPrimitivePopover\n toggleElement=this._toggleElement\n popoverElement=this._popoverElement\n isOpen=this._isOpen\n showPopover=this.showPopover\n hidePopover=this.hidePopover\n togglePopover=this.togglePopover\n )\n}}");
14
+ var TEMPLATE = precompileTemplate("{{!\n Copyright IBM Corp. 2021, 2025\n SPDX-License-Identifier: MPL-2.0\n}}\n{{yield\n (hash\n setupPrimitiveContainer=this.setupPrimitiveContainer\n setupPrimitiveToggle=this.setupPrimitiveToggle\n setupPrimitivePopover=this.setupPrimitivePopover\n toggleElement=this._toggleElement\n popoverElement=this._popoverElement\n isOpen=this._isOpen\n showPopover=this.showPopover\n hidePopover=this.hidePopover\n togglePopover=this.togglePopover\n boundary=@boundary\n )\n}}");
15
15
 
16
16
  /**
17
17
  * Copyright IBM Corp. 2021, 2025
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/popover-primitive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert, warn } from '@ember/debug';\nimport { next } from '@ember/runloop';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\n\nimport registerEvent from '../../../modifiers/hds-register-event.ts';\nimport anchoredPositionModifier from '../../../modifiers/hds-anchored-position.ts';\n\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\nimport type { ModifierLike } from '@glint/template';\nimport type Owner from '@ember/owner';\n\nexport interface HdsPopoverPrimitiveSignature {\n Args: {\n isOpen?: boolean;\n enableSoftEvents?: boolean;\n enableClickEvents?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n };\n Blocks: {\n default: [\n {\n setupPrimitiveContainer: ModifierLike<SetupPrimitiveContainerModifier>;\n setupPrimitiveToggle: ModifierLike<SetupPrimitiveToggleModifier>;\n setupPrimitivePopover: ModifierLike<SetupPrimitivePopoverModifier>;\n toggleElement?: HTMLButtonElement;\n popoverElement?: HTMLElement;\n isOpen: boolean;\n showPopover: () => void;\n hidePopover: (event?: Event) => void;\n togglePopover: () => void;\n },\n ];\n };\n}\n\ninterface SetupPrimitiveContainerModifier {\n Element: HTMLElement;\n}\n\nexport interface SetupPrimitiveToggleModifier {\n Element: HTMLButtonElement;\n}\n\nexport interface SetupPrimitivePopoverModifier {\n Element: HTMLElement;\n Args: {\n Positional: [];\n Named: { anchoredPositionOptions: HdsAnchoredPositionOptions };\n };\n}\n\nexport default class HdsPopoverPrimitive extends Component<HdsPopoverPrimitiveSignature> {\n @tracked private _isOpen;\n @tracked private _isClosing = false;\n @tracked private _anchoredPositionOptions?: HdsAnchoredPositionOptions;\n private _containerElement?: HTMLElement;\n private _toggleElement?: HTMLButtonElement;\n private _popoverElement?: HTMLElement;\n // this will enable \"soft\" events for the toggle (\"hover\" and \"focus\")\n enableSoftEvents = this.args.enableSoftEvents ?? false;\n // this will enable \"click\" events for the toggle\n enableClickEvents = this.args.enableClickEvents ?? false;\n private _timer?: ReturnType<typeof setTimeout> | null;\n\n constructor(owner: Owner, args: HdsPopoverPrimitiveSignature['Args']) {\n super(owner, args);\n this._isOpen = this.args.isOpen ?? false;\n }\n\n setupPrimitiveContainer = modifier<SetupPrimitiveContainerModifier>(\n (element: HTMLElement): void => {\n this._containerElement = element;\n\n // we register the \"soft\" events\n if (this.enableSoftEvents) {\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._containerElement, [\n 'mouseenter',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onMouseEnter,\n ]);\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._containerElement, [\n 'mouseleave',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onMouseLeave,\n ]);\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._containerElement, ['focusin', this.onFocusIn]);\n }\n // we always want the focusOut event\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._containerElement, ['focusout', this.onFocusOut]);\n }\n );\n\n setupPrimitiveToggle = modifier<SetupPrimitiveToggleModifier>(\n (element: HTMLButtonElement) => {\n this._toggleElement = element;\n\n assert(\n `The toggle element of \"Hds::PopoverPrimitive\" must be a <button>; element received: <${element.tagName.toLowerCase()}>`,\n element instanceof HTMLButtonElement\n );\n\n this._linkToggleAndPopover();\n\n // Return a teardown function to clean up the modifier's side effects.\n // This is a safeguard against bugs where this element might be\n // cached and re-parented in the DOM, rather than being fully destroyed.\n return () => {\n element.removeAttribute('aria-controls');\n element.removeAttribute('popovertarget');\n };\n }\n );\n\n setupPrimitivePopover = modifier(\n (\n element: HTMLElement,\n _positional,\n named: { anchoredPositionOptions: HdsAnchoredPositionOptions }\n ): void => {\n this._popoverElement = element;\n\n // We need to create a popoverId in order to connect the popover and the toggle with aria-controls\n // and an id is needed to implement `onclick` event listeners\n if (!this._popoverElement.id) {\n this._popoverElement.id = guidFor(this);\n }\n\n // this should be an extremely edge case, but in the case the popover needs to be initially forced to be open\n // we need to use the \"manual\" state to support the case of multiple \"menus\" opened at the same time\n // IMPORTANT! if a \"popover\" is set to \"open\" with a \"manual\" state, then it can't be closed via `esc` and `click outside`\n if (this.args.isOpen) {\n this._popoverElement.popover = 'manual';\n this._popoverElement.showPopover();\n } else {\n this._popoverElement.popover = 'auto';\n }\n\n // Register \"onBeforeToggle\" + \"onToggle\" callback functions to be called when a native 'toggle' event is dispatched\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._popoverElement, [\n 'beforetoggle',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onBeforeTogglePopover,\n ]);\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._popoverElement, ['toggle', this.onTogglePopover]);\n\n // we need to spread the argument because if it's set via `{{ hash … }}` Ember complains when we overwrite one of its values\n this._anchoredPositionOptions = {\n ...named.anchoredPositionOptions,\n };\n\n this._linkToggleAndPopover();\n }\n );\n\n // Apply the `hds-anchored-position` modifier to the \"popover\" element\n // (notice: this function runs the first time when the element the modifier was applied to is inserted into the DOM, and it autotracks while running.\n // Any tracked values that it accesses will be tracked, including the arguments it receives, and if any of them changes, the function will run again)\n // This modifiers uses the Floating UI library to provide:\n // - positioning of the \"popover\" in relation to the \"toggle\"\n // - collision detection (optional)\n private _applyAnchoredPositionModifier(): void {\n if (\n this._toggleElement !== undefined &&\n this._popoverElement !== undefined &&\n this._anchoredPositionOptions !== undefined\n ) {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n // @ts-expect-error: known issue with type of invocation\n anchoredPositionModifier(\n this._popoverElement, // element the modifier is attached to\n [this._toggleElement], // positional arguments\n this._anchoredPositionOptions // named arguments\n );\n });\n }\n }\n\n private _linkToggleAndPopover(): void {\n if (\n this._toggleElement === undefined ||\n this._popoverElement === undefined\n ) {\n return;\n }\n\n const popoverId = this._popoverElement.id;\n\n this._toggleElement.setAttribute('aria-controls', popoverId);\n\n if (this.enableClickEvents) {\n this._toggleElement.setAttribute('popovertarget', popoverId);\n } else {\n this._toggleElement.removeAttribute('popovertarget');\n }\n\n this._applyAnchoredPositionModifier();\n }\n\n @action\n showPopover(): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.showPopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`showPopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.show-popover-action.invocation-failed',\n }\n );\n }\n }\n\n @action\n // the event may be passed by the `on` modifier, so we need to keep it as an argument here\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hidePopover(_event?: Event): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.hidePopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`hidePopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.hide-popover-action.invocation-failed',\n }\n );\n }\n }\n\n @action\n togglePopover(): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.togglePopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`togglePopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.toggle-popover-action.invocation-failed',\n }\n );\n }\n }\n\n // fired just _before_ the \"popover\" is shown or hidden\n @action\n onBeforeTogglePopover(event: ToggleEvent): void {\n if (event.newState === 'closed') {\n // we need this flag to check if it's in the \"closing\" process,\n // because the browser automatically returns the focus to the \"trigger\" button\n // and this would re-open immediately the popover because of the `focusin` event\n this._isClosing = true;\n }\n }\n\n // fired just _after_ the \"popover\" is shown or hidden\n @action\n onTogglePopover(event: ToggleEvent): void {\n if (event.newState === 'open') {\n this._isOpen = true;\n\n // we call the \"onOpen\" callback if it exists (and is a function)\n const { onOpen } = this.args;\n if (typeof onOpen === 'function') {\n onOpen();\n }\n } else {\n this._isOpen = false;\n\n // reset the \"isClosing\" flag (the `toggle` event is fired _after_ the popover is closed)\n this._isClosing = false;\n\n // if the popover was initially forced to be open (using the \"manual\" state) then revert its status to `auto` once the user interacts with it\n if (this.args.isOpen) {\n if (this._popoverElement) {\n this._popoverElement.popover = 'auto';\n }\n }\n\n // we call the \"onClose\" callback if it exists (and is a function)\n const { onClose } = this.args;\n if (typeof onClose === 'function') {\n onClose();\n }\n }\n }\n\n @action\n onMouseEnter(): void {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this.showPopover();\n }\n\n @action\n onFocusIn(): void {\n // don't re-open the popover if the focus is returned because the closing\n if (!this._isClosing) {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this.showPopover();\n }\n }\n\n @action\n onMouseLeave(): void {\n this._timer = setTimeout((): void => this.hidePopover(), 500);\n }\n\n @action\n onFocusOut(event: FocusEvent): void {\n if (this._containerElement) {\n let isFocusStillInside = false;\n if (\n event.relatedTarget &&\n // if the related target is not part of the disclosed content we close the disclosed container\n this._containerElement.contains(event.relatedTarget as Node)\n ) {\n isFocusStillInside = true;\n } else if (\n document.activeElement &&\n // due to inconsistent implementation of relatedTarget across browsers we use the activeElement as a fallback\n this._containerElement.contains(document.activeElement)\n ) {\n isFocusStillInside = true;\n }\n // if the target receiving the focus is _not_ part of the disclosed content we close the disclosed container\n if (!isFocusStillInside) {\n this.hidePopover();\n }\n }\n }\n}\n"],"names":["HdsPopoverPrimitive","Component","g","prototype","tracked","i","void 0","_containerElement","_toggleElement","_popoverElement","enableSoftEvents","args","enableClickEvents","_timer","constructor","owner","_isOpen","isOpen","setupPrimitiveContainer","modifier","element","registerEvent","onMouseEnter","onMouseLeave","onFocusIn","onFocusOut","setupPrimitiveToggle","assert","tagName","toLowerCase","HTMLButtonElement","_linkToggleAndPopover","removeAttribute","setupPrimitivePopover","_positional","named","id","guidFor","popover","showPopover","onBeforeTogglePopover","onTogglePopover","_anchoredPositionOptions","anchoredPositionOptions","_applyAnchoredPositionModifier","undefined","next","anchoredPositionModifier","popoverId","setAttribute","error","warn","JSON","stringify","n","action","hidePopover","_event","togglePopover","event","newState","_isClosing","onOpen","onClose","clearTimeout","setTimeout","isFocusStillInside","relatedTarget","contains","document","activeElement","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/popover-primitive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { assert, warn } from '@ember/debug';\nimport { next } from '@ember/runloop';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\n\nimport registerEvent from '../../../modifiers/hds-register-event.ts';\nimport anchoredPositionModifier from '../../../modifiers/hds-anchored-position.ts';\n\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\nimport type { ModifierLike } from '@glint/template';\nimport type Owner from '@ember/owner';\n\nexport interface HdsPopoverPrimitiveSignature {\n Args: {\n isOpen?: boolean;\n enableSoftEvents?: boolean;\n enableClickEvents?: boolean;\n boundary?: HdsAnchoredPositionOptions['boundary'];\n onOpen?: () => void;\n onClose?: () => void;\n };\n Blocks: {\n default: [\n {\n setupPrimitiveContainer: ModifierLike<SetupPrimitiveContainerModifier>;\n setupPrimitiveToggle: ModifierLike<SetupPrimitiveToggleModifier>;\n setupPrimitivePopover: ModifierLike<SetupPrimitivePopoverModifier>;\n toggleElement?: HTMLButtonElement;\n popoverElement?: HTMLElement;\n isOpen: boolean;\n showPopover: () => void;\n hidePopover: (event?: Event) => void;\n togglePopover: () => void;\n boundary?: HdsAnchoredPositionOptions['boundary'];\n },\n ];\n };\n}\n\ninterface SetupPrimitiveContainerModifier {\n Element: HTMLElement;\n}\n\nexport interface SetupPrimitiveToggleModifier {\n Element: HTMLButtonElement;\n}\n\nexport interface SetupPrimitivePopoverModifier {\n Element: HTMLElement;\n Args: {\n Positional: [];\n Named: { anchoredPositionOptions: HdsAnchoredPositionOptions };\n };\n}\n\nexport default class HdsPopoverPrimitive extends Component<HdsPopoverPrimitiveSignature> {\n @tracked private _isOpen;\n @tracked private _isClosing = false;\n @tracked private _anchoredPositionOptions?: HdsAnchoredPositionOptions;\n private _containerElement?: HTMLElement;\n private _toggleElement?: HTMLButtonElement;\n private _popoverElement?: HTMLElement;\n // this will enable \"soft\" events for the toggle (\"hover\" and \"focus\")\n enableSoftEvents = this.args.enableSoftEvents ?? false;\n // this will enable \"click\" events for the toggle\n enableClickEvents = this.args.enableClickEvents ?? false;\n private _timer?: ReturnType<typeof setTimeout> | null;\n\n constructor(owner: Owner, args: HdsPopoverPrimitiveSignature['Args']) {\n super(owner, args);\n this._isOpen = this.args.isOpen ?? false;\n }\n\n setupPrimitiveContainer = modifier<SetupPrimitiveContainerModifier>(\n (element: HTMLElement): void => {\n this._containerElement = element;\n\n // we register the \"soft\" events\n if (this.enableSoftEvents) {\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._containerElement, [\n 'mouseenter',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onMouseEnter,\n ]);\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._containerElement, [\n 'mouseleave',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onMouseLeave,\n ]);\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._containerElement, ['focusin', this.onFocusIn]);\n }\n // we always want the focusOut event\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._containerElement, ['focusout', this.onFocusOut]);\n }\n );\n\n setupPrimitiveToggle = modifier<SetupPrimitiveToggleModifier>(\n (element: HTMLButtonElement) => {\n this._toggleElement = element;\n\n assert(\n `The toggle element of \"Hds::PopoverPrimitive\" must be a <button>; element received: <${element.tagName.toLowerCase()}>`,\n element instanceof HTMLButtonElement\n );\n\n this._linkToggleAndPopover();\n\n // Return a teardown function to clean up the modifier's side effects.\n // This is a safeguard against bugs where this element might be\n // cached and re-parented in the DOM, rather than being fully destroyed.\n return () => {\n element.removeAttribute('aria-controls');\n element.removeAttribute('popovertarget');\n };\n }\n );\n\n setupPrimitivePopover = modifier(\n (\n element: HTMLElement,\n _positional,\n named: { anchoredPositionOptions: HdsAnchoredPositionOptions }\n ): void => {\n this._popoverElement = element;\n\n // We need to create a popoverId in order to connect the popover and the toggle with aria-controls\n // and an id is needed to implement `onclick` event listeners\n if (!this._popoverElement.id) {\n this._popoverElement.id = guidFor(this);\n }\n\n // this should be an extremely edge case, but in the case the popover needs to be initially forced to be open\n // we need to use the \"manual\" state to support the case of multiple \"menus\" opened at the same time\n // IMPORTANT! if a \"popover\" is set to \"open\" with a \"manual\" state, then it can't be closed via `esc` and `click outside`\n if (this.args.isOpen) {\n this._popoverElement.popover = 'manual';\n this._popoverElement.showPopover();\n } else {\n this._popoverElement.popover = 'auto';\n }\n\n // Register \"onBeforeToggle\" + \"onToggle\" callback functions to be called when a native 'toggle' event is dispatched\n // @ts-expect-error: known issue with type of invocation\n registerEvent(this._popoverElement, [\n 'beforetoggle',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.onBeforeTogglePopover,\n ]);\n // @ts-expect-error: known issue with type of invocation\n // eslint-disable-next-line @typescript-eslint/unbound-method\n registerEvent(this._popoverElement, ['toggle', this.onTogglePopover]);\n\n // we need to spread the argument because if it's set via `{{ hash … }}` Ember complains when we overwrite one of its values\n this._anchoredPositionOptions = {\n ...named.anchoredPositionOptions,\n };\n\n this._linkToggleAndPopover();\n }\n );\n\n // Apply the `hds-anchored-position` modifier to the \"popover\" element\n // (notice: this function runs the first time when the element the modifier was applied to is inserted into the DOM, and it autotracks while running.\n // Any tracked values that it accesses will be tracked, including the arguments it receives, and if any of them changes, the function will run again)\n // This modifiers uses the Floating UI library to provide:\n // - positioning of the \"popover\" in relation to the \"toggle\"\n // - collision detection (optional)\n private _applyAnchoredPositionModifier(): void {\n if (\n this._toggleElement !== undefined &&\n this._popoverElement !== undefined &&\n this._anchoredPositionOptions !== undefined\n ) {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n // @ts-expect-error: known issue with type of invocation\n anchoredPositionModifier(\n this._popoverElement, // element the modifier is attached to\n [this._toggleElement], // positional arguments\n this._anchoredPositionOptions // named arguments\n );\n });\n }\n }\n\n private _linkToggleAndPopover(): void {\n if (\n this._toggleElement === undefined ||\n this._popoverElement === undefined\n ) {\n return;\n }\n\n const popoverId = this._popoverElement.id;\n\n this._toggleElement.setAttribute('aria-controls', popoverId);\n\n if (this.enableClickEvents) {\n this._toggleElement.setAttribute('popovertarget', popoverId);\n } else {\n this._toggleElement.removeAttribute('popovertarget');\n }\n\n this._applyAnchoredPositionModifier();\n }\n\n @action\n showPopover(): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.showPopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`showPopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.show-popover-action.invocation-failed',\n }\n );\n }\n }\n\n @action\n // the event may be passed by the `on` modifier, so we need to keep it as an argument here\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hidePopover(_event?: Event): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.hidePopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`hidePopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.hide-popover-action.invocation-failed',\n }\n );\n }\n }\n\n @action\n togglePopover(): void {\n try {\n if (this._popoverElement) {\n this._popoverElement.togglePopover();\n }\n } catch (error) {\n warn(\n `The invocation of \\`togglePopover\\` for the popover element caused an unexpected error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-popover.toggle-popover-action.invocation-failed',\n }\n );\n }\n }\n\n // fired just _before_ the \"popover\" is shown or hidden\n @action\n onBeforeTogglePopover(event: ToggleEvent): void {\n if (event.newState === 'closed') {\n // we need this flag to check if it's in the \"closing\" process,\n // because the browser automatically returns the focus to the \"trigger\" button\n // and this would re-open immediately the popover because of the `focusin` event\n this._isClosing = true;\n }\n }\n\n // fired just _after_ the \"popover\" is shown or hidden\n @action\n onTogglePopover(event: ToggleEvent): void {\n if (event.newState === 'open') {\n this._isOpen = true;\n\n // we call the \"onOpen\" callback if it exists (and is a function)\n const { onOpen } = this.args;\n if (typeof onOpen === 'function') {\n onOpen();\n }\n } else {\n this._isOpen = false;\n\n // reset the \"isClosing\" flag (the `toggle` event is fired _after_ the popover is closed)\n this._isClosing = false;\n\n // if the popover was initially forced to be open (using the \"manual\" state) then revert its status to `auto` once the user interacts with it\n if (this.args.isOpen) {\n if (this._popoverElement) {\n this._popoverElement.popover = 'auto';\n }\n }\n\n // we call the \"onClose\" callback if it exists (and is a function)\n const { onClose } = this.args;\n if (typeof onClose === 'function') {\n onClose();\n }\n }\n }\n\n @action\n onMouseEnter(): void {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this.showPopover();\n }\n\n @action\n onFocusIn(): void {\n // don't re-open the popover if the focus is returned because the closing\n if (!this._isClosing) {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this.showPopover();\n }\n }\n\n @action\n onMouseLeave(): void {\n this._timer = setTimeout((): void => this.hidePopover(), 500);\n }\n\n @action\n onFocusOut(event: FocusEvent): void {\n if (this._containerElement) {\n let isFocusStillInside = false;\n if (\n event.relatedTarget &&\n // if the related target is not part of the disclosed content we close the disclosed container\n this._containerElement.contains(event.relatedTarget as Node)\n ) {\n isFocusStillInside = true;\n } else if (\n document.activeElement &&\n // due to inconsistent implementation of relatedTarget across browsers we use the activeElement as a fallback\n this._containerElement.contains(document.activeElement)\n ) {\n isFocusStillInside = true;\n }\n // if the target receiving the focus is _not_ part of the disclosed content we close the disclosed container\n if (!isFocusStillInside) {\n this.hidePopover();\n }\n }\n }\n}\n"],"names":["HdsPopoverPrimitive","Component","g","prototype","tracked","i","void 0","_containerElement","_toggleElement","_popoverElement","enableSoftEvents","args","enableClickEvents","_timer","constructor","owner","_isOpen","isOpen","setupPrimitiveContainer","modifier","element","registerEvent","onMouseEnter","onMouseLeave","onFocusIn","onFocusOut","setupPrimitiveToggle","assert","tagName","toLowerCase","HTMLButtonElement","_linkToggleAndPopover","removeAttribute","setupPrimitivePopover","_positional","named","id","guidFor","popover","showPopover","onBeforeTogglePopover","onTogglePopover","_anchoredPositionOptions","anchoredPositionOptions","_applyAnchoredPositionModifier","undefined","next","anchoredPositionModifier","popoverId","setAttribute","error","warn","JSON","stringify","n","action","hidePopover","_event","togglePopover","event","newState","_isClosing","onOpen","onClose","clearTimeout","setTimeout","isFocusStillInside","relatedTarget","contains","document","activeElement","setComponentTemplate","TEMPLATE"],"mappings":"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"}
@@ -47,7 +47,8 @@ class HdsRichTooltipBubble extends Component {
47
47
  offsetOptions: this.args.offset ?? 12,
48
48
  enableCollisionDetection: this.args.enableCollisionDetection ?? true,
49
49
  arrowSelector: `#${this.args.arrowId}`,
50
- arrowPadding: 12
50
+ arrowPadding: 12,
51
+ boundary: this.args.boundary
51
52
  };
52
53
  }
53
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bubble.js","sources":["../../../../src/components/hds/rich-tooltip/bubble.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport type { ModifierLike } from '@glint/template';\nimport type { SetupPrimitivePopoverModifier } from '../popover-primitive';\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\nimport {\n DEFAULT_PLACEMENT,\n PLACEMENTS,\n} from '../../../modifiers/hds-anchored-position.ts';\n\nexport interface HdsRichTooltipBubbleSignature {\n Args: {\n placement?: HdsAnchoredPositionOptions['placement'];\n offset?: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection?: HdsAnchoredPositionOptions['enableCollisionDetection'];\n width?: string;\n height?: string;\n isOpen?: boolean;\n popoverId: string;\n arrowId: string;\n setupPrimitivePopover: ModifierLike<SetupPrimitivePopoverModifier>;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsRichTooltipBubble extends Component<HdsRichTooltipBubbleSignature> {\n /**\n * @param placement\n * @type {string}\n * @description Determines the position of the \"popover\"\n */\n get placement(): HdsAnchoredPositionOptions['placement'] {\n const { placement = DEFAULT_PLACEMENT } = this.args;\n\n assert(\n `@placement for \"Hds::RichTooltip::Bubble\" must be one of the following: ${PLACEMENTS.join(\n ', '\n )}; received: ${placement}`,\n PLACEMENTS.includes(placement)\n );\n\n return placement;\n }\n\n get enableCollisionDetection(): HdsAnchoredPositionOptions['enableCollisionDetection'] {\n return this.args.enableCollisionDetection ?? true;\n }\n\n get sizingStyles(): Record<string, string> {\n const sizingStyles: {\n width?: string;\n 'max-width'?: string;\n height?: string;\n 'max-height'?: string;\n } = {};\n\n if (this.args.width) {\n sizingStyles['width'] = this.args.width;\n sizingStyles['max-width'] = 'none';\n }\n\n if (this.args.height) {\n sizingStyles['height'] = this.args.height;\n sizingStyles['max-height'] = 'none';\n }\n\n return sizingStyles;\n }\n\n get anchoredPositionOptions(): {\n placement: HdsAnchoredPositionOptions['placement'];\n offsetOptions: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection: HdsAnchoredPositionOptions['enableCollisionDetection'];\n arrowSelector: string;\n arrowPadding: HdsAnchoredPositionOptions['arrowPadding'];\n } {\n // custom options specific for the `RichTooltip` component\n // for details see the `hds-anchored-position` modifier\n return {\n placement: this.placement,\n offsetOptions: this.args.offset ?? 12,\n enableCollisionDetection: this.args.enableCollisionDetection ?? true,\n arrowSelector: `#${this.args.arrowId}`,\n arrowPadding: 12,\n };\n }\n}\n"],"names":["HdsRichTooltipBubble","Component","placement","DEFAULT_PLACEMENT","args","assert","PLACEMENTS","join","includes","enableCollisionDetection","sizingStyles","width","height","anchoredPositionOptions","offsetOptions","offset","arrowSelector","arrowId","arrowPadding","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;;AA+Be,MAAMA,oBAAoB,SAASC,SAAS,CAAgC;AACzF;AACF;AACA;AACA;AACA;EACE,IAAIC,SAASA,GAA4C;IACvD,MAAM;AAAEA,MAAAA,SAAS,GAAGC;KAAmB,GAAG,IAAI,CAACC,IAAI;AAEnDC,IAAAA,MAAM,CACJ,CAAA,wEAAA,EAA2EC,UAAU,CAACC,IAAI,CACxF,IACF,CAAC,CAAA,YAAA,EAAeL,SAAS,CAAA,CAAE,EAC3BI,UAAU,CAACE,QAAQ,CAACN,SAAS,CAC/B,CAAC;AAED,IAAA,OAAOA,SAAS;AAClB,EAAA;EAEA,IAAIO,wBAAwBA,GAA2D;AACrF,IAAA,OAAO,IAAI,CAACL,IAAI,CAACK,wBAAwB,IAAI,IAAI;AACnD,EAAA;EAEA,IAAIC,YAAYA,GAA2B;IACzC,MAAMA,YAKL,GAAG,EAAE;AAEN,IAAA,IAAI,IAAI,CAACN,IAAI,CAACO,KAAK,EAAE;MACnBD,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAACN,IAAI,CAACO,KAAK;AACvCD,MAAAA,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM;AACpC,IAAA;AAEA,IAAA,IAAI,IAAI,CAACN,IAAI,CAACQ,MAAM,EAAE;MACpBF,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI,CAACN,IAAI,CAACQ,MAAM;AACzCF,MAAAA,YAAY,CAAC,YAAY,CAAC,GAAG,MAAM;AACrC,IAAA;AAEA,IAAA,OAAOA,YAAY;AACrB,EAAA;EAEA,IAAIG,uBAAuBA,GAMzB;AACA;AACA;IACA,OAAO;MACLX,SAAS,EAAE,IAAI,CAACA,SAAS;AACzBY,MAAAA,aAAa,EAAE,IAAI,CAACV,IAAI,CAACW,MAAM,IAAI,EAAE;AACrCN,MAAAA,wBAAwB,EAAE,IAAI,CAACL,IAAI,CAACK,wBAAwB,IAAI,IAAI;AACpEO,MAAAA,aAAa,EAAE,CAAA,CAAA,EAAI,IAAI,CAACZ,IAAI,CAACa,OAAO,CAAA,CAAE;AACtCC,MAAAA,YAAY,EAAE;KACf;AACH,EAAA;AACF;AAACC,oBAAA,CAAAC,QAAA,EA7DoBpB,oBAAoB,CAAA;;;;"}
1
+ {"version":3,"file":"bubble.js","sources":["../../../../src/components/hds/rich-tooltip/bubble.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\n\nimport type { ModifierLike } from '@glint/template';\nimport type { SetupPrimitivePopoverModifier } from '../popover-primitive';\nimport type { HdsAnchoredPositionOptions } from '../../../modifiers/hds-anchored-position.ts';\nimport {\n DEFAULT_PLACEMENT,\n PLACEMENTS,\n} from '../../../modifiers/hds-anchored-position.ts';\n\nexport interface HdsRichTooltipBubbleSignature {\n Args: {\n placement?: HdsAnchoredPositionOptions['placement'];\n offset?: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection?: HdsAnchoredPositionOptions['enableCollisionDetection'];\n width?: string;\n height?: string;\n isOpen?: boolean;\n popoverId: string;\n arrowId: string;\n boundary?: HdsAnchoredPositionOptions['boundary'];\n setupPrimitivePopover: ModifierLike<SetupPrimitivePopoverModifier>;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsRichTooltipBubble extends Component<HdsRichTooltipBubbleSignature> {\n /**\n * @param placement\n * @type {string}\n * @description Determines the position of the \"popover\"\n */\n get placement(): HdsAnchoredPositionOptions['placement'] {\n const { placement = DEFAULT_PLACEMENT } = this.args;\n\n assert(\n `@placement for \"Hds::RichTooltip::Bubble\" must be one of the following: ${PLACEMENTS.join(\n ', '\n )}; received: ${placement}`,\n PLACEMENTS.includes(placement)\n );\n\n return placement;\n }\n\n get enableCollisionDetection(): HdsAnchoredPositionOptions['enableCollisionDetection'] {\n return this.args.enableCollisionDetection ?? true;\n }\n\n get sizingStyles(): Record<string, string> {\n const sizingStyles: {\n width?: string;\n 'max-width'?: string;\n height?: string;\n 'max-height'?: string;\n } = {};\n\n if (this.args.width) {\n sizingStyles['width'] = this.args.width;\n sizingStyles['max-width'] = 'none';\n }\n\n if (this.args.height) {\n sizingStyles['height'] = this.args.height;\n sizingStyles['max-height'] = 'none';\n }\n\n return sizingStyles;\n }\n\n get anchoredPositionOptions(): {\n placement: HdsAnchoredPositionOptions['placement'];\n offsetOptions: HdsAnchoredPositionOptions['offsetOptions'];\n enableCollisionDetection: HdsAnchoredPositionOptions['enableCollisionDetection'];\n arrowSelector: string;\n arrowPadding: HdsAnchoredPositionOptions['arrowPadding'];\n boundary: HdsAnchoredPositionOptions['boundary'];\n } {\n // custom options specific for the `RichTooltip` component\n // for details see the `hds-anchored-position` modifier\n return {\n placement: this.placement,\n offsetOptions: this.args.offset ?? 12,\n enableCollisionDetection: this.args.enableCollisionDetection ?? true,\n arrowSelector: `#${this.args.arrowId}`,\n arrowPadding: 12,\n boundary: this.args.boundary,\n };\n }\n}\n"],"names":["HdsRichTooltipBubble","Component","placement","DEFAULT_PLACEMENT","args","assert","PLACEMENTS","join","includes","enableCollisionDetection","sizingStyles","width","height","anchoredPositionOptions","offsetOptions","offset","arrowSelector","arrowId","arrowPadding","boundary","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;;AAgCe,MAAMA,oBAAoB,SAASC,SAAS,CAAgC;AACzF;AACF;AACA;AACA;AACA;EACE,IAAIC,SAASA,GAA4C;IACvD,MAAM;AAAEA,MAAAA,SAAS,GAAGC;KAAmB,GAAG,IAAI,CAACC,IAAI;AAEnDC,IAAAA,MAAM,CACJ,CAAA,wEAAA,EAA2EC,UAAU,CAACC,IAAI,CACxF,IACF,CAAC,CAAA,YAAA,EAAeL,SAAS,CAAA,CAAE,EAC3BI,UAAU,CAACE,QAAQ,CAACN,SAAS,CAC/B,CAAC;AAED,IAAA,OAAOA,SAAS;AAClB,EAAA;EAEA,IAAIO,wBAAwBA,GAA2D;AACrF,IAAA,OAAO,IAAI,CAACL,IAAI,CAACK,wBAAwB,IAAI,IAAI;AACnD,EAAA;EAEA,IAAIC,YAAYA,GAA2B;IACzC,MAAMA,YAKL,GAAG,EAAE;AAEN,IAAA,IAAI,IAAI,CAACN,IAAI,CAACO,KAAK,EAAE;MACnBD,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAACN,IAAI,CAACO,KAAK;AACvCD,MAAAA,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM;AACpC,IAAA;AAEA,IAAA,IAAI,IAAI,CAACN,IAAI,CAACQ,MAAM,EAAE;MACpBF,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI,CAACN,IAAI,CAACQ,MAAM;AACzCF,MAAAA,YAAY,CAAC,YAAY,CAAC,GAAG,MAAM;AACrC,IAAA;AAEA,IAAA,OAAOA,YAAY;AACrB,EAAA;EAEA,IAAIG,uBAAuBA,GAOzB;AACA;AACA;IACA,OAAO;MACLX,SAAS,EAAE,IAAI,CAACA,SAAS;AACzBY,MAAAA,aAAa,EAAE,IAAI,CAACV,IAAI,CAACW,MAAM,IAAI,EAAE;AACrCN,MAAAA,wBAAwB,EAAE,IAAI,CAACL,IAAI,CAACK,wBAAwB,IAAI,IAAI;AACpEO,MAAAA,aAAa,EAAE,CAAA,CAAA,EAAI,IAAI,CAACZ,IAAI,CAACa,OAAO,CAAA,CAAE;AACtCC,MAAAA,YAAY,EAAE,EAAE;AAChBC,MAAAA,QAAQ,EAAE,IAAI,CAACf,IAAI,CAACe;KACrB;AACH,EAAA;AACF;AAACC,oBAAA,CAAAC,QAAA,EA/DoBrB,oBAAoB,CAAA;;;;"}
@@ -0,0 +1,45 @@
1
+ import Component from '@glimmer/component';
2
+ import { assert } from '@ember/debug';
3
+ import { HdsThemeContextThemesValues, HdsThemeContextModesValues } from './types.js';
4
+ import { precompileTemplate } from '@ember/template-compilation';
5
+ import { setComponentTemplate } from '@ember/component';
6
+
7
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<div class={{this.classNames}} ...attributes>{{yield}}</div>");
8
+
9
+ /**
10
+ * Copyright (c) HashiCorp, Inc.
11
+ * SPDX-License-Identifier: MPL-2.0
12
+ */
13
+
14
+ const CONTEXTUAL_THEMES = Object.values(HdsThemeContextThemesValues);
15
+ const CONTEXTUAL_MODES = Object.values(HdsThemeContextModesValues);
16
+ const CONTEXTUAL_VALUES = [...CONTEXTUAL_THEMES, ...CONTEXTUAL_MODES];
17
+ class HdsThemeContext extends Component {
18
+ constructor(owner, args) {
19
+ super(owner, args);
20
+ const {
21
+ context
22
+ } = args;
23
+ assert(`@context for "Hds::ThemeContext" must be one of the following: ${CONTEXTUAL_VALUES.join(', ')}; received: ${context}`, CONTEXTUAL_VALUES.includes(context));
24
+ }
25
+
26
+ // Get the class names to apply to the component.
27
+ get classNames() {
28
+ const classes = ['hds-theme-context'];
29
+ const {
30
+ context
31
+ } = this.args;
32
+
33
+ // add "theme" or "mode" classes based on the @context arguments
34
+ if (CONTEXTUAL_THEMES.includes(context)) {
35
+ classes.push(`hds-theme-${context}`);
36
+ } else if (CONTEXTUAL_MODES.includes(context)) {
37
+ classes.push(`hds-mode-${context}`);
38
+ }
39
+ return classes.join(' ');
40
+ }
41
+ }
42
+ setComponentTemplate(TEMPLATE, HdsThemeContext);
43
+
44
+ export { CONTEXTUAL_MODES, CONTEXTUAL_THEMES, CONTEXTUAL_VALUES, HdsThemeContext as default };
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/theme-context/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\nimport type Owner from '@ember/owner';\n\nimport {\n HdsThemeContextThemesValues,\n HdsThemeContextModesValues,\n} from './types.ts';\nimport type { HdsThemeContexts } from './types.ts';\n\nimport type { HdsThemes, HdsModes } from '../../../services/hds-theming.ts';\n\nexport interface HdsThemeContextSignature {\n Args: {\n // can be either an `HdsTheme` or an `HdsMode`\n context: HdsThemeContexts;\n };\n Blocks: {\n default: [];\n };\n Element: HTMLElement;\n}\n\nexport const CONTEXTUAL_THEMES: HdsThemes[] = Object.values(\n HdsThemeContextThemesValues\n);\nexport const CONTEXTUAL_MODES: HdsModes[] = Object.values(\n HdsThemeContextModesValues\n);\nexport const CONTEXTUAL_VALUES: HdsThemeContexts[] = [\n ...CONTEXTUAL_THEMES,\n ...CONTEXTUAL_MODES,\n];\n\nexport default class HdsThemeContext extends Component<HdsThemeContextSignature> {\n constructor(owner: Owner, args: HdsThemeContextSignature['Args']) {\n super(owner, args);\n\n const { context } = args;\n\n assert(\n `@context for \"Hds::ThemeContext\" must be one of the following: ${CONTEXTUAL_VALUES.join(\n ', '\n )}; received: ${context}`,\n CONTEXTUAL_VALUES.includes(context)\n );\n }\n\n // Get the class names to apply to the component.\n get classNames(): string {\n const classes = ['hds-theme-context'];\n\n const { context } = this.args;\n\n // add \"theme\" or \"mode\" classes based on the @context arguments\n if (CONTEXTUAL_THEMES.includes(context as HdsThemes)) {\n classes.push(`hds-theme-${context}`);\n } else if (CONTEXTUAL_MODES.includes(context as HdsModes)) {\n classes.push(`hds-mode-${context}`);\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["CONTEXTUAL_THEMES","Object","values","HdsThemeContextThemesValues","CONTEXTUAL_MODES","HdsThemeContextModesValues","CONTEXTUAL_VALUES","HdsThemeContext","Component","constructor","owner","args","context","assert","join","includes","classNames","classes","push","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;;AAyBO,MAAMA,iBAA8B,GAAGC,MAAM,CAACC,MAAM,CACzDC,2BACF;AACO,MAAMC,gBAA4B,GAAGH,MAAM,CAACC,MAAM,CACvDG,0BACF;AACO,MAAMC,iBAAqC,GAAG,CACnD,GAAGN,iBAAiB,EACpB,GAAGI,gBAAgB;AAGN,MAAMG,eAAe,SAASC,SAAS,CAA2B;AAC/EC,EAAAA,WAAWA,CAACC,KAAY,EAAEC,IAAsC,EAAE;AAChE,IAAA,KAAK,CAACD,KAAK,EAAEC,IAAI,CAAC;IAElB,MAAM;AAAEC,MAAAA;AAAQ,KAAC,GAAGD,IAAI;AAExBE,IAAAA,MAAM,CACJ,CAAA,+DAAA,EAAkEP,iBAAiB,CAACQ,IAAI,CACtF,IACF,CAAC,CAAA,YAAA,EAAeF,OAAO,CAAA,CAAE,EACzBN,iBAAiB,CAACS,QAAQ,CAACH,OAAO,CACpC,CAAC;AACH,EAAA;;AAEA;EACA,IAAII,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,mBAAmB,CAAC;IAErC,MAAM;AAAEL,MAAAA;KAAS,GAAG,IAAI,CAACD,IAAI;;AAE7B;AACA,IAAA,IAAIX,iBAAiB,CAACe,QAAQ,CAACH,OAAoB,CAAC,EAAE;AACpDK,MAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,UAAA,EAAaN,OAAO,EAAE,CAAC;IACtC,CAAC,MAAM,IAAIR,gBAAgB,CAACW,QAAQ,CAACH,OAAmB,CAAC,EAAE;AACzDK,MAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,SAAA,EAAYN,OAAO,EAAE,CAAC;AACrC,IAAA;AAEA,IAAA,OAAOK,OAAO,CAACH,IAAI,CAAC,GAAG,CAAC;AAC1B,EAAA;AACF;AAACK,oBAAA,CAAAC,QAAA,EA7BoBb,eAAe,CAAA;;;;"}
@@ -0,0 +1,27 @@
1
+ import { HdsThemeValues, HdsModesDarkValues, HdsModesLightValues } from '../../../services/hds-theming.js';
2
+
3
+ /**
4
+ * Copyright (c) HashiCorp, Inc.
5
+ * SPDX-License-Identifier: MPL-2.0
6
+ */
7
+
8
+ // re-export the enum values for the `HdsThemes` to use in the component
9
+ // note: using `as const` ensures Object.values() returns only the values (not keys _and_ values)
10
+ const HdsThemeContextThemesValues = {
11
+ Default: HdsThemeValues.Default,
12
+ System: HdsThemeValues.System,
13
+ Light: HdsThemeValues.Light,
14
+ Dark: HdsThemeValues.Dark
15
+ };
16
+
17
+ // re-export the enum values for the `HdsModes` to use in the component
18
+ // note: using `as const` ensures Object.values() returns only the values (not keys _and_ values)
19
+ const HdsThemeContextModesValues = {
20
+ CdsG0: HdsModesLightValues.CdsG0,
21
+ CdsG10: HdsModesLightValues.CdsG10,
22
+ CdsG90: HdsModesDarkValues.CdsG90,
23
+ CdsG100: HdsModesDarkValues.CdsG100
24
+ };
25
+
26
+ export { HdsThemeContextModesValues, HdsThemeContextThemesValues };
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../../src/components/hds/theme-context/types.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport {\n HdsThemeValues,\n HdsModesLightValues,\n HdsModesDarkValues,\n} from '../../../services/hds-theming.ts';\n\nimport type { HdsThemes, HdsModes } from '../../../services/hds-theming.ts';\n\n// re-export the enum values for the `HdsThemes` to use in the component\n// note: using `as const` ensures Object.values() returns only the values (not keys _and_ values)\nexport const HdsThemeContextThemesValues = {\n Default: HdsThemeValues.Default,\n System: HdsThemeValues.System,\n Light: HdsThemeValues.Light,\n Dark: HdsThemeValues.Dark,\n} as const;\n\n// re-export the enum values for the `HdsModes` to use in the component\n// note: using `as const` ensures Object.values() returns only the values (not keys _and_ values)\nexport const HdsThemeContextModesValues = {\n CdsG0: HdsModesLightValues.CdsG0,\n CdsG10: HdsModesLightValues.CdsG10,\n CdsG90: HdsModesDarkValues.CdsG90,\n CdsG100: HdsModesDarkValues.CdsG100,\n} as const;\n\nexport type HdsThemeContexts = HdsThemes | Exclude<HdsModes, 'default'>;\n"],"names":["HdsThemeContextThemesValues","Default","HdsThemeValues","System","Light","Dark","HdsThemeContextModesValues","CdsG0","HdsModesLightValues","CdsG10","CdsG90","HdsModesDarkValues","CdsG100"],"mappings":";;AAAA;AACA;AACA;AACA;;AAUA;AACA;AACO,MAAMA,2BAA2B,GAAG;EACzCC,OAAO,EAAEC,cAAc,CAACD,OAAO;EAC/BE,MAAM,EAAED,cAAc,CAACC,MAAM;EAC7BC,KAAK,EAAEF,cAAc,CAACE,KAAK;EAC3BC,IAAI,EAAEH,cAAc,CAACG;AACvB;;AAEA;AACA;AACO,MAAMC,0BAA0B,GAAG;EACxCC,KAAK,EAAEC,mBAAmB,CAACD,KAAK;EAChCE,MAAM,EAAED,mBAAmB,CAACC,MAAM;EAClCC,MAAM,EAAEC,kBAAkB,CAACD,MAAM;EACjCE,OAAO,EAAED,kBAAkB,CAACC;AAC9B;;;;"}
@@ -0,0 +1,100 @@
1
+ import Component from '@glimmer/component';
2
+ import { inject } from '@ember/service';
3
+ import { action } from '@ember/object';
4
+ import { precompileTemplate } from '@ember/template-compilation';
5
+ import { g, i, n } from 'decorator-transforms/runtime';
6
+ import { setComponentTemplate } from '@ember/component';
7
+
8
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n{{!\n ------------------------------------------------------------------------------------------\n IMPORTANT: this is a temporary implementation, while we wait for the design specifications\n ------------------------------------------------------------------------------------------\n}}\n\n<Hds::Dropdown\n @enableCollisionDetection={{true}}\n @matchToggleWidth={{@toggleIsFullWidth}}\n class=\"hds-theme-switcher-control\"\n ...attributes\n as |D|\n>\n <D.ToggleButton\n @color=\"secondary\"\n @size={{this.toggleSize}}\n @isFullWidth={{this.toggleIsFullWidth}}\n @text={{this.toggleContent.label}}\n @icon={{this.toggleContent.icon}}\n />\n {{#each-in this._options as |key data|}}\n <D.Interactive @icon={{data.icon}} {{on \"click\" (fn this.onSelectTheme data.theme)}}>{{data.label}}</D.Interactive>\n {{/each-in}}\n</Hds::Dropdown>");
9
+
10
+ /**
11
+ * Copyright (c) HashiCorp, Inc.
12
+ * SPDX-License-Identifier: MPL-2.0
13
+ */
14
+
15
+ const OPTIONS = {
16
+ default: {
17
+ theme: 'default',
18
+ icon: 'hashicorp',
19
+ label: 'Default'
20
+ },
21
+ system: {
22
+ theme: 'system',
23
+ icon: 'monitor',
24
+ label: 'System'
25
+ },
26
+ light: {
27
+ theme: 'light',
28
+ icon: 'sun',
29
+ label: 'Light'
30
+ },
31
+ dark: {
32
+ theme: 'dark',
33
+ icon: 'moon',
34
+ label: 'Dark'
35
+ }
36
+ };
37
+ class HdsThemeSwitcher extends Component {
38
+ static {
39
+ g(this.prototype, "hdsTheming", [inject]);
40
+ }
41
+ #hdsTheming = (i(this, "hdsTheming"), void 0);
42
+ get toggleSize() {
43
+ return this.args.toggleSize ?? 'small';
44
+ }
45
+ get toggleIsFullWidth() {
46
+ return this.args.toggleIsFullWidth ?? false;
47
+ }
48
+ get toggleContent() {
49
+ if (this.currentTheme === 'default' && this.hasDefaultOption || this.currentTheme === 'system' && this.hasSystemOption || this.currentTheme === 'light' || this.currentTheme === 'dark') {
50
+ return {
51
+ label: OPTIONS[this.currentTheme].label,
52
+ icon: OPTIONS[this.currentTheme].icon
53
+ };
54
+ } else {
55
+ return {
56
+ label: 'Theme',
57
+ icon: undefined
58
+ };
59
+ }
60
+ }
61
+
62
+ // note: we will use the `default` option in development, while migrating to the `cds` theming
63
+ // during this process, consumers will enable/disable this option via code logic or feature flag
64
+ get hasDefaultOption() {
65
+ return this.args.hasDefaultOption ?? false;
66
+ }
67
+ get hasSystemOption() {
68
+ return this.args.hasSystemOption ?? true;
69
+ }
70
+ get _options() {
71
+ const options = {
72
+ ...OPTIONS
73
+ };
74
+ if (!this.hasDefaultOption) {
75
+ delete options.default;
76
+ }
77
+ if (!this.hasSystemOption) {
78
+ delete options.system;
79
+ }
80
+ return options;
81
+ }
82
+ get currentTheme() {
83
+ // we get the theme from the global service
84
+ return this.hdsTheming.currentTheme;
85
+ }
86
+ onSelectTheme(theme) {
87
+ // we set the theme in the global service (and provide an optional user-defined callback)
88
+ this.hdsTheming.setTheme({
89
+ theme,
90
+ onSetTheme: this.args.onSetTheme
91
+ });
92
+ }
93
+ static {
94
+ n(this.prototype, "onSelectTheme", [action]);
95
+ }
96
+ }
97
+ setComponentTemplate(TEMPLATE, HdsThemeSwitcher);
98
+
99
+ export { HdsThemeSwitcher as default };
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/theme-switcher/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\n// ------------------------------------------------------------------------------------------\n// IMPORTANT: this is a temporary implementation, while we wait for the design specifications\n// ------------------------------------------------------------------------------------------\n\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\n\nimport type { HdsDropdownSignature } from '../dropdown/index.ts';\nimport type { HdsDropdownToggleButtonSignature } from '../dropdown/toggle/button.ts';\nimport type { HdsIconSignature } from '../icon/index.ts';\nimport type HdsThemingService from '../../../services/hds-theming.ts';\nimport type {\n HdsThemes,\n HdsOnSetThemeCallback,\n} from '../../../services/hds-theming.ts';\n\ninterface ThemeOption {\n theme: HdsThemes | undefined;\n icon: HdsIconSignature['Args']['name'];\n label: string;\n}\n\nconst OPTIONS: Record<HdsThemes, ThemeOption> = {\n default: { theme: 'default', icon: 'hashicorp', label: 'Default' },\n system: { theme: 'system', icon: 'monitor', label: 'System' },\n light: { theme: 'light', icon: 'sun', label: 'Light' },\n dark: { theme: 'dark', icon: 'moon', label: 'Dark' },\n};\n\nexport interface HdsThemeSwitcherSignature {\n Args: {\n toggleSize?: HdsDropdownToggleButtonSignature['Args']['size'];\n toggleIsFullWidth?: HdsDropdownToggleButtonSignature['Args']['isFullWidth'];\n hasDefaultOption?: boolean;\n hasSystemOption?: boolean;\n onSetTheme?: HdsOnSetThemeCallback;\n };\n Element: HdsDropdownSignature['Element'];\n}\n\nexport default class HdsThemeSwitcher extends Component<HdsThemeSwitcherSignature> {\n @service declare readonly hdsTheming: HdsThemingService;\n\n get toggleSize() {\n return this.args.toggleSize ?? 'small';\n }\n\n get toggleIsFullWidth() {\n return this.args.toggleIsFullWidth ?? false;\n }\n\n get toggleContent() {\n if (\n (this.currentTheme === 'default' && this.hasDefaultOption) ||\n (this.currentTheme === 'system' && this.hasSystemOption) ||\n this.currentTheme === 'light' ||\n this.currentTheme === 'dark'\n ) {\n return {\n label: OPTIONS[this.currentTheme].label,\n icon: OPTIONS[this.currentTheme].icon,\n };\n } else {\n return { label: 'Theme', icon: undefined };\n }\n }\n\n // note: we will use the `default` option in development, while migrating to the `cds` theming\n // during this process, consumers will enable/disable this option via code logic or feature flag\n get hasDefaultOption() {\n return this.args.hasDefaultOption ?? false;\n }\n\n get hasSystemOption() {\n return this.args.hasSystemOption ?? true;\n }\n\n get _options() {\n const options: Partial<typeof OPTIONS> = { ...OPTIONS };\n\n if (!this.hasDefaultOption) {\n delete options.default;\n }\n\n if (!this.hasSystemOption) {\n delete options.system;\n }\n\n return options;\n }\n\n get currentTheme() {\n // we get the theme from the global service\n return this.hdsTheming.currentTheme;\n }\n\n @action\n onSelectTheme(theme: HdsThemes | undefined): void {\n // we set the theme in the global service (and provide an optional user-defined callback)\n this.hdsTheming.setTheme({ theme, onSetTheme: this.args.onSetTheme });\n }\n}\n"],"names":["OPTIONS","default","theme","icon","label","system","light","dark","HdsThemeSwitcher","Component","g","prototype","service","i","void 0","toggleSize","args","toggleIsFullWidth","toggleContent","currentTheme","hasDefaultOption","hasSystemOption","undefined","_options","options","hdsTheming","onSelectTheme","setTheme","onSetTheme","n","action","setComponentTemplate","TEMPLATE"],"mappings":"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"}
@@ -218,6 +218,8 @@ export { default as HdsTextBody } from './components/hds/text/body.js';
218
218
  export { default as HdsTextCode } from './components/hds/text/code.js';
219
219
  export { default as HdsTextDisplay } from './components/hds/text/display.js';
220
220
  export { HdsTextAlignValues, HdsTextColorValues, HdsTextGroupValues, HdsTextSizeValues, HdsTextWeightValues } from './components/hds/text/types.js';
221
+ export { default as HdsThemeContext } from './components/hds/theme-context/index.js';
222
+ export { default as HdsThemeSwitcher } from './components/hds/theme-switcher/index.js';
221
223
  export { default as HdsTime } from './components/hds/time/index.js';
222
224
  export { default as HdsTimeSingle } from './components/hds/time/single.js';
223
225
  export { default as HdsTimeRange } from './components/hds/time/range.js';
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}