@hashicorp/design-system-components 5.2.0-rc-20260107211222 → 5.2.0-rc-20260108162959
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/declarations/components/hds/theme-context/index.d.ts +24 -0
- package/declarations/components/hds/theme-context/types.d.ts +19 -0
- package/declarations/components/hds/theme-switcher/index.d.ts +43 -0
- package/declarations/components.d.ts +2 -0
- package/declarations/services/hds-intl.d.ts +4 -3
- package/declarations/services/hds-theming.d.ts +57 -0
- package/declarations/services.d.ts +1 -0
- package/declarations/template-registry.d.ts +6 -0
- package/dist/_app_/components/hds/theme-context.js +1 -0
- package/dist/_app_/components/hds/theme-switcher.js +1 -0
- package/dist/_app_/services/hds-theming.js +1 -0
- package/dist/components/hds/advanced-table/index.js.map +1 -1
- package/dist/components/hds/advanced-table/models/column.js.map +1 -1
- package/dist/components/hds/advanced-table/models/row.js.map +1 -1
- package/dist/components/hds/advanced-table/models/table.js.map +1 -1
- package/dist/components/hds/advanced-table/td.js.map +1 -1
- package/dist/components/hds/advanced-table/th-context-menu.js.map +1 -1
- package/dist/components/hds/advanced-table/th-reorder-drop-target.js.map +1 -1
- package/dist/components/hds/advanced-table/th-resize-handle.js.map +1 -1
- package/dist/components/hds/advanced-table/th-selectable.js.map +1 -1
- package/dist/components/hds/advanced-table/th-sort.js.map +1 -1
- package/dist/components/hds/advanced-table/th.js.map +1 -1
- package/dist/components/hds/alert/index.js.map +1 -1
- package/dist/components/hds/app-header/index.js.map +1 -1
- package/dist/components/hds/app-side-nav/index.js.map +1 -1
- package/dist/components/hds/app-side-nav/list/index.js.map +1 -1
- package/dist/components/hds/app-side-nav/portal/target.js.map +1 -1
- package/dist/components/hds/breadcrumb/item.js.map +1 -1
- package/dist/components/hds/code-block/index.js.map +1 -1
- package/dist/components/hds/code-editor/index.js.map +1 -1
- package/dist/components/hds/copy/button/index.js.map +1 -1
- package/dist/components/hds/copy/snippet/index.js.map +1 -1
- package/dist/components/hds/disclosure-primitive/index.js.map +1 -1
- package/dist/components/hds/dismiss-button/index.js.map +1 -1
- package/dist/components/hds/dropdown/toggle/icon.js.map +1 -1
- package/dist/components/hds/flyout/index.js.map +1 -1
- package/dist/components/hds/form/key-value-inputs/index.js.map +1 -1
- package/dist/components/hds/form/masked-input/base.js.map +1 -1
- package/dist/components/hds/form/super-select/multiple/base.js.map +1 -1
- package/dist/components/hds/form/super-select/single/base.js.map +1 -1
- package/dist/components/hds/form/text-input/field.js.map +1 -1
- package/dist/components/hds/interactive/index.js.map +1 -1
- package/dist/components/hds/modal/index.js.map +1 -1
- package/dist/components/hds/pagination/compact/index.js.map +1 -1
- package/dist/components/hds/pagination/info/index.js.map +1 -1
- package/dist/components/hds/pagination/numbered/index.js.map +1 -1
- package/dist/components/hds/popover-primitive/index.js.map +1 -1
- package/dist/components/hds/side-nav/index.js.map +1 -1
- package/dist/components/hds/side-nav/list/index.js.map +1 -1
- package/dist/components/hds/side-nav/portal/target.js.map +1 -1
- package/dist/components/hds/stepper/list/index.js.map +1 -1
- package/dist/components/hds/stepper/nav/index.js.map +1 -1
- package/dist/components/hds/table/index.js.map +1 -1
- package/dist/components/hds/table/th-button-sort.js.map +1 -1
- package/dist/components/hds/table/th-selectable.js.map +1 -1
- package/dist/components/hds/tabs/index.js.map +1 -1
- package/dist/components/hds/tag/index.js.map +1 -1
- package/dist/components/hds/theme-context/index.js +45 -0
- package/dist/components/hds/theme-context/index.js.map +1 -0
- package/dist/components/hds/theme-context/types.js +27 -0
- package/dist/components/hds/theme-context/types.js.map +1 -0
- package/dist/components/hds/theme-switcher/index.js +100 -0
- package/dist/components/hds/theme-switcher/index.js.map +1 -0
- package/dist/components/hds/time/index.js.map +1 -1
- package/dist/components/hds/time/range.js.map +1 -1
- package/dist/components.js +2 -0
- package/dist/components.js.map +1 -1
- package/dist/helpers/hds-t.js.map +1 -1
- package/dist/modifiers/hds-code-editor.js.map +1 -1
- package/dist/services/hds-intl.js.map +1 -1
- package/dist/services/hds-theming.js +214 -0
- package/dist/services/hds-theming.js.map +1 -0
- package/dist/services/hds-time.js.map +1 -1
- package/dist/services.js +1 -1
- package/dist/styles/@hashicorp/design-system-components-common.css +9588 -0
- package/dist/styles/@hashicorp/design-system-components-common.css.map +1 -0
- package/dist/styles/@hashicorp/design-system-components-common.scss +24 -0
- package/dist/styles/@hashicorp/design-system-components.css +501 -320
- package/dist/styles/@hashicorp/design-system-components.css.map +1 -0
- package/dist/styles/@hashicorp/design-system-components.scss +4 -62
- package/dist/styles/@hashicorp/design-system-power-select-overrides.css +229 -0
- package/dist/styles/@hashicorp/design-system-power-select-overrides.css.map +1 -0
- package/dist/styles/components/badge-count.scss +26 -76
- package/dist/styles/components/badge.scss +26 -131
- package/dist/styles/components/button.scss +5 -0
- package/dist/styles/components/dropdown.scss +3 -5
- package/dist/styles/components/form/file-input.scss +2 -2
- package/dist/styles/components/form/key-value-inputs.scss +2 -4
- package/dist/styles/components/index.scss +52 -0
- package/dist/styles/components/theme-context.scss +12 -0
- package/dist/styles/mixins/_button.scss +82 -129
- package/dist/styles/mixins/_carbonization.scss +31 -0
- package/dist/styles/mixins/_interactive-dark-theme.scss +1 -1
- package/dist/utils/hds-aria-described-by.js.map +1 -1
- package/package.json +10 -6
- package/dist/styles/@hashicorp/design-system-components.scss.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/alert/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\n\nimport { HdsAlertColorValues, HdsAlertTypeValues } from './types.ts';\n\nimport type { ComponentLike, WithBoundArgs } from '@glint/template';\nimport type HdsButtonComponent from '../button';\nimport type HdsLinkStandaloneComponent from '../link/standalone';\nimport type { HdsYieldSignature } from '../yield';\nimport type { HdsAlertColors, HdsAlertTypes } from './types.ts';\nimport type { HdsAlertTitleSignature } from './title.ts';\nimport type { HdsAlertDescriptionSignature } from './description.ts';\nimport type { HdsIconSignature } from '../icon';\nimport type Owner from '@ember/owner';\n\nexport const TYPES: HdsAlertTypes[] = Object.values(HdsAlertTypeValues);\nexport const DEFAULT_COLOR: HdsAlertColors = HdsAlertColorValues.Neutral;\nexport const COLORS: HdsAlertColors[] = Object.values(HdsAlertColorValues);\n\nexport const MAPPING_COLORS_TO_ICONS = {\n [HdsAlertColorValues.Neutral]: 'info',\n [HdsAlertColorValues.Highlight]: 'info',\n [HdsAlertColorValues.Success]: 'check-circle',\n [HdsAlertColorValues.Warning]: 'alert-triangle',\n [HdsAlertColorValues.Critical]: 'alert-diamond',\n} as const;\n\nconst CONTENT_ELEMENT_SELECTOR = '.hds-alert__content';\nconst TITLE_ELEMENT_SELECTOR = '.hds-alert__title';\nconst DESCRIPTION_ELEMENT_SELECTOR = '.hds-alert__description';\n\nexport interface HdsAlertSignature {\n Args: {\n type: HdsAlertTypes;\n color?: HdsAlertColors;\n icon?: HdsIconSignature['Args']['name'] | false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onDismiss?: (event: MouseEvent, ...args: any[]) => void;\n };\n Blocks: {\n default: [\n {\n Title?: ComponentLike<HdsAlertTitleSignature>;\n Description?: ComponentLike<HdsAlertDescriptionSignature>;\n Generic?: ComponentLike<HdsYieldSignature>;\n LinkStandalone?: WithBoundArgs<\n typeof HdsLinkStandaloneComponent,\n 'size'\n >;\n Button?: WithBoundArgs<typeof HdsButtonComponent, 'size'>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAlert extends Component<HdsAlertSignature> {\n @tracked private _role?: string;\n @tracked private _ariaLabelledBy?: string;\n\n constructor(owner: Owner, args: HdsAlertSignature['Args']) {\n super(owner, args);\n\n assert(\n `@type for \"Hds::Alert\" must be one of the following: ${TYPES.join(\n ', '\n )}; received: ${this.args.type}`,\n TYPES.includes(this.args.type)\n );\n }\n\n // Determines the color scheme for the alert.\n get color(): HdsAlertColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Alert\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n // The name of the icon to be used.\n get icon(): HdsIconSignature['Args']['name'] | false {\n const { icon } = this.args;\n\n // If `icon` isn't passed, use the pre-defined one from `color`\n if (icon === undefined) {\n if (this.args.type === 'compact') {\n // for the \"compact\" type by default we use filled icons\n return `${MAPPING_COLORS_TO_ICONS[this.color]}-fill`;\n } else {\n // for all the other types by default we use outlined icons\n return MAPPING_COLORS_TO_ICONS[this.color];\n }\n // If `icon` is set explicitly to false, user doesn't want any icon in the alert\n } else if (icon === false) {\n assert(\n `@icon for \"Hds::Alert\" with @type \"compact\" is required`,\n this.args.type !== 'compact'\n );\n\n return false;\n } else {\n // If a name for `icon` is passed, set HdsIcon to that name\n return icon;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get onDismiss(): ((event: MouseEvent, ...args: any[]) => void) | false {\n const { onDismiss } = this.args;\n\n if (typeof onDismiss === 'function') {\n return onDismiss;\n } else {\n return false;\n }\n }\n\n // Ensures that the correct icon size is used. Automatically calculated.\n get iconSize(): HdsIconSignature['Args']['size'] {\n if (this.args.type === 'compact') {\n return '16';\n } else {\n return '24';\n }\n }\n\n get classNames(): string {\n const classes = ['hds-alert'];\n\n // Add a class based on the @type argument\n classes.push(`hds-alert--type-${this.args.type}`);\n\n // Add a class based on the @color argument\n classes.push(`hds-alert--color-${this.color}`);\n\n return classes.join(' ');\n }\n\n @action\n didInsert(element: HTMLDivElement): void {\n const actions = element.querySelectorAll(\n `${CONTENT_ELEMENT_SELECTOR} button, ${CONTENT_ELEMENT_SELECTOR} a`\n );\n\n // an Alert which actually alerts users (has role=\"alert\" & aria-live=\"polite\") as opposed to an informational or promo \"alert\"\n const isSemanticAlert: boolean =\n this.color === 'warning' ||\n this.color === 'critical' ||\n this.color === 'success';\n\n if (isSemanticAlert && actions.length) {\n this._role = 'alertdialog';\n } else if (isSemanticAlert) {\n this._role = 'alert';\n }\n\n // `alertdialog` must have an accessible name so we use either the\n // title or the description as label for the alert\n const label =\n element.querySelector(TITLE_ELEMENT_SELECTOR) ||\n element.querySelector(DESCRIPTION_ELEMENT_SELECTOR);\n if (label) {\n const labelId = label.getAttribute('id') || guidFor(element);\n label.setAttribute('id', labelId);\n this._ariaLabelledBy = labelId;\n }\n }\n}\n"],"names":["TYPES","Object","values","HdsAlertTypeValues","DEFAULT_COLOR","HdsAlertColorValues","Neutral","COLORS","MAPPING_COLORS_TO_ICONS","Highlight","Success","Warning","Critical","CONTENT_ELEMENT_SELECTOR","TITLE_ELEMENT_SELECTOR","DESCRIPTION_ELEMENT_SELECTOR","HdsAlert","Component","g","prototype","tracked","i","constructor","owner","args","assert","join","type","includes","color","icon","undefined","onDismiss","iconSize","classNames","classes","push","didInsert","element","actions","querySelectorAll","isSemanticAlert","length","_role","label","querySelector","labelId","getAttribute","guidFor","setAttribute","_ariaLabelledBy","n","action","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/alert/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\n\nimport { HdsAlertColorValues, HdsAlertTypeValues } from './types.ts';\n\nimport type { ComponentLike, WithBoundArgs } from '@glint/template';\nimport type HdsButtonComponent from '../button';\nimport type HdsLinkStandaloneComponent from '../link/standalone';\nimport type { HdsYieldSignature } from '../yield';\nimport type { HdsAlertColors, HdsAlertTypes } from './types.ts';\nimport type { HdsAlertTitleSignature } from './title.ts';\nimport type { HdsAlertDescriptionSignature } from './description.ts';\nimport type { HdsIconSignature } from '../icon';\nimport type Owner from '@ember/owner';\n\nexport const TYPES: HdsAlertTypes[] = Object.values(HdsAlertTypeValues);\nexport const DEFAULT_COLOR: HdsAlertColors = HdsAlertColorValues.Neutral;\nexport const COLORS: HdsAlertColors[] = Object.values(HdsAlertColorValues);\n\nexport const MAPPING_COLORS_TO_ICONS = {\n [HdsAlertColorValues.Neutral]: 'info',\n [HdsAlertColorValues.Highlight]: 'info',\n [HdsAlertColorValues.Success]: 'check-circle',\n [HdsAlertColorValues.Warning]: 'alert-triangle',\n [HdsAlertColorValues.Critical]: 'alert-diamond',\n} as const;\n\nconst CONTENT_ELEMENT_SELECTOR = '.hds-alert__content';\nconst TITLE_ELEMENT_SELECTOR = '.hds-alert__title';\nconst DESCRIPTION_ELEMENT_SELECTOR = '.hds-alert__description';\n\nexport interface HdsAlertSignature {\n Args: {\n type: HdsAlertTypes;\n color?: HdsAlertColors;\n icon?: HdsIconSignature['Args']['name'] | false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onDismiss?: (event: MouseEvent, ...args: any[]) => void;\n };\n Blocks: {\n default: [\n {\n Title?: ComponentLike<HdsAlertTitleSignature>;\n Description?: ComponentLike<HdsAlertDescriptionSignature>;\n Generic?: ComponentLike<HdsYieldSignature>;\n LinkStandalone?: WithBoundArgs<\n typeof HdsLinkStandaloneComponent,\n 'size'\n >;\n Button?: WithBoundArgs<typeof HdsButtonComponent, 'size'>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAlert extends Component<HdsAlertSignature> {\n @tracked private _role?: string;\n @tracked private _ariaLabelledBy?: string;\n\n constructor(owner: Owner, args: HdsAlertSignature['Args']) {\n super(owner, args);\n\n assert(\n `@type for \"Hds::Alert\" must be one of the following: ${TYPES.join(\n ', '\n )}; received: ${this.args.type}`,\n TYPES.includes(this.args.type)\n );\n }\n\n // Determines the color scheme for the alert.\n get color(): HdsAlertColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Alert\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n // The name of the icon to be used.\n get icon(): HdsIconSignature['Args']['name'] | false {\n const { icon } = this.args;\n\n // If `icon` isn't passed, use the pre-defined one from `color`\n if (icon === undefined) {\n if (this.args.type === 'compact') {\n // for the \"compact\" type by default we use filled icons\n return `${MAPPING_COLORS_TO_ICONS[this.color]}-fill`;\n } else {\n // for all the other types by default we use outlined icons\n return MAPPING_COLORS_TO_ICONS[this.color];\n }\n // If `icon` is set explicitly to false, user doesn't want any icon in the alert\n } else if (icon === false) {\n assert(\n `@icon for \"Hds::Alert\" with @type \"compact\" is required`,\n this.args.type !== 'compact'\n );\n\n return false;\n } else {\n // If a name for `icon` is passed, set HdsIcon to that name\n return icon;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get onDismiss(): ((event: MouseEvent, ...args: any[]) => void) | false {\n const { onDismiss } = this.args;\n\n if (typeof onDismiss === 'function') {\n return onDismiss;\n } else {\n return false;\n }\n }\n\n // Ensures that the correct icon size is used. Automatically calculated.\n get iconSize(): HdsIconSignature['Args']['size'] {\n if (this.args.type === 'compact') {\n return '16';\n } else {\n return '24';\n }\n }\n\n get classNames(): string {\n const classes = ['hds-alert'];\n\n // Add a class based on the @type argument\n classes.push(`hds-alert--type-${this.args.type}`);\n\n // Add a class based on the @color argument\n classes.push(`hds-alert--color-${this.color}`);\n\n return classes.join(' ');\n }\n\n @action\n didInsert(element: HTMLDivElement): void {\n const actions = element.querySelectorAll(\n `${CONTENT_ELEMENT_SELECTOR} button, ${CONTENT_ELEMENT_SELECTOR} a`\n );\n\n // an Alert which actually alerts users (has role=\"alert\" & aria-live=\"polite\") as opposed to an informational or promo \"alert\"\n const isSemanticAlert: boolean =\n this.color === 'warning' ||\n this.color === 'critical' ||\n this.color === 'success';\n\n if (isSemanticAlert && actions.length) {\n this._role = 'alertdialog';\n } else if (isSemanticAlert) {\n this._role = 'alert';\n }\n\n // `alertdialog` must have an accessible name so we use either the\n // title or the description as label for the alert\n const label =\n element.querySelector(TITLE_ELEMENT_SELECTOR) ||\n element.querySelector(DESCRIPTION_ELEMENT_SELECTOR);\n if (label) {\n const labelId = label.getAttribute('id') || guidFor(element);\n label.setAttribute('id', labelId);\n this._ariaLabelledBy = labelId;\n }\n }\n}\n"],"names":["TYPES","Object","values","HdsAlertTypeValues","DEFAULT_COLOR","HdsAlertColorValues","Neutral","COLORS","MAPPING_COLORS_TO_ICONS","Highlight","Success","Warning","Critical","CONTENT_ELEMENT_SELECTOR","TITLE_ELEMENT_SELECTOR","DESCRIPTION_ELEMENT_SELECTOR","HdsAlert","Component","g","prototype","tracked","i","void 0","constructor","owner","args","assert","join","type","includes","color","icon","undefined","onDismiss","iconSize","classNames","classes","push","didInsert","element","actions","querySelectorAll","isSemanticAlert","length","_role","label","querySelector","labelId","getAttribute","guidFor","setAttribute","_ariaLabelledBy","n","action","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-header/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\nimport type { NavigationNarratorSignature } from 'ember-a11y-refocus/components/navigation-narrator';\n\nimport { hdsBreakpoints } from '../../../utils/hds-breakpoints.ts';\n\nexport interface HdsAppHeaderSignature {\n Args: {\n breakpoint?: string;\n hasA11yRefocus?: boolean;\n a11yRefocusSkipTo?: string;\n a11yRefocusSkipText?: string;\n a11yRefocusNavigationText?: string;\n a11yRefocusRouteChangeValidator?: NavigationNarratorSignature['Args']['routeChangeValidator'];\n a11yRefocusExcludeAllQueryParams?: boolean;\n };\n Blocks: {\n logo?: [\n {\n close: () => void;\n },\n ];\n globalActions?: [\n {\n close: () => void;\n },\n ];\n utilityActions?: [\n {\n close: () => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppHeader extends Component<HdsAppHeaderSignature> {\n @tracked private _isOpen = false;\n @tracked private _isDesktop = true;\n @tracked private _hasOverflowContent = false;\n private _desktopMQ: MediaQueryList;\n hasA11yRefocus = this.args.hasA11yRefocus ?? true;\n a11yRefocusSkipTo = '#' + (this.args.a11yRefocusSkipTo ?? 'hds-main');\n\n // Generates a unique ID for the Menu Content\n private _menuContentId = 'hds-menu-content-' + guidFor(this);\n\n // we use the `md` breakpoint for `desktop` viewports, but consumers can override its value\n private _desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['md'].px;\n\n constructor(owner: Owner, args: Record<string, never>) {\n super(owner, args);\n this._desktopMQ = window.matchMedia(`(min-width: ${this._desktopMQVal})`);\n this.addEventListeners();\n registerDestructor(this, (): void => {\n this.removeEventListeners();\n });\n }\n\n addEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.addEventListener('keydown', this.escapePress, true);\n this._desktopMQ.addEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n\n // set initial state based on viewport using a \"synthetic\" event\n const syntheticEvent = new MediaQueryListEvent('change', {\n matches: this._desktopMQ.matches,\n media: this._desktopMQ.media,\n });\n this.updateDesktopVariable(syntheticEvent);\n }\n\n removeEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.removeEventListener('keydown', this.escapePress, true);\n this._desktopMQ.removeEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n }\n\n // In mobile view when the menu is open, trap focus within the AppHeader\n get shouldTrapFocus(): boolean {\n return !this._isDesktop && this._isOpen;\n }\n\n // Get the class names to apply to the component.\n get classNames(): string {\n const classes = ['hds-app-header'];\n\n if (this._isDesktop) {\n classes.push('hds-app-header--is-desktop');\n } else {\n classes.push('hds-app-header--is-mobile');\n\n // open and closed menu states are only relevant on mobile\n if (this._isOpen) {\n classes.push('hds-app-header--menu-is-open');\n } else {\n classes.push('hds-app-header--menu-is-closed');\n }\n }\n\n return classes.join(' ');\n }\n\n @action\n escapePress(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isOpen && !this._isDesktop) {\n this._isOpen = false;\n }\n }\n\n @action\n onClickToggle(): void {\n this._isOpen = !this._isOpen;\n }\n\n @action close(): void {\n if (this._isOpen && !this._isDesktop) {\n this._isOpen = false;\n }\n }\n\n @action\n updateDesktopVariable(event: MediaQueryListEvent): void {\n this._isDesktop = event.matches;\n\n // Close the menu when switching to desktop view\n // (prevents menu from being open when resizing which causes Skip button to not render)\n if (this._isDesktop) {\n this._isOpen = false;\n }\n }\n}\n"],"names":["HdsAppHeader","Component","g","prototype","tracked","i","_desktopMQ","hasA11yRefocus","args","a11yRefocusSkipTo","_menuContentId","guidFor","_desktopMQVal","breakpoint","hdsBreakpoints","px","constructor","owner","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","document","addEventListener","escapePress","updateDesktopVariable","syntheticEvent","MediaQueryListEvent","matches","media","removeEventListener","shouldTrapFocus","_isDesktop","_isOpen","classNames","classes","push","join","event","key","n","action","onClickToggle","close","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AA0Ce,MAAMA,YAAY,SAASC,SAAS,CAAwB;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CACxEC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAmB,KAAK;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,QAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-header/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\nimport type { NavigationNarratorSignature } from 'ember-a11y-refocus/components/navigation-narrator';\n\nimport { hdsBreakpoints } from '../../../utils/hds-breakpoints.ts';\n\nexport interface HdsAppHeaderSignature {\n Args: {\n breakpoint?: string;\n hasA11yRefocus?: boolean;\n a11yRefocusSkipTo?: string;\n a11yRefocusSkipText?: string;\n a11yRefocusNavigationText?: string;\n a11yRefocusRouteChangeValidator?: NavigationNarratorSignature['Args']['routeChangeValidator'];\n a11yRefocusExcludeAllQueryParams?: boolean;\n };\n Blocks: {\n logo?: [\n {\n close: () => void;\n },\n ];\n globalActions?: [\n {\n close: () => void;\n },\n ];\n utilityActions?: [\n {\n close: () => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppHeader extends Component<HdsAppHeaderSignature> {\n @tracked private _isOpen = false;\n @tracked private _isDesktop = true;\n @tracked private _hasOverflowContent = false;\n private _desktopMQ: MediaQueryList;\n hasA11yRefocus = this.args.hasA11yRefocus ?? true;\n a11yRefocusSkipTo = '#' + (this.args.a11yRefocusSkipTo ?? 'hds-main');\n\n // Generates a unique ID for the Menu Content\n private _menuContentId = 'hds-menu-content-' + guidFor(this);\n\n // we use the `md` breakpoint for `desktop` viewports, but consumers can override its value\n private _desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['md'].px;\n\n constructor(owner: Owner, args: Record<string, never>) {\n super(owner, args);\n this._desktopMQ = window.matchMedia(`(min-width: ${this._desktopMQVal})`);\n this.addEventListeners();\n registerDestructor(this, (): void => {\n this.removeEventListeners();\n });\n }\n\n addEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.addEventListener('keydown', this.escapePress, true);\n this._desktopMQ.addEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n\n // set initial state based on viewport using a \"synthetic\" event\n const syntheticEvent = new MediaQueryListEvent('change', {\n matches: this._desktopMQ.matches,\n media: this._desktopMQ.media,\n });\n this.updateDesktopVariable(syntheticEvent);\n }\n\n removeEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.removeEventListener('keydown', this.escapePress, true);\n this._desktopMQ.removeEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n }\n\n // In mobile view when the menu is open, trap focus within the AppHeader\n get shouldTrapFocus(): boolean {\n return !this._isDesktop && this._isOpen;\n }\n\n // Get the class names to apply to the component.\n get classNames(): string {\n const classes = ['hds-app-header'];\n\n if (this._isDesktop) {\n classes.push('hds-app-header--is-desktop');\n } else {\n classes.push('hds-app-header--is-mobile');\n\n // open and closed menu states are only relevant on mobile\n if (this._isOpen) {\n classes.push('hds-app-header--menu-is-open');\n } else {\n classes.push('hds-app-header--menu-is-closed');\n }\n }\n\n return classes.join(' ');\n }\n\n @action\n escapePress(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isOpen && !this._isDesktop) {\n this._isOpen = false;\n }\n }\n\n @action\n onClickToggle(): void {\n this._isOpen = !this._isOpen;\n }\n\n @action close(): void {\n if (this._isOpen && !this._isDesktop) {\n this._isOpen = false;\n }\n }\n\n @action\n updateDesktopVariable(event: MediaQueryListEvent): void {\n this._isDesktop = event.matches;\n\n // Close the menu when switching to desktop view\n // (prevents menu from being open when resizing which causes Skip button to not render)\n if (this._isDesktop) {\n this._isOpen = false;\n }\n }\n}\n"],"names":["HdsAppHeader","Component","g","prototype","tracked","i","void 0","_desktopMQ","hasA11yRefocus","args","a11yRefocusSkipTo","_menuContentId","guidFor","_desktopMQVal","breakpoint","hdsBreakpoints","px","constructor","owner","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","document","addEventListener","escapePress","updateDesktopVariable","syntheticEvent","MediaQueryListEvent","matches","media","removeEventListener","shouldTrapFocus","_isDesktop","_isOpen","classNames","classes","push","join","event","key","n","action","onClickToggle","close","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-side-nav/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\nimport { modifier } from 'ember-modifier';\n\nimport { hdsBreakpoints } from '../../../utils/hds-breakpoints.ts';\n\nexport interface HdsAppSideNavSignature {\n Args: {\n isResponsive?: boolean;\n isCollapsible?: boolean;\n isMinimized?: boolean;\n breakpoint?: string;\n onToggleMinimizedStatus?: (arg: boolean) => void;\n onDesktopViewportChange?: (arg: boolean) => void;\n };\n Blocks: {\n default?: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppSideNav extends Component<HdsAppSideNavSignature> {\n @tracked private _isMinimized;\n @tracked private _isAnimating = false;\n @tracked private _isDesktop = true;\n\n private _body!: HTMLElement;\n private _bodyInitialOverflowValue = '';\n private _desktopMQ: MediaQueryList;\n private _navWrapperBody!: HTMLElement;\n\n // we use the `lg` breakpoint for `desktop` viewports, but consumers can override its value\n private _desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['lg'].px;\n\n constructor(owner: Owner, args: HdsAppSideNavSignature['Args']) {\n super(owner, args);\n this._isMinimized = this.args.isMinimized ?? false; // sets the default state on 'desktop' viewports\n this._desktopMQ = window.matchMedia(`(min-width:${this._desktopMQVal})`);\n this.addEventListeners();\n registerDestructor(this, (): void => {\n this.removeEventListeners();\n });\n }\n\n private _setUpBodyElement = modifier((): void => {\n this._body = document.body;\n // Store the initial `overflow` value of `<body>` so we can reset to it\n this._bodyInitialOverflowValue =\n this._body.style.getPropertyValue('overflow');\n });\n\n private _setUpNavWrapperBody = modifier((element: HTMLElement) => {\n this._navWrapperBody = element;\n });\n\n addEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.addEventListener('keydown', this.escapePress, true);\n this._desktopMQ.addEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n // if not instantiated as minimized via arguments\n if (!this.args.isMinimized) {\n // set initial state based on viewport using a \"synthetic\" event\n const syntheticEvent = new MediaQueryListEvent('change', {\n matches: this._desktopMQ.matches,\n media: this._desktopMQ.media,\n });\n this.updateDesktopVariable(syntheticEvent);\n }\n }\n\n removeEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.removeEventListener('keydown', this.escapePress, true);\n this._desktopMQ.removeEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n }\n\n // controls if the component reacts to viewport changes\n get isResponsive(): boolean {\n return this.args.isResponsive ?? true;\n }\n\n // controls if users can collapse the appsidenav on 'desktop' viewports\n get isCollapsible(): boolean {\n return this.args.isCollapsible ?? false;\n }\n\n // traps focus if isResponsive is enabled and it's in mobile view with side nav expanded (overlaying content)\n get shouldTrapFocus(): boolean {\n return this.isResponsive && !this._isDesktop && !this._isMinimized;\n }\n\n get showToggleButton(): boolean {\n return (this.isResponsive && !this._isDesktop) || this.isCollapsible;\n }\n\n get classNames(): string {\n const classes = [`hds-app-side-nav`];\n\n // add specific class names for the different possible states\n if (this.isResponsive) {\n classes.push('hds-app-side-nav--is-responsive');\n }\n if (!this._isDesktop && this.isResponsive) {\n classes.push('hds-app-side-nav--is-mobile');\n } else {\n classes.push('hds-app-side-nav--is-desktop');\n }\n if (this._isMinimized && this.isResponsive) {\n classes.push('hds-app-side-nav--is-minimized');\n } else {\n classes.push('hds-app-side-nav--is-not-minimized');\n }\n if (this._isAnimating) {\n classes.push('hds-app-side-nav--is-animating');\n }\n\n return classes.join(' ');\n }\n\n synchronizeInert(): void {\n if (this._isMinimized) {\n this._navWrapperBody?.setAttribute('inert', '');\n } else {\n this._navWrapperBody?.removeAttribute('inert');\n }\n }\n\n lockBodyScroll(): void {\n if (this._body) {\n // Prevent page from scrolling when the dialog is open\n this._body.style.setProperty('overflow', 'hidden');\n }\n }\n\n unlockBodyScroll(): void {\n // Reset page `overflow` property\n if (this._body) {\n this._body.style.removeProperty('overflow');\n if (this._bodyInitialOverflowValue === '') {\n if (this._body.style.length === 0) {\n this._body.removeAttribute('style');\n }\n } else {\n this._body.style.setProperty(\n 'overflow',\n this._bodyInitialOverflowValue\n );\n }\n }\n }\n\n @action\n escapePress(event: KeyboardEvent): void {\n if (event.key === 'Escape' && !this._isMinimized && !this._isDesktop) {\n this._isMinimized = true;\n this.synchronizeInert();\n this.unlockBodyScroll();\n }\n }\n\n @action\n toggleMinimizedStatus(): void {\n this._isMinimized = !this._isMinimized;\n this.synchronizeInert();\n\n const { onToggleMinimizedStatus } = this.args;\n\n if (typeof onToggleMinimizedStatus === 'function') {\n onToggleMinimizedStatus(this._isMinimized);\n }\n\n if (!this._isDesktop) {\n if (this._isMinimized) {\n this.unlockBodyScroll();\n } else {\n this.lockBodyScroll();\n }\n }\n }\n\n @action\n setTransition(phase: string, event: TransitionEvent): void {\n // we only want to respond to `width` animation/transitions\n if (event.propertyName !== 'width') {\n return;\n }\n if (phase === 'start') {\n this._isAnimating = true;\n } else {\n this._isAnimating = false;\n }\n }\n\n @action\n updateDesktopVariable(event: MediaQueryListEvent): void {\n this._isDesktop = event.matches;\n\n // automatically minimize on narrow viewports (when not in desktop mode)\n this._isMinimized = !this._isDesktop;\n\n this.synchronizeInert();\n\n if (this._isDesktop) {\n // make sure scrolling is enabled if the user resizes the window from mobile to desktop\n this.unlockBodyScroll();\n }\n\n const { onDesktopViewportChange } = this.args;\n\n if (typeof onDesktopViewportChange === 'function') {\n onDesktopViewportChange(this._isDesktop);\n }\n }\n}\n"],"names":["HdsAppSideNav","Component","g","prototype","tracked","i","_body","_bodyInitialOverflowValue","_desktopMQ","_navWrapperBody","_desktopMQVal","args","breakpoint","hdsBreakpoints","px","constructor","owner","_isMinimized","isMinimized","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","_setUpBodyElement","modifier","document","body","style","getPropertyValue","_setUpNavWrapperBody","element","addEventListener","escapePress","updateDesktopVariable","syntheticEvent","MediaQueryListEvent","matches","media","removeEventListener","isResponsive","isCollapsible","shouldTrapFocus","_isDesktop","showToggleButton","classNames","classes","push","_isAnimating","join","synchronizeInert","setAttribute","removeAttribute","lockBodyScroll","setProperty","unlockBodyScroll","removeProperty","length","event","key","n","action","toggleMinimizedStatus","onToggleMinimizedStatus","setTransition","phase","propertyName","onDesktopViewportChange","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-side-nav/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\nimport { modifier } from 'ember-modifier';\n\nimport { hdsBreakpoints } from '../../../utils/hds-breakpoints.ts';\n\nexport interface HdsAppSideNavSignature {\n Args: {\n isResponsive?: boolean;\n isCollapsible?: boolean;\n isMinimized?: boolean;\n breakpoint?: string;\n onToggleMinimizedStatus?: (arg: boolean) => void;\n onDesktopViewportChange?: (arg: boolean) => void;\n };\n Blocks: {\n default?: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppSideNav extends Component<HdsAppSideNavSignature> {\n @tracked private _isMinimized;\n @tracked private _isAnimating = false;\n @tracked private _isDesktop = true;\n\n private _body!: HTMLElement;\n private _bodyInitialOverflowValue = '';\n private _desktopMQ: MediaQueryList;\n private _navWrapperBody!: HTMLElement;\n\n // we use the `lg` breakpoint for `desktop` viewports, but consumers can override its value\n private _desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['lg'].px;\n\n constructor(owner: Owner, args: HdsAppSideNavSignature['Args']) {\n super(owner, args);\n this._isMinimized = this.args.isMinimized ?? false; // sets the default state on 'desktop' viewports\n this._desktopMQ = window.matchMedia(`(min-width:${this._desktopMQVal})`);\n this.addEventListeners();\n registerDestructor(this, (): void => {\n this.removeEventListeners();\n });\n }\n\n private _setUpBodyElement = modifier((): void => {\n this._body = document.body;\n // Store the initial `overflow` value of `<body>` so we can reset to it\n this._bodyInitialOverflowValue =\n this._body.style.getPropertyValue('overflow');\n });\n\n private _setUpNavWrapperBody = modifier((element: HTMLElement) => {\n this._navWrapperBody = element;\n });\n\n addEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.addEventListener('keydown', this.escapePress, true);\n this._desktopMQ.addEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n // if not instantiated as minimized via arguments\n if (!this.args.isMinimized) {\n // set initial state based on viewport using a \"synthetic\" event\n const syntheticEvent = new MediaQueryListEvent('change', {\n matches: this._desktopMQ.matches,\n media: this._desktopMQ.media,\n });\n this.updateDesktopVariable(syntheticEvent);\n }\n }\n\n removeEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.removeEventListener('keydown', this.escapePress, true);\n this._desktopMQ.removeEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n }\n\n // controls if the component reacts to viewport changes\n get isResponsive(): boolean {\n return this.args.isResponsive ?? true;\n }\n\n // controls if users can collapse the appsidenav on 'desktop' viewports\n get isCollapsible(): boolean {\n return this.args.isCollapsible ?? false;\n }\n\n // traps focus if isResponsive is enabled and it's in mobile view with side nav expanded (overlaying content)\n get shouldTrapFocus(): boolean {\n return this.isResponsive && !this._isDesktop && !this._isMinimized;\n }\n\n get showToggleButton(): boolean {\n return (this.isResponsive && !this._isDesktop) || this.isCollapsible;\n }\n\n get classNames(): string {\n const classes = [`hds-app-side-nav`];\n\n // add specific class names for the different possible states\n if (this.isResponsive) {\n classes.push('hds-app-side-nav--is-responsive');\n }\n if (!this._isDesktop && this.isResponsive) {\n classes.push('hds-app-side-nav--is-mobile');\n } else {\n classes.push('hds-app-side-nav--is-desktop');\n }\n if (this._isMinimized && this.isResponsive) {\n classes.push('hds-app-side-nav--is-minimized');\n } else {\n classes.push('hds-app-side-nav--is-not-minimized');\n }\n if (this._isAnimating) {\n classes.push('hds-app-side-nav--is-animating');\n }\n\n return classes.join(' ');\n }\n\n synchronizeInert(): void {\n if (this._isMinimized) {\n this._navWrapperBody?.setAttribute('inert', '');\n } else {\n this._navWrapperBody?.removeAttribute('inert');\n }\n }\n\n lockBodyScroll(): void {\n if (this._body) {\n // Prevent page from scrolling when the dialog is open\n this._body.style.setProperty('overflow', 'hidden');\n }\n }\n\n unlockBodyScroll(): void {\n // Reset page `overflow` property\n if (this._body) {\n this._body.style.removeProperty('overflow');\n if (this._bodyInitialOverflowValue === '') {\n if (this._body.style.length === 0) {\n this._body.removeAttribute('style');\n }\n } else {\n this._body.style.setProperty(\n 'overflow',\n this._bodyInitialOverflowValue\n );\n }\n }\n }\n\n @action\n escapePress(event: KeyboardEvent): void {\n if (event.key === 'Escape' && !this._isMinimized && !this._isDesktop) {\n this._isMinimized = true;\n this.synchronizeInert();\n this.unlockBodyScroll();\n }\n }\n\n @action\n toggleMinimizedStatus(): void {\n this._isMinimized = !this._isMinimized;\n this.synchronizeInert();\n\n const { onToggleMinimizedStatus } = this.args;\n\n if (typeof onToggleMinimizedStatus === 'function') {\n onToggleMinimizedStatus(this._isMinimized);\n }\n\n if (!this._isDesktop) {\n if (this._isMinimized) {\n this.unlockBodyScroll();\n } else {\n this.lockBodyScroll();\n }\n }\n }\n\n @action\n setTransition(phase: string, event: TransitionEvent): void {\n // we only want to respond to `width` animation/transitions\n if (event.propertyName !== 'width') {\n return;\n }\n if (phase === 'start') {\n this._isAnimating = true;\n } else {\n this._isAnimating = false;\n }\n }\n\n @action\n updateDesktopVariable(event: MediaQueryListEvent): void {\n this._isDesktop = event.matches;\n\n // automatically minimize on narrow viewports (when not in desktop mode)\n this._isMinimized = !this._isDesktop;\n\n this.synchronizeInert();\n\n if (this._isDesktop) {\n // make sure scrolling is enabled if the user resizes the window from mobile to desktop\n this.unlockBodyScroll();\n }\n\n const { onDesktopViewportChange } = this.args;\n\n if (typeof onDesktopViewportChange === 'function') {\n onDesktopViewportChange(this._isDesktop);\n }\n }\n}\n"],"names":["HdsAppSideNav","Component","g","prototype","tracked","i","void 0","_body","_bodyInitialOverflowValue","_desktopMQ","_navWrapperBody","_desktopMQVal","args","breakpoint","hdsBreakpoints","px","constructor","owner","_isMinimized","isMinimized","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","_setUpBodyElement","modifier","document","body","style","getPropertyValue","_setUpNavWrapperBody","element","addEventListener","escapePress","updateDesktopVariable","syntheticEvent","MediaQueryListEvent","matches","media","removeEventListener","isResponsive","isCollapsible","shouldTrapFocus","_isDesktop","showToggleButton","classNames","classes","push","_isAnimating","join","synchronizeInert","setAttribute","removeAttribute","lockBodyScroll","setProperty","unlockBodyScroll","removeProperty","length","event","key","n","action","toggleMinimizedStatus","onToggleMinimizedStatus","setTransition","phase","propertyName","onDesktopViewportChange","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AA0Be,MAAMA,aAAa,SAASC,SAAS,CAAyB;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,cAAA,EAAA,CAC1EC,OAAO,CAAA,CAAA;AAAA;AAAA,EAAA,aAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,cAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAJ,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,cAAA,EAAA,CACPC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAwB,KAAK;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,aAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,cAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAJ,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,YAAA,EAAA,CACpCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAsB,IAAI;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,WAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,YAAA,CAAA,EAAAC,MAAA;EAE1BC,KAAK;AACLC,EAAAA,yBAAyB,GAAG,EAAE;EAC9BC,UAAU;EACVC,eAAe;;AAEvB;AACQC,EAAAA,aAAa,GAAG,IAAI,CAACC,IAAI,CAACC,UAAU,IAAIC,cAAc,CAAC,IAAI,CAAC,CAACC,EAAE;AAEvEC,EAAAA,WAAWA,CAACC,KAAY,EAAEL,IAAoC,EAAE;AAC9D,IAAA,KAAK,CAACK,KAAK,EAAEL,IAAI,CAAC;IAClB,IAAI,CAACM,YAAY,GAAG,IAAI,CAACN,IAAI,CAACO,WAAW,IAAI,KAAK,CAAC;AACnD,IAAA,IAAI,CAACV,UAAU,GAAGW,MAAM,CAACC,UAAU,CAAC,CAAA,WAAA,EAAc,IAAI,CAACV,aAAa,CAAA,CAAA,CAAG,CAAC;IACxE,IAAI,CAACW,iBAAiB,EAAE;IACxBC,kBAAkB,CAAC,IAAI,EAAE,MAAY;MACnC,IAAI,CAACC,oBAAoB,EAAE;AAC7B,IAAA,CAAC,CAAC;AACJ,EAAA;EAEQC,iBAAiB,GAAGC,QAAQ,CAAC,MAAY;AAC/C,IAAA,IAAI,CAACnB,KAAK,GAAGoB,QAAQ,CAACC,IAAI;AAC1B;AACA,IAAA,IAAI,CAACpB,yBAAyB,GAC5B,IAAI,CAACD,KAAK,CAACsB,KAAK,CAACC,gBAAgB,CAAC,UAAU,CAAC;AACjD,EAAA,CAAC,CAAC;AAEMC,EAAAA,oBAAoB,GAAGL,QAAQ,CAAEM,OAAoB,IAAK;IAChE,IAAI,CAACtB,eAAe,GAAGsB,OAAO;AAChC,EAAA,CAAC,CAAC;AAEFV,EAAAA,iBAAiBA,GAAS;AACxB;IACAK,QAAQ,CAACM,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACC,WAAW,EAAE,IAAI,CAAC;AAC5D,IAAA,IAAI,CAACzB,UAAU,CAACwB,gBAAgB,CAC9B,QAAQ;AACR;AACA,IAAA,IAAI,CAACE,qBAAqB,EAC1B,IACF,CAAC;AACD;AACA,IAAA,IAAI,CAAC,IAAI,CAACvB,IAAI,CAACO,WAAW,EAAE;AAC1B;AACA,MAAA,MAAMiB,cAAc,GAAG,IAAIC,mBAAmB,CAAC,QAAQ,EAAE;AACvDC,QAAAA,OAAO,EAAE,IAAI,CAAC7B,UAAU,CAAC6B,OAAO;AAChCC,QAAAA,KAAK,EAAE,IAAI,CAAC9B,UAAU,CAAC8B;AACzB,OAAC,CAAC;AACF,MAAA,IAAI,CAACJ,qBAAqB,CAACC,cAAc,CAAC;AAC5C,IAAA;AACF,EAAA;AAEAZ,EAAAA,oBAAoBA,GAAS;AAC3B;IACAG,QAAQ,CAACa,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACN,WAAW,EAAE,IAAI,CAAC;AAC/D,IAAA,IAAI,CAACzB,UAAU,CAAC+B,mBAAmB,CACjC,QAAQ;AACR;AACA,IAAA,IAAI,CAACL,qBAAqB,EAC1B,IACF,CAAC;AACH,EAAA;;AAEA;EACA,IAAIM,YAAYA,GAAY;AAC1B,IAAA,OAAO,IAAI,CAAC7B,IAAI,CAAC6B,YAAY,IAAI,IAAI;AACvC,EAAA;;AAEA;EACA,IAAIC,aAAaA,GAAY;AAC3B,IAAA,OAAO,IAAI,CAAC9B,IAAI,CAAC8B,aAAa,IAAI,KAAK;AACzC,EAAA;;AAEA;EACA,IAAIC,eAAeA,GAAY;AAC7B,IAAA,OAAO,IAAI,CAACF,YAAY,IAAI,CAAC,IAAI,CAACG,UAAU,IAAI,CAAC,IAAI,CAAC1B,YAAY;AACpE,EAAA;EAEA,IAAI2B,gBAAgBA,GAAY;IAC9B,OAAQ,IAAI,CAACJ,YAAY,IAAI,CAAC,IAAI,CAACG,UAAU,IAAK,IAAI,CAACF,aAAa;AACtE,EAAA;EAEA,IAAII,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,CAAA,gBAAA,CAAkB,CAAC;;AAEpC;IACA,IAAI,IAAI,CAACN,YAAY,EAAE;AACrBM,MAAAA,OAAO,CAACC,IAAI,CAAC,iCAAiC,CAAC;AACjD,IAAA;IACA,IAAI,CAAC,IAAI,CAACJ,UAAU,IAAI,IAAI,CAACH,YAAY,EAAE;AACzCM,MAAAA,OAAO,CAACC,IAAI,CAAC,6BAA6B,CAAC;AAC7C,IAAA,CAAC,MAAM;AACLD,MAAAA,OAAO,CAACC,IAAI,CAAC,8BAA8B,CAAC;AAC9C,IAAA;AACA,IAAA,IAAI,IAAI,CAAC9B,YAAY,IAAI,IAAI,CAACuB,YAAY,EAAE;AAC1CM,MAAAA,OAAO,CAACC,IAAI,CAAC,gCAAgC,CAAC;AAChD,IAAA,CAAC,MAAM;AACLD,MAAAA,OAAO,CAACC,IAAI,CAAC,oCAAoC,CAAC;AACpD,IAAA;IACA,IAAI,IAAI,CAACC,YAAY,EAAE;AACrBF,MAAAA,OAAO,CAACC,IAAI,CAAC,gCAAgC,CAAC;AAChD,IAAA;AAEA,IAAA,OAAOD,OAAO,CAACG,IAAI,CAAC,GAAG,CAAC;AAC1B,EAAA;AAEAC,EAAAA,gBAAgBA,GAAS;IACvB,IAAI,IAAI,CAACjC,YAAY,EAAE;MACrB,IAAI,CAACR,eAAe,EAAE0C,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AACjD,IAAA,CAAC,MAAM;AACL,MAAA,IAAI,CAAC1C,eAAe,EAAE2C,eAAe,CAAC,OAAO,CAAC;AAChD,IAAA;AACF,EAAA;AAEAC,EAAAA,cAAcA,GAAS;IACrB,IAAI,IAAI,CAAC/C,KAAK,EAAE;AACd;MACA,IAAI,CAACA,KAAK,CAACsB,KAAK,CAAC0B,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC;AACpD,IAAA;AACF,EAAA;AAEAC,EAAAA,gBAAgBA,GAAS;AACvB;IACA,IAAI,IAAI,CAACjD,KAAK,EAAE;MACd,IAAI,CAACA,KAAK,CAACsB,KAAK,CAAC4B,cAAc,CAAC,UAAU,CAAC;AAC3C,MAAA,IAAI,IAAI,CAACjD,yBAAyB,KAAK,EAAE,EAAE;QACzC,IAAI,IAAI,CAACD,KAAK,CAACsB,KAAK,CAAC6B,MAAM,KAAK,CAAC,EAAE;AACjC,UAAA,IAAI,CAACnD,KAAK,CAAC8C,eAAe,CAAC,OAAO,CAAC;AACrC,QAAA;AACF,MAAA,CAAC,MAAM;AACL,QAAA,IAAI,CAAC9C,KAAK,CAACsB,KAAK,CAAC0B,WAAW,CAC1B,UAAU,EACV,IAAI,CAAC/C,yBACP,CAAC;AACH,MAAA;AACF,IAAA;AACF,EAAA;EAGA0B,WAAWA,CAACyB,KAAoB,EAAQ;AACtC,IAAA,IAAIA,KAAK,CAACC,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC1C,YAAY,IAAI,CAAC,IAAI,CAAC0B,UAAU,EAAE;MACpE,IAAI,CAAC1B,YAAY,GAAG,IAAI;MACxB,IAAI,CAACiC,gBAAgB,EAAE;MACvB,IAAI,CAACK,gBAAgB,EAAE;AACzB,IAAA;AACF,EAAA;AAAC,EAAA;IAAAK,CAAA,CAAA,IAAA,CAAA1D,SAAA,EAAA,aAAA,EAAA,CAPA2D,MAAM,CAAA,CAAA;AAAA;AAUPC,EAAAA,qBAAqBA,GAAS;AAC5B,IAAA,IAAI,CAAC7C,YAAY,GAAG,CAAC,IAAI,CAACA,YAAY;IACtC,IAAI,CAACiC,gBAAgB,EAAE;IAEvB,MAAM;AAAEa,MAAAA;KAAyB,GAAG,IAAI,CAACpD,IAAI;AAE7C,IAAA,IAAI,OAAOoD,uBAAuB,KAAK,UAAU,EAAE;AACjDA,MAAAA,uBAAuB,CAAC,IAAI,CAAC9C,YAAY,CAAC;AAC5C,IAAA;AAEA,IAAA,IAAI,CAAC,IAAI,CAAC0B,UAAU,EAAE;MACpB,IAAI,IAAI,CAAC1B,YAAY,EAAE;QACrB,IAAI,CAACsC,gBAAgB,EAAE;AACzB,MAAA,CAAC,MAAM;QACL,IAAI,CAACF,cAAc,EAAE;AACvB,MAAA;AACF,IAAA;AACF,EAAA;AAAC,EAAA;IAAAO,CAAA,CAAA,IAAA,CAAA1D,SAAA,EAAA,uBAAA,EAAA,CAlBA2D,MAAM,CAAA,CAAA;AAAA;AAqBPG,EAAAA,aAAaA,CAACC,KAAa,EAAEP,KAAsB,EAAQ;AACzD;AACA,IAAA,IAAIA,KAAK,CAACQ,YAAY,KAAK,OAAO,EAAE;AAClC,MAAA;AACF,IAAA;IACA,IAAID,KAAK,KAAK,OAAO,EAAE;MACrB,IAAI,CAACjB,YAAY,GAAG,IAAI;AAC1B,IAAA,CAAC,MAAM;MACL,IAAI,CAACA,YAAY,GAAG,KAAK;AAC3B,IAAA;AACF,EAAA;AAAC,EAAA;IAAAY,CAAA,CAAA,IAAA,CAAA1D,SAAA,EAAA,eAAA,EAAA,CAXA2D,MAAM,CAAA,CAAA;AAAA;EAcP3B,qBAAqBA,CAACwB,KAA0B,EAAQ;AACtD,IAAA,IAAI,CAACf,UAAU,GAAGe,KAAK,CAACrB,OAAO;;AAE/B;AACA,IAAA,IAAI,CAACpB,YAAY,GAAG,CAAC,IAAI,CAAC0B,UAAU;IAEpC,IAAI,CAACO,gBAAgB,EAAE;IAEvB,IAAI,IAAI,CAACP,UAAU,EAAE;AACnB;MACA,IAAI,CAACY,gBAAgB,EAAE;AACzB,IAAA;IAEA,MAAM;AAAEY,MAAAA;KAAyB,GAAG,IAAI,CAACxD,IAAI;AAE7C,IAAA,IAAI,OAAOwD,uBAAuB,KAAK,UAAU,EAAE;AACjDA,MAAAA,uBAAuB,CAAC,IAAI,CAACxB,UAAU,CAAC;AAC1C,IAAA;AACF,EAAA;AAAC,EAAA;IAAAiB,CAAA,CAAA,IAAA,CAAA1D,SAAA,EAAA,uBAAA,EAAA,CAnBA2D,MAAM,CAAA,CAAA;AAAA;AAoBT;AAACO,oBAAA,CAAAC,QAAA,EA1MoBtE,aAAa,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/app-side-nav/list/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsYieldSignature } from '../../yield';\nimport type { HdsAppSideNavListItemSignature } from './item';\nimport type { HdsAppSideNavListBackLinkSignature } from './back-link';\nimport type { HdsAppSideNavListTitleSignature } from './title';\nimport type { HdsAppSideNavListLinkSignature } from './link';\n\nexport interface HdsAppSideNavListSignature {\n Blocks: {\n default: [\n {\n ExtraBefore?: ComponentLike<HdsYieldSignature>;\n Item?: ComponentLike<HdsAppSideNavListItemSignature>;\n BackLink?: ComponentLike<HdsAppSideNavListBackLinkSignature>;\n Title?: ComponentLike<HdsAppSideNavListTitleSignature>;\n Link?: ComponentLike<HdsAppSideNavListLinkSignature>;\n ExtraAfter?: ComponentLike<HdsYieldSignature>;\n },\n ];\n };\n Element: HTMLElement;\n}\n\nexport default class HdsAppSideNavList extends Component<HdsAppSideNavListSignature> {\n @tracked private _titleIds: string[] = [];\n\n get titleIds(): string {\n return this._titleIds.join(' ');\n }\n\n @action\n didInsertTitle(titleId: string): void {\n this._titleIds = [...this._titleIds, titleId];\n }\n}\n"],"names":["HdsAppSideNavList","Component","g","prototype","tracked","i","titleIds","_titleIds","join","didInsertTitle","titleId","n","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;;AA4Be,MAAMA,iBAAiB,SAASC,SAAS,CAA6B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,WAAA,EAAA,CAClFC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA+B,EAAE;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,UAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,WAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/app-side-nav/list/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsYieldSignature } from '../../yield';\nimport type { HdsAppSideNavListItemSignature } from './item';\nimport type { HdsAppSideNavListBackLinkSignature } from './back-link';\nimport type { HdsAppSideNavListTitleSignature } from './title';\nimport type { HdsAppSideNavListLinkSignature } from './link';\n\nexport interface HdsAppSideNavListSignature {\n Blocks: {\n default: [\n {\n ExtraBefore?: ComponentLike<HdsYieldSignature>;\n Item?: ComponentLike<HdsAppSideNavListItemSignature>;\n BackLink?: ComponentLike<HdsAppSideNavListBackLinkSignature>;\n Title?: ComponentLike<HdsAppSideNavListTitleSignature>;\n Link?: ComponentLike<HdsAppSideNavListLinkSignature>;\n ExtraAfter?: ComponentLike<HdsYieldSignature>;\n },\n ];\n };\n Element: HTMLElement;\n}\n\nexport default class HdsAppSideNavList extends Component<HdsAppSideNavListSignature> {\n @tracked private _titleIds: string[] = [];\n\n get titleIds(): string {\n return this._titleIds.join(' ');\n }\n\n @action\n didInsertTitle(titleId: string): void {\n this._titleIds = [...this._titleIds, titleId];\n }\n}\n"],"names":["HdsAppSideNavList","Component","g","prototype","tracked","i","void 0","titleIds","_titleIds","join","didInsertTitle","titleId","n","action","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;;AA4Be,MAAMA,iBAAiB,SAASC,SAAS,CAA6B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,WAAA,EAAA,CAClFC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA+B,EAAE;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,UAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,WAAA,CAAA,EAAAC,MAAA;EAEzC,IAAIC,QAAQA,GAAW;AACrB,IAAA,OAAO,IAAI,CAACC,SAAS,CAACC,IAAI,CAAC,GAAG,CAAC;AACjC,EAAA;EAGAC,cAAcA,CAACC,OAAe,EAAQ;IACpC,IAAI,CAACH,SAAS,GAAG,CAAC,GAAG,IAAI,CAACA,SAAS,EAAEG,OAAO,CAAC;AAC/C,EAAA;AAAC,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAT,SAAA,EAAA,gBAAA,EAAA,CAHAU,MAAM,CAAA,CAAA;AAAA;AAIT;AAACC,oBAAA,CAAAC,QAAA,EAXoBf,iBAAiB,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target.js","sources":["../../../../../src/components/hds/app-side-nav/portal/target.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { macroCondition, isTesting } from '@embroider/macros';\n\nimport type { HdsAppSideNavPortalSignature } from './index';\nimport type { Registry as Services } from '@ember/service';\n\ninterface HdsAppSideNavPortalTargetSignature {\n Args: {\n targetName?: HdsAppSideNavPortalSignature['Args']['targetName'];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppSideNavPortalTarget extends Component<HdsAppSideNavPortalTargetSignature> {\n @service router!: Services['router'];\n\n @tracked private _numSubnavs = 0;\n @tracked private _lastPanelEl: Element | undefined;\n\n static get prefersReducedMotionOverride(): boolean {\n return macroCondition(isTesting()) ? true : false;\n }\n\n private _prefersReducedMotionMQ = window.matchMedia(\n '(prefers-reduced-motion: reduce)'\n );\n\n get prefersReducedMotion(): boolean {\n return (\n HdsAppSideNavPortalTarget.prefersReducedMotionOverride ||\n (this._prefersReducedMotionMQ && this._prefersReducedMotionMQ.matches)\n );\n }\n\n @action\n panelsChanged(portalCount: number): void {\n this._numSubnavs = portalCount;\n }\n\n @action\n didUpdateSubnav(element: HTMLElement, [count]: [number]): void {\n this.animateSubnav(element, [count]);\n }\n\n @action\n animateSubnav(element: HTMLElement, [count]: [number]): void {\n /*\n * Here is ascii art of what the layout looks like for this setup\n *\n\n AppSideNav\n +----------------------+\n | +------------------+ |\n | | (\"header\") | |\n | +------------------+ |\n | |\n | +------------------+ |\n | | (\"body\") | |\n (PortalTarget) | | | |\n +----------------------------------------------+ | |\n | +----------+ +----------+ | +----------+ | | |\n | | (Portal) | | (Portal) | | (Portal) | | | |\n | | | | | | | | | | |\n | | hidden | | hidden | | *active* | | | |\n | | panel | | panel | | | panel | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | +----------+ +----------+ | +----------+ | | |\n +----------------------------------------------+ | |\n | | | |\n | +------------------+ |\n | |\n | +------------------+ |\n | | (\"footer\") | |\n | +------------------+ |\n +----------------------+\n\n *\n * every time `HcAppFrame::SideNav::Portal` renders, it contains a portaled \"panel\"\n * that is rendered into the `hds-app-side-nav__content-panels` (inside the PortalTarget).\n *\n * Rendering or unrendering other `HcAppFrame::SideNav::Portal`s triggers the number of\n * subnavs to change (via `numSubnavs`), so this function runs and slides\n * `hds-app-side-nav__content-panels` left or right using the `element.animate` api.\n *\n * */\n\n const activeIndex = count - 1;\n const targetElement = element;\n const { prefersReducedMotion } = this;\n\n const styles = getComputedStyle(targetElement);\n const columnWidth = styles.getPropertyValue(\n '--hds-app-sidenav-width-expanded'\n );\n const slideDuration = prefersReducedMotion ? 0 : 150;\n let fadeDuration = prefersReducedMotion ? 0 : 175;\n let fadeDelay = prefersReducedMotion ? 0 : 50;\n\n // slide entire parent panel\n const start = styles.transform;\n const end = `translateX(-${activeIndex * parseInt(columnWidth, 10)}px)`;\n const anim = targetElement.animate(\n [{ transform: start }, { transform: end }],\n {\n duration: slideDuration,\n easing: 'cubic-bezier(0.65, 0, 0.35, 1)',\n fill: 'forwards',\n }\n );\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n anim.finished.then((): void => {\n // uncomment this if we need/want to scroll the element to the top\n // targetElement.scrollIntoView(true);\n if (activeIndex > 0) {\n const allPrev = Array.from(targetElement.children).slice(\n 0,\n activeIndex\n ) as HTMLElement[];\n for (const ele of allPrev) {\n ele.ariaHidden = 'true';\n ele.style.setProperty('visibility', 'hidden');\n ele.style.setProperty('opacity', '0');\n }\n }\n // Notice: we don't add the styles by default because it writes a `style` attribute to the element and it causes an additional re-render\n if (macroCondition(isTesting())) {\n // Check the visibility of the element before attempting to commitStyles.\n if (targetElement.offsetParent !== null) {\n anim.commitStyles();\n }\n }\n });\n\n // fade in next panel\n const nextPanelEl = targetElement.children[activeIndex] as HTMLElement;\n\n // get reference to last child panel\n const lastPanelEl = targetElement.children[\n targetElement.children.length - 1\n ] as HTMLElement;\n\n if (nextPanelEl) {\n nextPanelEl.ariaHidden = 'false';\n nextPanelEl.style.setProperty('visibility', 'visible');\n // this eliminates a flicker if there's only one subnav rendering or if we\n // already just rendered this panel.\n if (this._lastPanelEl) {\n if (activeIndex === 0 || nextPanelEl.isSameNode(this._lastPanelEl)) {\n fadeDelay = 0;\n fadeDuration = 0;\n }\n }\n\n // remember the last panel\n this._lastPanelEl = lastPanelEl;\n\n nextPanelEl.animate([{ opacity: '0' }, { opacity: '1' }], {\n delay: fadeDelay,\n duration: fadeDuration,\n fill: 'forwards',\n });\n }\n }\n}\n"],"names":["HdsAppSideNavPortalTarget","Component","g","prototype","service","i","tracked","prefersReducedMotionOverride","macroCondition","isTesting","_prefersReducedMotionMQ","window","matchMedia","prefersReducedMotion","matches","panelsChanged","portalCount","_numSubnavs","n","action","didUpdateSubnav","element","count","animateSubnav","activeIndex","targetElement","styles","getComputedStyle","columnWidth","getPropertyValue","slideDuration","fadeDuration","fadeDelay","start","transform","end","parseInt","anim","animate","duration","easing","fill","finished","then","allPrev","Array","from","children","slice","ele","ariaHidden","style","setProperty","offsetParent","commitStyles","nextPanelEl","lastPanelEl","length","_lastPanelEl","isSameNode","opacity","delay","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"target.js","sources":["../../../../../src/components/hds/app-side-nav/portal/target.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { macroCondition, isTesting } from '@embroider/macros';\n\nimport type { HdsAppSideNavPortalSignature } from './index';\nimport type { Registry as Services } from '@ember/service';\n\ninterface HdsAppSideNavPortalTargetSignature {\n Args: {\n targetName?: HdsAppSideNavPortalSignature['Args']['targetName'];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppSideNavPortalTarget extends Component<HdsAppSideNavPortalTargetSignature> {\n @service router!: Services['router'];\n\n @tracked private _numSubnavs = 0;\n @tracked private _lastPanelEl: Element | undefined;\n\n static get prefersReducedMotionOverride(): boolean {\n return macroCondition(isTesting()) ? true : false;\n }\n\n private _prefersReducedMotionMQ = window.matchMedia(\n '(prefers-reduced-motion: reduce)'\n );\n\n get prefersReducedMotion(): boolean {\n return (\n HdsAppSideNavPortalTarget.prefersReducedMotionOverride ||\n (this._prefersReducedMotionMQ && this._prefersReducedMotionMQ.matches)\n );\n }\n\n @action\n panelsChanged(portalCount: number): void {\n this._numSubnavs = portalCount;\n }\n\n @action\n didUpdateSubnav(element: HTMLElement, [count]: [number]): void {\n this.animateSubnav(element, [count]);\n }\n\n @action\n animateSubnav(element: HTMLElement, [count]: [number]): void {\n /*\n * Here is ascii art of what the layout looks like for this setup\n *\n\n AppSideNav\n +----------------------+\n | +------------------+ |\n | | (\"header\") | |\n | +------------------+ |\n | |\n | +------------------+ |\n | | (\"body\") | |\n (PortalTarget) | | | |\n +----------------------------------------------+ | |\n | +----------+ +----------+ | +----------+ | | |\n | | (Portal) | | (Portal) | | (Portal) | | | |\n | | | | | | | | | | |\n | | hidden | | hidden | | *active* | | | |\n | | panel | | panel | | | panel | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | | | | | | | | | | |\n | | | | | | | | | |\n | +----------+ +----------+ | +----------+ | | |\n +----------------------------------------------+ | |\n | | | |\n | +------------------+ |\n | |\n | +------------------+ |\n | | (\"footer\") | |\n | +------------------+ |\n +----------------------+\n\n *\n * every time `HcAppFrame::SideNav::Portal` renders, it contains a portaled \"panel\"\n * that is rendered into the `hds-app-side-nav__content-panels` (inside the PortalTarget).\n *\n * Rendering or unrendering other `HcAppFrame::SideNav::Portal`s triggers the number of\n * subnavs to change (via `numSubnavs`), so this function runs and slides\n * `hds-app-side-nav__content-panels` left or right using the `element.animate` api.\n *\n * */\n\n const activeIndex = count - 1;\n const targetElement = element;\n const { prefersReducedMotion } = this;\n\n const styles = getComputedStyle(targetElement);\n const columnWidth = styles.getPropertyValue(\n '--hds-app-sidenav-width-expanded'\n );\n const slideDuration = prefersReducedMotion ? 0 : 150;\n let fadeDuration = prefersReducedMotion ? 0 : 175;\n let fadeDelay = prefersReducedMotion ? 0 : 50;\n\n // slide entire parent panel\n const start = styles.transform;\n const end = `translateX(-${activeIndex * parseInt(columnWidth, 10)}px)`;\n const anim = targetElement.animate(\n [{ transform: start }, { transform: end }],\n {\n duration: slideDuration,\n easing: 'cubic-bezier(0.65, 0, 0.35, 1)',\n fill: 'forwards',\n }\n );\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n anim.finished.then((): void => {\n // uncomment this if we need/want to scroll the element to the top\n // targetElement.scrollIntoView(true);\n if (activeIndex > 0) {\n const allPrev = Array.from(targetElement.children).slice(\n 0,\n activeIndex\n ) as HTMLElement[];\n for (const ele of allPrev) {\n ele.ariaHidden = 'true';\n ele.style.setProperty('visibility', 'hidden');\n ele.style.setProperty('opacity', '0');\n }\n }\n // Notice: we don't add the styles by default because it writes a `style` attribute to the element and it causes an additional re-render\n if (macroCondition(isTesting())) {\n // Check the visibility of the element before attempting to commitStyles.\n if (targetElement.offsetParent !== null) {\n anim.commitStyles();\n }\n }\n });\n\n // fade in next panel\n const nextPanelEl = targetElement.children[activeIndex] as HTMLElement;\n\n // get reference to last child panel\n const lastPanelEl = targetElement.children[\n targetElement.children.length - 1\n ] as HTMLElement;\n\n if (nextPanelEl) {\n nextPanelEl.ariaHidden = 'false';\n nextPanelEl.style.setProperty('visibility', 'visible');\n // this eliminates a flicker if there's only one subnav rendering or if we\n // already just rendered this panel.\n if (this._lastPanelEl) {\n if (activeIndex === 0 || nextPanelEl.isSameNode(this._lastPanelEl)) {\n fadeDelay = 0;\n fadeDuration = 0;\n }\n }\n\n // remember the last panel\n this._lastPanelEl = lastPanelEl;\n\n nextPanelEl.animate([{ opacity: '0' }, { opacity: '1' }], {\n delay: fadeDelay,\n duration: fadeDuration,\n fill: 'forwards',\n });\n }\n }\n}\n"],"names":["HdsAppSideNavPortalTarget","Component","g","prototype","service","i","void 0","tracked","prefersReducedMotionOverride","macroCondition","isTesting","_prefersReducedMotionMQ","window","matchMedia","prefersReducedMotion","matches","panelsChanged","portalCount","_numSubnavs","n","action","didUpdateSubnav","element","count","animateSubnav","activeIndex","targetElement","styles","getComputedStyle","columnWidth","getPropertyValue","slideDuration","fadeDuration","fadeDelay","start","transform","end","parseInt","anim","animate","duration","easing","fill","finished","then","allPrev","Array","from","children","slice","ele","ariaHidden","style","setProperty","offsetParent","commitStyles","nextPanelEl","lastPanelEl","length","_lastPanelEl","isSameNode","opacity","delay","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.js","sources":["../../../../src/components/hds/breadcrumb/item.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { htmlSafe } from '@ember/template';\nimport { assert } from '@ember/debug';\n\nimport { hdsResolveLinkToExternal } from '../../../utils/hds-resolve-link-to-external.ts';\n\nimport type Owner from '@ember/owner';\nimport type { LinkTo } from '@ember/routing';\nimport type { SafeString } from '@ember/template';\nimport type { HdsIconSignature } from '../icon/index';\n\nexport interface HdsBreadcrumbItemSignature {\n Args: {\n current?: boolean;\n maxWidth?: string;\n text: string;\n isRouteExternal?: boolean;\n icon?: HdsIconSignature['Args']['name'];\n route?: string;\n models?: Array<string | number>;\n model?: string | number;\n query?: Record<string, string>;\n 'current-when'?: string;\n replace?: boolean;\n };\n Element: HTMLLIElement;\n}\n\nexport default class HdsBreadcrumbItem extends Component<HdsBreadcrumbItemSignature> {\n @tracked linkToExternal: LinkTo | null = null;\n\n constructor(owner: Owner, args: HdsBreadcrumbItemSignature['Args']) {\n super(owner, args);\n\n // we want to avoid resolving the component if it's not needed\n if (args.isRouteExternal) {\n void this.resolveLinkToExternal();\n }\n }\n\n async resolveLinkToExternal() {\n this.linkToExternal = await hdsResolveLinkToExternal(\n this.args.isRouteExternal\n );\n }\n\n /**\n * @param maxWidth\n * @type {string}\n * @default undefined\n * @description A parameter that can be applied to an \"item\" to limit its max-width\n */\n get maxWidth(): string | undefined {\n const { maxWidth } = this.args;\n\n if (maxWidth) {\n assert(\n `@maxWidth for \"Hds::Breadcrumb::Item\" must be a size as number in 'px' or in 'em' (eg. '200px' or '24em'); received: ${maxWidth}`,\n maxWidth.match(/^\\d+(px|em)$/)\n );\n\n return maxWidth;\n } else {\n return undefined;\n }\n }\n\n /**\n * Get the inline style to apply to the item.\n * @method BreadcrumbItem#itemStyle\n * @return {string} The \"style\" attribute to apply to the item.\n */\n get itemStyle(): SafeString | undefined {\n if (this.maxWidth) {\n return htmlSafe(`max-width: ${this.maxWidth}`);\n } else {\n return undefined;\n }\n }\n\n /**\n * Get the class names to apply to the component.\n * @method BreadcrumbItem#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-breadcrumb__item'];\n\n return classes.join(' ');\n }\n}\n"],"names":["HdsBreadcrumbItem","Component","g","prototype","tracked","i","constructor","owner","args","isRouteExternal","resolveLinkToExternal","linkToExternal","hdsResolveLinkToExternal","maxWidth","assert","match","undefined","itemStyle","htmlSafe","classNames","classes","join","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;;AA+Be,MAAMA,iBAAiB,SAASC,SAAS,CAA6B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,gBAAA,EAAA,CAClFC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAiC,IAAI;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,eAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"item.js","sources":["../../../../src/components/hds/breadcrumb/item.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { htmlSafe } from '@ember/template';\nimport { assert } from '@ember/debug';\n\nimport { hdsResolveLinkToExternal } from '../../../utils/hds-resolve-link-to-external.ts';\n\nimport type Owner from '@ember/owner';\nimport type { LinkTo } from '@ember/routing';\nimport type { SafeString } from '@ember/template';\nimport type { HdsIconSignature } from '../icon/index';\n\nexport interface HdsBreadcrumbItemSignature {\n Args: {\n current?: boolean;\n maxWidth?: string;\n text: string;\n isRouteExternal?: boolean;\n icon?: HdsIconSignature['Args']['name'];\n route?: string;\n models?: Array<string | number>;\n model?: string | number;\n query?: Record<string, string>;\n 'current-when'?: string;\n replace?: boolean;\n };\n Element: HTMLLIElement;\n}\n\nexport default class HdsBreadcrumbItem extends Component<HdsBreadcrumbItemSignature> {\n @tracked linkToExternal: LinkTo | null = null;\n\n constructor(owner: Owner, args: HdsBreadcrumbItemSignature['Args']) {\n super(owner, args);\n\n // we want to avoid resolving the component if it's not needed\n if (args.isRouteExternal) {\n void this.resolveLinkToExternal();\n }\n }\n\n async resolveLinkToExternal() {\n this.linkToExternal = await hdsResolveLinkToExternal(\n this.args.isRouteExternal\n );\n }\n\n /**\n * @param maxWidth\n * @type {string}\n * @default undefined\n * @description A parameter that can be applied to an \"item\" to limit its max-width\n */\n get maxWidth(): string | undefined {\n const { maxWidth } = this.args;\n\n if (maxWidth) {\n assert(\n `@maxWidth for \"Hds::Breadcrumb::Item\" must be a size as number in 'px' or in 'em' (eg. '200px' or '24em'); received: ${maxWidth}`,\n maxWidth.match(/^\\d+(px|em)$/)\n );\n\n return maxWidth;\n } else {\n return undefined;\n }\n }\n\n /**\n * Get the inline style to apply to the item.\n * @method BreadcrumbItem#itemStyle\n * @return {string} The \"style\" attribute to apply to the item.\n */\n get itemStyle(): SafeString | undefined {\n if (this.maxWidth) {\n return htmlSafe(`max-width: ${this.maxWidth}`);\n } else {\n return undefined;\n }\n }\n\n /**\n * Get the class names to apply to the component.\n * @method BreadcrumbItem#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-breadcrumb__item'];\n\n return classes.join(' ');\n }\n}\n"],"names":["HdsBreadcrumbItem","Component","g","prototype","tracked","i","void 0","constructor","owner","args","isRouteExternal","resolveLinkToExternal","linkToExternal","hdsResolveLinkToExternal","maxWidth","assert","match","undefined","itemStyle","htmlSafe","classNames","classes","join","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;;AA+Be,MAAMA,iBAAiB,SAASC,SAAS,CAA6B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,gBAAA,EAAA,CAClFC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAiC,IAAI;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,eAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,EAAAC,MAAA;AAE7CC,EAAAA,WAAWA,CAACC,KAAY,EAAEC,IAAwC,EAAE;AAClE,IAAA,KAAK,CAACD,KAAK,EAAEC,IAAI,CAAC;;AAElB;IACA,IAAIA,IAAI,CAACC,eAAe,EAAE;AACxB,MAAA,KAAK,IAAI,CAACC,qBAAqB,EAAE;AACnC,IAAA;AACF,EAAA;EAEA,MAAMA,qBAAqBA,GAAG;IAC5B,IAAI,CAACC,cAAc,GAAG,MAAMC,wBAAwB,CAClD,IAAI,CAACJ,IAAI,CAACC,eACZ,CAAC;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,IAAII,QAAQA,GAAuB;IACjC,MAAM;AAAEA,MAAAA;KAAU,GAAG,IAAI,CAACL,IAAI;AAE9B,IAAA,IAAIK,QAAQ,EAAE;MACZC,MAAM,CACJ,CAAA,qHAAA,EAAwHD,QAAQ,CAAA,CAAE,EAClIA,QAAQ,CAACE,KAAK,CAAC,cAAc,CAC/B,CAAC;AAED,MAAA,OAAOF,QAAQ;AACjB,IAAA,CAAC,MAAM;AACL,MAAA,OAAOG,SAAS;AAClB,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIC,SAASA,GAA2B;IACtC,IAAI,IAAI,CAACJ,QAAQ,EAAE;AACjB,MAAA,OAAOK,QAAQ,CAAC,CAAA,WAAA,EAAc,IAAI,CAACL,QAAQ,EAAE,CAAC;AAChD,IAAA,CAAC,MAAM;AACL,MAAA,OAAOG,SAAS;AAClB,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE,IAAIG,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,sBAAsB,CAAC;AAExC,IAAA,OAAOA,OAAO,CAACC,IAAI,CAAC,GAAG,CAAC;AAC1B,EAAA;AACF;AAACC,oBAAA,CAAAC,QAAA,EA9DoBxB,iBAAiB,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/code-block/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { 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","_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 IBM Corp. 2021, 2025\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/code-editor/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\nimport { guidFor } from '@ember/object/internals';\n\nimport HdsCodeEditorDescription from './description.ts';\nimport HdsCodeEditorTitle from './title.ts';\n\nimport type { WithBoundArgs } from '@glint/template';\nimport type Owner from '@ember/owner';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsCodeEditorSignature as HdsCodeEditorModifierSignature } from '../../../modifiers/hds-code-editor.ts';\nimport type { HdsCodeEditorDescriptionSignature } from './description';\nimport type { HdsCodeEditorTitleSignature } from './title';\nimport type { HdsCodeEditorGenericSignature } from './generic';\nimport type { EditorView } from '@codemirror/view';\nimport type { HdsCopyButtonSignature } from '../copy/button/index.ts';\n\nexport interface HdsCodeEditorSignature {\n Args: {\n hasCopyButton?: boolean;\n hasFullScreenButton?: boolean;\n isStandalone?: boolean;\n copyButtonText?: HdsCopyButtonSignature['Args']['text'];\n } & HdsCodeEditorModifierSignature['Args']['Named'];\n Blocks: {\n default: [\n {\n Title?: WithBoundArgs<\n typeof HdsCodeEditorTitle,\n 'onInsert' | 'editorId'\n >;\n Description?: WithBoundArgs<\n typeof HdsCodeEditorDescription,\n 'onInsert' | 'editorId'\n >;\n Generic?: ComponentLike<HdsCodeEditorGenericSignature>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsCodeEditor extends Component<HdsCodeEditorSignature> {\n @tracked private _isFullScreen = false;\n @tracked private _isSetupComplete = false;\n @tracked private _value;\n @tracked private _titleId: string | undefined;\n @tracked private _descriptionId: string | undefined;\n\n private _id = guidFor(this);\n\n private _handleEscape = modifier(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !this._isFullScreen) {\n return;\n }\n\n this.toggleFullScreen();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n });\n\n constructor(owner: Owner, args: HdsCodeEditorSignature['Args']) {\n super(owner, args);\n\n if (args.value) {\n this._value = args.value;\n }\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 get hasActions(): boolean {\n return (this.args.hasCopyButton || this.args.hasFullScreenButton) ?? false;\n }\n\n get isStandalone(): boolean {\n return this.args.isStandalone ?? true;\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-editor', 'hds-code-editor--theme-dark'];\n\n if (this._isFullScreen) {\n classes.push('hds-code-editor--is-full-screen');\n }\n\n if (this.isStandalone) {\n classes.push('hds-code-editor--is-standalone');\n }\n\n return classes.join(' ');\n }\n\n get copyButtonText(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.copyButtonText ? this.args.copyButtonText : 'Copy';\n }\n\n @action\n registerTitleElement(element: HdsCodeEditorTitleSignature['Element']): void {\n this._titleId = element.id;\n }\n\n @action\n registerDescriptionElement(\n element: HdsCodeEditorDescriptionSignature['Element']\n ): void {\n this._descriptionId = element.id;\n }\n\n @action\n toggleFullScreen(): void {\n this._isFullScreen = !this._isFullScreen;\n }\n\n @action\n onInput(newValue: string, editorView: EditorView): void {\n this._value = newValue;\n this.args.onInput?.(newValue, editorView);\n }\n\n @action\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isFullScreen) {\n this.toggleFullScreen();\n }\n }\n\n @action\n onSetup(editorView: EditorView): void {\n this._isSetupComplete = true;\n this.args.onSetup?.(editorView);\n }\n}\n"],"names":["HdsCodeEditor","Component","g","prototype","tracked","i","_id","guidFor","_handleEscape","modifier","handleKeyDown","event","key","_isFullScreen","toggleFullScreen","document","addEventListener","removeEventListener","constructor","owner","args","value","_value","ariaLabelledBy","ariaLabel","undefined","_titleId","ariaDescribedBy","_descriptionId","hasActions","hasCopyButton","hasFullScreenButton","isStandalone","classNames","classes","push","join","copyButtonText","registerTitleElement","element","id","n","action","registerDescriptionElement","onInput","newValue","editorView","onKeyDown","onSetup","_isSetupComplete","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AA8Ce,MAAMA,aAAa,SAASC,SAAS,CAAyB;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,eAAA,EAAA,CAC1EC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAyB,KAAK;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,cAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,eAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/code-editor/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\nimport { guidFor } from '@ember/object/internals';\n\nimport HdsCodeEditorDescription from './description.ts';\nimport HdsCodeEditorTitle from './title.ts';\n\nimport type { WithBoundArgs } from '@glint/template';\nimport type Owner from '@ember/owner';\nimport type { ComponentLike } from '@glint/template';\nimport type { HdsCodeEditorSignature as HdsCodeEditorModifierSignature } from '../../../modifiers/hds-code-editor.ts';\nimport type { HdsCodeEditorDescriptionSignature } from './description';\nimport type { HdsCodeEditorTitleSignature } from './title';\nimport type { HdsCodeEditorGenericSignature } from './generic';\nimport type { EditorView } from '@codemirror/view';\nimport type { HdsCopyButtonSignature } from '../copy/button/index.ts';\n\nexport interface HdsCodeEditorSignature {\n Args: {\n hasCopyButton?: boolean;\n hasFullScreenButton?: boolean;\n isStandalone?: boolean;\n copyButtonText?: HdsCopyButtonSignature['Args']['text'];\n } & HdsCodeEditorModifierSignature['Args']['Named'];\n Blocks: {\n default: [\n {\n Title?: WithBoundArgs<\n typeof HdsCodeEditorTitle,\n 'onInsert' | 'editorId'\n >;\n Description?: WithBoundArgs<\n typeof HdsCodeEditorDescription,\n 'onInsert' | 'editorId'\n >;\n Generic?: ComponentLike<HdsCodeEditorGenericSignature>;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsCodeEditor extends Component<HdsCodeEditorSignature> {\n @tracked private _isFullScreen = false;\n @tracked private _isSetupComplete = false;\n @tracked private _value;\n @tracked private _titleId: string | undefined;\n @tracked private _descriptionId: string | undefined;\n\n private _id = guidFor(this);\n\n private _handleEscape = modifier(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !this._isFullScreen) {\n return;\n }\n\n this.toggleFullScreen();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n });\n\n constructor(owner: Owner, args: HdsCodeEditorSignature['Args']) {\n super(owner, args);\n\n if (args.value) {\n this._value = args.value;\n }\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 get hasActions(): boolean {\n return (this.args.hasCopyButton || this.args.hasFullScreenButton) ?? false;\n }\n\n get isStandalone(): boolean {\n return this.args.isStandalone ?? true;\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-editor', 'hds-code-editor--theme-dark'];\n\n if (this._isFullScreen) {\n classes.push('hds-code-editor--is-full-screen');\n }\n\n if (this.isStandalone) {\n classes.push('hds-code-editor--is-standalone');\n }\n\n return classes.join(' ');\n }\n\n get copyButtonText(): HdsCopyButtonSignature['Args']['text'] {\n return this.args.copyButtonText ? this.args.copyButtonText : 'Copy';\n }\n\n @action\n registerTitleElement(element: HdsCodeEditorTitleSignature['Element']): void {\n this._titleId = element.id;\n }\n\n @action\n registerDescriptionElement(\n element: HdsCodeEditorDescriptionSignature['Element']\n ): void {\n this._descriptionId = element.id;\n }\n\n @action\n toggleFullScreen(): void {\n this._isFullScreen = !this._isFullScreen;\n }\n\n @action\n onInput(newValue: string, editorView: EditorView): void {\n this._value = newValue;\n this.args.onInput?.(newValue, editorView);\n }\n\n @action\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isFullScreen) {\n this.toggleFullScreen();\n }\n }\n\n @action\n onSetup(editorView: EditorView): void {\n this._isSetupComplete = true;\n this.args.onSetup?.(editorView);\n }\n}\n"],"names":["HdsCodeEditor","Component","g","prototype","tracked","i","void 0","_id","guidFor","_handleEscape","modifier","handleKeyDown","event","key","_isFullScreen","toggleFullScreen","document","addEventListener","removeEventListener","constructor","owner","args","value","_value","ariaLabelledBy","ariaLabel","undefined","_titleId","ariaDescribedBy","_descriptionId","hasActions","hasCopyButton","hasFullScreenButton","isStandalone","classNames","classes","push","join","copyButtonText","registerTitleElement","element","id","n","action","registerDescriptionElement","onInput","newValue","editorView","onKeyDown","onSetup","_isSetupComplete","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/button/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\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","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":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAgBO,MAAMA,YAAY,GAAGC,uBAAuB,CAACC;AAC7C,MAAMC,KAA2B,GAAGC,MAAM,CAACC,MAAM,CACtDJ,uBACF;AACO,MAAMK,YAAY,GAAG;AACrB,MAAMC,YAAY,GAAG;AACrB,MAAMC,UAAU,GAAG;AACnB,MAAMC,cAAc,GAAG;AAcf,MAAMC,aAAa,SAASC,SAAS,CAAyB;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CAC1EC,OAAO,CAAA,CAAA;AAAA;EAAA,QAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/button/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/snippet/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { HdsCopySnippetColorValues } from './types.ts';\nimport type { HdsCopySnippetColors } from './types.ts';\nimport type { HdsClipboardModifierSignature } from '../../../../modifiers/hds-clipboard.ts';\nimport type { HdsIconSignature } from '../../icon';\n\nexport const DEFAULT_COLOR = HdsCopySnippetColorValues.Primary;\nexport const COLORS: HdsCopySnippetColors[] = Object.values(\n HdsCopySnippetColorValues\n);\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 HdsCopySnippetSignature {\n Args: {\n color?: HdsCopySnippetColors;\n isFullWidth?: boolean;\n textToCopy: HdsClipboardModifierSignature['Args']['Named']['text'];\n isTruncated?: boolean;\n onSuccess?: HdsClipboardModifierSignature['Args']['Named']['onSuccess'];\n onError?: HdsClipboardModifierSignature['Args']['Named']['onError'];\n };\n Element: HTMLButtonElement;\n}\n\nexport default class HdsCopySnippet extends Component<HdsCopySnippetSignature> {\n @tracked private _status = DEFAULT_STATUS;\n @tracked private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @method textToShow\n * @return {string}\n */\n get textToShow(): string {\n const { textToCopy = '' } = this.args;\n\n if (typeof textToCopy === 'string') {\n return textToCopy;\n } else {\n return textToCopy.toString();\n }\n }\n\n /**\n * @param icon\n * @type {string}\n * @default clipboard-copy\n * @description Determines the icon to be used, based on the success state. Note that this is auto-tracked because it depends on a 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 color\n * @type {string}\n * @default primary\n * @description Determines the color of button to be used; acceptable values are `primary` and `secondary`\n */\n get color(): HdsCopySnippetColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Copy::Snippet\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n /**\n * @param isFullWidth\n * @type {boolean}\n * @default false\n * @description Indicates that the component should take up the full width of the parent container.\n */\n get isFullWidth(): boolean {\n return this.args.isFullWidth ?? false;\n }\n\n /**\n * @param isTruncated\n * @type {boolean}\n * @default false\n * @description Indicates that the component should be truncated instead of wrapping text and using multiple lines.\n */\n get isTruncated(): boolean {\n return this.args.isTruncated ?? false;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method CopySnippet#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-copy-snippet'];\n\n // add a class based on the @color argument\n classes.push(`hds-copy-snippet--color-${this.color}`);\n\n // add a class based on the tracked status (idle/success/error)\n classes.push(`hds-copy-snippet--status-${this._status}`);\n\n // add a class based on the @isTruncated argument\n if (this.isTruncated) {\n classes.push('hds-copy-snippet--is-truncated');\n }\n\n // add a class based on the @isFullWidth argument\n if (this.isFullWidth) {\n classes.push('hds-copy-snippet--width-full');\n }\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_COLOR","HdsCopySnippetColorValues","Primary","COLORS","Object","values","DEFAULT_ICON","SUCCESS_ICON","ERROR_ICON","DEFAULT_STATUS","HdsCopySnippet","Component","g","prototype","tracked","i","textToShow","textToCopy","args","toString","icon","_status","color","assert","join","includes","isFullWidth","isTruncated","classNames","classes","push","onSuccess","resetStatusDelayed","n","action","onError","clearTimeout","_timer","setTimeout","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAWO,MAAMA,aAAa,GAAGC,yBAAyB,CAACC;AAChD,MAAMC,MAA8B,GAAGC,MAAM,CAACC,MAAM,CACzDJ,yBACF;AAEO,MAAMK,YAAY,GAAG;AACrB,MAAMC,YAAY,GAAG;AACrB,MAAMC,UAAU,GAAG;AACnB,MAAMC,cAAc,GAAG;AAcf,MAAMC,cAAc,SAASC,SAAS,CAA0B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CAC5EC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAmBL,cAAc;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,QAAA,IAAAM,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/hds/copy/snippet/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { assert } from '@ember/debug';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { HdsCopySnippetColorValues } from './types.ts';\nimport type { HdsCopySnippetColors } from './types.ts';\nimport type { HdsClipboardModifierSignature } from '../../../../modifiers/hds-clipboard.ts';\nimport type { HdsIconSignature } from '../../icon';\n\nexport const DEFAULT_COLOR = HdsCopySnippetColorValues.Primary;\nexport const COLORS: HdsCopySnippetColors[] = Object.values(\n HdsCopySnippetColorValues\n);\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 HdsCopySnippetSignature {\n Args: {\n color?: HdsCopySnippetColors;\n isFullWidth?: boolean;\n textToCopy: HdsClipboardModifierSignature['Args']['Named']['text'];\n isTruncated?: boolean;\n onSuccess?: HdsClipboardModifierSignature['Args']['Named']['onSuccess'];\n onError?: HdsClipboardModifierSignature['Args']['Named']['onError'];\n };\n Element: HTMLButtonElement;\n}\n\nexport default class HdsCopySnippet extends Component<HdsCopySnippetSignature> {\n @tracked private _status = DEFAULT_STATUS;\n @tracked private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @method textToShow\n * @return {string}\n */\n get textToShow(): string {\n const { textToCopy = '' } = this.args;\n\n if (typeof textToCopy === 'string') {\n return textToCopy;\n } else {\n return textToCopy.toString();\n }\n }\n\n /**\n * @param icon\n * @type {string}\n * @default clipboard-copy\n * @description Determines the icon to be used, based on the success state. Note that this is auto-tracked because it depends on a 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 color\n * @type {string}\n * @default primary\n * @description Determines the color of button to be used; acceptable values are `primary` and `secondary`\n */\n get color(): HdsCopySnippetColors {\n const { color = DEFAULT_COLOR } = this.args;\n\n assert(\n `@color for \"Hds::Copy::Snippet\" must be one of the following: ${COLORS.join(\n ', '\n )}; received: ${color}`,\n COLORS.includes(color)\n );\n\n return color;\n }\n\n /**\n * @param isFullWidth\n * @type {boolean}\n * @default false\n * @description Indicates that the component should take up the full width of the parent container.\n */\n get isFullWidth(): boolean {\n return this.args.isFullWidth ?? false;\n }\n\n /**\n * @param isTruncated\n * @type {boolean}\n * @default false\n * @description Indicates that the component should be truncated instead of wrapping text and using multiple lines.\n */\n get isTruncated(): boolean {\n return this.args.isTruncated ?? false;\n }\n\n /**\n * Get the class names to apply to the component.\n * @method CopySnippet#classNames\n * @return {string} The \"class\" attribute to apply to the component.\n */\n get classNames(): string {\n const classes = ['hds-copy-snippet'];\n\n // add a class based on the @color argument\n classes.push(`hds-copy-snippet--color-${this.color}`);\n\n // add a class based on the tracked status (idle/success/error)\n classes.push(`hds-copy-snippet--status-${this._status}`);\n\n // add a class based on the @isTruncated argument\n if (this.isTruncated) {\n classes.push('hds-copy-snippet--is-truncated');\n }\n\n // add a class based on the @isFullWidth argument\n if (this.isFullWidth) {\n classes.push('hds-copy-snippet--width-full');\n }\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_COLOR","HdsCopySnippetColorValues","Primary","COLORS","Object","values","DEFAULT_ICON","SUCCESS_ICON","ERROR_ICON","DEFAULT_STATUS","HdsCopySnippet","Component","g","prototype","tracked","i","void 0","textToShow","textToCopy","args","toString","icon","_status","color","assert","join","includes","isFullWidth","isTruncated","classNames","classes","push","onSuccess","resetStatusDelayed","n","action","onError","clearTimeout","_timer","setTimeout","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/disclosure-primitive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { schedule } from '@ember/runloop';\nimport { guidFor } from '@ember/object/internals';\n\nexport interface HdsDisclosurePrimitiveSignature {\n Args: {\n isOpen?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClose?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClickToggle?: (...args: any[]) => void;\n };\n Blocks: {\n toggle: [\n {\n contentId: string;\n isOpen: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClickToggle: (...args: any[]) => void;\n },\n ];\n content: [\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n close: (...args: any[]) => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsDisclosurePrimitive extends Component<HdsDisclosurePrimitiveSignature> {\n @tracked private _isOpen = false;\n @tracked private _isControlled = this.args.isOpen !== undefined;\n private _contentId = 'content-' + guidFor(this);\n\n get isOpen(): boolean {\n if (this._isControlled) {\n // if the state is controlled from outside, the argument overrides the internal state\n return this.args.isOpen ?? this._isOpen;\n } else {\n // if the state changes internally, the internal state overrides the argument\n return this._isOpen;\n }\n }\n\n set isOpen(value) {\n this._isOpen = value || false;\n }\n\n @action\n onClickToggle(): void {\n this.isOpen = !this.isOpen;\n this._isControlled = false;\n // we call the \"onClickToggle\" callback if it exists and it's a function\n if (\n this.args.onClickToggle &&\n typeof this.args.onClickToggle === 'function'\n ) {\n this.args.onClickToggle(this.isOpen);\n }\n }\n\n @action\n onStateChange(): void {\n if (this.args.isOpen !== undefined) {\n this.isOpen = this.args.isOpen;\n }\n this._isControlled = true;\n }\n\n @action\n close(): void {\n // we schedule this afterRender to avoid an error in tests caused by updating `isOpen` multiple times in the same computation\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.isOpen = false;\n // we call the \"onClose\" callback if it exists (and is a function)\n if (this.args.onClose && typeof this.args.onClose === 'function') {\n this.args.onClose();\n }\n });\n }\n}\n"],"names":["HdsDisclosurePrimitive","Component","g","prototype","tracked","i","args","isOpen","undefined","_contentId","guidFor","_isControlled","_isOpen","value","onClickToggle","n","action","onStateChange","close","schedule","onClose","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAmCe,MAAMA,sBAAsB,SAASC,SAAS,CAAkC;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CAC5FC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAmB,KAAK;AAAA,IAAA,CAAA,CAAA;AAAA;EAAA,QAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/disclosure-primitive/index.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2021, 2025\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { schedule } from '@ember/runloop';\nimport { guidFor } from '@ember/object/internals';\n\nexport interface HdsDisclosurePrimitiveSignature {\n Args: {\n isOpen?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClose?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClickToggle?: (...args: any[]) => void;\n };\n Blocks: {\n toggle: [\n {\n contentId: string;\n isOpen: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClickToggle: (...args: any[]) => void;\n },\n ];\n content: [\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n close: (...args: any[]) => void;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsDisclosurePrimitive extends Component<HdsDisclosurePrimitiveSignature> {\n @tracked private _isOpen = false;\n @tracked private _isControlled = this.args.isOpen !== undefined;\n private _contentId = 'content-' + guidFor(this);\n\n get isOpen(): boolean {\n if (this._isControlled) {\n // if the state is controlled from outside, the argument overrides the internal state\n return this.args.isOpen ?? this._isOpen;\n } else {\n // if the state changes internally, the internal state overrides the argument\n return this._isOpen;\n }\n }\n\n set isOpen(value) {\n this._isOpen = value || false;\n }\n\n @action\n onClickToggle(): void {\n this.isOpen = !this.isOpen;\n this._isControlled = false;\n // we call the \"onClickToggle\" callback if it exists and it's a function\n if (\n this.args.onClickToggle &&\n typeof this.args.onClickToggle === 'function'\n ) {\n this.args.onClickToggle(this.isOpen);\n }\n }\n\n @action\n onStateChange(): void {\n if (this.args.isOpen !== undefined) {\n this.isOpen = this.args.isOpen;\n }\n this._isControlled = true;\n }\n\n @action\n close(): void {\n // we schedule this afterRender to avoid an error in tests caused by updating `isOpen` multiple times in the same computation\n // eslint-disable-next-line ember/no-runloop\n schedule('afterRender', (): void => {\n this.isOpen = false;\n // we call the \"onClose\" callback if it exists (and is a function)\n if (this.args.onClose && typeof this.args.onClose === 'function') {\n this.args.onClose();\n }\n });\n }\n}\n"],"names":["HdsDisclosurePrimitive","Component","g","prototype","tracked","i","void 0","args","isOpen","undefined","_contentId","guidFor","_isControlled","_isOpen","value","onClickToggle","n","action","onStateChange","close","schedule","onClose","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAmCe,MAAMA,sBAAsB,SAASC,SAAS,CAAkC;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CAC5FC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAmB,KAAK;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,QAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAJ,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,eAAA,EAAA,CAC/BC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAyB,IAAI,CAACG,IAAI,CAACC,MAAM,KAAKC,SAAS;AAAA,IAAA,CAAA,CAAA;AAAA;AAAA,EAAA,cAAA,IAAAJ,CAAA,CAAA,IAAA,EAAA,eAAA,CAAA,EAAAC,MAAA;AACvDI,EAAAA,UAAU,GAAG,UAAU,GAAGC,OAAO,CAAC,IAAI,CAAC;EAE/C,IAAIH,MAAMA,GAAY;IACpB,IAAI,IAAI,CAACI,aAAa,EAAE;AACtB;MACA,OAAO,IAAI,CAACL,IAAI,CAACC,MAAM,IAAI,IAAI,CAACK,OAAO;AACzC,IAAA,CAAC,MAAM;AACL;MACA,OAAO,IAAI,CAACA,OAAO;AACrB,IAAA;AACF,EAAA;EAEA,IAAIL,MAAMA,CAACM,KAAK,EAAE;AAChB,IAAA,IAAI,CAACD,OAAO,GAAGC,KAAK,IAAI,KAAK;AAC/B,EAAA;AAGAC,EAAAA,aAAaA,GAAS;AACpB,IAAA,IAAI,CAACP,MAAM,GAAG,CAAC,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACI,aAAa,GAAG,KAAK;AAC1B;AACA,IAAA,IACE,IAAI,CAACL,IAAI,CAACQ,aAAa,IACvB,OAAO,IAAI,CAACR,IAAI,CAACQ,aAAa,KAAK,UAAU,EAC7C;MACA,IAAI,CAACR,IAAI,CAACQ,aAAa,CAAC,IAAI,CAACP,MAAM,CAAC;AACtC,IAAA;AACF,EAAA;AAAC,EAAA;IAAAQ,CAAA,CAAA,IAAA,CAAAb,SAAA,EAAA,eAAA,EAAA,CAXAc,MAAM,CAAA,CAAA;AAAA;AAcPC,EAAAA,aAAaA,GAAS;AACpB,IAAA,IAAI,IAAI,CAACX,IAAI,CAACC,MAAM,KAAKC,SAAS,EAAE;AAClC,MAAA,IAAI,CAACD,MAAM,GAAG,IAAI,CAACD,IAAI,CAACC,MAAM;AAChC,IAAA;IACA,IAAI,CAACI,aAAa,GAAG,IAAI;AAC3B,EAAA;AAAC,EAAA;IAAAI,CAAA,CAAA,IAAA,CAAAb,SAAA,EAAA,eAAA,EAAA,CANAc,MAAM,CAAA,CAAA;AAAA;AASPE,EAAAA,KAAKA,GAAS;AACZ;AACA;IACAC,QAAQ,CAAC,aAAa,EAAE,MAAY;MAClC,IAAI,CAACZ,MAAM,GAAG,KAAK;AACnB;AACA,MAAA,IAAI,IAAI,CAACD,IAAI,CAACc,OAAO,IAAI,OAAO,IAAI,CAACd,IAAI,CAACc,OAAO,KAAK,UAAU,EAAE;AAChE,QAAA,IAAI,CAACd,IAAI,CAACc,OAAO,EAAE;AACrB,MAAA;AACF,IAAA,CAAC,CAAC;AACJ,EAAA;AAAC,EAAA;IAAAL,CAAA,CAAA,IAAA,CAAAb,SAAA,EAAA,OAAA,EAAA,CAXAc,MAAM,CAAA,CAAA;AAAA;AAYT;AAACK,oBAAA,CAAAC,QAAA,EApDoBvB,sBAAsB,CAAA;;;;"}
|