@hashicorp/design-system-components 5.0.0-rc-20251017112839 → 5.0.0-rc-20251027005635

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.
package/addon-main.cjs CHANGED
@@ -8,7 +8,6 @@ const flightIconSprite = require('@hashicorp/flight-icons/svg-sprite/svg-sprite-
8
8
 
9
9
  module.exports = {
10
10
  ...addonV1Shim(__dirname),
11
-
12
11
  contentFor(type, config) {
13
12
  if (
14
13
  !config.flightIconsSpriteLazyEmbed &&
@@ -9,6 +9,7 @@ export interface HdsCodeBlockCopyButtonSignature {
9
9
  targetToCopy?: HdsCopyButtonSignature['Args']['targetToCopy'];
10
10
  text?: HdsCopyButtonSignature['Args']['text'];
11
11
  onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];
12
+ copySuccessMessageText?: HdsCopyButtonSignature['Args']['ariaMessageText'];
12
13
  };
13
14
  Blocks: {
14
15
  default: [];
@@ -39,6 +39,7 @@ export interface HdsCodeBlockSignature {
39
39
  value: string;
40
40
  copyButtonText?: HdsCopyButtonSignature['Args']['text'];
41
41
  onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];
42
+ copySuccessMessageText?: HdsCopyButtonSignature['Args']['ariaMessageText'];
42
43
  };
43
44
  Blocks: {
44
45
  default: [
@@ -8,6 +8,7 @@ import type { HdsCopyButtonSizes } from './types.ts';
8
8
  import type { HdsButtonSignature } from '../../button/';
9
9
  import type { HdsClipboardModifierSignature } from '../../../../modifiers/hds-clipboard.ts';
10
10
  import type { HdsIconSignature } from '../../icon';
11
+ import type HdsIntlService from '../../../../services/hds-intl';
11
12
  export declare const DEFAULT_SIZE = HdsCopyButtonSizeValues.Medium;
12
13
  export declare const SIZES: HdsCopyButtonSizes[];
13
14
  export declare const DEFAULT_ICON = "clipboard-copy";
@@ -21,10 +22,12 @@ export interface HdsCopyButtonSignature {
21
22
  targetToCopy?: HdsClipboardModifierSignature['Args']['Named']['target'];
22
23
  onSuccess?: HdsClipboardModifierSignature['Args']['Named']['onSuccess'];
23
24
  onError?: HdsClipboardModifierSignature['Args']['Named']['onError'];
25
+ ariaMessageText?: string;
24
26
  };
25
27
  Element: HdsButtonSignature['Element'];
26
28
  }
27
29
  export default class HdsCopyButton extends Component<HdsCopyButtonSignature> {
30
+ hdsIntl: HdsIntlService;
28
31
  private _status;
29
32
  private _timer;
30
33
  /**
@@ -46,6 +49,7 @@ export default class HdsCopyButton extends Component<HdsCopyButtonSignature> {
46
49
  * @return {string} The "class" attribute to apply to the component.
47
50
  */
48
51
  get classNames(): string;
52
+ get ariaMessageText(): string;
49
53
  onSuccess(args: HdsClipboardModifierSignature['Args']['Named']['onSuccess']): void;
50
54
  onError(args: HdsClipboardModifierSignature['Args']['Named']['onError']): void;
51
55
  resetStatusDelayed(): void;
@@ -2,8 +2,7 @@
2
2
  * Copyright (c) HashiCorp, Inc.
3
3
  * SPDX-License-Identifier: MPL-2.0
4
4
  */
5
- import type ApplicationInstance from '@ember/application/instance';
6
- export declare function initialize(appInstance: ApplicationInstance): Promise<void>;
5
+ export declare function initialize(): Promise<void>;
7
6
  declare const _default: {
8
7
  initialize: typeof initialize;
9
8
  };
@@ -2,7 +2,7 @@ import Component from '@glimmer/component';
2
2
  import { precompileTemplate } from '@ember/template-compilation';
3
3
  import { setComponentTemplate } from '@ember/component';
4
4
 
5
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<div class=\"hds-app-footer__copyright\" ...attributes>\n <Hds::Icon @name=\"hashicorp\" />\n <Hds::Text::Body @tag=\"span\" @size=\"100\">\n {{hds-t\n \"hds.components.app-footer.copyright.copyright-text\"\n default=(concat \"© \" this.year \" HashiCorp\")\n year=this.year\n }}\n </Hds::Text::Body>\n</div>");
5
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<div class=\"hds-app-footer__copyright\" ...attributes>\n <Hds::Icon @name=\"hashicorp\" />\n <Hds::Text::Body @tag=\"span\" @size=\"100\" @align=\"center\">\n {{hds-t\n \"hds.components.app-footer.copyright.copyright-text\"\n default=(concat \"© \" this.year \" HashiCorp, an IBM Company\")\n year=this.year\n }}\n </Hds::Text::Body>\n</div>");
6
6
 
7
7
  /**
8
8
  * Copyright (c) HashiCorp, Inc.
@@ -2,7 +2,7 @@ import Component from '@glimmer/component';
2
2
  import { precompileTemplate } from '@ember/template-compilation';
3
3
  import { setComponentTemplate } from '@ember/component';
4
4
 
5
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<Hds::Copy::Button\n class=\"hds-code-block__copy-button\"\n @text={{this.text}}\n @isIconOnly={{true}}\n @size=\"small\"\n @targetToCopy={{@targetToCopy}}\n @onSuccess={{@onCopy}}\n ...attributes\n/>");
5
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<Hds::Copy::Button\n class=\"hds-code-block__copy-button\"\n @text={{this.text}}\n @isIconOnly={{true}}\n @size=\"small\"\n @targetToCopy={{@targetToCopy}}\n @onSuccess={{@onCopy}}\n @ariaMessageText={{@copySuccessMessageText}}\n ...attributes\n/>");
6
6
 
7
7
  /**
8
8
  * Copyright (c) HashiCorp, Inc.
@@ -1 +1 @@
1
- {"version":3,"file":"copy-button.js","sources":["../../../../src/components/hds/code-block/copy-button.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\n\nimport type { HdsCopyButtonSignature } from '../copy/button';\n\nexport interface HdsCodeBlockCopyButtonSignature {\n Args: {\n targetToCopy?: HdsCopyButtonSignature['Args']['targetToCopy'];\n text?: HdsCopyButtonSignature['Args']['text'];\n onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];\n };\n Blocks: {\n default: [];\n };\n Element: HdsCopyButtonSignature['Element'];\n}\n\nexport default class HdsCodeBlockCopyButton extends Component<HdsCodeBlockCopyButtonSignature> {\n get text(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.text ? this.args.text : 'Copy';\n }\n}\n"],"names":["HdsCodeBlockCopyButton","Component","text","args","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;;AAkBe,MAAMA,sBAAsB,SAASC,SAAS,CAAkC;EAC7F,IAAIC,IAAIA,GAA2C;AACjD,IAAA,OAAO,IAAI,CAACC,IAAI,CAACD,IAAI,GAAG,IAAI,CAACC,IAAI,CAACD,IAAI,GAAG,MAAM;AACjD,EAAA;AACF;AAACE,oBAAA,CAAAC,QAAA,EAJoBL,sBAAsB,CAAA;;;;"}
1
+ {"version":3,"file":"copy-button.js","sources":["../../../../src/components/hds/code-block/copy-button.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\n\nimport type { HdsCopyButtonSignature } from '../copy/button';\n\nexport interface HdsCodeBlockCopyButtonSignature {\n Args: {\n targetToCopy?: HdsCopyButtonSignature['Args']['targetToCopy'];\n text?: HdsCopyButtonSignature['Args']['text'];\n onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];\n copySuccessMessageText?: HdsCopyButtonSignature['Args']['ariaMessageText'];\n };\n Blocks: {\n default: [];\n };\n Element: HdsCopyButtonSignature['Element'];\n}\n\nexport default class HdsCodeBlockCopyButton extends Component<HdsCodeBlockCopyButtonSignature> {\n get text(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.text ? this.args.text : 'Copy';\n }\n}\n"],"names":["HdsCodeBlockCopyButton","Component","text","args","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;;AAmBe,MAAMA,sBAAsB,SAASC,SAAS,CAAkC;EAC7F,IAAIC,IAAIA,GAA2C;AACjD,IAAA,OAAO,IAAI,CAACC,IAAI,CAACD,IAAI,GAAG,IAAI,CAACC,IAAI,CAACD,IAAI,GAAG,MAAM;AACjD,EAAA;AACF;AAACE,oBAAA,CAAAC,QAAA,EAJoBL,sBAAsB,CAAA;;;;"}
@@ -26,7 +26,7 @@ import { precompileTemplate } from '@ember/template-compilation';
26
26
  import { g, i, n } from 'decorator-transforms/runtime';
27
27
  import { setComponentTemplate } from '@ember/component';
28
28
 
29
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<div class={{this.classNames}} ...attributes {{this._setUpCodeObserver}}>\n <div class=\"hds-code-block__header\">\n {{~yield (hash Title=(component \"hds/code-block/title\" didInsertNode=this.registerTitleElement))~}}\n {{~yield\n (hash Description=(component \"hds/code-block/description\" didInsertNode=this.registerDescriptionElement))\n ~}}\n </div>\n <div class=\"hds-code-block__body\">\n {{! content within pre tag is whitespace-sensitive; do not add new lines! }}\n <pre\n class=\"hds-code-block__code\"\n {{style maxHeight=this.maxHeight}}\n data-line={{@highlightLines}}\n data-start={{@lineNumberStart}}\n id={{this._preCodeId}}\n aria-label={{@ariaLabel}}\n aria-labelledby={{this.ariaLabelledBy}}\n aria-describedby={{this.ariaDescribedBy}}\n tabindex=\"0\"\n ><code {{this._setUpCodeBlockCode}}>\n {{~this._prismCode~}}\n </code></pre>\n\n {{#if @hasCopyButton}}\n <Hds::CodeBlock::CopyButton\n @targetToCopy=\"#{{this._preCodeId}}\"\n aria-describedby={{this._preCodeId}}\n @text={{this.copyButtonText}}\n @onCopy={{@onCopy}}\n />\n {{/if}}\n </div>\n {{#if this.showFooter}}\n <div class=\"hds-code-block__overlay-footer\">\n <Hds::Button\n class=\"hds-code-block__height-toggle-button\"\n @text={{if this._isExpanded \"Show less code\" \"Show more code\"}}\n @color=\"secondary\"\n @icon={{if this._isExpanded \"unfold-close\" \"unfold-open\"}}\n @size=\"small\"\n {{on \"click\" this.toggleExpanded}}\n />\n </div>\n {{/if}}\n</div>");
29
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n\n<div class={{this.classNames}} ...attributes {{this._setUpCodeObserver}}>\n <div class=\"hds-code-block__header\">\n {{~yield (hash Title=(component \"hds/code-block/title\" didInsertNode=this.registerTitleElement))~}}\n {{~yield\n (hash Description=(component \"hds/code-block/description\" didInsertNode=this.registerDescriptionElement))\n ~}}\n </div>\n <div class=\"hds-code-block__body\">\n {{! content within pre tag is whitespace-sensitive; do not add new lines! }}\n <pre\n class=\"hds-code-block__code\"\n {{style maxHeight=this.maxHeight}}\n data-line={{@highlightLines}}\n data-start={{@lineNumberStart}}\n id={{this._preCodeId}}\n aria-label={{@ariaLabel}}\n aria-labelledby={{this.ariaLabelledBy}}\n aria-describedby={{this.ariaDescribedBy}}\n tabindex=\"0\"\n ><code {{this._setUpCodeBlockCode}}>\n {{~this._prismCode~}}\n </code></pre>\n\n {{#if @hasCopyButton}}\n <Hds::CodeBlock::CopyButton\n @targetToCopy=\"#{{this._preCodeId}}\"\n aria-describedby={{this._preCodeId}}\n @text={{this.copyButtonText}}\n @onCopy={{@onCopy}}\n @copySuccessMessageText={{@copySuccessMessageText}}\n />\n {{/if}}\n </div>\n {{#if this.showFooter}}\n <div class=\"hds-code-block__overlay-footer\">\n <Hds::Button\n class=\"hds-code-block__height-toggle-button\"\n @text={{if this._isExpanded \"Show less code\" \"Show more code\"}}\n @color=\"secondary\"\n @icon={{if this._isExpanded \"unfold-close\" \"unfold-open\"}}\n @size=\"small\"\n {{on \"click\" this.toggleExpanded}}\n />\n </div>\n {{/if}}\n</div>");
30
30
 
31
31
  /**
32
32
  * Copyright (c) HashiCorp, Inc.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/hds/code-block/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport { assert } from '@ember/debug';\nimport { next, schedule } from '@ember/runloop';\nimport { htmlSafe } from '@ember/template';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\n\nimport Prism from 'prismjs';\n\nimport type { SafeString } from '@ember/template';\nimport type { WithBoundArgs } from '@glint/template';\n\nimport type { HdsCodeBlockTitleSignature } from './title';\nimport type { HdsCodeBlockDescriptionSignature } from './description';\nimport { HdsCodeBlockLanguageValues } from './types.ts';\nimport type { HdsCodeBlockLanguages } from './types.ts';\nimport type { HdsCopyButtonSignature } from '../copy/button/index.ts';\n\nimport HdsCodeBlockTitleComponent from './title.ts';\nimport HdsCodeBlockDescriptionComponent from './description.ts';\n\nimport 'prismjs/plugins/line-numbers/prism-line-numbers';\nimport 'prismjs/plugins/line-highlight/prism-line-highlight';\n\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-hcl';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-log';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-shell-session';\nimport 'prismjs/components/prism-yaml';\n\n// These imports are required to overcome a global variable clash in Helios website\n// where language import are overriden by the Prism instance in `CodeBlock`\n// Note that `prism-handlebars` is dependant on `prism-markup-templating`\nimport 'prismjs/components/prism-markup-templating';\nimport 'prismjs/components/prism-handlebars';\n\nexport const LANGUAGES: HdsCodeBlockLanguages[] = Object.values(\n HdsCodeBlockLanguageValues\n);\n\nexport interface HdsCodeBlockSignature {\n Args: {\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n hasCopyButton?: boolean;\n hasLineNumbers?: boolean;\n hasLineWrapping?: boolean;\n highlightLines?: string;\n lineNumberStart?: number;\n isStandalone?: boolean;\n language?: HdsCodeBlockLanguages;\n maxHeight?: string;\n value: string;\n copyButtonText?: HdsCopyButtonSignature['Args']['text'];\n onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];\n };\n Blocks: {\n default: [\n {\n Title?: WithBoundArgs<\n typeof HdsCodeBlockTitleComponent,\n 'didInsertNode'\n >;\n Description?: WithBoundArgs<\n typeof HdsCodeBlockDescriptionComponent,\n 'didInsertNode'\n >;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsCodeBlock extends Component<HdsCodeBlockSignature> {\n @tracked private _prismCode: SafeString = htmlSafe('');\n @tracked private _isExpanded: boolean = false;\n @tracked private _codeContentHeight: number = 0;\n @tracked private _codeContainerHeight: number = 0;\n @tracked private _titleId: string | undefined;\n @tracked private _descriptionId: string | undefined;\n\n // Generates a unique ID for the code content\n private _preCodeId = 'pre-code-' + guidFor(this);\n private _preCodeElement!: HTMLPreElement;\n private _observer!: ResizeObserver;\n\n // If a code block is hidden from view, and made visible after load, the Prism code needs to be re-run\n private _setUpCodeObserver = modifier((element: HTMLElement) => {\n this._preCodeElement = element.querySelector(\n '.hds-code-block__code'\n ) as HTMLPreElement;\n this._observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n this._updateCodeHeights();\n this._updatePrismPlugins();\n }\n });\n });\n this._observer.observe(element);\n\n return () => {\n this._observer.disconnect();\n };\n });\n\n private _setUpCodeBlockCode = modifier((element: HTMLElement) => {\n this._isExpanded = false; // reset expanded state on updates\n this.setPrismCode(element);\n return () => {};\n });\n\n get ariaLabelledBy(): string | undefined {\n if (this.args.ariaLabel !== undefined) {\n return;\n }\n\n return this.args.ariaLabelledBy ?? this._titleId;\n }\n\n get ariaDescribedBy(): string | undefined {\n return this.args.ariaDescribedBy ?? this._descriptionId;\n }\n\n // code text content for the CodeBlock\n get code(): string {\n const code = this.args.value;\n\n assert(\n '@code for \"Hds::CodeBlock\" must have a valid value',\n code !== undefined\n );\n\n if (Prism?.plugins?.['NormalizeWhitespace']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n return Prism.plugins['NormalizeWhitespace'].normalize(code);\n }\n\n return code;\n }\n\n get maxHeight(): string | undefined {\n return this._isExpanded ? 'none' : this.args.maxHeight;\n }\n\n // Shows overlay footer if maxHeight is set and the pre tag content height is greater than the pre tag height\n get showFooter(): boolean {\n if (this.args.maxHeight) {\n return this._codeContentHeight > this._codeContainerHeight;\n }\n return false;\n }\n\n // Name of coding language used within CodeBlock for syntax highlighting\n get language(): HdsCodeBlockLanguages | undefined {\n return this.args.language ?? undefined;\n }\n\n // Displays line numbers if true\n get hasLineNumbers(): boolean {\n return this.args.hasLineNumbers ?? true;\n }\n\n // Make CodeBlock container corners appear rounded (the standalone variation)\n get isStandalone(): boolean {\n return this.args.isStandalone ?? true;\n }\n\n // Make text content wrap to multiple lines\n get hasLineWrapping(): boolean {\n return this.args.hasLineWrapping ?? false;\n }\n\n get copyButtonText(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.copyButtonText ? this.args.copyButtonText : 'Copy';\n }\n\n @action\n registerTitleElement(element: HdsCodeBlockTitleSignature['Element']): void {\n this._titleId = element.id;\n }\n\n @action\n registerDescriptionElement(\n element: HdsCodeBlockDescriptionSignature['Element']\n ): void {\n this._descriptionId = element.id;\n }\n\n @action\n setPrismCode(element: HTMLElement): void {\n const code = this.code;\n const language = this.language;\n const grammar = language ? Prism.languages[language] : undefined;\n\n if (code) {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n if (language && grammar) {\n this._prismCode = htmlSafe(Prism.highlight(code, grammar, language));\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n this._prismCode = htmlSafe(Prism.util.encode(code).toString());\n }\n\n // Existing line numbers must be removed in order to be updated correctly\n const lineNumbers = element.querySelector(\n '.line-numbers-rows'\n ) as HTMLElement;\n if (lineNumbers) {\n element.removeChild(lineNumbers);\n }\n\n if (this.args.highlightLines) {\n this._prismCode = this._addHighlightSrOnlyText(\n this._prismCode.toString()\n );\n }\n\n // Force prism-line-numbers plugin initialization, required for Prism.highlight usage\n // See https://github.com/PrismJS/prism/issues/1234\n Prism.hooks.run('complete', {\n code,\n element,\n });\n\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this._updateCodeHeights();\n // we need to delay re-evaluating the context for prism plugins for as much as possible, and `afterRender` is the 'latest' we can use in the component lifecycle\n this._updatePrismPlugins();\n });\n });\n }\n }\n\n private _updateCodeHeights(): void {\n if (!this._isExpanded) {\n // Get the actual height & the content height of the preCodeElement\n this._codeContentHeight = this._preCodeElement?.scrollHeight ?? 0;\n this._codeContainerHeight = this._preCodeElement?.clientHeight ?? 0;\n }\n }\n\n private _updatePrismPlugins(): void {\n if (this.hasLineNumbers && Prism?.plugins?.['lineNumbers']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n Prism.plugins['lineNumbers'].resize(this._preCodeElement);\n }\n\n // Force prism-line-highlight plugin initialization\n // Context: https://github.com/hashicorp/design-system/pull/1749#discussion_r1374288785\n if (this.args.highlightLines) {\n // we piggy-back on the plugin's `resize` event listener to trigger a new call of the `highlightLines` function: https://github.com/PrismJS/prism/blob/master/plugins/line-highlight/prism-line-highlight.js#L337\n if (window) window.dispatchEvent(new Event('resize'));\n }\n }\n\n @action\n toggleExpanded(): void {\n this._isExpanded = !this._isExpanded;\n }\n\n // Logic for determining where line highlighting starts and ends taken from Prism.js plugin source code\n // Context: https://github.com/PrismJS/prism/blob/19f8de66b0f3a79aedbbf096081a4060fc0e80af/src/plugins/line-highlight/prism-line-highlight.ts#L82\n private _addHighlightSrOnlyText(code: string): SafeString {\n const NEW_LINE_EXP = /\\n(?!$)/g;\n const lines = code.split(NEW_LINE_EXP);\n const numLines = lines.length;\n const lineOffset = this.args.lineNumberStart\n ? this.args.lineNumberStart\n : 0;\n\n const highlightStart = '<span class=\"sr-only\">highlight start</span>';\n const highlightEnd = '<span class=\"sr-only\">highlight end</span>';\n\n const ranges = this.args.highlightLines\n ?.replace(/\\s+/g, '')\n .split(',')\n .filter(Boolean);\n\n if (ranges && ranges.length > 0) {\n const highlightedLines = [] as { start: number; end: number }[];\n\n ranges.forEach((currentRange) => {\n const range = currentRange.split('-');\n const start = +range[0]! - lineOffset;\n let end = +range[1]! || start - lineOffset;\n end = Math.min(numLines, end);\n highlightedLines.push({\n start: start,\n end: end,\n });\n });\n\n highlightedLines.forEach((line) => {\n lines[line.start - 1] = highlightStart + lines[line.start - 1];\n lines[line.end - 1] = lines[line.end - 1] + highlightEnd;\n });\n\n return htmlSafe(lines.join('\\n'));\n } else {\n return htmlSafe(code);\n }\n }\n\n get classNames(): string {\n // Currently there is only one theme so the class name is hard-coded.\n // In the future, additional themes such as a \"light\" theme could be added.\n const classes = ['hds-code-block', 'hds-code-block--theme-dark'];\n\n if (this.language) {\n classes.push(`language-${this.language}`);\n }\n\n if (this.isStandalone === true) {\n classes.push('hds-code-block--is-standalone');\n }\n\n if (this.hasLineWrapping === true) {\n classes.push('hds-code-block--has-line-wrapping');\n }\n\n // Note: Prism.js is using the specific class name \"line-numbers\" to determine implementation of line numbers in the UI\n if (this.hasLineNumbers) {\n classes.push('line-numbers');\n }\n\n if (this.showFooter) {\n classes.push('hds-code-block--has-overlay-footer');\n }\n\n if (this._isExpanded) {\n classes.push('hds-code-block--is-expanded');\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["LANGUAGES","Object","values","HdsCodeBlockLanguageValues","HdsCodeBlock","Component","g","prototype","tracked","htmlSafe","i","void 0","_preCodeId","guidFor","_preCodeElement","_observer","_setUpCodeObserver","modifier","element","querySelector","ResizeObserver","entries","forEach","entry","contentBoxSize","_updateCodeHeights","_updatePrismPlugins","observe","disconnect","_setUpCodeBlockCode","_isExpanded","setPrismCode","ariaLabelledBy","args","ariaLabel","undefined","_titleId","ariaDescribedBy","_descriptionId","code","value","assert","Prism","plugins","normalize","maxHeight","showFooter","_codeContentHeight","_codeContainerHeight","language","hasLineNumbers","isStandalone","hasLineWrapping","copyButtonText","registerTitleElement","id","n","action","registerDescriptionElement","grammar","languages","next","_prismCode","highlight","util","encode","toString","lineNumbers","removeChild","highlightLines","_addHighlightSrOnlyText","hooks","run","schedule","scrollHeight","clientHeight","resize","window","dispatchEvent","Event","toggleExpanded","NEW_LINE_EXP","lines","split","numLines","length","lineOffset","lineNumberStart","highlightStart","highlightEnd","ranges","replace","filter","Boolean","highlightedLines","currentRange","range","start","end","Math","min","push","line","join","classNames","classes","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/hds/code-block/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport { assert } from '@ember/debug';\nimport { next, schedule } from '@ember/runloop';\nimport { htmlSafe } from '@ember/template';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\n\nimport Prism from 'prismjs';\n\nimport type { SafeString } from '@ember/template';\nimport type { WithBoundArgs } from '@glint/template';\n\nimport type { HdsCodeBlockTitleSignature } from './title';\nimport type { HdsCodeBlockDescriptionSignature } from './description';\nimport { HdsCodeBlockLanguageValues } from './types.ts';\nimport type { HdsCodeBlockLanguages } from './types.ts';\nimport type { HdsCopyButtonSignature } from '../copy/button/index.ts';\n\nimport HdsCodeBlockTitleComponent from './title.ts';\nimport HdsCodeBlockDescriptionComponent from './description.ts';\n\nimport 'prismjs/plugins/line-numbers/prism-line-numbers';\nimport 'prismjs/plugins/line-highlight/prism-line-highlight';\n\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-hcl';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-log';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-shell-session';\nimport 'prismjs/components/prism-yaml';\n\n// These imports are required to overcome a global variable clash in Helios website\n// where language import are overriden by the Prism instance in `CodeBlock`\n// Note that `prism-handlebars` is dependant on `prism-markup-templating`\nimport 'prismjs/components/prism-markup-templating';\nimport 'prismjs/components/prism-handlebars';\n\nexport const LANGUAGES: HdsCodeBlockLanguages[] = Object.values(\n HdsCodeBlockLanguageValues\n);\n\nexport interface HdsCodeBlockSignature {\n Args: {\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n hasCopyButton?: boolean;\n hasLineNumbers?: boolean;\n hasLineWrapping?: boolean;\n highlightLines?: string;\n lineNumberStart?: number;\n isStandalone?: boolean;\n language?: HdsCodeBlockLanguages;\n maxHeight?: string;\n value: string;\n copyButtonText?: HdsCopyButtonSignature['Args']['text'];\n onCopy?: HdsCopyButtonSignature['Args']['onSuccess'];\n copySuccessMessageText?: HdsCopyButtonSignature['Args']['ariaMessageText'];\n };\n Blocks: {\n default: [\n {\n Title?: WithBoundArgs<\n typeof HdsCodeBlockTitleComponent,\n 'didInsertNode'\n >;\n Description?: WithBoundArgs<\n typeof HdsCodeBlockDescriptionComponent,\n 'didInsertNode'\n >;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsCodeBlock extends Component<HdsCodeBlockSignature> {\n @tracked private _prismCode: SafeString = htmlSafe('');\n @tracked private _isExpanded: boolean = false;\n @tracked private _codeContentHeight: number = 0;\n @tracked private _codeContainerHeight: number = 0;\n @tracked private _titleId: string | undefined;\n @tracked private _descriptionId: string | undefined;\n\n // Generates a unique ID for the code content\n private _preCodeId = 'pre-code-' + guidFor(this);\n private _preCodeElement!: HTMLPreElement;\n private _observer!: ResizeObserver;\n\n // If a code block is hidden from view, and made visible after load, the Prism code needs to be re-run\n private _setUpCodeObserver = modifier((element: HTMLElement) => {\n this._preCodeElement = element.querySelector(\n '.hds-code-block__code'\n ) as HTMLPreElement;\n this._observer = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.contentBoxSize) {\n this._updateCodeHeights();\n this._updatePrismPlugins();\n }\n });\n });\n this._observer.observe(element);\n\n return () => {\n this._observer.disconnect();\n };\n });\n\n private _setUpCodeBlockCode = modifier((element: HTMLElement) => {\n this._isExpanded = false; // reset expanded state on updates\n this.setPrismCode(element);\n return () => {};\n });\n\n get ariaLabelledBy(): string | undefined {\n if (this.args.ariaLabel !== undefined) {\n return;\n }\n\n return this.args.ariaLabelledBy ?? this._titleId;\n }\n\n get ariaDescribedBy(): string | undefined {\n return this.args.ariaDescribedBy ?? this._descriptionId;\n }\n\n // code text content for the CodeBlock\n get code(): string {\n const code = this.args.value;\n\n assert(\n '@code for \"Hds::CodeBlock\" must have a valid value',\n code !== undefined\n );\n\n if (Prism?.plugins?.['NormalizeWhitespace']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n return Prism.plugins['NormalizeWhitespace'].normalize(code);\n }\n\n return code;\n }\n\n get maxHeight(): string | undefined {\n return this._isExpanded ? 'none' : this.args.maxHeight;\n }\n\n // Shows overlay footer if maxHeight is set and the pre tag content height is greater than the pre tag height\n get showFooter(): boolean {\n if (this.args.maxHeight) {\n return this._codeContentHeight > this._codeContainerHeight;\n }\n return false;\n }\n\n // Name of coding language used within CodeBlock for syntax highlighting\n get language(): HdsCodeBlockLanguages | undefined {\n return this.args.language ?? undefined;\n }\n\n // Displays line numbers if true\n get hasLineNumbers(): boolean {\n return this.args.hasLineNumbers ?? true;\n }\n\n // Make CodeBlock container corners appear rounded (the standalone variation)\n get isStandalone(): boolean {\n return this.args.isStandalone ?? true;\n }\n\n // Make text content wrap to multiple lines\n get hasLineWrapping(): boolean {\n return this.args.hasLineWrapping ?? false;\n }\n\n get copyButtonText(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.copyButtonText ? this.args.copyButtonText : 'Copy';\n }\n\n @action\n registerTitleElement(element: HdsCodeBlockTitleSignature['Element']): void {\n this._titleId = element.id;\n }\n\n @action\n registerDescriptionElement(\n element: HdsCodeBlockDescriptionSignature['Element']\n ): void {\n this._descriptionId = element.id;\n }\n\n @action\n setPrismCode(element: HTMLElement): void {\n const code = this.code;\n const language = this.language;\n const grammar = language ? Prism.languages[language] : undefined;\n\n if (code) {\n // eslint-disable-next-line ember/no-runloop\n next((): void => {\n if (language && grammar) {\n this._prismCode = htmlSafe(Prism.highlight(code, grammar, language));\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n this._prismCode = htmlSafe(Prism.util.encode(code).toString());\n }\n\n // Existing line numbers must be removed in order to be updated correctly\n const lineNumbers = element.querySelector(\n '.line-numbers-rows'\n ) as HTMLElement;\n if (lineNumbers) {\n element.removeChild(lineNumbers);\n }\n\n if (this.args.highlightLines) {\n this._prismCode = this._addHighlightSrOnlyText(\n this._prismCode.toString()\n );\n }\n\n // Force prism-line-numbers plugin initialization, required for Prism.highlight usage\n // See https://github.com/PrismJS/prism/issues/1234\n Prism.hooks.run('complete', {\n code,\n element,\n });\n\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this._updateCodeHeights();\n // we need to delay re-evaluating the context for prism plugins for as much as possible, and `afterRender` is the 'latest' we can use in the component lifecycle\n this._updatePrismPlugins();\n });\n });\n }\n }\n\n private _updateCodeHeights(): void {\n if (!this._isExpanded) {\n // Get the actual height & the content height of the preCodeElement\n this._codeContentHeight = this._preCodeElement?.scrollHeight ?? 0;\n this._codeContainerHeight = this._preCodeElement?.clientHeight ?? 0;\n }\n }\n\n private _updatePrismPlugins(): void {\n if (this.hasLineNumbers && Prism?.plugins?.['lineNumbers']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n Prism.plugins['lineNumbers'].resize(this._preCodeElement);\n }\n\n // Force prism-line-highlight plugin initialization\n // Context: https://github.com/hashicorp/design-system/pull/1749#discussion_r1374288785\n if (this.args.highlightLines) {\n // we piggy-back on the plugin's `resize` event listener to trigger a new call of the `highlightLines` function: https://github.com/PrismJS/prism/blob/master/plugins/line-highlight/prism-line-highlight.js#L337\n if (window) window.dispatchEvent(new Event('resize'));\n }\n }\n\n @action\n toggleExpanded(): void {\n this._isExpanded = !this._isExpanded;\n }\n\n // Logic for determining where line highlighting starts and ends taken from Prism.js plugin source code\n // Context: https://github.com/PrismJS/prism/blob/19f8de66b0f3a79aedbbf096081a4060fc0e80af/src/plugins/line-highlight/prism-line-highlight.ts#L82\n private _addHighlightSrOnlyText(code: string): SafeString {\n const NEW_LINE_EXP = /\\n(?!$)/g;\n const lines = code.split(NEW_LINE_EXP);\n const numLines = lines.length;\n const lineOffset = this.args.lineNumberStart\n ? this.args.lineNumberStart\n : 0;\n\n const highlightStart = '<span class=\"sr-only\">highlight start</span>';\n const highlightEnd = '<span class=\"sr-only\">highlight end</span>';\n\n const ranges = this.args.highlightLines\n ?.replace(/\\s+/g, '')\n .split(',')\n .filter(Boolean);\n\n if (ranges && ranges.length > 0) {\n const highlightedLines = [] as { start: number; end: number }[];\n\n ranges.forEach((currentRange) => {\n const range = currentRange.split('-');\n const start = +range[0]! - lineOffset;\n let end = +range[1]! || start - lineOffset;\n end = Math.min(numLines, end);\n highlightedLines.push({\n start: start,\n end: end,\n });\n });\n\n highlightedLines.forEach((line) => {\n lines[line.start - 1] = highlightStart + lines[line.start - 1];\n lines[line.end - 1] = lines[line.end - 1] + highlightEnd;\n });\n\n return htmlSafe(lines.join('\\n'));\n } else {\n return htmlSafe(code);\n }\n }\n\n get classNames(): string {\n // Currently there is only one theme so the class name is hard-coded.\n // In the future, additional themes such as a \"light\" theme could be added.\n const classes = ['hds-code-block', 'hds-code-block--theme-dark'];\n\n if (this.language) {\n classes.push(`language-${this.language}`);\n }\n\n if (this.isStandalone === true) {\n classes.push('hds-code-block--is-standalone');\n }\n\n if (this.hasLineWrapping === true) {\n classes.push('hds-code-block--has-line-wrapping');\n }\n\n // Note: Prism.js is using the specific class name \"line-numbers\" to determine implementation of line numbers in the UI\n if (this.hasLineNumbers) {\n classes.push('line-numbers');\n }\n\n if (this.showFooter) {\n classes.push('hds-code-block--has-overlay-footer');\n }\n\n if (this._isExpanded) {\n classes.push('hds-code-block--is-expanded');\n }\n\n return classes.join(' ');\n }\n}\n"],"names":["LANGUAGES","Object","values","HdsCodeBlockLanguageValues","HdsCodeBlock","Component","g","prototype","tracked","htmlSafe","i","void 0","_preCodeId","guidFor","_preCodeElement","_observer","_setUpCodeObserver","modifier","element","querySelector","ResizeObserver","entries","forEach","entry","contentBoxSize","_updateCodeHeights","_updatePrismPlugins","observe","disconnect","_setUpCodeBlockCode","_isExpanded","setPrismCode","ariaLabelledBy","args","ariaLabel","undefined","_titleId","ariaDescribedBy","_descriptionId","code","value","assert","Prism","plugins","normalize","maxHeight","showFooter","_codeContentHeight","_codeContainerHeight","language","hasLineNumbers","isStandalone","hasLineWrapping","copyButtonText","registerTitleElement","id","n","action","registerDescriptionElement","grammar","languages","next","_prismCode","highlight","util","encode","toString","lineNumbers","removeChild","highlightLines","_addHighlightSrOnlyText","hooks","run","schedule","scrollHeight","clientHeight","resize","window","dispatchEvent","Event","toggleExpanded","NEW_LINE_EXP","lines","split","numLines","length","lineOffset","lineNumberStart","highlightStart","highlightEnd","ranges","replace","filter","Boolean","highlightedLines","currentRange","range","start","end","Math","min","push","line","join","classNames","classes","setComponentTemplate","TEMPLATE"],"mappings":"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"}
@@ -2,12 +2,13 @@ import Component from '@glimmer/component';
2
2
  import { assert } from '@ember/debug';
3
3
  import { tracked } from '@glimmer/tracking';
4
4
  import { action } from '@ember/object';
5
+ import { service } from '@ember/service';
5
6
  import { HdsCopyButtonSizeValues } from './types.js';
6
7
  import { precompileTemplate } from '@ember/template-compilation';
7
8
  import { g, i, n } from 'decorator-transforms/runtime';
8
9
  import { setComponentTemplate } from '@ember/component';
9
10
 
10
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::Button\n class={{this.classNames}}\n @size={{this.size}}\n @isFullWidth={{@isFullWidth}}\n @text={{@text}}\n @icon={{this.icon}}\n @isIconOnly={{@isIconOnly}}\n @color=\"secondary\"\n @iconPosition=\"trailing\"\n {{hds-clipboard text=@textToCopy target=@targetToCopy onSuccess=this.onSuccess onError=this.onError}}\n ...attributes\n/>");
11
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<Hds::Button\n class={{this.classNames}}\n @size={{this.size}}\n @isFullWidth={{@isFullWidth}}\n @text={{@text}}\n @icon={{this.icon}}\n @isIconOnly={{@isIconOnly}}\n @color=\"secondary\"\n @iconPosition=\"trailing\"\n {{hds-clipboard text=@textToCopy target=@targetToCopy onSuccess=this.onSuccess onError=this.onError}}\n ...attributes\n/>\n<span class=\"sr-only\" aria-live=\"polite\">{{this.ariaMessageText}}</span>");
11
12
 
12
13
  /**
13
14
  * Copyright (c) HashiCorp, Inc.
@@ -21,6 +22,10 @@ const SUCCESS_ICON = 'clipboard-checked';
21
22
  const ERROR_ICON = 'clipboard-x';
22
23
  const DEFAULT_STATUS = 'idle';
23
24
  class HdsCopyButton extends Component {
25
+ static {
26
+ g(this.prototype, "hdsIntl", [service]);
27
+ }
28
+ #hdsIntl = (i(this, "hdsIntl"), void 0);
24
29
  static {
25
30
  g(this.prototype, "_status", [tracked], function () {
26
31
  return DEFAULT_STATUS;
@@ -73,6 +78,15 @@ class HdsCopyButton extends Component {
73
78
  classes.push(`hds-copy-button--status-${this._status}`);
74
79
  return classes.join(' ');
75
80
  }
81
+ get ariaMessageText() {
82
+ if (this._status === 'success') {
83
+ return this.args.ariaMessageText ?? this.hdsIntl.t('hds.components.copy-button.aria-message-text', {
84
+ default: 'Copied to clipboard'
85
+ });
86
+ } else {
87
+ return '';
88
+ }
89
+ }
76
90
  onSuccess(args) {
77
91
  this._status = 'success';
78
92
  this.resetStatusDelayed();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/button/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 { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { HdsCopyButtonSizeValues } from './types.ts';\nimport type { HdsCopyButtonSizes } from './types.ts';\nimport type { HdsButtonSignature } from '../../button/';\nimport type { HdsClipboardModifierSignature } from '../../../../modifiers/hds-clipboard.ts';\nimport type { HdsIconSignature } from '../../icon';\n\nexport const DEFAULT_SIZE = HdsCopyButtonSizeValues.Medium;\nexport const SIZES: HdsCopyButtonSizes[] = Object.values(\n HdsCopyButtonSizeValues\n);\nexport const DEFAULT_ICON = 'clipboard-copy';\nexport const SUCCESS_ICON = 'clipboard-checked';\nexport const ERROR_ICON = 'clipboard-x';\nexport const DEFAULT_STATUS = 'idle';\n\nexport interface HdsCopyButtonSignature {\n Args: HdsButtonSignature['Args'] & {\n size?: HdsCopyButtonSizes;\n textToCopy?: HdsClipboardModifierSignature['Args']['Named']['text'];\n targetToCopy?: HdsClipboardModifierSignature['Args']['Named']['target'];\n onSuccess?: HdsClipboardModifierSignature['Args']['Named']['onSuccess'];\n onError?: HdsClipboardModifierSignature['Args']['Named']['onError'];\n };\n Element: HdsButtonSignature['Element'];\n}\n\nexport default class HdsCopyButton extends Component<HdsCopyButtonSignature> {\n @tracked private _status = DEFAULT_STATUS;\n @tracked private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @param icon\n * @type {string}\n * @description The icon to be displayed for each status; automatically calculated based on the tracked property `status`.\n */\n get icon(): HdsIconSignature['Args']['name'] {\n let icon: HdsIconSignature['Args']['name'] = DEFAULT_ICON;\n if (this._status === 'success') {\n icon = SUCCESS_ICON;\n } else if (this._status === 'error') {\n icon = ERROR_ICON;\n }\n return icon;\n }\n\n /**\n * @param size\n * @type {string}\n * @default medium\n * @description The size of the copy/button; acceptable values are `small` and `medium`\n */\n get size(): HdsCopyButtonSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Copy::Button\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method CopyButton#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-copy-button'];\n\n // add a class based on the @size argument\n classes.push(`hds-button--size-${this.size}`);\n\n classes.push(`hds-copy-button--status-${this._status}`);\n\n return classes.join(' ');\n }\n\n @action\n onSuccess(\n args: HdsClipboardModifierSignature['Args']['Named']['onSuccess']\n ): void {\n this._status = 'success';\n this.resetStatusDelayed();\n\n const { onSuccess } = this.args;\n\n if (typeof onSuccess === 'function') {\n onSuccess(args);\n }\n }\n\n @action\n onError(\n args: HdsClipboardModifierSignature['Args']['Named']['onError']\n ): void {\n this._status = 'error';\n this.resetStatusDelayed();\n\n const { onError } = this.args;\n\n if (typeof onError === 'function') {\n onError(args);\n }\n }\n\n resetStatusDelayed(): void {\n clearTimeout(this._timer);\n // make it fade back to the default state\n this._timer = setTimeout((): void => {\n this._status = DEFAULT_STATUS;\n }, 1500);\n }\n}\n"],"names":["DEFAULT_SIZE","HdsCopyButtonSizeValues","Medium","SIZES","Object","values","DEFAULT_ICON","SUCCESS_ICON","ERROR_ICON","DEFAULT_STATUS","HdsCopyButton","Component","g","prototype","tracked","i","void 0","icon","_status","size","args","assert","join","includes","classNames","classes","push","onSuccess","resetStatusDelayed","n","action","onError","clearTimeout","_timer","setTimeout","setComponentTemplate","TEMPLATE"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/button/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 { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\n\nimport { HdsCopyButtonSizeValues } from './types.ts';\n\nimport type { HdsCopyButtonSizes } from './types.ts';\nimport type { HdsButtonSignature } from '../../button/';\nimport type { HdsClipboardModifierSignature } from '../../../../modifiers/hds-clipboard.ts';\nimport type { HdsIconSignature } from '../../icon';\nimport type HdsIntlService from '../../../../services/hds-intl';\n\nexport const DEFAULT_SIZE = HdsCopyButtonSizeValues.Medium;\nexport const SIZES: HdsCopyButtonSizes[] = Object.values(\n HdsCopyButtonSizeValues\n);\nexport const DEFAULT_ICON = 'clipboard-copy';\nexport const SUCCESS_ICON = 'clipboard-checked';\nexport const ERROR_ICON = 'clipboard-x';\nexport const DEFAULT_STATUS = 'idle';\n\nexport interface HdsCopyButtonSignature {\n Args: HdsButtonSignature['Args'] & {\n size?: HdsCopyButtonSizes;\n textToCopy?: HdsClipboardModifierSignature['Args']['Named']['text'];\n targetToCopy?: HdsClipboardModifierSignature['Args']['Named']['target'];\n onSuccess?: HdsClipboardModifierSignature['Args']['Named']['onSuccess'];\n onError?: HdsClipboardModifierSignature['Args']['Named']['onError'];\n ariaMessageText?: string;\n };\n Element: HdsButtonSignature['Element'];\n}\n\nexport default class HdsCopyButton extends Component<HdsCopyButtonSignature> {\n @service hdsIntl!: HdsIntlService;\n\n @tracked private _status = DEFAULT_STATUS;\n @tracked private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @param icon\n * @type {string}\n * @description The icon to be displayed for each status; automatically calculated based on the tracked property `status`.\n */\n get icon(): HdsIconSignature['Args']['name'] {\n let icon: HdsIconSignature['Args']['name'] = DEFAULT_ICON;\n if (this._status === 'success') {\n icon = SUCCESS_ICON;\n } else if (this._status === 'error') {\n icon = ERROR_ICON;\n }\n return icon;\n }\n\n /**\n * @param size\n * @type {string}\n * @default medium\n * @description The size of the copy/button; acceptable values are `small` and `medium`\n */\n get size(): HdsCopyButtonSizes {\n const { size = DEFAULT_SIZE } = this.args;\n\n assert(\n `@size for \"Hds::Copy::Button\" must be one of the following: ${SIZES.join(\n ', '\n )}; received: ${size}`,\n SIZES.includes(size)\n );\n\n return size;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method CopyButton#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-copy-button'];\n\n // add a class based on the @size argument\n classes.push(`hds-button--size-${this.size}`);\n\n classes.push(`hds-copy-button--status-${this._status}`);\n\n return classes.join(' ');\n }\n\n get ariaMessageText(): string {\n if (this._status === 'success') {\n return (\n this.args.ariaMessageText ??\n this.hdsIntl.t('hds.components.copy-button.aria-message-text', {\n default: 'Copied to clipboard',\n })\n );\n } else {\n return '';\n }\n }\n\n @action\n onSuccess(\n args: HdsClipboardModifierSignature['Args']['Named']['onSuccess']\n ): void {\n this._status = 'success';\n this.resetStatusDelayed();\n\n const { onSuccess } = this.args;\n\n if (typeof onSuccess === 'function') {\n onSuccess(args);\n }\n }\n\n @action\n onError(\n args: HdsClipboardModifierSignature['Args']['Named']['onError']\n ): void {\n this._status = 'error';\n this.resetStatusDelayed();\n\n const { onError } = this.args;\n\n if (typeof onError === 'function') {\n onError(args);\n }\n }\n\n resetStatusDelayed(): void {\n clearTimeout(this._timer);\n // make it fade back to the default state\n this._timer = setTimeout((): void => {\n this._status = DEFAULT_STATUS;\n }, 1500);\n }\n}\n"],"names":["DEFAULT_SIZE","HdsCopyButtonSizeValues","Medium","SIZES","Object","values","DEFAULT_ICON","SUCCESS_ICON","ERROR_ICON","DEFAULT_STATUS","HdsCopyButton","Component","g","prototype","service","i","void 0","tracked","icon","_status","size","args","assert","join","includes","classNames","classes","push","ariaMessageText","hdsIntl","t","default","onSuccess","resetStatusDelayed","n","action","onError","clearTimeout","_timer","setTimeout","setComponentTemplate","TEMPLATE"],"mappings":"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"}
@@ -2,7 +2,7 @@ import TemplateOnlyComponent from '@ember/component/template-only';
2
2
  import { precompileTemplate } from '@ember/template-compilation';
3
3
  import { setComponentTemplate } from '@ember/component';
4
4
 
5
- var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<div class=\"hds-dialog-primitive__body {{@contextualClass}}\" tabindex=\"0\" ...attributes>\n {{yield}}\n</div>");
5
+ var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<div class=\"hds-dialog-primitive__body {{@contextualClass}}\" tabindex=\"-1\" ...attributes>\n {{yield}}\n</div>");
6
6
 
7
7
  /**
8
8
  * Copyright (c) HashiCorp, Inc.
@@ -1,20 +1,21 @@
1
- import { isTesting } from '@embroider/macros';
1
+ import config from 'ember-get-config';
2
2
 
3
3
  /**
4
4
  * Copyright (c) HashiCorp, Inc.
5
5
  * SPDX-License-Identifier: MPL-2.0
6
6
  */
7
7
 
8
- async function initialize(appInstance) {
9
- const config = appInstance.resolveRegistration('config:environment');
10
- if (config.flightIconsSpriteLazyEmbed) {
8
+ async function initialize() {
9
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
10
+ if (config?.flightIconsSpriteLazyEmbed) {
11
11
  const {
12
12
  default: svgSprite
13
13
  } = await import('@hashicorp/flight-icons/svg-sprite/svg-sprite-module');
14
14
 
15
15
  // in test environments we can inject the sprite directly into the ember testing container
16
16
  // to avoid issues with tools like Percy that only consider content inside that element
17
- if (isTesting()) {
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
18
+ if (config.environment === 'test') {
18
19
  const container = window.document?.getElementById('ember-testing');
19
20
  if (container && !container.querySelector('.flight-sprite-container')) {
20
21
  container.insertAdjacentHTML('afterbegin', svgSprite);
@@ -1 +1 @@
1
- {"version":3,"file":"load-sprite.js","sources":["../../src/instance-initializers/load-sprite.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport { isTesting } from '@embroider/macros';\n\nimport type ApplicationInstance from '@ember/application/instance';\n\ninterface Config {\n flightIconsSpriteLazyEmbed?: boolean;\n}\n\nexport async function initialize(appInstance: ApplicationInstance) {\n const config = appInstance.resolveRegistration(\n 'config:environment'\n ) as Config;\n\n if (config.flightIconsSpriteLazyEmbed) {\n const { default: svgSprite } = await import(\n '@hashicorp/flight-icons/svg-sprite/svg-sprite-module'\n );\n\n // in test environments we can inject the sprite directly into the ember testing container\n // to avoid issues with tools like Percy that only consider content inside that element\n if (isTesting()) {\n const container = window.document?.getElementById('ember-testing');\n\n if (container && !container.querySelector('.flight-sprite-container')) {\n container.insertAdjacentHTML('afterbegin', svgSprite);\n }\n } else {\n const container = window.document?.body;\n\n if (container && !container.querySelector('.flight-sprite-container')) {\n container.insertAdjacentHTML('beforeend', svgSprite);\n }\n }\n }\n}\n\nexport default {\n initialize,\n};\n"],"names":["initialize","appInstance","config","resolveRegistration","flightIconsSpriteLazyEmbed","default","svgSprite","isTesting","container","window","document","getElementById","querySelector","insertAdjacentHTML","body"],"mappings":";;AAAA;AACA;AACA;AACA;;AAUO,eAAeA,UAAUA,CAACC,WAAgC,EAAE;AACjE,EAAA,MAAMC,MAAM,GAAGD,WAAW,CAACE,mBAAmB,CAC5C,oBACF,CAAW;EAEX,IAAID,MAAM,CAACE,0BAA0B,EAAE;IACrC,MAAM;AAAEC,MAAAA,OAAO,EAAEC;AAAU,KAAC,GAAG,MAAM,OACnC,sDACF,CAAC;;AAED;AACA;IACA,IAAIC,SAAS,EAAE,EAAE;MACf,MAAMC,SAAS,GAAGC,MAAM,CAACC,QAAQ,EAAEC,cAAc,CAAC,eAAe,CAAC;MAElE,IAAIH,SAAS,IAAI,CAACA,SAAS,CAACI,aAAa,CAAC,0BAA0B,CAAC,EAAE;AACrEJ,QAAAA,SAAS,CAACK,kBAAkB,CAAC,YAAY,EAAEP,SAAS,CAAC;AACvD,MAAA;AACF,IAAA,CAAC,MAAM;AACL,MAAA,MAAME,SAAS,GAAGC,MAAM,CAACC,QAAQ,EAAEI,IAAI;MAEvC,IAAIN,SAAS,IAAI,CAACA,SAAS,CAACI,aAAa,CAAC,0BAA0B,CAAC,EAAE;AACrEJ,QAAAA,SAAS,CAACK,kBAAkB,CAAC,WAAW,EAAEP,SAAS,CAAC;AACtD,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEA,iBAAe;AACbN,EAAAA;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"load-sprite.js","sources":["../../src/instance-initializers/load-sprite.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport config from 'ember-get-config';\n\nexport async function initialize() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (config?.flightIconsSpriteLazyEmbed) {\n const { default: svgSprite } = await import(\n '@hashicorp/flight-icons/svg-sprite/svg-sprite-module'\n );\n\n // in test environments we can inject the sprite directly into the ember testing container\n // to avoid issues with tools like Percy that only consider content inside that element\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (config.environment === 'test') {\n const container = window.document?.getElementById('ember-testing');\n\n if (container && !container.querySelector('.flight-sprite-container')) {\n container.insertAdjacentHTML('afterbegin', svgSprite);\n }\n } else {\n const container = window.document?.body;\n\n if (container && !container.querySelector('.flight-sprite-container')) {\n container.insertAdjacentHTML('beforeend', svgSprite);\n }\n }\n }\n}\n\nexport default {\n initialize,\n};\n"],"names":["initialize","config","flightIconsSpriteLazyEmbed","default","svgSprite","environment","container","window","document","getElementById","querySelector","insertAdjacentHTML","body"],"mappings":";;AAAA;AACA;AACA;AACA;;AAIO,eAAeA,UAAUA,GAAG;AACjC;EACA,IAAIC,MAAM,EAAEC,0BAA0B,EAAE;IACtC,MAAM;AAAEC,MAAAA,OAAO,EAAEC;AAAU,KAAC,GAAG,MAAM,OACnC,sDACF,CAAC;;AAED;AACA;AACA;AACA,IAAA,IAAIH,MAAM,CAACI,WAAW,KAAK,MAAM,EAAE;MACjC,MAAMC,SAAS,GAAGC,MAAM,CAACC,QAAQ,EAAEC,cAAc,CAAC,eAAe,CAAC;MAElE,IAAIH,SAAS,IAAI,CAACA,SAAS,CAACI,aAAa,CAAC,0BAA0B,CAAC,EAAE;AACrEJ,QAAAA,SAAS,CAACK,kBAAkB,CAAC,YAAY,EAAEP,SAAS,CAAC;AACvD,MAAA;AACF,IAAA,CAAC,MAAM;AACL,MAAA,MAAME,SAAS,GAAGC,MAAM,CAACC,QAAQ,EAAEI,IAAI;MAEvC,IAAIN,SAAS,IAAI,CAACA,SAAS,CAACI,aAAa,CAAC,0BAA0B,CAAC,EAAE;AACrEJ,QAAAA,SAAS,CAACK,kBAAkB,CAAC,WAAW,EAAEP,SAAS,CAAC;AACtD,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEA,iBAAe;AACbJ,EAAAA;AACF,CAAC;;;;"}
@@ -3,7 +3,7 @@ import Modifier from 'ember-modifier';
3
3
  import { assert, warn } from '@ember/debug';
4
4
  import { registerDestructor } from '@ember/destroyable';
5
5
  import 'ember-concurrency';
6
- import { macroCondition, isTesting } from '@embroider/macros';
6
+ import config from 'ember-get-config';
7
7
  import { Compartment } from '@codemirror/state';
8
8
  import { EditorView } from '@codemirror/view';
9
9
  import { guidFor } from '@ember/object/internals';
@@ -130,7 +130,8 @@ class HdsCodeEditorModifier extends Modifier {
130
130
  // if the editor does not exist, setup the editor
131
131
  else {
132
132
  // the intersection observer makes loading unreliable in tests
133
- if (macroCondition(isTesting())) {
133
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
134
+ if (config.environment === 'test') {
134
135
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
135
136
  this._setupTask.perform(element, positional, named);
136
137
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"hds-code-editor.js","sources":["../../src/modifiers/hds-code-editor.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\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]: () => void;\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 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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n language,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n isLintingEnabled,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\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 = [\n lineWrappingExtension,\n bracketMatching(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n // custom extensions\n handleUpdateExtension,\n // hds dark theme\n hdsDarkTheme,\n syntaxHighlighting(hdsDarkHighlightStyle),\n ];\n\n if (extraKeys !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const nonce = cspNonce ?? getCSPNonceFromMeta();\n\n if (nonce !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\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 onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'language'\n | 'extraKeys'\n | 'value'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\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 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 } = 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 });\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","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 (c) HashiCorp, Inc.\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 config from 'ember-get-config';\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]: () => void;\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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (config.environment === 'test') {\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 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n language,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n isLintingEnabled,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\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 = [\n lineWrappingExtension,\n bracketMatching(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n // custom extensions\n handleUpdateExtension,\n // hds dark theme\n hdsDarkTheme,\n syntaxHighlighting(hdsDarkHighlightStyle),\n ];\n\n if (extraKeys !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const nonce = cspNonce ?? getCSPNonceFromMeta();\n\n if (nonce !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\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 onLint,\n }: Pick<\n HdsCodeEditorSignature['Args']['Named'],\n | 'cspNonce'\n | 'language'\n | 'extraKeys'\n | 'value'\n | 'hasLineWrapping'\n | 'isLintingEnabled'\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 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 } = 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 });\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","config","environment","_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","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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"}
@@ -1926,8 +1926,10 @@
1926
1926
 
1927
1927
  .hds-app-footer__copyright {
1928
1928
  display: flex;
1929
+ flex-wrap: wrap;
1929
1930
  gap: 6px;
1930
1931
  align-items: center;
1932
+ justify-content: center;
1931
1933
  color: var(--app-footer-copyright-text-color);
1932
1934
  }
1933
1935
  .hds-app-footer__copyright .hds-icon {
@@ -5384,6 +5386,7 @@ button.hds-button[href]::after {
5384
5386
  * SPDX-License-Identifier: MPL-2.0
5385
5387
  */
5386
5388
  .hds-form-file-input {
5389
+ width: 100%;
5387
5390
  margin: -4px 0 -4px -4px;
5388
5391
  padding: 3px 0 3px 3px;
5389
5392
  color: var(--token-color-foreground-primary);
@@ -108,9 +108,12 @@ $hds-app-footer-icon-text-gap: 6px;
108
108
  }
109
109
 
110
110
  .hds-app-footer__copyright {
111
+ // Allow content to wrap and center in smaller viewports
111
112
  display: flex;
113
+ flex-wrap: wrap;
112
114
  gap: $hds-app-footer-icon-text-gap;
113
115
  align-items: center;
116
+ justify-content: center;
114
117
  color: var(--app-footer-copyright-text-color);
115
118
 
116
119
  .hds-icon {
@@ -10,6 +10,7 @@
10
10
  @use "../../mixins/button" as *;
11
11
 
12
12
  .hds-form-file-input {
13
+ width: 100%; // we want to prevent the input from overflowing its container
13
14
  margin: -4px 0 -4px -4px; // offset shadow padding + default 1px spacing
14
15
  padding: 3px 0 3px 3px; // add padding so button shadow is visible
15
16
  color: var(--token-color-foreground-primary);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hashicorp/design-system-components",
3
- "version": "5.0.0-rc-20251017112839",
3
+ "version": "5.0.0-rc-20251027005635",
4
4
  "description": "Helios Design System Components",
5
5
  "keywords": [
6
6
  "hashicorp",
@@ -36,7 +36,7 @@
36
36
  "@embroider/util": "^1.13.4",
37
37
  "@floating-ui/dom": "^1.6.12",
38
38
  "@hashicorp/design-system-tokens": "^3.0.0",
39
- "@hashicorp/flight-icons": "4.0.0-rc-20251017112839",
39
+ "@hashicorp/flight-icons": "4.0.0-rc-20251027005635",
40
40
  "@lezer/highlight": "^1.2.1",
41
41
  "@nullvoxpopuli/ember-composable-helpers": "^5.2.11",
42
42
  "clipboard-polyfill": "^4.1.1",
@@ -46,6 +46,7 @@
46
46
  "ember-concurrency": "^4.0.4",
47
47
  "ember-element-helper": "^0.8.6",
48
48
  "ember-focus-trap": "^1.1.1",
49
+ "ember-get-config": "^2.1.1",
49
50
  "ember-modifier": "^4.2.2",
50
51
  "ember-power-select": "^8.7.1",
51
52
  "ember-stargate": "^1.0.2",
@@ -1 +1 @@
1
- copyright-text: "© {year} HashiCorp"
1
+ copyright-text: "© {year} HashiCorp, an IBM Company"
@@ -0,0 +1 @@
1
+ aria-message-text: Copied to clipboard