@hashicorp/design-system-components 5.2.0-rc-20260107211222 → 5.2.0-rc-20260108162959

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 (96) hide show
  1. package/declarations/components/hds/theme-context/index.d.ts +24 -0
  2. package/declarations/components/hds/theme-context/types.d.ts +19 -0
  3. package/declarations/components/hds/theme-switcher/index.d.ts +43 -0
  4. package/declarations/components.d.ts +2 -0
  5. package/declarations/services/hds-intl.d.ts +4 -3
  6. package/declarations/services/hds-theming.d.ts +57 -0
  7. package/declarations/services.d.ts +1 -0
  8. package/declarations/template-registry.d.ts +6 -0
  9. package/dist/_app_/components/hds/theme-context.js +1 -0
  10. package/dist/_app_/components/hds/theme-switcher.js +1 -0
  11. package/dist/_app_/services/hds-theming.js +1 -0
  12. package/dist/components/hds/advanced-table/index.js.map +1 -1
  13. package/dist/components/hds/advanced-table/models/column.js.map +1 -1
  14. package/dist/components/hds/advanced-table/models/row.js.map +1 -1
  15. package/dist/components/hds/advanced-table/models/table.js.map +1 -1
  16. package/dist/components/hds/advanced-table/td.js.map +1 -1
  17. package/dist/components/hds/advanced-table/th-context-menu.js.map +1 -1
  18. package/dist/components/hds/advanced-table/th-reorder-drop-target.js.map +1 -1
  19. package/dist/components/hds/advanced-table/th-resize-handle.js.map +1 -1
  20. package/dist/components/hds/advanced-table/th-selectable.js.map +1 -1
  21. package/dist/components/hds/advanced-table/th-sort.js.map +1 -1
  22. package/dist/components/hds/advanced-table/th.js.map +1 -1
  23. package/dist/components/hds/alert/index.js.map +1 -1
  24. package/dist/components/hds/app-header/index.js.map +1 -1
  25. package/dist/components/hds/app-side-nav/index.js.map +1 -1
  26. package/dist/components/hds/app-side-nav/list/index.js.map +1 -1
  27. package/dist/components/hds/app-side-nav/portal/target.js.map +1 -1
  28. package/dist/components/hds/breadcrumb/item.js.map +1 -1
  29. package/dist/components/hds/code-block/index.js.map +1 -1
  30. package/dist/components/hds/code-editor/index.js.map +1 -1
  31. package/dist/components/hds/copy/button/index.js.map +1 -1
  32. package/dist/components/hds/copy/snippet/index.js.map +1 -1
  33. package/dist/components/hds/disclosure-primitive/index.js.map +1 -1
  34. package/dist/components/hds/dismiss-button/index.js.map +1 -1
  35. package/dist/components/hds/dropdown/toggle/icon.js.map +1 -1
  36. package/dist/components/hds/flyout/index.js.map +1 -1
  37. package/dist/components/hds/form/key-value-inputs/index.js.map +1 -1
  38. package/dist/components/hds/form/masked-input/base.js.map +1 -1
  39. package/dist/components/hds/form/super-select/multiple/base.js.map +1 -1
  40. package/dist/components/hds/form/super-select/single/base.js.map +1 -1
  41. package/dist/components/hds/form/text-input/field.js.map +1 -1
  42. package/dist/components/hds/interactive/index.js.map +1 -1
  43. package/dist/components/hds/modal/index.js.map +1 -1
  44. package/dist/components/hds/pagination/compact/index.js.map +1 -1
  45. package/dist/components/hds/pagination/info/index.js.map +1 -1
  46. package/dist/components/hds/pagination/numbered/index.js.map +1 -1
  47. package/dist/components/hds/popover-primitive/index.js.map +1 -1
  48. package/dist/components/hds/side-nav/index.js.map +1 -1
  49. package/dist/components/hds/side-nav/list/index.js.map +1 -1
  50. package/dist/components/hds/side-nav/portal/target.js.map +1 -1
  51. package/dist/components/hds/stepper/list/index.js.map +1 -1
  52. package/dist/components/hds/stepper/nav/index.js.map +1 -1
  53. package/dist/components/hds/table/index.js.map +1 -1
  54. package/dist/components/hds/table/th-button-sort.js.map +1 -1
  55. package/dist/components/hds/table/th-selectable.js.map +1 -1
  56. package/dist/components/hds/tabs/index.js.map +1 -1
  57. package/dist/components/hds/tag/index.js.map +1 -1
  58. package/dist/components/hds/theme-context/index.js +45 -0
  59. package/dist/components/hds/theme-context/index.js.map +1 -0
  60. package/dist/components/hds/theme-context/types.js +27 -0
  61. package/dist/components/hds/theme-context/types.js.map +1 -0
  62. package/dist/components/hds/theme-switcher/index.js +100 -0
  63. package/dist/components/hds/theme-switcher/index.js.map +1 -0
  64. package/dist/components/hds/time/index.js.map +1 -1
  65. package/dist/components/hds/time/range.js.map +1 -1
  66. package/dist/components.js +2 -0
  67. package/dist/components.js.map +1 -1
  68. package/dist/helpers/hds-t.js.map +1 -1
  69. package/dist/modifiers/hds-code-editor.js.map +1 -1
  70. package/dist/services/hds-intl.js.map +1 -1
  71. package/dist/services/hds-theming.js +214 -0
  72. package/dist/services/hds-theming.js.map +1 -0
  73. package/dist/services/hds-time.js.map +1 -1
  74. package/dist/services.js +1 -1
  75. package/dist/styles/@hashicorp/design-system-components-common.css +9588 -0
  76. package/dist/styles/@hashicorp/design-system-components-common.css.map +1 -0
  77. package/dist/styles/@hashicorp/design-system-components-common.scss +24 -0
  78. package/dist/styles/@hashicorp/design-system-components.css +501 -320
  79. package/dist/styles/@hashicorp/design-system-components.css.map +1 -0
  80. package/dist/styles/@hashicorp/design-system-components.scss +4 -62
  81. package/dist/styles/@hashicorp/design-system-power-select-overrides.css +229 -0
  82. package/dist/styles/@hashicorp/design-system-power-select-overrides.css.map +1 -0
  83. package/dist/styles/components/badge-count.scss +26 -76
  84. package/dist/styles/components/badge.scss +26 -131
  85. package/dist/styles/components/button.scss +5 -0
  86. package/dist/styles/components/dropdown.scss +3 -5
  87. package/dist/styles/components/form/file-input.scss +2 -2
  88. package/dist/styles/components/form/key-value-inputs.scss +2 -4
  89. package/dist/styles/components/index.scss +52 -0
  90. package/dist/styles/components/theme-context.scss +12 -0
  91. package/dist/styles/mixins/_button.scss +82 -129
  92. package/dist/styles/mixins/_carbonization.scss +31 -0
  93. package/dist/styles/mixins/_interactive-dark-theme.scss +1 -1
  94. package/dist/utils/hds-aria-described-by.js.map +1 -1
  95. package/package.json +10 -6
  96. package/dist/styles/@hashicorp/design-system-components.scss.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hds-code-editor.js","sources":["../../src/modifiers/hds-code-editor.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Modifier from 'ember-modifier';\nimport { assert, warn } from '@ember/debug';\nimport { registerDestructor } from '@ember/destroyable';\nimport { task } from 'ember-concurrency';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport { Compartment } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { guidFor } from '@ember/object/internals';\nimport { isEmpty } from '@ember/utils';\nimport { service } from '@ember/service';\n\n// hds-dark theme\nimport hdsDarkTheme from './hds-code-editor/themes/hds-dark-theme.ts';\nimport hdsDarkHighlightStyle from './hds-code-editor/highlight-styles/hds-dark-highlight-style.ts';\n\nimport type HdsIntlService from '../services/hds-intl.ts';\nimport type { HdsCodeEditorLanguages } from './hds-code-editor/types.ts';\nimport type { ArgsFor, PositionalArgs, NamedArgs } from 'ember-modifier';\nimport type {\n StreamLanguage as StreamLanguageType,\n StreamParser as StreamParserType,\n} from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport type {\n EditorView as EditorViewType,\n KeyBinding,\n ViewUpdate,\n} from '@codemirror/view';\nimport type { Diagnostic as DiagnosticType } from '@codemirror/lint';\nimport type Owner from '@ember/owner';\n\ntype HTMLElementWithEditor = HTMLElement & { editor: EditorViewType };\n\ntype HdsCodeEditorBlurHandler = (\n editor: EditorViewType,\n event: FocusEvent\n) => void;\n\ninterface HdsCodeEditorExtraKeys {\n [key: string]: () => boolean;\n}\n\nexport interface HdsCodeEditorSignature {\n Args: {\n Named: {\n ariaDescribedBy?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n cspNonce?: string;\n extraKeys?: HdsCodeEditorExtraKeys;\n customExtensions?: Extension[];\n hasLineWrapping?: boolean;\n isLintingEnabled?: boolean;\n language?: HdsCodeEditorLanguages;\n value?: string;\n onInput?: (newValue: string, editor: EditorViewType) => void;\n onBlur?: HdsCodeEditorBlurHandler;\n onLint?: (\n diagnostics: DiagnosticType[],\n newValue: string,\n editor: EditorViewType\n ) => void;\n onSetup?: (editor: EditorViewType) => unknown;\n };\n };\n}\n\nasync function defineStreamLanguage(streamParser: StreamParserType<unknown>) {\n const { StreamLanguage } = await import('@codemirror/language');\n\n return StreamLanguage.define(streamParser);\n}\n\nexport function getCSPNonceFromMeta(): string | undefined {\n const meta = document.querySelector(\n 'meta[http-equiv=\"Content-Security-Policy\"]'\n );\n\n if (meta === null) {\n return undefined;\n }\n\n const content = meta.getAttribute('content');\n\n if (content === null) {\n return undefined;\n }\n\n // searches for either \"style-src\" or \"script-src\" followed by anything until a token like 'nonce-<value>'\n const match = content.match(/(?:style-src|script-src)[^;]*'nonce-([^']+)'/);\n\n return match ? match[1] : undefined;\n}\n\nconst LOADER_HEIGHT = '164px';\n\nconst LANGUAGES: Record<\n HdsCodeEditorLanguages,\n {\n load: () => Promise<Extension | StreamLanguageType<unknown>>;\n loadLinter?: (\n onLint?: HdsCodeEditorSignature['Args']['Named']['onLint']\n ) => Promise<Extension>;\n }\n> = {\n rego: {\n load: async () => {\n const { rego } = await import('./hds-code-editor/languages/rego.ts');\n return defineStreamLanguage(rego);\n },\n },\n ruby: {\n load: async () => {\n const { ruby } = await import('@codemirror/legacy-modes/mode/ruby');\n return defineStreamLanguage(ruby);\n },\n },\n sentinel: {\n load: async () => {\n const { sentinel } = await import(\n './hds-code-editor/languages/sentinel.ts'\n );\n return defineStreamLanguage(sentinel);\n },\n },\n shell: {\n load: async () => {\n const { shell } = await import('@codemirror/legacy-modes/mode/shell');\n return defineStreamLanguage(shell);\n },\n },\n go: {\n load: async () => (await import('@codemirror/lang-go')).go(),\n },\n hcl: {\n load: async () => (await import('codemirror-lang-hcl')).hcl(),\n },\n javascript: {\n load: async () =>\n (await import('@codemirror/lang-javascript')).javascript(),\n },\n json: {\n load: async () => (await import('@codemirror/lang-json')).json(),\n loadLinter: async (onLint) => {\n const linter = await import('./hds-code-editor/linters/json-linter.ts');\n\n return linter.default(onLint);\n },\n },\n markdown: {\n load: async () => (await import('@codemirror/lang-markdown')).markdown(),\n },\n sql: {\n load: async () => (await import('@codemirror/lang-sql')).sql(),\n },\n yaml: {\n load: async () => (await import('@codemirror/lang-yaml')).yaml(),\n },\n} as const;\n\nexport default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignature> {\n @service declare hdsIntl: HdsIntlService;\n\n editor!: EditorViewType;\n element!: HTMLElementWithEditor;\n\n onBlur: HdsCodeEditorSignature['Args']['Named']['onBlur'];\n onInput: HdsCodeEditorSignature['Args']['Named']['onInput'];\n\n blurHandler!: (event: FocusEvent) => void;\n intersectionObserver!: IntersectionObserver;\n mutationObserver!: MutationObserver;\n\n lineWrappingCompartment = new Compartment();\n\n constructor(owner: Owner, args: ArgsFor<HdsCodeEditorSignature>) {\n super(owner, args);\n\n registerDestructor(this, () => {\n this.intersectionObserver?.disconnect();\n this.mutationObserver?.disconnect();\n\n if (this.onBlur !== undefined) {\n this.element.removeEventListener('blur', this.blurHandler);\n }\n });\n }\n\n modify(\n element: HTMLElementWithEditor,\n positional: PositionalArgs<HdsCodeEditorSignature>,\n named: NamedArgs<HdsCodeEditorSignature>\n ): void {\n const { hasLineWrapping = false } = named;\n\n // if the editor already exists, update the line wrapping\n if (this.editor) {\n this.editor.dispatch({\n effects: this.lineWrappingCompartment.reconfigure(\n hasLineWrapping ? EditorView.lineWrapping : []\n ),\n });\n }\n // if the editor does not exist, setup the editor\n else {\n // the intersection observer makes loading unreliable in tests\n if (macroCondition(isTesting())) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._setupTask.perform(element, positional, named);\n } else {\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && this.editor === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._setupTask.perform(element, positional, named);\n }\n });\n },\n {\n rootMargin: LOADER_HEIGHT,\n }\n );\n\n this.intersectionObserver.observe(element);\n }\n }\n }\n\n private _setupEditorBlurHandler(\n element: HTMLElementWithEditor,\n onBlur: HdsCodeEditorBlurHandler\n ) {\n const inputElement = element.querySelector('.cm-content');\n\n if (inputElement === null) {\n return;\n }\n\n this.blurHandler = (event: FocusEvent) => onBlur(this.editor, event);\n\n (inputElement as HTMLElement).addEventListener('blur', this.blurHandler);\n }\n\n private _setupEditorAriaLabel(\n editor: EditorViewType,\n {\n ariaLabel,\n ariaLabelledBy,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n 'ariaLabel' | 'ariaLabelledBy'\n >\n ) {\n assert(\n '`hds-code-editor` modifier - Either `ariaLabel` or `ariaLabelledBy` must be provided',\n ariaLabel !== undefined || ariaLabelledBy !== undefined\n );\n\n if (ariaLabel !== undefined) {\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-label', ariaLabel);\n } else if (ariaLabelledBy !== undefined) {\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-labelledby', ariaLabelledBy);\n }\n }\n\n private _setupEditorAriaDescribedBy(\n editor: EditorViewType,\n {\n ariaDescribedBy,\n lintingDescriptionElement,\n }: {\n ariaDescribedBy?: string;\n lintingDescriptionElement?: HTMLParagraphElement;\n }\n ) {\n if (\n ariaDescribedBy === undefined &&\n lintingDescriptionElement === undefined\n ) {\n return;\n }\n\n const ariaDescribedByArray = [];\n\n if (ariaDescribedBy !== undefined) {\n ariaDescribedByArray.push(ariaDescribedBy);\n }\n\n if (lintingDescriptionElement !== undefined) {\n ariaDescribedByArray.push(lintingDescriptionElement.id);\n }\n\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-describedby', ariaDescribedByArray.join(' '));\n }\n\n private _createLintingDescriptionElement(): HTMLParagraphElement {\n const element = document.createElement('p');\n\n element.id = `lint-panel-instructions-${this.element.id}`;\n element.classList.add('sr-only');\n element.textContent = this.hdsIntl.t(\n 'hds.modifiers.hds-code-editor.lint-panel-description',\n {\n default:\n 'Press `Ctrl-Shift-m` (`Cmd-Shift-m` on macOS) while focus is on the textbox to open the linting panel',\n }\n );\n\n this.element.insertAdjacentElement('beforebegin', element);\n\n return element;\n }\n\n private _setupEditorAriaAttributes(\n editor: EditorViewType,\n {\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n lintingDescriptionElement,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n 'ariaDescribedBy' | 'ariaLabel' | 'ariaLabelledBy'\n > & { lintingDescriptionElement?: HTMLParagraphElement }\n ) {\n this._setupEditorAriaLabel(editor, { ariaLabel, ariaLabelledBy });\n this._setupEditorAriaDescribedBy(editor, {\n ariaDescribedBy,\n lintingDescriptionElement,\n });\n }\n\n private _loadLanguageExtensionsTask = task(\n { drop: true },\n async ({\n language,\n isLintingEnabled,\n onLint,\n }: {\n language?: HdsCodeEditorLanguages;\n isLintingEnabled?: boolean;\n onLint?: HdsCodeEditorSignature['Args']['Named']['onLint'];\n }) => {\n if (language === undefined) {\n return;\n }\n\n try {\n const validLanguageKeys = Object.keys(LANGUAGES);\n\n assert(\n `\\`hds-code-editor\\` modifier - \\`language\\` must be one of the following: ${validLanguageKeys.join(\n ', '\n )}; received: ${language}`,\n validLanguageKeys.includes(language)\n );\n\n let extensionPromises = [LANGUAGES[language].load()];\n\n if (isLintingEnabled && LANGUAGES[language].loadLinter) {\n extensionPromises = [\n ...extensionPromises,\n LANGUAGES[language].loadLinter(onLint),\n ];\n }\n\n return Promise.all(extensionPromises);\n } catch (error) {\n warn(\n `\\`hds-code-editor\\` modifier - Failed to dynamically import the CodeMirror language module for '${language}'. Error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-code-editor.load-language-task.import-failed',\n }\n );\n }\n }\n );\n\n private _buildExtensionsTask = task(\n { drop: true },\n async ({\n cspNonce,\n extraKeys,\n language,\n hasLineWrapping,\n isLintingEnabled,\n customExtensions,\n onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'extraKeys'\n | 'language'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\n | 'customExtensions'\n | 'onLint'\n >) => {\n const [\n {\n keymap,\n lineNumbers,\n highlightActiveLineGutter,\n highlightSpecialChars,\n highlightActiveLine,\n },\n { defaultKeymap, history, historyKeymap },\n { bracketMatching, syntaxHighlighting },\n ] = await Promise.all([\n import('@codemirror/view'),\n import('@codemirror/commands'),\n import('@codemirror/language'),\n ]);\n\n const languageExtensions = await this._loadLanguageExtensionsTask.perform(\n {\n language,\n isLintingEnabled,\n onLint,\n }\n );\n\n const handleUpdateExtension = EditorView.updateListener.of(\n (update: ViewUpdate) => {\n // toggle a class if the update has/does not have a selection\n if (update.selectionSet) {\n update.view.dom.classList.toggle(\n 'cm-hasSelection',\n !update.state.selection.main.empty\n );\n }\n\n // call the onInput callback if the document has changed\n if (!update.docChanged || this.onInput === undefined) {\n return;\n }\n this.onInput(update.state.doc.toString(), update.view);\n }\n );\n\n const lineWrappingExtension = this.lineWrappingCompartment.of(\n hasLineWrapping ? EditorView.lineWrapping : []\n );\n\n let extensions: Extension[] = [\n lineWrappingExtension,\n bracketMatching(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n // custom extensions\n handleUpdateExtension,\n // user-provided extensions\n ...(customExtensions ?? []),\n // hds dark theme\n hdsDarkTheme,\n syntaxHighlighting(hdsDarkHighlightStyle),\n ];\n\n if (extraKeys !== undefined) {\n const customKeyMap = Object.entries(extraKeys).map(([key, value]) => ({\n key: key,\n run: value,\n }));\n\n extensions = [keymap.of(customKeyMap as KeyBinding[]), ...extensions];\n }\n\n if (languageExtensions !== undefined) {\n extensions = [...extensions, ...languageExtensions];\n }\n\n // add nonce to the editor view if it exists\n const nonce = cspNonce ?? getCSPNonceFromMeta();\n\n if (nonce !== undefined) {\n extensions = [...extensions, EditorView.cspNonce.of(nonce)];\n }\n\n // ensure we add lineNumber last in the stack to create the right gutter order for linting\n extensions = [...extensions, lineNumbers()];\n\n return extensions;\n }\n );\n\n private _createEditorTask = task(\n { drop: true },\n async (\n element: HTMLElementWithEditor,\n {\n cspNonce,\n language,\n extraKeys,\n value,\n hasLineWrapping,\n isLintingEnabled,\n customExtensions,\n onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'language'\n | 'extraKeys'\n | 'value'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\n | 'customExtensions'\n | 'onLint'\n >\n ) => {\n try {\n const { EditorState } = await import('@codemirror/state');\n\n const extensions = await this._buildExtensionsTask.perform({\n cspNonce,\n extraKeys,\n language,\n hasLineWrapping: hasLineWrapping ?? false,\n isLintingEnabled,\n customExtensions,\n onLint,\n });\n\n const state = EditorState.create({\n doc: value,\n extensions,\n });\n\n const editor = new EditorView({\n state,\n parent: element,\n });\n\n return editor;\n } catch (error) {\n console.error(\n `\\`hds-code-editor\\` modifier - Failed to setup the CodeMirror editor. Error: ${JSON.stringify(error)}`\n );\n }\n }\n );\n\n private _setupEditorMutationObserver() {\n this.mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n const removedNodeContainsLintPanel =\n node.querySelector('.cm-panel-lint') !== null;\n\n if (removedNodeContainsLintPanel) {\n this.editor.focus();\n }\n });\n });\n });\n\n this.mutationObserver.observe(this.element, {\n childList: true,\n subtree: true,\n });\n }\n\n private _setupTask = task(\n { drop: true },\n async (\n element: HTMLElementWithEditor,\n _positional: PositionalArgs<HdsCodeEditorSignature>,\n named: NamedArgs<HdsCodeEditorSignature>\n ) => {\n const {\n onBlur,\n onInput,\n onLint,\n onSetup,\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n cspNonce,\n extraKeys,\n hasLineWrapping,\n isLintingEnabled,\n language,\n value,\n customExtensions,\n } = named;\n\n this.onInput = onInput;\n this.onBlur = onBlur;\n\n this.element = element;\n this.element.id = isEmpty(this.element.id)\n ? guidFor(this)\n : this.element.id;\n\n const editor = await this._createEditorTask.perform(element, {\n onLint,\n cspNonce,\n hasLineWrapping,\n isLintingEnabled,\n extraKeys,\n language,\n value,\n customExtensions,\n });\n\n if (editor === undefined) {\n return;\n }\n\n this.editor = editor;\n element.editor = editor;\n\n if (onBlur !== undefined) {\n this._setupEditorBlurHandler(element, onBlur);\n }\n\n let lintingDescriptionElement: HTMLParagraphElement | null = null;\n\n if (\n isLintingEnabled &&\n language !== undefined &&\n LANGUAGES[language]?.loadLinter !== undefined\n ) {\n // insert a new dom element above the editor\n lintingDescriptionElement = this._createLintingDescriptionElement();\n\n this._setupEditorMutationObserver();\n }\n\n this._setupEditorAriaAttributes(editor, {\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n lintingDescriptionElement: lintingDescriptionElement ?? undefined,\n });\n\n onSetup?.(this.editor);\n }\n );\n}\n"],"names":["defineStreamLanguage","streamParser","StreamLanguage","define","getCSPNonceFromMeta","meta","document","querySelector","undefined","content","getAttribute","match","LOADER_HEIGHT","LANGUAGES","rego","load","ruby","sentinel","shell","go","hcl","javascript","json","loadLinter","onLint","linter","default","markdown","sql","yaml","HdsCodeEditorModifier","Modifier","g","prototype","service","i","editor","element","onBlur","onInput","blurHandler","intersectionObserver","mutationObserver","lineWrappingCompartment","Compartment","constructor","owner","args","registerDestructor","disconnect","removeEventListener","modify","positional","named","hasLineWrapping","dispatch","effects","reconfigure","EditorView","lineWrapping","macroCondition","isTesting","_setupTask","perform","IntersectionObserver","entries","forEach","entry","isIntersecting","rootMargin","observe","_setupEditorBlurHandler","inputElement","event","addEventListener","_setupEditorAriaLabel","ariaLabel","ariaLabelledBy","assert","dom","setAttribute","_setupEditorAriaDescribedBy","ariaDescribedBy","lintingDescriptionElement","ariaDescribedByArray","push","id","join","_createLintingDescriptionElement","createElement","classList","add","textContent","hdsIntl","t","insertAdjacentElement","_setupEditorAriaAttributes","_loadLanguageExtensionsTask","_buildTask","context","generator","language","isLintingEnabled","validLanguageKeys","Object","keys","includes","extensionPromises","Promise","all","error","warn","JSON","stringify","drop","_buildExtensionsTask","cspNonce","extraKeys","customExtensions","keymap","lineNumbers","highlightActiveLineGutter","highlightSpecialChars","highlightActiveLine","defaultKeymap","history","historyKeymap","bracketMatching","syntaxHighlighting","languageExtensions","handleUpdateExtension","updateListener","of","update","selectionSet","view","toggle","state","selection","main","empty","docChanged","doc","toString","lineWrappingExtension","extensions","hdsDarkTheme","hdsDarkHighlightStyle","customKeyMap","map","key","value","run","nonce","_createEditorTask","EditorState","create","parent","console","_setupEditorMutationObserver","MutationObserver","mutations","mutation","removedNodes","node","HTMLElement","removedNodeContainsLintPanel","focus","childList","subtree","_positional","onSetup","isEmpty","guidFor"],"mappings":"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"}
1
+ {"version":3,"file":"hds-code-editor.js","sources":["../../src/modifiers/hds-code-editor.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Modifier from 'ember-modifier';\nimport { assert, warn } from '@ember/debug';\nimport { registerDestructor } from '@ember/destroyable';\nimport { task } from 'ember-concurrency';\nimport { macroCondition, isTesting } from '@embroider/macros';\nimport { Compartment } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { guidFor } from '@ember/object/internals';\nimport { isEmpty } from '@ember/utils';\nimport { service } from '@ember/service';\n\n// hds-dark theme\nimport hdsDarkTheme from './hds-code-editor/themes/hds-dark-theme.ts';\nimport hdsDarkHighlightStyle from './hds-code-editor/highlight-styles/hds-dark-highlight-style.ts';\n\nimport type HdsIntlService from '../services/hds-intl.ts';\nimport type { HdsCodeEditorLanguages } from './hds-code-editor/types.ts';\nimport type { ArgsFor, PositionalArgs, NamedArgs } from 'ember-modifier';\nimport type {\n StreamLanguage as StreamLanguageType,\n StreamParser as StreamParserType,\n} from '@codemirror/language';\nimport type { Extension } from '@codemirror/state';\nimport type {\n EditorView as EditorViewType,\n KeyBinding,\n ViewUpdate,\n} from '@codemirror/view';\nimport type { Diagnostic as DiagnosticType } from '@codemirror/lint';\nimport type Owner from '@ember/owner';\n\ntype HTMLElementWithEditor = HTMLElement & { editor: EditorViewType };\n\ntype HdsCodeEditorBlurHandler = (\n editor: EditorViewType,\n event: FocusEvent\n) => void;\n\ninterface HdsCodeEditorExtraKeys {\n [key: string]: () => boolean;\n}\n\nexport interface HdsCodeEditorSignature {\n Args: {\n Named: {\n ariaDescribedBy?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n cspNonce?: string;\n extraKeys?: HdsCodeEditorExtraKeys;\n customExtensions?: Extension[];\n hasLineWrapping?: boolean;\n isLintingEnabled?: boolean;\n language?: HdsCodeEditorLanguages;\n value?: string;\n onInput?: (newValue: string, editor: EditorViewType) => void;\n onBlur?: HdsCodeEditorBlurHandler;\n onLint?: (\n diagnostics: DiagnosticType[],\n newValue: string,\n editor: EditorViewType\n ) => void;\n onSetup?: (editor: EditorViewType) => unknown;\n };\n };\n}\n\nasync function defineStreamLanguage(streamParser: StreamParserType<unknown>) {\n const { StreamLanguage } = await import('@codemirror/language');\n\n return StreamLanguage.define(streamParser);\n}\n\nexport function getCSPNonceFromMeta(): string | undefined {\n const meta = document.querySelector(\n 'meta[http-equiv=\"Content-Security-Policy\"]'\n );\n\n if (meta === null) {\n return undefined;\n }\n\n const content = meta.getAttribute('content');\n\n if (content === null) {\n return undefined;\n }\n\n // searches for either \"style-src\" or \"script-src\" followed by anything until a token like 'nonce-<value>'\n const match = content.match(/(?:style-src|script-src)[^;]*'nonce-([^']+)'/);\n\n return match ? match[1] : undefined;\n}\n\nconst LOADER_HEIGHT = '164px';\n\nconst LANGUAGES: Record<\n HdsCodeEditorLanguages,\n {\n load: () => Promise<Extension | StreamLanguageType<unknown>>;\n loadLinter?: (\n onLint?: HdsCodeEditorSignature['Args']['Named']['onLint']\n ) => Promise<Extension>;\n }\n> = {\n rego: {\n load: async () => {\n const { rego } = await import('./hds-code-editor/languages/rego.ts');\n return defineStreamLanguage(rego);\n },\n },\n ruby: {\n load: async () => {\n const { ruby } = await import('@codemirror/legacy-modes/mode/ruby');\n return defineStreamLanguage(ruby);\n },\n },\n sentinel: {\n load: async () => {\n const { sentinel } = await import(\n './hds-code-editor/languages/sentinel.ts'\n );\n return defineStreamLanguage(sentinel);\n },\n },\n shell: {\n load: async () => {\n const { shell } = await import('@codemirror/legacy-modes/mode/shell');\n return defineStreamLanguage(shell);\n },\n },\n go: {\n load: async () => (await import('@codemirror/lang-go')).go(),\n },\n hcl: {\n load: async () => (await import('codemirror-lang-hcl')).hcl(),\n },\n javascript: {\n load: async () =>\n (await import('@codemirror/lang-javascript')).javascript(),\n },\n json: {\n load: async () => (await import('@codemirror/lang-json')).json(),\n loadLinter: async (onLint) => {\n const linter = await import('./hds-code-editor/linters/json-linter.ts');\n\n return linter.default(onLint);\n },\n },\n markdown: {\n load: async () => (await import('@codemirror/lang-markdown')).markdown(),\n },\n sql: {\n load: async () => (await import('@codemirror/lang-sql')).sql(),\n },\n yaml: {\n load: async () => (await import('@codemirror/lang-yaml')).yaml(),\n },\n} as const;\n\nexport default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignature> {\n @service declare hdsIntl: HdsIntlService;\n\n editor!: EditorViewType;\n element!: HTMLElementWithEditor;\n\n onBlur: HdsCodeEditorSignature['Args']['Named']['onBlur'];\n onInput: HdsCodeEditorSignature['Args']['Named']['onInput'];\n\n blurHandler!: (event: FocusEvent) => void;\n intersectionObserver!: IntersectionObserver;\n mutationObserver!: MutationObserver;\n\n lineWrappingCompartment = new Compartment();\n\n constructor(owner: Owner, args: ArgsFor<HdsCodeEditorSignature>) {\n super(owner, args);\n\n registerDestructor(this, () => {\n this.intersectionObserver?.disconnect();\n this.mutationObserver?.disconnect();\n\n if (this.onBlur !== undefined) {\n this.element.removeEventListener('blur', this.blurHandler);\n }\n });\n }\n\n modify(\n element: HTMLElementWithEditor,\n positional: PositionalArgs<HdsCodeEditorSignature>,\n named: NamedArgs<HdsCodeEditorSignature>\n ): void {\n const { hasLineWrapping = false } = named;\n\n // if the editor already exists, update the line wrapping\n if (this.editor) {\n this.editor.dispatch({\n effects: this.lineWrappingCompartment.reconfigure(\n hasLineWrapping ? EditorView.lineWrapping : []\n ),\n });\n }\n // if the editor does not exist, setup the editor\n else {\n // the intersection observer makes loading unreliable in tests\n if (macroCondition(isTesting())) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._setupTask.perform(element, positional, named);\n } else {\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && this.editor === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._setupTask.perform(element, positional, named);\n }\n });\n },\n {\n rootMargin: LOADER_HEIGHT,\n }\n );\n\n this.intersectionObserver.observe(element);\n }\n }\n }\n\n private _setupEditorBlurHandler(\n element: HTMLElementWithEditor,\n onBlur: HdsCodeEditorBlurHandler\n ) {\n const inputElement = element.querySelector('.cm-content');\n\n if (inputElement === null) {\n return;\n }\n\n this.blurHandler = (event: FocusEvent) => onBlur(this.editor, event);\n\n (inputElement as HTMLElement).addEventListener('blur', this.blurHandler);\n }\n\n private _setupEditorAriaLabel(\n editor: EditorViewType,\n {\n ariaLabel,\n ariaLabelledBy,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n 'ariaLabel' | 'ariaLabelledBy'\n >\n ) {\n assert(\n '`hds-code-editor` modifier - Either `ariaLabel` or `ariaLabelledBy` must be provided',\n ariaLabel !== undefined || ariaLabelledBy !== undefined\n );\n\n if (ariaLabel !== undefined) {\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-label', ariaLabel);\n } else if (ariaLabelledBy !== undefined) {\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-labelledby', ariaLabelledBy);\n }\n }\n\n private _setupEditorAriaDescribedBy(\n editor: EditorViewType,\n {\n ariaDescribedBy,\n lintingDescriptionElement,\n }: {\n ariaDescribedBy?: string;\n lintingDescriptionElement?: HTMLParagraphElement;\n }\n ) {\n if (\n ariaDescribedBy === undefined &&\n lintingDescriptionElement === undefined\n ) {\n return;\n }\n\n const ariaDescribedByArray = [];\n\n if (ariaDescribedBy !== undefined) {\n ariaDescribedByArray.push(ariaDescribedBy);\n }\n\n if (lintingDescriptionElement !== undefined) {\n ariaDescribedByArray.push(lintingDescriptionElement.id);\n }\n\n editor.dom\n .querySelector('[role=\"textbox\"]')\n ?.setAttribute('aria-describedby', ariaDescribedByArray.join(' '));\n }\n\n private _createLintingDescriptionElement(): HTMLParagraphElement {\n const element = document.createElement('p');\n\n element.id = `lint-panel-instructions-${this.element.id}`;\n element.classList.add('sr-only');\n element.textContent = this.hdsIntl.t(\n 'hds.modifiers.hds-code-editor.lint-panel-description',\n {\n default:\n 'Press `Ctrl-Shift-m` (`Cmd-Shift-m` on macOS) while focus is on the textbox to open the linting panel',\n }\n );\n\n this.element.insertAdjacentElement('beforebegin', element);\n\n return element;\n }\n\n private _setupEditorAriaAttributes(\n editor: EditorViewType,\n {\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n lintingDescriptionElement,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n 'ariaDescribedBy' | 'ariaLabel' | 'ariaLabelledBy'\n > & { lintingDescriptionElement?: HTMLParagraphElement }\n ) {\n this._setupEditorAriaLabel(editor, { ariaLabel, ariaLabelledBy });\n this._setupEditorAriaDescribedBy(editor, {\n ariaDescribedBy,\n lintingDescriptionElement,\n });\n }\n\n private _loadLanguageExtensionsTask = task(\n { drop: true },\n async ({\n language,\n isLintingEnabled,\n onLint,\n }: {\n language?: HdsCodeEditorLanguages;\n isLintingEnabled?: boolean;\n onLint?: HdsCodeEditorSignature['Args']['Named']['onLint'];\n }) => {\n if (language === undefined) {\n return;\n }\n\n try {\n const validLanguageKeys = Object.keys(LANGUAGES);\n\n assert(\n `\\`hds-code-editor\\` modifier - \\`language\\` must be one of the following: ${validLanguageKeys.join(\n ', '\n )}; received: ${language}`,\n validLanguageKeys.includes(language)\n );\n\n let extensionPromises = [LANGUAGES[language].load()];\n\n if (isLintingEnabled && LANGUAGES[language].loadLinter) {\n extensionPromises = [\n ...extensionPromises,\n LANGUAGES[language].loadLinter(onLint),\n ];\n }\n\n return Promise.all(extensionPromises);\n } catch (error) {\n warn(\n `\\`hds-code-editor\\` modifier - Failed to dynamically import the CodeMirror language module for '${language}'. Error: ${JSON.stringify(\n error\n )}`,\n {\n id: 'hds-code-editor.load-language-task.import-failed',\n }\n );\n }\n }\n );\n\n private _buildExtensionsTask = task(\n { drop: true },\n async ({\n cspNonce,\n extraKeys,\n language,\n hasLineWrapping,\n isLintingEnabled,\n customExtensions,\n onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'extraKeys'\n | 'language'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\n | 'customExtensions'\n | 'onLint'\n >) => {\n const [\n {\n keymap,\n lineNumbers,\n highlightActiveLineGutter,\n highlightSpecialChars,\n highlightActiveLine,\n },\n { defaultKeymap, history, historyKeymap },\n { bracketMatching, syntaxHighlighting },\n ] = await Promise.all([\n import('@codemirror/view'),\n import('@codemirror/commands'),\n import('@codemirror/language'),\n ]);\n\n const languageExtensions = await this._loadLanguageExtensionsTask.perform(\n {\n language,\n isLintingEnabled,\n onLint,\n }\n );\n\n const handleUpdateExtension = EditorView.updateListener.of(\n (update: ViewUpdate) => {\n // toggle a class if the update has/does not have a selection\n if (update.selectionSet) {\n update.view.dom.classList.toggle(\n 'cm-hasSelection',\n !update.state.selection.main.empty\n );\n }\n\n // call the onInput callback if the document has changed\n if (!update.docChanged || this.onInput === undefined) {\n return;\n }\n this.onInput(update.state.doc.toString(), update.view);\n }\n );\n\n const lineWrappingExtension = this.lineWrappingCompartment.of(\n hasLineWrapping ? EditorView.lineWrapping : []\n );\n\n let extensions: Extension[] = [\n lineWrappingExtension,\n bracketMatching(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n // custom extensions\n handleUpdateExtension,\n // user-provided extensions\n ...(customExtensions ?? []),\n // hds dark theme\n hdsDarkTheme,\n syntaxHighlighting(hdsDarkHighlightStyle),\n ];\n\n if (extraKeys !== undefined) {\n const customKeyMap = Object.entries(extraKeys).map(([key, value]) => ({\n key: key,\n run: value,\n }));\n\n extensions = [keymap.of(customKeyMap as KeyBinding[]), ...extensions];\n }\n\n if (languageExtensions !== undefined) {\n extensions = [...extensions, ...languageExtensions];\n }\n\n // add nonce to the editor view if it exists\n const nonce = cspNonce ?? getCSPNonceFromMeta();\n\n if (nonce !== undefined) {\n extensions = [...extensions, EditorView.cspNonce.of(nonce)];\n }\n\n // ensure we add lineNumber last in the stack to create the right gutter order for linting\n extensions = [...extensions, lineNumbers()];\n\n return extensions;\n }\n );\n\n private _createEditorTask = task(\n { drop: true },\n async (\n element: HTMLElementWithEditor,\n {\n cspNonce,\n language,\n extraKeys,\n value,\n hasLineWrapping,\n isLintingEnabled,\n customExtensions,\n onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'language'\n | 'extraKeys'\n | 'value'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\n | 'customExtensions'\n | 'onLint'\n >\n ) => {\n try {\n const { EditorState } = await import('@codemirror/state');\n\n const extensions = await this._buildExtensionsTask.perform({\n cspNonce,\n extraKeys,\n language,\n hasLineWrapping: hasLineWrapping ?? false,\n isLintingEnabled,\n customExtensions,\n onLint,\n });\n\n const state = EditorState.create({\n doc: value,\n extensions,\n });\n\n const editor = new EditorView({\n state,\n parent: element,\n });\n\n return editor;\n } catch (error) {\n console.error(\n `\\`hds-code-editor\\` modifier - Failed to setup the CodeMirror editor. Error: ${JSON.stringify(error)}`\n );\n }\n }\n );\n\n private _setupEditorMutationObserver() {\n this.mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n if (!(node instanceof HTMLElement)) {\n return;\n }\n\n const removedNodeContainsLintPanel =\n node.querySelector('.cm-panel-lint') !== null;\n\n if (removedNodeContainsLintPanel) {\n this.editor.focus();\n }\n });\n });\n });\n\n this.mutationObserver.observe(this.element, {\n childList: true,\n subtree: true,\n });\n }\n\n private _setupTask = task(\n { drop: true },\n async (\n element: HTMLElementWithEditor,\n _positional: PositionalArgs<HdsCodeEditorSignature>,\n named: NamedArgs<HdsCodeEditorSignature>\n ) => {\n const {\n onBlur,\n onInput,\n onLint,\n onSetup,\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n cspNonce,\n extraKeys,\n hasLineWrapping,\n isLintingEnabled,\n language,\n value,\n customExtensions,\n } = named;\n\n this.onInput = onInput;\n this.onBlur = onBlur;\n\n this.element = element;\n this.element.id = isEmpty(this.element.id)\n ? guidFor(this)\n : this.element.id;\n\n const editor = await this._createEditorTask.perform(element, {\n onLint,\n cspNonce,\n hasLineWrapping,\n isLintingEnabled,\n extraKeys,\n language,\n value,\n customExtensions,\n });\n\n if (editor === undefined) {\n return;\n }\n\n this.editor = editor;\n element.editor = editor;\n\n if (onBlur !== undefined) {\n this._setupEditorBlurHandler(element, onBlur);\n }\n\n let lintingDescriptionElement: HTMLParagraphElement | null = null;\n\n if (\n isLintingEnabled &&\n language !== undefined &&\n LANGUAGES[language]?.loadLinter !== undefined\n ) {\n // insert a new dom element above the editor\n lintingDescriptionElement = this._createLintingDescriptionElement();\n\n this._setupEditorMutationObserver();\n }\n\n this._setupEditorAriaAttributes(editor, {\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n lintingDescriptionElement: lintingDescriptionElement ?? undefined,\n });\n\n onSetup?.(this.editor);\n }\n );\n}\n"],"names":["defineStreamLanguage","streamParser","StreamLanguage","define","getCSPNonceFromMeta","meta","document","querySelector","undefined","content","getAttribute","match","LOADER_HEIGHT","LANGUAGES","rego","load","ruby","sentinel","shell","go","hcl","javascript","json","loadLinter","onLint","linter","default","markdown","sql","yaml","HdsCodeEditorModifier","Modifier","g","prototype","service","i","void 0","editor","element","onBlur","onInput","blurHandler","intersectionObserver","mutationObserver","lineWrappingCompartment","Compartment","constructor","owner","args","registerDestructor","disconnect","removeEventListener","modify","positional","named","hasLineWrapping","dispatch","effects","reconfigure","EditorView","lineWrapping","macroCondition","isTesting","_setupTask","perform","IntersectionObserver","entries","forEach","entry","isIntersecting","rootMargin","observe","_setupEditorBlurHandler","inputElement","event","addEventListener","_setupEditorAriaLabel","ariaLabel","ariaLabelledBy","assert","dom","setAttribute","_setupEditorAriaDescribedBy","ariaDescribedBy","lintingDescriptionElement","ariaDescribedByArray","push","id","join","_createLintingDescriptionElement","createElement","classList","add","textContent","hdsIntl","t","insertAdjacentElement","_setupEditorAriaAttributes","_loadLanguageExtensionsTask","_buildTask","context","generator","language","isLintingEnabled","validLanguageKeys","Object","keys","includes","extensionPromises","Promise","all","error","warn","JSON","stringify","drop","_buildExtensionsTask","cspNonce","extraKeys","customExtensions","keymap","lineNumbers","highlightActiveLineGutter","highlightSpecialChars","highlightActiveLine","defaultKeymap","history","historyKeymap","bracketMatching","syntaxHighlighting","languageExtensions","handleUpdateExtension","updateListener","of","update","selectionSet","view","toggle","state","selection","main","empty","docChanged","doc","toString","lineWrappingExtension","extensions","hdsDarkTheme","hdsDarkHighlightStyle","customKeyMap","map","key","value","run","nonce","_createEditorTask","EditorState","create","parent","console","_setupEditorMutationObserver","MutationObserver","mutations","mutation","removedNodes","node","HTMLElement","removedNodeContainsLintPanel","focus","childList","subtree","_positional","onSetup","isEmpty","guidFor"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hds-intl.js","sources":["../../src/services/hds-intl.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Service from '@ember/service';\nimport { getOwner } from '@ember/owner';\nimport { isPresent } from '@ember/utils';\nimport { assert } from '@ember/debug';\n\nimport type { IntlService } from 'ember-intl';\n\ntype IntlTOptions = Parameters<IntlService['t']>[1];\n\nexport type HdsIntlTOptions = IntlTOptions & {\n default: string;\n};\n\nexport default class HdsIntlService extends Service {\n get intl(): IntlService | undefined {\n const owner = getOwner(this);\n\n if (\n typeof owner?.factoryFor === 'function' &&\n owner.factoryFor('service:intl')\n ) {\n return owner.lookup('service:intl');\n }\n\n return undefined;\n }\n\n t(key: string, options: HdsIntlTOptions): string {\n const { default: defaultString, ...restOptions } = options;\n\n assert(\n 'HdsIntlService requires a key as the first positional argument',\n typeof key === 'string' && isPresent(key)\n );\n\n // try to use ember-intl if available and a translation key exists\n if (this.intl !== undefined) {\n const localeIsSet = this.intl.locales && this.intl.locales.length > 0;\n\n if (localeIsSet && this.intl.exists(key)) {\n return this.intl.t(key, restOptions);\n }\n }\n\n return defaultString;\n }\n}\n"],"names":["HdsIntlService","Service","intl","owner","getOwner","factoryFor","lookup","undefined","t","key","options","default","defaultString","restOptions","assert","isPresent","localeIsSet","locales","length","exists"],"mappings":";;;;;AAAA;AACA;AACA;AACA;;AAee,MAAMA,cAAc,SAASC,OAAO,CAAC;EAClD,IAAIC,IAAIA,GAA4B;AAClC,IAAA,MAAMC,KAAK,GAAGC,QAAQ,CAAC,IAAI,CAAC;AAE5B,IAAA,IACE,OAAOD,KAAK,EAAEE,UAAU,KAAK,UAAU,IACvCF,KAAK,CAACE,UAAU,CAAC,cAAc,CAAC,EAChC;AACA,MAAA,OAAOF,KAAK,CAACG,MAAM,CAAC,cAAc,CAAC;AACrC,IAAA;AAEA,IAAA,OAAOC,SAAS;AAClB,EAAA;AAEAC,EAAAA,CAACA,CAACC,GAAW,EAAEC,OAAwB,EAAU;IAC/C,MAAM;AAAEC,MAAAA,OAAO,EAAEC,aAAa;MAAE,GAAGC;AAAY,KAAC,GAAGH,OAAO;AAE1DI,IAAAA,MAAM,CACJ,gEAAgE,EAChE,OAAOL,GAAG,KAAK,QAAQ,IAAIM,SAAS,CAACN,GAAG,CAC1C,CAAC;;AAED;AACA,IAAA,IAAI,IAAI,CAACP,IAAI,KAAKK,SAAS,EAAE;AAC3B,MAAA,MAAMS,WAAW,GAAG,IAAI,CAACd,IAAI,CAACe,OAAO,IAAI,IAAI,CAACf,IAAI,CAACe,OAAO,CAACC,MAAM,GAAG,CAAC;MAErE,IAAIF,WAAW,IAAI,IAAI,CAACd,IAAI,CAACiB,MAAM,CAACV,GAAG,CAAC,EAAE;QACxC,OAAO,IAAI,CAACP,IAAI,CAACM,CAAC,CAACC,GAAG,EAAEI,WAAW,CAAC;AACtC,MAAA;AACF,IAAA;AAEA,IAAA,OAAOD,aAAa;AACtB,EAAA;AACF;;;;"}
1
+ {"version":3,"file":"hds-intl.js","sources":["../../src/services/hds-intl.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Service from '@ember/service';\nimport { getOwner } from '@ember/owner';\nimport { isPresent } from '@ember/utils';\nimport { assert } from '@ember/debug';\n\nimport type { IntlService } from 'ember-intl';\nimport type { FormatMessageParameters } from 'ember-intl/-private/formatjs';\n\nexport type HdsIntlTOptions = FormatMessageParameters[1] & {\n default: string;\n htmlSafe?: boolean | undefined;\n locale?: string | undefined;\n};\n\nexport default class HdsIntlService extends Service {\n get intl(): IntlService | undefined {\n const owner = getOwner(this);\n\n if (\n typeof owner?.factoryFor === 'function' &&\n owner.factoryFor('service:intl')\n ) {\n return owner.lookup('service:intl');\n }\n\n return undefined;\n }\n\n t(key: string, options: HdsIntlTOptions): string {\n const { default: defaultString, ...restOptions } = options;\n\n assert(\n 'HdsIntlService requires a key as the first positional argument',\n typeof key === 'string' && isPresent(key)\n );\n\n // try to use ember-intl if available and a translation key exists\n if (this.intl !== undefined) {\n const localeIsSet = this.intl.locales && this.intl.locales.length > 0;\n\n if (localeIsSet && this.intl.exists(key)) {\n return this.intl.t(key, restOptions);\n }\n }\n\n return defaultString;\n }\n}\n"],"names":["HdsIntlService","Service","intl","owner","getOwner","factoryFor","lookup","undefined","t","key","options","default","defaultString","restOptions","assert","isPresent","localeIsSet","locales","length","exists"],"mappings":";;;;;AAAA;AACA;AACA;AACA;;AAgBe,MAAMA,cAAc,SAASC,OAAO,CAAC;EAClD,IAAIC,IAAIA,GAA4B;AAClC,IAAA,MAAMC,KAAK,GAAGC,QAAQ,CAAC,IAAI,CAAC;AAE5B,IAAA,IACE,OAAOD,KAAK,EAAEE,UAAU,KAAK,UAAU,IACvCF,KAAK,CAACE,UAAU,CAAC,cAAc,CAAC,EAChC;AACA,MAAA,OAAOF,KAAK,CAACG,MAAM,CAAC,cAAc,CAAC;AACrC,IAAA;AAEA,IAAA,OAAOC,SAAS;AAClB,EAAA;AAEAC,EAAAA,CAACA,CAACC,GAAW,EAAEC,OAAwB,EAAU;IAC/C,MAAM;AAAEC,MAAAA,OAAO,EAAEC,aAAa;MAAE,GAAGC;AAAY,KAAC,GAAGH,OAAO;AAE1DI,IAAAA,MAAM,CACJ,gEAAgE,EAChE,OAAOL,GAAG,KAAK,QAAQ,IAAIM,SAAS,CAACN,GAAG,CAC1C,CAAC;;AAED;AACA,IAAA,IAAI,IAAI,CAACP,IAAI,KAAKK,SAAS,EAAE;AAC3B,MAAA,MAAMS,WAAW,GAAG,IAAI,CAACd,IAAI,CAACe,OAAO,IAAI,IAAI,CAACf,IAAI,CAACe,OAAO,CAACC,MAAM,GAAG,CAAC;MAErE,IAAIF,WAAW,IAAI,IAAI,CAACd,IAAI,CAACiB,MAAM,CAACV,GAAG,CAAC,EAAE;QACxC,OAAO,IAAI,CAACP,IAAI,CAACM,CAAC,CAACC,GAAG,EAAEI,WAAW,CAAC;AACtC,MAAA;AACF,IAAA;AAEA,IAAA,OAAOD,aAAa;AACtB,EAAA;AACF;;;;"}
@@ -0,0 +1,214 @@
1
+ import Service from '@ember/service';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { g, i } from 'decorator-transforms/runtime';
4
+
5
+ let HdsThemeValues = /*#__PURE__*/function (HdsThemeValues) {
6
+ // default (original HDS)
7
+ HdsThemeValues["Default"] = "default";
8
+ // system settings (prefers-color-scheme)
9
+ HdsThemeValues["System"] = "system";
10
+ // user settings for dark/light
11
+ HdsThemeValues["Light"] = "light";
12
+ HdsThemeValues["Dark"] = "dark";
13
+ return HdsThemeValues;
14
+ }({});
15
+ let HdsModesBaseValues = /*#__PURE__*/function (HdsModesBaseValues) {
16
+ HdsModesBaseValues["Default"] = "default";
17
+ return HdsModesBaseValues;
18
+ }({});
19
+ let HdsModesLightValues = /*#__PURE__*/function (HdsModesLightValues) {
20
+ HdsModesLightValues["CdsG0"] = "cds-g0";
21
+ HdsModesLightValues["CdsG10"] = "cds-g10";
22
+ return HdsModesLightValues;
23
+ }({});
24
+ let HdsModesDarkValues = /*#__PURE__*/function (HdsModesDarkValues) {
25
+ HdsModesDarkValues["CdsG90"] = "cds-g90";
26
+ HdsModesDarkValues["CdsG100"] = "cds-g100";
27
+ return HdsModesDarkValues;
28
+ }({});
29
+ const THEMES = Object.values(HdsThemeValues);
30
+ const MODES_LIGHT = Object.values(HdsModesLightValues);
31
+ const MODES_DARK = Object.values(HdsModesDarkValues);
32
+ const MODES = [...Object.values(HdsModesBaseValues), ...MODES_LIGHT, ...MODES_DARK];
33
+ const HDS_THEMING_LOCALSTORAGE_DATA = 'hds-theming-data';
34
+ const DEFAULT_THEMING_OPTION_LIGHT_THEME = HdsModesLightValues.CdsG0;
35
+ const DEFAULT_THEMING_OPTION_DARK_THEME = HdsModesDarkValues.CdsG100;
36
+ // We use this guard function to check if the data parsed from `localStorage` conforms to the `StoredThemingData` type and so is safe to use.
37
+ // This prevents the application from using corrupted, malformed or malicious data, by validating the object structure, theme, and mode values.
38
+
39
+ function isSafeStoredThemingData(data) {
40
+ if (typeof data !== 'object' || data === null) return false;
41
+ const d = data;
42
+ const isSafeThemeData =
43
+ // there is no stored `theme` key in the object (eg. the `default` theme was selected)
44
+ !('theme' in d) ||
45
+ // there is a `theme` value and is one of the valid `HdsThemes`
46
+ d['theme'] === undefined || THEMES.includes(d['theme']);
47
+ const options = d['options'];
48
+ const isSafeOptionsData =
49
+ // there is no stored `options` key in the object (eg. it's the first run of the application)
50
+ !('options' in d) ||
51
+ // there is an `options` value and has valid entries
52
+ typeof options === 'object' && options !== null && 'lightTheme' in options && MODES_LIGHT.includes(options['lightTheme']) && 'darkTheme' in options && MODES_DARK.includes(options['darkTheme']);
53
+ return isSafeThemeData && isSafeOptionsData;
54
+ }
55
+ class HdsThemingService extends Service {
56
+ static {
57
+ g(this.prototype, "_currentTheme", [tracked], function () {
58
+ return undefined;
59
+ });
60
+ }
61
+ #_currentTheme = (i(this, "_currentTheme"), void 0);
62
+ static {
63
+ g(this.prototype, "_currentMode", [tracked], function () {
64
+ return undefined;
65
+ });
66
+ }
67
+ #_currentMode = (i(this, "_currentMode"), void 0);
68
+ static {
69
+ g(this.prototype, "_currentLightTheme", [tracked], function () {
70
+ return DEFAULT_THEMING_OPTION_LIGHT_THEME;
71
+ });
72
+ }
73
+ #_currentLightTheme = (i(this, "_currentLightTheme"), void 0);
74
+ static {
75
+ g(this.prototype, "_currentDarkTheme", [tracked], function () {
76
+ return DEFAULT_THEMING_OPTION_DARK_THEME;
77
+ });
78
+ }
79
+ #_currentDarkTheme = (i(this, "_currentDarkTheme"), void 0);
80
+ static {
81
+ g(this.prototype, "globalOnSetTheme", [tracked]);
82
+ }
83
+ #globalOnSetTheme = (i(this, "globalOnSetTheme"), void 0);
84
+ initializeTheme() {
85
+ const rawStoredThemingData = localStorage.getItem(HDS_THEMING_LOCALSTORAGE_DATA);
86
+ if (rawStoredThemingData !== null) {
87
+ let storedThemingData;
88
+ try {
89
+ storedThemingData = JSON.parse(rawStoredThemingData);
90
+ } catch (error) {
91
+ // malformed JSON in localStorage, ignore and proceed with defaults
92
+ console.error(`Error while reading local storage '${HDS_THEMING_LOCALSTORAGE_DATA}' for theming`, error);
93
+ }
94
+ if (isSafeStoredThemingData(storedThemingData)) {
95
+ this.setTheme({
96
+ theme: storedThemingData.theme,
97
+ options: storedThemingData.options
98
+ });
99
+ } else {
100
+ // if data is not safe or malformed, reset theming to its defaults
101
+ this.setTheme({
102
+ theme: undefined,
103
+ options: undefined
104
+ });
105
+ }
106
+ }
107
+ }
108
+ setTheme({
109
+ theme,
110
+ options,
111
+ onSetTheme
112
+ }) {
113
+ if (options !== undefined) {
114
+ // if we have new options, we override the current ones (`lightTheme` / `darkTheme`)
115
+ // these options can be used by consumers that want to customize how they apply theming
116
+ // (and used by the showcase for the custom theming / theme switching logic)
117
+ if (Object.hasOwn(options, 'lightTheme') && Object.hasOwn(options, 'darkTheme')) {
118
+ const {
119
+ lightTheme,
120
+ darkTheme
121
+ } = options;
122
+ this._currentLightTheme = lightTheme;
123
+ this._currentDarkTheme = darkTheme;
124
+ } else {
125
+ // fallback if something goes wrong
126
+ this._currentLightTheme = DEFAULT_THEMING_OPTION_LIGHT_THEME;
127
+ this._currentDarkTheme = DEFAULT_THEMING_OPTION_DARK_THEME;
128
+ }
129
+ }
130
+
131
+ // set the current theme/mode (`currentTheme` / `currentMode`)
132
+ if (theme === undefined ||
133
+ // standard (no theming)
134
+ !THEMES.includes(theme) // handle possible errors
135
+ ) {
136
+ this._currentTheme = undefined;
137
+ this._currentMode = undefined;
138
+ } else if (theme === HdsThemeValues.Default // default (original HDS)
139
+ ) {
140
+ this._currentTheme = HdsThemeValues.Default;
141
+ this._currentMode = undefined;
142
+ } else if (theme === HdsThemeValues.System // system (prefers-color-scheme)
143
+ ) {
144
+ this._currentTheme = HdsThemeValues.System;
145
+ this._currentMode = undefined;
146
+ } else {
147
+ this._currentTheme = theme;
148
+ if (this._currentTheme === HdsThemeValues.Light) {
149
+ this._currentMode = this._currentLightTheme;
150
+ }
151
+ if (this._currentTheme === HdsThemeValues.Dark) {
152
+ this._currentMode = this._currentDarkTheme;
153
+ }
154
+ }
155
+
156
+ // IMPORTANT: for this to work, it needs to be the `<html>` tag (it's the `:root` in CSS)
157
+ const rootElement = document.querySelector('html');
158
+ if (!rootElement) {
159
+ return;
160
+ }
161
+ // remove or update the CSS selectors applied to the root element (depending on the `theme`/`mode` arguments)
162
+ const hdsThemingClassesToRemove = Array.from(rootElement.classList).filter(className => className.match(/^hds-(theme|mode)/));
163
+ rootElement.classList.remove(...hdsThemingClassesToRemove);
164
+ if (this._currentTheme !== undefined) {
165
+ rootElement.classList.add(`hds-theme-${this._currentTheme}`);
166
+ }
167
+ if (this._currentMode !== undefined) {
168
+ rootElement.classList.add(`hds-mode-${this._currentMode}`);
169
+ }
170
+
171
+ // store the current theme and theming options in local storage
172
+ localStorage.setItem(HDS_THEMING_LOCALSTORAGE_DATA, JSON.stringify({
173
+ theme: this._currentTheme,
174
+ options: {
175
+ lightTheme: this._currentLightTheme,
176
+ darkTheme: this._currentDarkTheme
177
+ }
178
+ }));
179
+
180
+ // this is a general callback that can be defined globally (by extending the service)
181
+ if (this.globalOnSetTheme) {
182
+ this.globalOnSetTheme({
183
+ currentTheme: this._currentTheme,
184
+ currentMode: this._currentMode
185
+ });
186
+ }
187
+
188
+ // this is a "local" callback that can be defined "locally" (eg. in a theme switcher)
189
+ if (onSetTheme) {
190
+ onSetTheme({
191
+ currentTheme: this._currentTheme,
192
+ currentMode: this._currentMode
193
+ });
194
+ }
195
+ }
196
+
197
+ // getters used for reactivity in the components/services using this service
198
+
199
+ get currentTheme() {
200
+ return this._currentTheme;
201
+ }
202
+ get currentMode() {
203
+ return this._currentMode;
204
+ }
205
+ get currentLightTheme() {
206
+ return this._currentLightTheme;
207
+ }
208
+ get currentDarkTheme() {
209
+ return this._currentDarkTheme;
210
+ }
211
+ }
212
+
213
+ export { DEFAULT_THEMING_OPTION_DARK_THEME, DEFAULT_THEMING_OPTION_LIGHT_THEME, HDS_THEMING_LOCALSTORAGE_DATA, HdsModesBaseValues, HdsModesDarkValues, HdsModesLightValues, HdsThemeValues, MODES, MODES_DARK, MODES_LIGHT, THEMES, HdsThemingService as default };
214
+ //# sourceMappingURL=hds-theming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hds-theming.js","sources":["../../src/services/hds-theming.ts"],"sourcesContent":["import Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport enum HdsThemeValues {\n // default (original HDS)\n Default = 'default',\n // system settings (prefers-color-scheme)\n System = 'system',\n // user settings for dark/light\n Light = 'light',\n Dark = 'dark',\n}\n\nexport enum HdsModesBaseValues {\n Default = 'default',\n}\n\nexport enum HdsModesLightValues {\n CdsG0 = 'cds-g0',\n CdsG10 = 'cds-g10',\n}\n\nexport enum HdsModesDarkValues {\n CdsG90 = 'cds-g90',\n CdsG100 = 'cds-g100',\n}\n\nexport type HdsThemes = `${HdsThemeValues}`;\nexport type HdsModes =\n | `${HdsModesBaseValues}`\n | `${HdsModesLightValues}`\n | `${HdsModesDarkValues}`;\nexport type HdsModesLight = `${HdsModesLightValues}`;\nexport type HdsModesDark = `${HdsModesDarkValues}`;\n\ntype HdsThemingOptions = {\n lightTheme: HdsModesLight;\n darkTheme: HdsModesDark;\n};\n\ntype SetThemeArgs = {\n theme: HdsThemes | undefined;\n options?: HdsThemingOptions;\n onSetTheme?: HdsOnSetThemeCallback;\n};\n\nexport type HdsOnSetThemeCallbackArgs = {\n currentTheme: HdsThemes | undefined;\n currentMode: HdsModes | undefined;\n};\n\nexport type HdsOnSetThemeCallback = (args: HdsOnSetThemeCallbackArgs) => void;\n\nexport const THEMES: HdsThemes[] = Object.values(HdsThemeValues);\nexport const MODES_LIGHT: HdsModesLight[] = Object.values(HdsModesLightValues);\nexport const MODES_DARK: HdsModesDark[] = Object.values(HdsModesDarkValues);\nexport const MODES: HdsModes[] = [\n ...Object.values(HdsModesBaseValues),\n ...MODES_LIGHT,\n ...MODES_DARK,\n];\n\nexport const HDS_THEMING_LOCALSTORAGE_DATA = 'hds-theming-data';\n\nexport const DEFAULT_THEMING_OPTION_LIGHT_THEME = HdsModesLightValues.CdsG0;\nexport const DEFAULT_THEMING_OPTION_DARK_THEME = HdsModesDarkValues.CdsG100;\n\ntype StoredThemingData = {\n theme: HdsThemes | undefined;\n options: HdsThemingOptions;\n};\n\n// We use this guard function to check if the data parsed from `localStorage` conforms to the `StoredThemingData` type and so is safe to use.\n// This prevents the application from using corrupted, malformed or malicious data, by validating the object structure, theme, and mode values.\n\nfunction isSafeStoredThemingData(data: unknown): data is StoredThemingData {\n if (typeof data !== 'object' || data === null) return false;\n\n const d = data as Record<string, unknown>;\n\n const isSafeThemeData =\n // there is no stored `theme` key in the object (eg. the `default` theme was selected)\n !('theme' in d) ||\n // there is a `theme` value and is one of the valid `HdsThemes`\n d['theme'] === undefined ||\n THEMES.includes(d['theme'] as HdsThemes);\n\n const options = d['options'] as Record<string, unknown> | undefined;\n\n const isSafeOptionsData =\n // there is no stored `options` key in the object (eg. it's the first run of the application)\n !('options' in d) ||\n // there is an `options` value and has valid entries\n (typeof options === 'object' &&\n options !== null &&\n 'lightTheme' in options &&\n MODES_LIGHT.includes(options['lightTheme'] as HdsModesLight) &&\n 'darkTheme' in options &&\n MODES_DARK.includes(options['darkTheme'] as HdsModesDark));\n\n return isSafeThemeData && isSafeOptionsData;\n}\n\nexport default class HdsThemingService extends Service {\n @tracked _currentTheme: HdsThemes | undefined = undefined;\n @tracked _currentMode: HdsModes | undefined = undefined;\n @tracked _currentLightTheme: HdsModesLight =\n DEFAULT_THEMING_OPTION_LIGHT_THEME;\n @tracked _currentDarkTheme: HdsModesDark = DEFAULT_THEMING_OPTION_DARK_THEME;\n @tracked globalOnSetTheme: HdsOnSetThemeCallback | undefined;\n\n initializeTheme() {\n const rawStoredThemingData = localStorage.getItem(\n HDS_THEMING_LOCALSTORAGE_DATA\n );\n\n if (rawStoredThemingData !== null) {\n let storedThemingData: unknown;\n try {\n storedThemingData = JSON.parse(rawStoredThemingData);\n } catch (error) {\n // malformed JSON in localStorage, ignore and proceed with defaults\n console.error(\n `Error while reading local storage '${HDS_THEMING_LOCALSTORAGE_DATA}' for theming`,\n error\n );\n }\n\n if (isSafeStoredThemingData(storedThemingData)) {\n this.setTheme({\n theme: storedThemingData.theme,\n options: storedThemingData.options,\n });\n } else {\n // if data is not safe or malformed, reset theming to its defaults\n this.setTheme({\n theme: undefined,\n options: undefined,\n });\n }\n }\n }\n\n setTheme({ theme, options, onSetTheme }: SetThemeArgs) {\n if (options !== undefined) {\n // if we have new options, we override the current ones (`lightTheme` / `darkTheme`)\n // these options can be used by consumers that want to customize how they apply theming\n // (and used by the showcase for the custom theming / theme switching logic)\n if (\n Object.hasOwn(options, 'lightTheme') &&\n Object.hasOwn(options, 'darkTheme')\n ) {\n const { lightTheme, darkTheme } = options;\n\n this._currentLightTheme = lightTheme;\n this._currentDarkTheme = darkTheme;\n } else {\n // fallback if something goes wrong\n this._currentLightTheme = DEFAULT_THEMING_OPTION_LIGHT_THEME;\n this._currentDarkTheme = DEFAULT_THEMING_OPTION_DARK_THEME;\n }\n }\n\n // set the current theme/mode (`currentTheme` / `currentMode`)\n if (\n theme === undefined || // standard (no theming)\n !THEMES.includes(theme) // handle possible errors\n ) {\n this._currentTheme = undefined;\n this._currentMode = undefined;\n } else if (\n theme === HdsThemeValues.Default // default (original HDS)\n ) {\n this._currentTheme = HdsThemeValues.Default;\n this._currentMode = undefined;\n } else if (\n theme === HdsThemeValues.System // system (prefers-color-scheme)\n ) {\n this._currentTheme = HdsThemeValues.System;\n this._currentMode = undefined;\n } else {\n this._currentTheme = theme;\n if (this._currentTheme === HdsThemeValues.Light) {\n this._currentMode = this._currentLightTheme;\n }\n if (this._currentTheme === HdsThemeValues.Dark) {\n this._currentMode = this._currentDarkTheme;\n }\n }\n\n // IMPORTANT: for this to work, it needs to be the `<html>` tag (it's the `:root` in CSS)\n const rootElement = document.querySelector('html');\n\n if (!rootElement) {\n return;\n }\n // remove or update the CSS selectors applied to the root element (depending on the `theme`/`mode` arguments)\n const hdsThemingClassesToRemove = Array.from(rootElement.classList).filter(\n (className) => className.match(/^hds-(theme|mode)/)\n );\n rootElement.classList.remove(...hdsThemingClassesToRemove);\n if (this._currentTheme !== undefined) {\n rootElement.classList.add(`hds-theme-${this._currentTheme}`);\n }\n if (this._currentMode !== undefined) {\n rootElement.classList.add(`hds-mode-${this._currentMode}`);\n }\n\n // store the current theme and theming options in local storage\n localStorage.setItem(\n HDS_THEMING_LOCALSTORAGE_DATA,\n JSON.stringify({\n theme: this._currentTheme,\n options: {\n lightTheme: this._currentLightTheme,\n darkTheme: this._currentDarkTheme,\n },\n })\n );\n\n // this is a general callback that can be defined globally (by extending the service)\n if (this.globalOnSetTheme) {\n this.globalOnSetTheme({\n currentTheme: this._currentTheme,\n currentMode: this._currentMode,\n });\n }\n\n // this is a \"local\" callback that can be defined \"locally\" (eg. in a theme switcher)\n if (onSetTheme) {\n onSetTheme({\n currentTheme: this._currentTheme,\n currentMode: this._currentMode,\n });\n }\n }\n\n // getters used for reactivity in the components/services using this service\n\n get currentTheme(): HdsThemes | undefined {\n return this._currentTheme;\n }\n\n get currentMode(): HdsModes | undefined {\n return this._currentMode;\n }\n\n get currentLightTheme(): HdsModesLight {\n return this._currentLightTheme;\n }\n\n get currentDarkTheme(): HdsModesDark {\n return this._currentDarkTheme;\n }\n}\n"],"names":["HdsThemeValues","HdsModesBaseValues","HdsModesLightValues","HdsModesDarkValues","THEMES","Object","values","MODES_LIGHT","MODES_DARK","MODES","HDS_THEMING_LOCALSTORAGE_DATA","DEFAULT_THEMING_OPTION_LIGHT_THEME","CdsG0","DEFAULT_THEMING_OPTION_DARK_THEME","CdsG100","isSafeStoredThemingData","data","d","isSafeThemeData","undefined","includes","options","isSafeOptionsData","HdsThemingService","Service","g","prototype","tracked","i","void 0","initializeTheme","rawStoredThemingData","localStorage","getItem","storedThemingData","JSON","parse","error","console","setTheme","theme","onSetTheme","hasOwn","lightTheme","darkTheme","_currentLightTheme","_currentDarkTheme","_currentTheme","_currentMode","Default","System","Light","Dark","rootElement","document","querySelector","hdsThemingClassesToRemove","Array","from","classList","filter","className","match","remove","add","setItem","stringify","globalOnSetTheme","currentTheme","currentMode","currentLightTheme","currentDarkTheme"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hds-time.js","sources":["../../src/services/hds-time.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Service from '@ember/service';\nimport { dropTask, timeout } from 'ember-concurrency';\nimport { tracked } from '@glimmer/tracking';\nimport { DateTime } from 'luxon';\nimport { isTesting } from '@embroider/macros';\nimport type {\n DisplayType,\n DefaultDisplayType,\n DisplayFormatType,\n} from './hds-time-types.ts';\n\nexport const MILLISECOND_IN_MS = 1;\nexport const SECOND_IN_MS = 1000 * MILLISECOND_IN_MS;\nexport const MINUTE_IN_MS = 60 * SECOND_IN_MS;\nexport const HOUR_IN_MS = 60 * MINUTE_IN_MS;\nexport const DAY_IN_MS = 24 * HOUR_IN_MS;\nexport const WEEK_IN_MS = 7 * DAY_IN_MS;\n\nexport const THRESHOLD_RELATIVE_TIME_IN_MS = WEEK_IN_MS;\n\nexport enum HdsTimeRelativeUnitValues {\n Second = 'second',\n Hour = 'hour',\n Minute = 'minute',\n Day = 'day',\n Week = 'week',\n}\n\nexport const DEFAULT_RELATIVE_THRESHOLDS = {\n [HdsTimeRelativeUnitValues.Second]: 1 * MINUTE_IN_MS,\n [HdsTimeRelativeUnitValues.Minute]: 1 * HOUR_IN_MS,\n [HdsTimeRelativeUnitValues.Hour]: 1 * DAY_IN_MS,\n [HdsTimeRelativeUnitValues.Day]: 100 * WEEK_IN_MS,\n};\n\nexport enum HdsDisplayKeyValues {\n FriendlyRelative = 'friendly-relative', // Example: 'Sep 5, 2018 (30 minutes ago)'\n FriendlyLocal = 'friendly-local', // Example: 'Sep 5, 2018, 4:07:32 pm'\n FriendlyOnly = 'friendly-only', // Example: 'Sep 5, 2018'\n Relative = 'relative', // Example: 'in 7 days'\n Utc = 'utc', // Example: '2018-09-05T23:15:17345Z'\n}\n\nexport const FORMAT_PRECISION_SHORT_DATE: DisplayFormatType = {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n};\nexport const FORMAT_PRECISION_MINUTE: DisplayFormatType = {\n ...FORMAT_PRECISION_SHORT_DATE,\n hour: 'numeric',\n minute: 'numeric',\n};\nexport const FORMAT_PRECISION_SECOND: DisplayFormatType = {\n ...FORMAT_PRECISION_SHORT_DATE,\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n};\nexport const DATE_DISPLAY_FORMATS: {\n [x: string]: DisplayFormatType;\n} = {\n [HdsDisplayKeyValues.FriendlyLocal]: FORMAT_PRECISION_SECOND,\n [HdsDisplayKeyValues.FriendlyOnly]: FORMAT_PRECISION_SHORT_DATE,\n};\n\nexport const DEFAULT_DISPLAY = '';\n\nexport const DEFAULT_DISPLAY_MAPPING: {\n [x: string]: DefaultDisplayType;\n} = {\n [HdsDisplayKeyValues.FriendlyRelative]: {\n displayFormat: FORMAT_PRECISION_SHORT_DATE,\n showFriendly: true,\n showRelative: true,\n tooltipFormat: FORMAT_PRECISION_SECOND,\n },\n [HdsDisplayKeyValues.FriendlyLocal]: {\n displayFormat: DATE_DISPLAY_FORMATS[HdsDisplayKeyValues.FriendlyLocal],\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n [HdsDisplayKeyValues.FriendlyOnly]: {\n displayFormat: DATE_DISPLAY_FORMATS[HdsDisplayKeyValues.FriendlyOnly],\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n [HdsDisplayKeyValues.Relative]: {\n displayFormat: null,\n showFriendly: false,\n showRelative: true,\n tooltipFormat: FORMAT_PRECISION_MINUTE,\n },\n [HdsDisplayKeyValues.Utc]: {\n displayFormat: null,\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n};\n\nexport const DISPLAY_SCALE = Object.keys(DEFAULT_DISPLAY_MAPPING);\n\nexport const DISPLAYS = [\n HdsDisplayKeyValues.FriendlyRelative,\n HdsDisplayKeyValues.FriendlyLocal,\n HdsDisplayKeyValues.FriendlyOnly,\n HdsDisplayKeyValues.Relative,\n HdsDisplayKeyValues.Utc,\n];\n\nexport default class TimeService extends Service {\n #listeners = new Set<Date>();\n\n @tracked now = Date.now();\n\n format(\n difference: {\n absValueInMs: number;\n valueInMs: number;\n },\n display = DEFAULT_DISPLAY\n ): DisplayType {\n let displayKey;\n // If the scale display is defined and valid then set that display.\n if (display && DISPLAY_SCALE.includes(display)) {\n displayKey = display;\n } else {\n // If there's no defined display then we will execute the design system's\n // prefered algorithm.\n\n // By default, we assume we will display just a relative display only.\n displayKey = HdsDisplayKeyValues.Relative;\n\n // If the difference in date is greater than the threshold for showing the\n // relative time then switch the display key.\n if (difference.absValueInMs > THRESHOLD_RELATIVE_TIME_IN_MS) {\n displayKey = HdsDisplayKeyValues.FriendlyLocal;\n }\n }\n\n const options: DefaultDisplayType | undefined =\n DEFAULT_DISPLAY_MAPPING[displayKey];\n\n return {\n options,\n difference,\n relative: this.selectTimeRelativeUnit(difference),\n };\n }\n\n // Formats the value of a relative unit.\n formatTimeRelativeUnit(\n value: number,\n unit: Intl.RelativeTimeFormatUnit\n ): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n return {\n value: Math.trunc(value),\n unit,\n };\n }\n\n // Selects an appropriate display format for the difference.\n selectTimeRelativeUnit(\n { absValueInMs, valueInMs }: { absValueInMs: number; valueInMs: number },\n thresholds: {\n second: number;\n minute: number;\n hour: number;\n day: number;\n } = DEFAULT_RELATIVE_THRESHOLDS\n ): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Second]) {\n return this.formatTimeRelativeUnit(\n valueInMs / SECOND_IN_MS,\n HdsTimeRelativeUnitValues.Second\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Minute]) {\n return this.formatTimeRelativeUnit(\n valueInMs / MINUTE_IN_MS,\n HdsTimeRelativeUnitValues.Minute\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Hour]) {\n return this.formatTimeRelativeUnit(\n valueInMs / HOUR_IN_MS,\n HdsTimeRelativeUnitValues.Hour\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Day]) {\n return this.formatTimeRelativeUnit(\n valueInMs / DAY_IN_MS,\n HdsTimeRelativeUnitValues.Day\n );\n }\n\n return this.formatTimeRelativeUnit(\n valueInMs / WEEK_IN_MS,\n HdsTimeRelativeUnitValues.Week\n );\n }\n\n // Gets the currently subscribed listeners.\n timeDifference(\n startDate: number,\n endDate: Date\n ): { absValueInMs: number; valueInMs: number } {\n const valueInMs = Number(endDate) - Number(startDate);\n return {\n absValueInMs: Math.abs(valueInMs),\n valueInMs,\n };\n }\n\n // Subscribes a listener to the ticking task for time changes.\n register(id: Date): () => void {\n this.#listeners.add(id);\n\n void this.start.perform();\n\n return (): void => {\n this.unregister(id);\n };\n }\n\n // Unregisters listener for the time task.\n unregister(id: Date): boolean {\n return this.#listeners.delete(id);\n }\n\n start = dropTask(async () => {\n while (this.listeners.size) {\n this.now = Date.now();\n // When testing and canceling a EC task, a timer will never resolve and\n // cause the test to hang while waiting for a permanently hanging timeout.\n // This condition breaks the test out of that.\n // via: http://ember-concurrency.com/docs/testing-debugging/\n if (isTesting()) return;\n await timeout(SECOND_IN_MS);\n }\n });\n\n // Transforms a JS date to a string representing the UTC ISO date.\n toIsoUtcString(date: Date): string | undefined {\n try {\n return DateTime.fromJSDate(date).toUTC().toJSDate().toISOString();\n } catch (error) {\n console.error('Error: Could not convert date to ISO UTC string; ', error);\n }\n }\n\n // Gets the currently subscribed listeners.\n get listeners(): Set<Date> {\n return this.#listeners;\n }\n}\n"],"names":["MILLISECOND_IN_MS","SECOND_IN_MS","MINUTE_IN_MS","HOUR_IN_MS","DAY_IN_MS","WEEK_IN_MS","THRESHOLD_RELATIVE_TIME_IN_MS","HdsTimeRelativeUnitValues","DEFAULT_RELATIVE_THRESHOLDS","Second","Minute","Hour","Day","HdsDisplayKeyValues","FORMAT_PRECISION_SHORT_DATE","month","day","year","FORMAT_PRECISION_MINUTE","hour","minute","FORMAT_PRECISION_SECOND","second","timeZoneName","DATE_DISPLAY_FORMATS","FriendlyLocal","FriendlyOnly","DEFAULT_DISPLAY","DEFAULT_DISPLAY_MAPPING","FriendlyRelative","displayFormat","showFriendly","showRelative","tooltipFormat","Relative","Utc","DISPLAY_SCALE","Object","keys","DISPLAYS","TimeService","Service","Set","g","prototype","tracked","Date","now","i","format","difference","display","displayKey","includes","absValueInMs","options","relative","selectTimeRelativeUnit","formatTimeRelativeUnit","value","unit","Math","trunc","valueInMs","thresholds","Week","timeDifference","startDate","endDate","Number","abs","register","id","add","start","perform","unregister","delete","_buildTask","context","generator","listeners","size","isTesting","timeout","toIsoUtcString","date","DateTime","fromJSDate","toUTC","toJSDate","toISOString","error","console"],"mappings":"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"}
1
+ {"version":3,"file":"hds-time.js","sources":["../../src/services/hds-time.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Service from '@ember/service';\nimport { dropTask, timeout } from 'ember-concurrency';\nimport { tracked } from '@glimmer/tracking';\nimport { DateTime } from 'luxon';\nimport { isTesting } from '@embroider/macros';\nimport type {\n DisplayType,\n DefaultDisplayType,\n DisplayFormatType,\n} from './hds-time-types.ts';\n\nexport const MILLISECOND_IN_MS = 1;\nexport const SECOND_IN_MS = 1000 * MILLISECOND_IN_MS;\nexport const MINUTE_IN_MS = 60 * SECOND_IN_MS;\nexport const HOUR_IN_MS = 60 * MINUTE_IN_MS;\nexport const DAY_IN_MS = 24 * HOUR_IN_MS;\nexport const WEEK_IN_MS = 7 * DAY_IN_MS;\n\nexport const THRESHOLD_RELATIVE_TIME_IN_MS = WEEK_IN_MS;\n\nexport enum HdsTimeRelativeUnitValues {\n Second = 'second',\n Hour = 'hour',\n Minute = 'minute',\n Day = 'day',\n Week = 'week',\n}\n\nexport const DEFAULT_RELATIVE_THRESHOLDS = {\n [HdsTimeRelativeUnitValues.Second]: 1 * MINUTE_IN_MS,\n [HdsTimeRelativeUnitValues.Minute]: 1 * HOUR_IN_MS,\n [HdsTimeRelativeUnitValues.Hour]: 1 * DAY_IN_MS,\n [HdsTimeRelativeUnitValues.Day]: 100 * WEEK_IN_MS,\n};\n\nexport enum HdsDisplayKeyValues {\n FriendlyRelative = 'friendly-relative', // Example: 'Sep 5, 2018 (30 minutes ago)'\n FriendlyLocal = 'friendly-local', // Example: 'Sep 5, 2018, 4:07:32 pm'\n FriendlyOnly = 'friendly-only', // Example: 'Sep 5, 2018'\n Relative = 'relative', // Example: 'in 7 days'\n Utc = 'utc', // Example: '2018-09-05T23:15:17345Z'\n}\n\nexport const FORMAT_PRECISION_SHORT_DATE: DisplayFormatType = {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n};\nexport const FORMAT_PRECISION_MINUTE: DisplayFormatType = {\n ...FORMAT_PRECISION_SHORT_DATE,\n hour: 'numeric',\n minute: 'numeric',\n};\nexport const FORMAT_PRECISION_SECOND: DisplayFormatType = {\n ...FORMAT_PRECISION_SHORT_DATE,\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n};\nexport const DATE_DISPLAY_FORMATS: {\n [x: string]: DisplayFormatType;\n} = {\n [HdsDisplayKeyValues.FriendlyLocal]: FORMAT_PRECISION_SECOND,\n [HdsDisplayKeyValues.FriendlyOnly]: FORMAT_PRECISION_SHORT_DATE,\n};\n\nexport const DEFAULT_DISPLAY = '';\n\nexport const DEFAULT_DISPLAY_MAPPING: {\n [x: string]: DefaultDisplayType;\n} = {\n [HdsDisplayKeyValues.FriendlyRelative]: {\n displayFormat: FORMAT_PRECISION_SHORT_DATE,\n showFriendly: true,\n showRelative: true,\n tooltipFormat: FORMAT_PRECISION_SECOND,\n },\n [HdsDisplayKeyValues.FriendlyLocal]: {\n displayFormat: DATE_DISPLAY_FORMATS[HdsDisplayKeyValues.FriendlyLocal],\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n [HdsDisplayKeyValues.FriendlyOnly]: {\n displayFormat: DATE_DISPLAY_FORMATS[HdsDisplayKeyValues.FriendlyOnly],\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n [HdsDisplayKeyValues.Relative]: {\n displayFormat: null,\n showFriendly: false,\n showRelative: true,\n tooltipFormat: FORMAT_PRECISION_MINUTE,\n },\n [HdsDisplayKeyValues.Utc]: {\n displayFormat: null,\n showFriendly: true,\n showRelative: false,\n tooltipFormat: null,\n },\n};\n\nexport const DISPLAY_SCALE = Object.keys(DEFAULT_DISPLAY_MAPPING);\n\nexport const DISPLAYS = [\n HdsDisplayKeyValues.FriendlyRelative,\n HdsDisplayKeyValues.FriendlyLocal,\n HdsDisplayKeyValues.FriendlyOnly,\n HdsDisplayKeyValues.Relative,\n HdsDisplayKeyValues.Utc,\n];\n\nexport default class TimeService extends Service {\n #listeners = new Set<Date>();\n\n @tracked now = Date.now();\n\n format(\n difference: {\n absValueInMs: number;\n valueInMs: number;\n },\n display = DEFAULT_DISPLAY\n ): DisplayType {\n let displayKey;\n // If the scale display is defined and valid then set that display.\n if (display && DISPLAY_SCALE.includes(display)) {\n displayKey = display;\n } else {\n // If there's no defined display then we will execute the design system's\n // prefered algorithm.\n\n // By default, we assume we will display just a relative display only.\n displayKey = HdsDisplayKeyValues.Relative;\n\n // If the difference in date is greater than the threshold for showing the\n // relative time then switch the display key.\n if (difference.absValueInMs > THRESHOLD_RELATIVE_TIME_IN_MS) {\n displayKey = HdsDisplayKeyValues.FriendlyLocal;\n }\n }\n\n const options: DefaultDisplayType | undefined =\n DEFAULT_DISPLAY_MAPPING[displayKey];\n\n return {\n options,\n difference,\n relative: this.selectTimeRelativeUnit(difference),\n };\n }\n\n // Formats the value of a relative unit.\n formatTimeRelativeUnit(\n value: number,\n unit: Intl.RelativeTimeFormatUnit\n ): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n return {\n value: Math.trunc(value),\n unit,\n };\n }\n\n // Selects an appropriate display format for the difference.\n selectTimeRelativeUnit(\n { absValueInMs, valueInMs }: { absValueInMs: number; valueInMs: number },\n thresholds: {\n second: number;\n minute: number;\n hour: number;\n day: number;\n } = DEFAULT_RELATIVE_THRESHOLDS\n ): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Second]) {\n return this.formatTimeRelativeUnit(\n valueInMs / SECOND_IN_MS,\n HdsTimeRelativeUnitValues.Second\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Minute]) {\n return this.formatTimeRelativeUnit(\n valueInMs / MINUTE_IN_MS,\n HdsTimeRelativeUnitValues.Minute\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Hour]) {\n return this.formatTimeRelativeUnit(\n valueInMs / HOUR_IN_MS,\n HdsTimeRelativeUnitValues.Hour\n );\n }\n\n if (absValueInMs < thresholds[HdsTimeRelativeUnitValues.Day]) {\n return this.formatTimeRelativeUnit(\n valueInMs / DAY_IN_MS,\n HdsTimeRelativeUnitValues.Day\n );\n }\n\n return this.formatTimeRelativeUnit(\n valueInMs / WEEK_IN_MS,\n HdsTimeRelativeUnitValues.Week\n );\n }\n\n // Gets the currently subscribed listeners.\n timeDifference(\n startDate: number,\n endDate: Date\n ): { absValueInMs: number; valueInMs: number } {\n const valueInMs = Number(endDate) - Number(startDate);\n return {\n absValueInMs: Math.abs(valueInMs),\n valueInMs,\n };\n }\n\n // Subscribes a listener to the ticking task for time changes.\n register(id: Date): () => void {\n this.#listeners.add(id);\n\n void this.start.perform();\n\n return (): void => {\n this.unregister(id);\n };\n }\n\n // Unregisters listener for the time task.\n unregister(id: Date): boolean {\n return this.#listeners.delete(id);\n }\n\n start = dropTask(async () => {\n while (this.listeners.size) {\n this.now = Date.now();\n // When testing and canceling a EC task, a timer will never resolve and\n // cause the test to hang while waiting for a permanently hanging timeout.\n // This condition breaks the test out of that.\n // via: http://ember-concurrency.com/docs/testing-debugging/\n if (isTesting()) return;\n await timeout(SECOND_IN_MS);\n }\n });\n\n // Transforms a JS date to a string representing the UTC ISO date.\n toIsoUtcString(date: Date): string | undefined {\n try {\n return DateTime.fromJSDate(date).toUTC().toJSDate().toISOString();\n } catch (error) {\n console.error('Error: Could not convert date to ISO UTC string; ', error);\n }\n }\n\n // Gets the currently subscribed listeners.\n get listeners(): Set<Date> {\n return this.#listeners;\n }\n}\n"],"names":["MILLISECOND_IN_MS","SECOND_IN_MS","MINUTE_IN_MS","HOUR_IN_MS","DAY_IN_MS","WEEK_IN_MS","THRESHOLD_RELATIVE_TIME_IN_MS","HdsTimeRelativeUnitValues","DEFAULT_RELATIVE_THRESHOLDS","Second","Minute","Hour","Day","HdsDisplayKeyValues","FORMAT_PRECISION_SHORT_DATE","month","day","year","FORMAT_PRECISION_MINUTE","hour","minute","FORMAT_PRECISION_SECOND","second","timeZoneName","DATE_DISPLAY_FORMATS","FriendlyLocal","FriendlyOnly","DEFAULT_DISPLAY","DEFAULT_DISPLAY_MAPPING","FriendlyRelative","displayFormat","showFriendly","showRelative","tooltipFormat","Relative","Utc","DISPLAY_SCALE","Object","keys","DISPLAYS","TimeService","Service","Set","g","prototype","tracked","Date","now","i","void 0","format","difference","display","displayKey","includes","absValueInMs","options","relative","selectTimeRelativeUnit","formatTimeRelativeUnit","value","unit","Math","trunc","valueInMs","thresholds","Week","timeDifference","startDate","endDate","Number","abs","register","id","add","start","perform","unregister","delete","_buildTask","context","generator","listeners","size","isTesting","timeout","toIsoUtcString","date","DateTime","fromJSDate","toUTC","toJSDate","toISOString","error","console"],"mappings":"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"}
package/dist/services.js CHANGED
@@ -1,2 +1,2 @@
1
-
1
+ export { DEFAULT_THEMING_OPTION_DARK_THEME, DEFAULT_THEMING_OPTION_LIGHT_THEME, HDS_THEMING_LOCALSTORAGE_DATA, HdsModesBaseValues, HdsModesDarkValues, HdsModesLightValues, HdsThemeValues, MODES, MODES_DARK, MODES_LIGHT, THEMES } from './services/hds-theming.js';
2
2
  //# sourceMappingURL=services.js.map